get rid of xmlschema

This commit is contained in:
Shish 2009-01-22 04:05:55 -08:00
parent 64fb261b87
commit 44ac62e1ae
15 changed files with 171 additions and 2586 deletions

View File

@ -104,14 +104,14 @@ class EventLog implements Extension {
global $config; global $config;
if($config->get_int("ext_event_log_version", 0) < 1) { if($config->get_int("ext_event_log_version", 0) < 1) {
$database->Execute("CREATE TABLE event_log ( $database->create_table("event_log", "
id int(11) NOT NULL auto_increment primary key, id SCORE_AIPK,
owner_id int(11) NOT NULL, owner_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
owner_ip char(15) NOT NULL, owner_ip SCORE_INET NOT NULL,
date datetime NOT NULL, date DATETIME NOT NULL,
event varchar(32) NOT NULL, event VARCHAR(32) NOT NULL,
entry varchar(255) NOT NULL entry TEXT NOT NULL
)"); ");
$config->set_int("ext_event_log_version", 1); $config->set_int("ext_event_log_version", 1);
} }
} }

View File

@ -116,13 +116,12 @@ class ImageBan implements Extension {
protected function install() { protected function install() {
global $database; global $database;
global $config; global $config;
$database->Execute("CREATE TABLE image_bans ( $database->create_table("image_bans", "
id int(11) NOT NULL auto_increment, id SCORE_AIPK,
hash char(32) default NULL, hash CHAR(32) NOT NULL,
date datetime default NULL, date DATETIME DEFAULT now(),
reason varchar(255) default NULL, reason TEXT NOT NULL,
PRIMARY KEY (id) ");
)");
$config->set_int("ext_imageban_version", 1); $config->set_int("ext_imageban_version", 1);
} }

View File

@ -103,15 +103,13 @@ class IPBan implements Extension {
// shortcut to latest // shortcut to latest
if($config->get_int("ext_ipban_version") < 1) { if($config->get_int("ext_ipban_version") < 1) {
$database->execute(" $database->create_table("bans", "
CREATE TABLE bans ( id SCORE_AIPK,
id {$database->engine->auto_increment}, banner_id INTEGER NOT NULL,
banner_id INTEGER NOT NULL, ip SCORE_INET NOT NULL,
ip VARCHAR(15) NOT NULL, end_timestamp INTEGER,
end_timestamp INTEGER, reason TEXT NOT NULL,
reason TEXT NOT NULL, INDEX (end_timestamp)
INDEX (end_timestamp)
) {$database->engine->create_table_extras};
"); ");
$config->set_int("ext_ipban_version", 6); $config->set_int("ext_ipban_version", 6);
} }

View File

@ -31,21 +31,21 @@ class Notes implements Extension {
protected function install() { protected function install() {
global $database; global $database;
global $config; global $config;
$database->Execute("CREATE TABLE image_notes ( $database->create_table("image_notes", "
id int(11) NOT NULL auto_increment PRIMARY KEY, id SCORE_AIPK,
image_id int(11) NOT NULL, image_id INTEGER NOT NULL,
user_id int(11) NOT NULL, user_id INTEGER NOT NULL,
owner_ip char(15) NOT NULL, owner_ip SCORE_INET NOT NULL,
created_at datetime NOT NULL, created_at DATETIME NOT NULL,
updated_at datetime NOT NULL, updated_at DATETIME NOT NULL,
version int(11) DEFAULT 1 NOT NULL, version INTEGER DEFAULT 1 NOT NULL,
is_active enum('Y', 'N') DEFAULT 'Y' NOT NULL, is_active SCORE_BOOL DEFAULT SCORE_BOOL_Y NOT NULL,
x int(11) NOT NULL, x INTEGER NOT NULL,
y int(11) NOT NULL, y INTEGER NOT NULL,
w int(11) NOT NULL, w INTEGER NOT NULL,
h int(11) NOT NULL, h INTEGER NOT NULL,
body text NOT NULL body TEXT NOT NULL
)"); ");
$config->set_int("ext_notes_version", 1); $config->set_int("ext_notes_version", 1);
} }
} }

View File

