/* 
  Create a database at first:
    CREATE DATABASE sonews CHARACTER SET utf8
*/

/* 
  flags:
  If bit 0 is set, groups is a mirrorred mailing list. 
  If not set default newsgroup.

  Normalization: 1NF, 2NF, 3NF
*/
CREATE TABLE groups 
(
  group_id      SERIAL,
  name          VARCHAR(80) NOT NULL,
  flags         TINYINT UNSIGNED DEFAULT 0,

  PRIMARY KEY(group_id),
  UNIQUE(name)
)
ENGINE = INNODB
CHARACTER SET utf8;

CREATE TABLE articles 
(
  article_id    INT,
  body          LONGBLOB,

  PRIMARY KEY(article_id)
)
ENGINE = INNODB
CHARACTER SET utf8;

CREATE TABLE article_ids
(
  article_id  INT REFERENCES articles.article_id ON DELETE CASCADE,
  message_id  VARCHAR(255),

  PRIMARY KEY(article_id),
  UNIQUE(message_id)
)
ENGINE = INNODB
CHARACTER SET utf8;

CREATE TABLE headers
(
  article_id    INT REFERENCES articles.article_id ON DELETE CASCADE,
  header_key    VARCHAR(255),
  header_value  TEXT, /* Max. 64k */
  header_index  INT,

  PRIMARY KEY(article_id, header_key, header_index)
)
ENGINE = INNODB
CHARACTER SET utf8;

/*
  Normalization: 1NF, 2NF
*/
CREATE TABLE postings 
(
  group_id      INTEGER,
  article_id    INTEGER REFERENCES articles.article_id ON DELETE CASCADE,
  article_index INTEGER NOT NULL, 

  PRIMARY KEY(group_id, article_id)
)
ENGINE = INNODB
CHARACTER SET utf8;

/* 
  Table for association of newsgroups and mailing-lists 

  Normalization: 1NF, 2NF, 3NF
*/
CREATE TABLE groups2list
(
  group_id    INTEGER REFERENCES groups.group_id ON DELETE CASCADE,
  listaddress VARCHAR(255),

  PRIMARY KEY(group_id, listaddress),
  UNIQUE(listaddress)
)
ENGINE = INNODB
CHARACTER SET utf8;

/* 
  Configuration table, containing key/value pairs 

  Normalization: 1NF, 2NF, 3NF
*/
CREATE TABLE config
(
  config_key     VARCHAR(255),
  config_value   TEXT,

  PRIMARY KEY(config_key)
)
ENGINE = INNODB
CHARACTER SET utf8;

/* 
  Newsserver peers 
  feedtype: 0: pullfeed 1: pushfeed
  Normalization: 1NF (atomic values), 2NF
*/
CREATE TABLE peers
(
  peer_id     SERIAL,
  host        VARCHAR(255),
  port        SMALLINT UNSIGNED,

  PRIMARY KEY(peer_id),
  UNIQUE(host, port)
)
ENGINE = INNODB
CHARACTER SET utf8;

/* 
  List of newsgroups to feed into sonews 

  Normalization: 1NF, 2NF, 3NF
*/
CREATE TABLE peer_subscriptions
(
  peer_id    INTEGER REFERENCES peers.peer_id ON DELETE CASCADE,
  group_id   INTEGER REFERENCES groups.group_id ON DELETE CASCADE,
  feedtype   TINYINT UNSIGNED DEFAULT 0,

  PRIMARY KEY(peer_id, group_id, feedtype)
)
ENGINE = INNODB
CHARACTER SET utf8;

/* 
   Tables for server event statistics

   Possible statistic keys:
   1=CONNECTIONS     (active connections)
   2=POSTED_NEWS     (directly to the server posted unique messages)
   3=GATEWAYED_NEWS  (posted unique message gateways through the ML-gateway)
   4=FEEDED_NEWS     (unique messages feed via NNTP)

   The server will create snapshots of the above data.

   Normalization: 1NF, 2NF
*/
CREATE TABLE events
(
  event_time         BIGINT UNSIGNED,   /* time of this snapshot */
  event_key          TINYINT UNSIGNED,  /* which data */
  group_id           INT REFERENCES groups.group_id ON DELETE CASCADE,

  PRIMARY KEY(event_time, event_key)
)
ENGINE = INNODB
CHARACTER SET utf8;