-- $Id: schema-pgsql.txt 23894 2007-05-01 17:24:07Z leeh $

CREATE TABLE users (
	id SERIAL,
	username VARCHAR(USERREGNAME_LEN) NOT NULL,
	password VARCHAR(PASSWDLEN) NOT NULL,
	email VARCHAR(EMAILLEN),
	suspender VARCHAR(OPERNAMELEN),
	suspend_reason VARCHAR(SUSPENDREASONLEN),
	suspend_time INTEGER DEFAULT '0',
	reg_time INTEGER,
	last_time INTEGER,
	flags INTEGER,
	verify_token VARCHAR(8),
	language VARCHAR(255) DEFAULT '',
	PRIMARY KEY(id)
);
ALTER TABLE users ADD UNIQUE(username);

CREATE TABLE users_resetpass (
	username VARCHAR(USERREGNAME_LEN) NOT NULL,
	token VARCHAR(10),
	time INTEGER,
	PRIMARY KEY(username)
);
CREATE INDEX resetpass_time_idx ON users_resetpass (time);

CREATE TABLE users_resetemail (
	username VARCHAR(USERREGNAME_LEN) NOT NULL,
	token VARCHAR(10),
	email VARCHAR(EMAILLEN) DEFAULT NULL,
	time INTEGER,
	PRIMARY KEY(username)
);
CREATE INDEX resetemail_time_idx ON users_resetemail (time);

CREATE TABLE users_sync (
	id SERIAL,
	hook VARCHAR(50) NOT NULL,
	data TEXT,
	PRIMARY KEY(id)
);

CREATE TABLE nicks (
	nickname VARCHAR(NICKLEN) NOT NULL,
	username VARCHAR(USERREGNAME_LEN) NOT NULL,
	reg_time INTEGER,
	last_time INTEGER,
	flags INTEGER,
	PRIMARY KEY(nickname),
	FOREIGN KEY(username) REFERENCES users (username) MATCH FULL
);

CREATE TABLE channels (
	chname VARCHAR(CHANNELLEN) NOT NULL,
	topic VARCHAR(TOPICLEN),
	url VARCHAR(URLLEN),
	createmodes VARCHAR(50),
	enforcemodes VARCHAR(50),
	tsinfo INTEGER,
	reg_time INTEGER,
	last_time INTEGER,
	flags INTEGER,
	suspender VARCHAR(OPERNAMELEN),
	suspend_reason VARCHAR(SUSPENDREASONLEN),
	suspend_time INTEGER DEFAULT '0',
	PRIMARY KEY(chname)
);

CREATE TABLE channels_dropowner (
	chname VARCHAR(CHANNELLEN) NOT NULL,
	token VARCHAR(10),
	time INTEGER,
	PRIMARY KEY(chname)
);
CREATE INDEX dropowner_time_idx ON channels_dropowner (time);

CREATE TABLE members (
	chname VARCHAR(CHANNELLEN) NOT NULL,
	username VARCHAR(USERREGNAME_LEN) NOT NULL,
	lastmod VARCHAR(USERREGNAME_LEN) NOT NULL,
	level INT,
	flags INTEGER,
	suspend INT,
	PRIMARY KEY(chname, username),
	FOREIGN KEY(chname) REFERENCES channels (chname) MATCH FULL,
	FOREIGN KEY(username) REFERENCES users (username) MATCH FULL
);
CREATE INDEX members_chname_idx ON members (chname);
CREATE INDEX members_username_idx ON members (username);

CREATE TABLE bans (
	chname VARCHAR(CHANNELLEN) NOT NULL,
	mask VARCHAR(CONVERT_NICK_USER_HOST) NOT NULL,
	reason VARCHAR(50) NOT NULL,
	username VARCHAR(USERREGNAME_LEN) NOT NULL,
	level INT,
	hold INT,
	PRIMARY KEY(chname, mask),
	FOREIGN KEY(chname) REFERENCES channels (chname) MATCH FULL
--	FOREIGN KEY(username) REFERENCES users (username) MATCH FULL
--	Username might not exist?
);
CREATE INDEX bans_chname_idx ON bans (chname);

CREATE TABLE operbot (
	chname VARCHAR(CHANNELLEN) NOT NULL,
	tsinfo INTEGER,
	oper VARCHAR(OPERNAMELEN),
	PRIMARY KEY(chname)
);

CREATE TABLE operserv (
	chname VARCHAR(CHANNELLEN) NOT NULL,
	tsinfo INTEGER,
	oper VARCHAR(OPERNAMELEN),
	PRIMARY KEY(chname)
);

CREATE TABLE jupes (
	servername VARCHAR(HOSTLEN) NOT NULL,
	reason VARCHAR(REALLEN) NOT NULL,
	PRIMARY KEY(servername)
);

CREATE TABLE operbans (
	type CHAR(1) NOT NULL,
	mask VARCHAR(CHANNELLEN) NOT NULL,
	reason VARCHAR(REASONLEN) NOT NULL,
	operreason VARCHAR(REASONLEN),
	hold INTEGER,
	create_time INTEGER,
	oper VARCHAR(OPERNAMELEN),
	remove BOOL,
	flags INTEGER,
	PRIMARY KEY(type, mask)
);

CREATE TABLE operbans_regexp (
	id SERIAL,
	regex VARCHAR(255) NOT NULL,
	reason VARCHAR(REASONLEN) NOT NULL,
	hold INTEGER,
	create_time INTEGER,
	oper VARCHAR(OPERNAMELEN),
	PRIMARY KEY(id)
);

CREATE TABLE operbans_regexp_neg (
	id SERIAL,
	parent_id BIGINT NOT NULL,
	regex VARCHAR(255) NOT NULL,
	oper VARCHAR(30) NOT NULL,
	PRIMARY KEY(id)
);

CREATE TABLE global_welcome (
	id INTEGER,
	text TEXT,
	PRIMARY KEY(id)
);

CREATE TABLE email_banned_domain (
	domain VARCHAR(255) NOT NULL,
	PRIMARY KEY(domain)
);

CREATE TABLE ignore_hosts (
	hostname VARCHAR(255) NOT NULL,
	oper VARCHAR(OPERNAMELEN) NOT NULL,
	reason VARCHAR(255) NOT NULL,
	PRIMARY KEY(hostname)
);

CREATE TABLE memos (
	id SERIAL,
	user_id BIGINT NOT NULL,
	source_id BIGINT NOT NULL,
	source VARCHAR(USERREGNAME_LEN) NOT NULL,
	timestamp INTEGER DEFAULT '0',
	flags INTEGER DEFAULT '0',
	text TEXT,
	PRIMARY KEY(id),
	FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
);