@ -92,14 +92,12 @@ class NumericScore implements Extension {
if($config->get_int("ext_numeric_score_version") < 1) { if($config->get_int("ext_numeric_score_version") < 1) {
$database->Execute("ALTER TABLE images ADD COLUMN numeric_score INTEGER NOT NULL DEFAULT 0"); $database->Execute("ALTER TABLE images ADD COLUMN numeric_score INTEGER NOT NULL DEFAULT 0");
$database->Execute("CREATE INDEX images__numeric_score ON images(numeric_score)"); $database->Execute("CREATE INDEX images__numeric_score ON images(numeric_score)");
$database->Execute(" $database->create_table("numeric_score_votes", "
CREATE TABLE numeric_score_votes ( image_id INTEGER NOT NULL REFERENCES images(id) ON DELETE CASCADE,
image_id INTEGER NOT NULL, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
user_id INTEGER NOT NULL, score INTEGER NOT NULL,
score INTEGER NOT NULL, UNIQUE(image_id, user_id),
UNIQUE(image_id, user_id), INDEX(image_id)
INDEX(image_id)
)
"); ");
$config->set_int("ext_numeric_score_version", 1); $config->set_int("ext_numeric_score_version", 1);
} }

View File

@ -121,18 +121,16 @@ class PM implements Extension {
// shortcut to latest // shortcut to latest
if($config->get_int("pm_version") < 1) { if($config->get_int("pm_version") < 1) {
$database->execute(" $database->create_table("private_message", "
CREATE TABLE private_message ( id SCORE_AIPK,
id {$database->engine->auto_increment}, from_id INTEGER NOT NULL,
from_id INTEGER NOT NULL, from_ip SCORE_INET NOT NULL,
from_ip VARCHAR(15) NOT NULL, to_id INTEGER NOT NULL,
to_id INTEGER NOT NULL, sent_date DATETIME NOT NULL,
sent_date DATETIME NOT NULL, subject VARCHAR(64) NOT NULL,
subject VARCHAR(64) NOT NULL, message TEXT NOT NULL,
message TEXT NOT NULL, is_read SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N,
is_read ENUM('Y', 'N') NOT NULL DEFAULT 'N', INDEX (to_id)
INDEX (to_id)
) {$database->engine->create_table_extras};
"); ");
$config->set_int("pm_version", 1); $config->set_int("pm_version", 1);
} }

View File

@ -115,12 +115,12 @@ class ReportImage implements Extension {
global $database; global $database;
global $config; global $config;
if($config->get_int("ext_report_image_version") < 1) { if($config->get_int("ext_report_image_version") < 1) {
$database->Execute("CREATE TABLE image_reports ( $database->create_table("image_reports", "
id {$database->engine->auto_increment}, id SCORE_AIPK,
image_id INTEGER NOT NULL, image_id INTEGER NOT NULL REFERENCES images(id) ON DELETE CASCADE,
reporter_id INTEGER NOT NULL, reporter_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
reason TEXT NOT NULL reason TEXT NOT NULL
)"); ");
$config->set_int("ext_report_image_version", 1); $config->set_int("ext_report_image_version", 1);
} }
} }

View File

