--------------------------------------------------------------------------------
-- *** sql/rapi_blog.sql -- DO NOT MOVE OR RENAME THIS FILE ***
--
-- Add your DDL here (i.e. CREATE TABLE statements)
--
-- To (re)initialize your SQLite database (rapi_blog.db) and (re)generate
-- your DBIC schema classes and update your base TableSpec configs, run this command
-- from your app home directory:
--
-- perl devel/model_DB_updater.pl --from-ddl --cfg
--
--------------------------------------------------------------------------------
DROP TABLE IF EXISTS [user];
CREATE TABLE [user] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[username] varchar(32) UNIQUE NOT NULL,
[full_name] varchar(64) UNIQUE DEFAULT NULL,
[image] varchar(255) DEFAULT NULL,
[email] varchar(255) DEFAULT NULL,
[admin] BOOLEAN NOT NULL DEFAULT 0,
[author] BOOLEAN NOT NULL DEFAULT 0,
[comment] BOOLEAN NOT NULL DEFAULT 1,
[disabled] BOOLEAN NOT NULL DEFAULT 0
);
INSERT INTO [user] VALUES(0,'(system)','System User',null,null,1,1,1,0);
DROP TABLE IF EXISTS [section];
CREATE TABLE [section] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[name] varchar(64) NOT NULL,
[description] varchar(1024) DEFAULT NULL,
[parent_id] INTEGER DEFAULT NULL,
FOREIGN KEY ([parent_id]) REFERENCES [section] ([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP INDEX IF EXISTS [unique_subsection];
CREATE UNIQUE INDEX [unique_subsection] ON [section] ([parent_id],[name]);
DROP TABLE IF EXISTS [post];
CREATE TABLE [post] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[name] varchar(255) UNIQUE NOT NULL,
[title] varchar(255) DEFAULT NULL,
[image] varchar(255) DEFAULT NULL,
[ts] datetime NOT NULL,
[create_ts] datetime NOT NULL,
[update_ts] datetime NOT NULL,
[author_id] INTEGER NOT NULL,
[creator_id] INTEGER NOT NULL,
[updater_id] INTEGER NOT NULL,
[section_id] INTEGER DEFAULT NULL,
[published] BOOLEAN NOT NULL DEFAULT 0,
[publish_ts] datetime DEFAULT NULL,
[size] INTEGER DEFAULT NULL,
[tag_names] text default NULL,
[custom_summary] text default NULL,
[summary] text default NULL,
[body] text default '',
FOREIGN KEY ([author_id]) REFERENCES [user] ([id]) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY ([creator_id]) REFERENCES [user] ([id]) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY ([updater_id]) REFERENCES [user] ([id]) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY ([section_id]) REFERENCES [section] ([id]) ON DELETE SET DEFAULT ON UPDATE CASCADE
);
DROP TABLE IF EXISTS [tag];
CREATE TABLE [tag] (
[name] varchar(64) PRIMARY KEY NOT NULL
);
DROP TABLE IF EXISTS [post_tag];
CREATE TABLE [post_tag] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[post_id] INTEGER NOT NULL,
[tag_name] varchar(64) NOT NULL,
FOREIGN KEY ([post_id]) REFERENCES [post] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([tag_name]) REFERENCES [tag] ([name]) ON DELETE RESTRICT ON UPDATE RESTRICT
);
DROP TABLE IF EXISTS [category];
CREATE TABLE [category] (
[name] varchar(64) PRIMARY KEY NOT NULL,
[description] varchar(1024) DEFAULT NULL
);
DROP TABLE IF EXISTS [post_category];
CREATE TABLE [post_category] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[post_id] INTEGER NOT NULL,
[category_name] varchar(64) NOT NULL,
FOREIGN KEY ([post_id]) REFERENCES [post] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([category_name]) REFERENCES [category] ([name]) ON DELETE RESTRICT ON UPDATE RESTRICT
);
DROP TABLE IF EXISTS [comment];
CREATE TABLE [comment] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[parent_id] INTEGER DEFAULT NULL,
[post_id] INTEGER NOT NULL,
[user_id] INTEGER NOT NULL,
[ts] datetime NOT NULL,
[body] text default '',
FOREIGN KEY ([parent_id]) REFERENCES [comment] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([post_id]) REFERENCES [post] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([user_id]) REFERENCES [user] ([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP TABLE IF EXISTS [hit];
CREATE TABLE [hit] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[post_id] INTEGER,
[ts] datetime NOT NULL,
[client_ip] varchar(16),
[client_hostname] varchar(255),
[uri] varchar(512),
[method] varchar(8),
[user_agent] varchar(1024),
[referer] varchar(512),
[serialized_request] text,
FOREIGN KEY ([post_id]) REFERENCES [post] ([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP TABLE IF EXISTS [trk_section_posts];
CREATE TABLE [trk_section_posts] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[section_id] INTEGER NOT NULL,
[post_id] INTEGER NOT NULL,
[depth] INTEGER NOT NULL,
FOREIGN KEY ([section_id]) REFERENCES [section] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([post_id]) REFERENCES [post] ([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP TABLE IF EXISTS [trk_section_sections];
CREATE TABLE [trk_section_sections] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[section_id] INTEGER NOT NULL,
[subsection_id] INTEGER NOT NULL,
[depth] INTEGER NOT NULL,
FOREIGN KEY ([section_id]) REFERENCES [section] ([id]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([subsection_id]) REFERENCES [section] ([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP TABLE IF EXISTS [preauth_action_type];
CREATE TABLE [preauth_action_type] (
[name] varchar(16) PRIMARY KEY NOT NULL,
[description] varchar(1024) DEFAULT NULL
);
INSERT INTO [preauth_action_type] VALUES('enable_account','Enable a disabled user account');
INSERT INTO [preauth_action_type] VALUES('password_reset','Change a user password');
INSERT INTO [preauth_action_type] VALUES('login','Single-use login');
DROP TABLE IF EXISTS [preauth_action];
CREATE TABLE [preauth_action] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[type] varchar(16) NOT NULL,
[active] BOOLEAN NOT NULL DEFAULT 1,
[sealed] BOOLEAN NOT NULL DEFAULT 0,
[create_ts] datetime NOT NULL,
[expire_ts] datetime NOT NULL,
[user_id] INTEGER,
[auth_key] varchar(128) UNIQUE NOT NULL,
[json_data] text,
FOREIGN KEY ([type]) REFERENCES [preauth_action_type] ([name]) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY ([user_id]) REFERENCES [user] ([id]) ON DELETE CASCADE ON UPDATE CASCADE
);
DROP TABLE IF EXISTS [preauth_event_type];
CREATE TABLE [preauth_event_type] (
[id] INTEGER PRIMARY KEY NOT NULL,
[name] varchar(16) UNIQUE NOT NULL,
[description] varchar(1024) DEFAULT NULL
);
INSERT INTO [preauth_event_type] VALUES(1,'Valid', 'Pre-Authorization Action accessed and is valid');
INSERT INTO [preauth_event_type] VALUES(2,'Invalid', 'Pre-Authorization Action exists but is invalid');
INSERT INTO [preauth_event_type] VALUES(3,'Deactivate','Pre-Authorization Action deactivated');
INSERT INTO [preauth_event_type] VALUES(4,'Executed', 'Pre-Authorization Action executed');
INSERT INTO [preauth_event_type] VALUES(5,'Sealed', 'Action sealed - can no longer be accessed with key, except by admins');
DROP TABLE IF EXISTS [preauth_action_event];
CREATE TABLE [preauth_action_event] (
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[ts] datetime NOT NULL,
[type_id] INTEGER NOT NULL,
[action_id] INTEGER NOT NULL,
[hit_id] INTEGER,
[info] text,
FOREIGN KEY ([type_id]) REFERENCES [preauth_event_type] ([id]) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY ([action_id]) REFERENCES [preauth_action] ([id]) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY ([hit_id]) REFERENCES [hit] ([id]) ON DELETE RESTRICT ON UPDATE CASCADE
);