xml schema for installer

git-svn-id: file:///home/shish/svn/shimmie2/trunk@704 7f39781d-f577-437e-ae19-be835c7a54ca
This commit is contained in:
shish 2008-01-27 15:33:59 +00:00
parent 980ebd5189
commit 4fb0092742

View File

@ -1,7 +1,16 @@
<?php if(false) { ?>
<html> <html>
<!--
- install.php (c) Shish 2007
-
- Initialise the database, check that folder
- permissions are set properly, set an admin
- account.
-
- This file should be independant of the database
- and other such things that aren't ready yet
-->
<head> <head>
<title>Error</title> <title>Shimmie Installation</title>
<style> <style>
BODY {background: #EEE;font-family: "Arial", sans-serif;font-size: 14px;} BODY {background: #EEE;font-family: "Arial", sans-serif;font-size: 14px;}
H1, H3 {border: 1px solid black;background: #DDD;text-align: center;} H1, H3 {border: 1px solid black;background: #DDD;text-align: center;}
@ -11,9 +20,12 @@ FORM {margin: 0px;}
A {text-decoration: none;} A {text-decoration: none;}
A:hover {text-decoration: underline;} A:hover {text-decoration: underline;}
#block {width: 512px; margin: auto; margin-top: 64px;} #block {width: 512px; margin: auto; margin-top: 64px;}
#iblock {width: 512px; margin: auto; margin-top: 16px;}
TD INPUT {width: 350px;}
</style> </style>
</head> </head>
<body> <body>
<?php if(false) { ?>
<div id="block"> <div id="block">
<h1>Install Error</h1> <h1>Install Error</h1>
<p>Shimmie needs to be run via a web server with PHP support -- you <p>Shimmie needs to be run via a web server with PHP support -- you
@ -26,23 +38,25 @@ A:hover {text-decoration: underline;}
documentation wiki</a>. documentation wiki</a>.
</div> </div>
<div style="display: none;"> <div style="display: none;">
<PLAINTEXT>
<?php } <?php }
/*
* install.php (c) Shish 2007
*
* Initialise the database, check that folder
* permissions are set properly, set an admin
* account.
*
* This file should be independant of the database
* and other such things that aren't ready yet
*/
// FIXME: should be called from index // FIXME: should be called from index
do_install();
assert_options(ASSERT_ACTIVE, 1); assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_BAIL, 1); assert_options(ASSERT_BAIL, 1);
/*
* This file lets anyone destroy the database -- disable it
* as soon as the admin is done installing for the first time
*/
if(is_readable("config.php")) {
echo "'config.php' exists -- install function is disabled";
exit;
}
require_once "lib/adodb/adodb.inc.php";
require_once "lib/adodb/adodb-xmlschema03.inc.php";
do_install();
// utilities {{{ // utilities {{{
function installer_write_file($fname, $data) { function installer_write_file($fname, $data) {
$fp = fopen($fname, "w"); $fp = fopen($fname, "w");
@ -68,19 +82,16 @@ function check_gd_version() {
return $gdversion; return $gdversion;
} }
function check_im_version() {
if(!ini_get('safe_mode')) {
$convert_check = exec("convert");
}
return (empty($convert_check) ? 0 : 1);
}
// }}} // }}}
// init {{{ // init {{{
function do_install() { function do_install() {
/*
* This file lets anyone destroy the database -- disable it
* as soon as the admin is done installing for the first time
*/
if(is_readable("config.php")) {
echo "'config.php' exists -- install function is disabled";
exit;
}
require_once "lib/adodb/adodb.inc.php";
session_start(); // hold temp stuff in session session_start(); // hold temp stuff in session
$stage = isset($_GET['stage']) ? $_GET['stage'] : "begin"; $stage = isset($_GET['stage']) ? $_GET['stage'] : "begin";
@ -93,31 +104,16 @@ function do_install() {
function begin() { function begin() {
if(check_gd_version() == 0) { if(check_gd_version() == 0 && check_im_version() == 0) {
$gd = "<h3>Error</h3>\nPHP's GD extension seems to be missing; ". $gd = "<h3>Error</h3>\nPHP's GD extension seems to be missing, ".
"you can live without it if you have imagemagick installed..."; "and imagemagick's \"convert\" command cannot be found - ".
"no thumbnailing engines are available.";
} }
else { else {
$gd = ""; $gd = "";
} }
print <<<EOD print <<<EOD
<html>
<head>
<title>Shimmie2 Installer</title>
<style>
BODY {background: #EEE;font-family: "Arial", sans-serif;font-size: 14px;}
H1, H3 {border: 1px solid black;background: #DDD;text-align: center;}
H1 {margin-top: 0px;margin-bottom: 0px;padding: 2px;}
H3 {margin-top: 32px;padding: 1px;}
FORM {margin: 0px;}
A {text-decoration: none;}
A:hover {text-decoration: underline;}
#iblock {width: 512px; margin: auto; margin-top: 16px;}
TD INPUT {width: 350px;}
</style>
</head>
<body>
<div id="iblock"> <div id="iblock">
<h1>Shimmie Installer</h1> <h1>Shimmie Installer</h1>
@ -145,8 +141,6 @@ TD INPUT {width: 350px;}
<a href="http://trac.shishnet.org/shimmie2/wiki/Guides/Admin/Install">the <a href="http://trac.shishnet.org/shimmie2/wiki/Guides/Admin/Install">the
documentation wiki</a>. documentation wiki</a>.
</div> </div>
</body>
</html>
EOD; EOD;
} }
// }}} // }}}
@ -164,26 +158,16 @@ function create_tables($dsn) { // {{{
} }
else { else {
if(substr($dsn, 0, 5) == "mysql") { if(substr($dsn, 0, 5) == "mysql") {
if(create_tables_mysql($db)) { $db->Execute("SET NAMES utf8");
$_SESSION['tables_created'] = true;
}
}
else if(substr($dsn, 0, 5) == "pgsql" || substr($dsn, 0, 8) == "postgres") {
if(create_tables_pgsql($db)) {
$_SESSION['tables_created'] = true;
}
}
else if(substr($dsn, 0, 6) == "sqlite") {
if(create_tables_sqlite($db)) {
$_SESSION['tables_created'] = true;
}
}
else {
die("This database format isn't currently supported. Please use either MySQL, PostgreSQL, or SQLite.");
} }
$schema = new adoSchema($db);
$sql = $schema->ParseSchema("ext/upgrade/schema.xml");
echo "<pre>"; var_dump($sql); echo "</pre>";
$result = $schema->ExecuteSchema();
if(!isset($_SESSION['tables_created']) || !$_SESSION['tables_created']) { if(!$result) {
die("Error creating tables"); define( 'XMLS_DEBUG', TRUE );
die("Error creating tables from XML schema");
} }
} }
$db->Close(); $db->Close();
@ -228,9 +212,6 @@ function write_config($dsn) { // {{{
else { else {
$h_file_content = htmlentities($file_content); $h_file_content = htmlentities($file_content);
print <<<EOD print <<<EOD
<html>
<head><title>Shimmie2 Installer</title></head>
<body>
The web server isn't allowed to write to the config file; please copy The web server isn't allowed to write to the config file; please copy
the text below, save it as 'config.php', and upload it into the shimmie the text below, save it as 'config.php', and upload it into the shimmie
folder manually. Make sure that when you save it, there is no whitespace folder manually. Make sure that when you save it, there is no whitespace
@ -239,15 +220,11 @@ 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?q=setup'>Continue</a>
</body>
</html>
EOD; EOD;
session_destroy(); session_destroy();
exit; exit;
} }
} // }}} } // }}}
// }}}
// install {{{
function install_process() { // {{{ function install_process() { // {{{
if(!isset($_POST['database_dsn']) || !isset($_POST["admin_name"]) || !isset($_POST["admin_pass"])) { if(!isset($_POST['database_dsn']) || !isset($_POST["admin_name"]) || !isset($_POST["admin_pass"])) {
die("Install is missing some paramaters (database_dsn, admin_name, or admin_pass)"); die("Install is missing some paramaters (database_dsn, admin_name, or admin_pass)");
@ -294,111 +271,14 @@ function insert_defaults($dsn, $admin_name, $admin_pass) { // {{{
$admin_pass = md5(strtolower($admin_name).$admin_pass); $admin_pass = md5(strtolower($admin_name).$admin_pass);
$db->Execute($user_insert, Array($admin_name, $admin_pass, 'Y')); $db->Execute($user_insert, Array($admin_name, $admin_pass, 'Y'));
if(!ini_get('safe_mode')) { if(check_im_version() > 0) {
$convert_check = exec("convert");
if(!empty($convert_check)) {
$db->Execute($config_insert, Array('thumb_engine', 'convert')); $db->Execute($config_insert, Array('thumb_engine', 'convert'));
} }
}
$db->Close(); $db->Close();
} }
} // }}} } // }}}
// }}} // }}}
// table creation {{{
/*
* Note: try and keep this as ANSI SQL compliant as possible,
* so that we can (in theory) support other databases
*/
function create_tables_common($db, $auto_incrementing_id, $boolean, $true, $false, $ip) {
$db->Execute("CREATE TABLE aliases (
oldtag VARCHAR(255) NOT NULL PRIMARY KEY,
newtag VARCHAR(255) NOT NULL
)");
$db->Execute("CREATE TABLE config (
name VARCHAR(255) NOT NULL PRIMARY KEY,
value TEXT
)");
$db->Execute("CREATE TABLE images (
id $auto_incrementing_id,
owner_id INTEGER NOT NULL,
owner_ip $ip,
filename VARCHAR(64) NOT NULL DEFAULT '',
filesize INTEGER NOT NULL,
hash CHAR(32) NOT NULL UNIQUE,
ext CHAR(4) NOT NULL,
source VARCHAR(255),
width INTEGER NOT NULL,
height INTEGER NOT NULL,
posted TIMESTAMP NOT NULL
)");
$db->Execute("CREATE TABLE users (
id $auto_incrementing_id,
name VARCHAR(32) NOT NULL UNIQUE,
pass CHAR(32),
joindate DATETIME NOT NULL,
enabled $boolean NOT NULL DEFAULT $true,
admin $boolean NOT NULL DEFAULT $false,
email VARCHAR(255)
)");
$db->Execute("CREATE TABLE layout (
title VARCHAR(64) PRIMARY KEY NOT NULL,
section VARCHAR(32) NOT NULL DEFAULT 'left',
position INTEGER NOT NULL DEFAULT 50,
visible $boolean DEFAULT $true
)");
$db->Execute("CREATE TABLE tags (
id $auto_incrementing_id,
tag VARCHAR(64) NOT NULL UNIQUE,
count INTEGER NOT NULL DEFAULT 0
)");
$db->Execute("CREATE INDEX tags__count ON tags(count)");
$db->Execute("CREATE TABLE image_tags (
image_id INTEGER NOT NULL DEFAULT 0,
tag_id INTEGER NOT NULL DEFAULT 0,
UNIQUE (image_id, tag_id)
)");
$db->Execute("CREATE INDEX image_tags__tag_id ON image_tags(tag_id)");
$db->Execute("CREATE INDEX image_tags__image_id ON image_tags(image_id)");
$db->Execute("INSERT INTO config(name, value) VALUES(?, ?)", Array('db_version', 5));
}
function create_tables_mysql($db) {
$db->StartTrans();
$db->Execute("SET NAMES utf8");
create_tables_common($db,
"INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY",
"ENUM('Y', 'N')", "'Y'", "'N'",
"CHAR(15)"
);
return $db->CommitTrans();
}
function create_tables_pgsql($db) {
$db->StartTrans();
create_tables_common($db,
"SERIAL NOT NULL PRIMARY KEY",
"BOOLEAN", "True", "False",
"INET"
);
return $db->CommitTrans();
}
function create_tables_sqlite($db) {
$db->StartTrans();
create_tables_common($db,
"INTEGER AUTOINCREMENT PRIMARY KEY NOT NULL",
"CHAR(1)", "'Y'", "'N'",
"CHAR(15)"
);
return $db->CommitTrans();
}
// }}}
?> ?>
</body>
</html>