@ -67,12 +67,11 @@ class Tag_History implements Extension {
global $config; global $config;
if($config->get_int("ext_tag_history_version") < 1) { if($config->get_int("ext_tag_history_version") < 1) {
$database->Execute("CREATE TABLE tag_histories $database->create_table("tag_histories", "
( id SCORE_AIPK,
id integer NOT NULL auto_increment PRIMARY KEY, image_id INTEGER NOT NULL REFERENCES images(id) ON DELETE CASCADE,
image_id integer NOT NULL, tags TEXT NOT NULL
tags text NOT NULL ");
)");
$config->set_int("ext_tag_history_version", 1); $config->set_int("ext_tag_history_version", 1);
} }

View File

@ -81,14 +81,12 @@ class TextScore implements Extension {
if($config->get_int("ext_text_score_version") < 1) { if($config->get_int("ext_text_score_version") < 1) {
$database->Execute("ALTER TABLE images ADD COLUMN text_score INTEGER NOT NULL DEFAULT 0"); $database->Execute("ALTER TABLE images ADD COLUMN text_score INTEGER NOT NULL DEFAULT 0");
$database->Execute("CREATE INDEX images__text_score ON images(text_score)"); $database->Execute("CREATE INDEX images__text_score ON images(text_score)");
$database->Execute(" $database->create_table("text_score_votes", "
CREATE TABLE text_score_votes ( image_id INTEGER NOT NULL REFERENCES images(id) ON DELETE CASCADE,
image_id INTEGER NOT NULL, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
user_id INTEGER NOT NULL, score INTEGER NOT NULL,
score INTEGER NOT NULL, UNIQUE(image_id, user_id),
UNIQUE(image_id, user_id), INDEX(image_id)
INDEX(image_id)
)
"); ");
$config->set_int("ext_text_score_version", 1); $config->set_int("ext_text_score_version", 1);
} }

View File

@ -147,17 +147,18 @@ class Wiki implements Extension {
global $config; global $config;
if($config->get_int("ext_wiki_version", 0) < 1) { if($config->get_int("ext_wiki_version", 0) < 1) {
$database->Execute("CREATE TABLE wiki_pages ( $database->create_table("wiki_pages", "
id int(11) NOT NULL auto_increment, id SCORE_AIPK,
owner_id int(11) NOT NULL, owner_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
owner_ip char(15) NOT NULL, owner_ip SCORE_INET NOT NULL,
date datetime default NULL, date DATETIME DEFAULT NULL,
title varchar(255) NOT NULL, title VARCHAR(255) NOT NULL,
revision int(11) NOT NULL default 1, revision INTEGER NOT NULL DEFAULT 1,
body text NOT NULL, locked SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N,
PRIMARY KEY (id), UNIQUE (title, revision) body TEXT NOT NULL,
)"); UNIQUE (title, revision)
$config->set_int("ext_wiki_version", 1); ");
$config->set_int("ext_wiki_version", 2);
} }
if($config->get_int("ext_wiki_version") < 2) { if($config->get_int("ext_wiki_version") < 2) {
$database->Execute("ALTER TABLE wiki_pages ADD COLUMN $database->Execute("ALTER TABLE wiki_pages ADD COLUMN

View File

@ -53,22 +53,45 @@ class ImgQuerylet {
class DBEngine { class DBEngine {
var $name = null; var $name = null;
var $auto_increment = null; var $auto_increment = null;
var $inet = null;
var $create_table_extras = ""; var $create_table_extras = "";
public function create_table_sql($name, $data) {
return "CREATE TABLE $name ($data)";
}
} }
class MySQL extends DBEngine { class MySQL extends DBEngine {
var $name = "mysql"; var $name = "mysql";
var $auto_increment = "INTEGER PRIMARY KEY auto_increment";
var $create_table_extras = "TYPE=INNODB DEFAULT CHARSET='utf8'";
function init($db) { public function init($db) {
$db->Execute("SET NAMES utf8;"); $db->Execute("SET NAMES utf8;");
} }
public function create_table_sql($name, $data) {
$data = str_replace($data, "SCORE_AIPK", "INTEGER PRIMARY KEY auto_increment");
$data = str_replace($data, "SCORE_INET", "CHAR(15)");
$data = str_replace($data, "SCORE_BOOL", "ENUM('Y', 'N')");
$data = str_replace($data, "SCORE_BOOL_Y", "'Y'");
$data = str_replace($data, "SCORE_BOOL_N", "'N'");
$data = str_replace($data, "SCORE_NOW", "now()");
$ctes = "TYPE=InnoDB DEFAULT CHARSET='utf8'";
return "CREATE TABLE $name ($data) $ctes";
}
} }
class PostgreSQL extends DBEngine { class PostgreSQL extends DBEngine {
var $name = "pgsql"; var $name = "pgsql";
var $auto_increment = "SERIAL PRIMARY KEY";
function init($db) { public function init($db) {
}
public function create_table_sql($name, $data) {
$data = str_replace($data, "SCORE_AIPK", "SERIAL PRIMARY KEY");
$data = str_replace($data, "SCORE_INET", "INET");
$data = str_replace($data, "SCORE_BOOL", "BOOL",);
$data = str_replace($data, "SCORE_BOOL_Y", "'t'");
$data = str_replace($data, "SCORE_BOOL_N", "'f'");
$data = str_replace($data, "SCORE_NOW", "current_time");
return "CREATE TABLE $name ($data)";
} }
} }
// }}} // }}}
@ -180,7 +203,6 @@ class Database {
} }
} }
// safety wrapping {{{
public function execute($query, $args=array()) { public function execute($query, $args=array()) {
$result = $this->db->Execute($query, $args); $result = $this->db->Execute($query, $args);
if($result === False) { if($result === False) {
@ -220,9 +242,7 @@ class Database {
} }
public function create_table($name, $data) { public function create_table($name, $data) {
$data = str_replace($data, "SCORE_AIPK", $this->engine->auto_increment); $this->execute($this->engine->create_table_sql($name, $data));
$ctes = $this->engine->create_table_extras;
$this->execute("CREATE TABLE $name ($data) $ctes");
} }
public function upgrade_schema($filename) { public function upgrade_schema($filename) {
@ -248,6 +268,5 @@ class Database {
$config->set_bool("in_upgrade", false); $config->set_bool("in_upgrade", false);
} }
// }}}
} }
?> ?>

View File

@ -160,17 +160,17 @@ class CommentList implements Extension {
// shortcut to latest // shortcut to latest
if($config->get_int("ext_comments_version") < 1) { if($config->get_int("ext_comments_version") < 1) {
$database->Execute("CREATE TABLE comments ( $database->create_table("comments", "
id {$database->engine->auto_increment}, id SCORE_AIPK,
image_id INTEGER NOT NULL, image_id INTEGER NOT NULL REFERENCES images(id) ON DELETE CASCADE,
owner_id INTEGER NOT NULL, owner_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
owner_ip CHAR(16) NOT NULL, owner_ip SCORE_INET NOT NULL,
posted DATETIME DEFAULT NULL, posted DATETIME DEFAULT NULL,
comment TEXT NOT NULL, comment TEXT NOT NULL,
INDEX (image_id), INDEX (image_id),
INDEX (owner_ip), INDEX (owner_ip),
INDEX (posted) INDEX (posted)
) {$database->engine->create_table_extras}"); ");
$config->set_int("ext_comments_version", 2); $config->set_int("ext_comments_version", 2);
} }

View File

@ -1,68 +0,0 @@
<?xml version="1.0"?>
<schema version="0.3">
<!-- FIXME: mysql utf8ness -->
<table name="aliases">
<field name="oldtag" type="C" size="128"><key/><notnull/></field>
<field name="newtag" type="C" size="128"><notnull/></field>
<index name="aliases__unique"><col>oldtag</col><col>newtag</col><unique/></index>
<opt platform="mysql">DEFAULT CHARSET='utf8'</opt>
</table>
<table name="config">
<field name="name" type="C" size="128"><key/><notnull/></field>
<field name="value" type="X" size="4000"></field>
<opt platform="mysql">DEFAULT CHARSET='utf8'</opt>
</table>
<table name="images">
<field name="id" type="I"><key/><autoincrement/></field>
<field name="owner_id" type="I"><notnull/></field>
<field name="owner_ip" type="C" size="15"><notnull/></field>
<field name="filename" type="C" size="64"><notnull/></field>
<field name="filesize" type="I"><notnull/></field>
<field name="hash" type="C" size="32"><notnull/></field>
<field name="ext" type="C" size="4"><notnull/></field>
<field name="source" type="C" size="249"></field>
<field name="width" type="I"><notnull/></field>
<field name="height" type="I"><notnull/></field>
<field name="posted" type="T"><notnull/></field>
<index name="images__owner_id"><col>owner_id</col></index>
<index name="images__hash"><col>hash</col><unique/></index>
<index name="images__width"><col>width</col></index>
<index name="images__height"><col>height</col></index>
<opt platform="mysql">DEFAULT CHARSET='utf8'</opt>
</table>
<table name="users">
<field name="id" type="I"><key/><autoincrement/></field>
<field name="name" type="C" size="32"><notnull/></field>
<field name="pass" type="C" size="32"></field>
<field name="joindate" type="T"><notnull/></field>
<field name="admin" type="C" size="1"><notnull/><default value="N"/></field>
<field name="email" type="C" size="249"></field>
<index name="users__name"><col>name</col><unique/></index>
<opt platform="mysql">DEFAULT CHARSET='utf8'</opt>
</table>
<table name="tags">
<field name="id" type="I"><key/><autoincrement/></field>
<field name="tag" type="C" size="64"><notnull/></field>
<field name="count" type="I"><notnull/><default value="0"/></field>
<index name="tags__tag"><col>tag</col><unique/></index>
<opt platform="mysql">DEFAULT CHARSET='utf8'</opt>
</table>
<table name="image_tags">
<field name="image_id" type="I"><notnull/></field>
<field name="tag_id" type="I"><notnull/></field>
<index name="image_tags__image_id"><col>image_id</col></index>
<index name="image_tags__tag_id"><col>tag_id</col></index>
<index name="image_tags__key"><col>image_id</col><col>tag_id</col><unique/></index>
<opt platform="mysql">DEFAULT CHARSET='utf8'</opt>
</table>
<sql>
<query>DELETE FROM config WHERE name='db_version'</query>
<query>INSERT INTO config(name, value) VALUES('db_version', 6)</query>
</sql>
</schema>

View File

@ -53,8 +53,7 @@ if(is_readable("config.php")) {
exit; exit;
} }
require_once "core/compat.inc.php"; require_once "core/compat.inc.php";
require_once "lib/adodb/adodb.inc.php"; require_once "core/database.class.php";
require_once "lib/adodb/adodb-xmlschema03.inc.php";
do_install(); do_install();
@ -143,15 +142,62 @@ function create_tables($dsn) { // {{{
} }
else { else {
if(substr($dsn, 0, 5) == "mysql") { if(substr($dsn, 0, 5) == "mysql") {
$db->Execute("SET NAMES utf8"); $engine = new MySQL();
} }
$schema = new adoSchema($db); else if(substr($dsn, 0, 5) == "pgsql") {
$sql = $schema->ParseSchema("ext/upgrade/schema.xml"); $engine = new PostgreSQL();
$result = $schema->ExecuteSchema(); }
$engine->init($db);
if(!$result) { $db->execute($engine->create_table_sql("aliases", "
die("Error creating tables from XML schema"); oldtag VARCHAR(128) NOT NULL PRIMARY KEY,
} newtag VARCHAR(128) NOT NULL,
UNIQUE(oldtag, newtag)
"));
$db->execute($engine->create_table_sql("config", "
name VARCHAR(128) NOT NULL PRIMARY KEY,
value TEXT
"));
$db->execute($engine->create_table_sql("images", "
id SCORE_AIPK,
owner_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
owner_ip SCORE_INET NOT NULL,
filename VARCHAR(64) NOT NULL,
filesize INTEGER NOT NULL,
hash CHAR(32) NOT NULL,
ext CHAR(4) NOT NULL,
source VARCHAR(255),
width INTEGER NOT NULL,
height INTEGER NOT NULL,
posted TIMESTAMP NOT NULL DEFAULT SCORE_NOW,
INDEX(owner_id),
INDEX(hash),
INDEX(width),
INDEX(height)
"));
$db->execute($engine->create_table_sql("users", "
id SCORE_AIPK,
name VARCHAR(32) NOT NULL,
pass CHAR(32),
joindate DATATIME NOT NULL DEFAULT SCORE_NOW,
admin SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N,
email VARCHAR(128),
INDEX(name)
"));
$db->execute($engine->create_table_sql("tags", "
id SCORE_AIPK,
tag VARCHAR(64) NOT NULL,
count NOT NULL DEFAULT 0,
INDEX(tag)
"));
$db->execute($engine->create_table_sql("image_tags", "
image_id INTEGER REFERENCES images(id) ON DELETE CASCADE,
tag_id INTEGER REFERENCES tags(id) ON DELETE CASCADE,
INDEX(image_id),
INDEX(tag_id),
INDEX(image_id, tag_id)
"));
$db->execute("INSERT INTO config(name, value) VALUES('db_version', 7)");
} }
$db->Close(); $db->Close();
} // }}} } // }}}
@ -220,7 +266,7 @@ function write_config($dsn) { // {{{
<p><textarea cols="80" rows="2">$file_content</textarea> <p><textarea cols="80" rows="2">$file_content</textarea>
<p>One done, <a href='index.php?q=setup'>Continue</a> <p>One done, <a href='index.php'>Continue</a>
EOD; EOD;
exit; exit;
} }

File diff suppressed because it is too large Load Diff