First shot at switching to database revision numbers separate from release version number. There are probably bugs, especially related to migration.
authorDan Fuhry <dan@enanocms.org>
Thu, 01 Jul 2010 20:24:19 -0400
changeset 1259 49db7495f6b8
parent 1258 d972b1276d95
child 1260 cd72bcd83401
First shot at switching to database revision numbers separate from release version number. There are probably bugs, especially related to migration.
includes/common.php
includes/functions.php
install/includes/common.php
install/includes/libenanoinstall.php
install/includes/payload.php
install/index.php
install/schemas/upgrade/1.0-1.0.1-mysql.sql
install/schemas/upgrade/1.0.1-1.0.2b1-mysql.sql
install/schemas/upgrade/1.0.2-1.0.3-mysql.sql
install/schemas/upgrade/1.0.2b1-1.0.2-mysql.sql
install/schemas/upgrade/1.0.3-1.0.4-mysql.sql
install/schemas/upgrade/1.0.4-1.0.5-mysql.sql
install/schemas/upgrade/1.0.5-1.0.6-mysql.sql
install/schemas/upgrade/1.0.6-1.0.6pl1-mysql.sql
install/schemas/upgrade/1.1.1-1.1.2-mysql.sql
install/schemas/upgrade/1.1.1-1.1.2-postgresql.sql
install/schemas/upgrade/1.1.2-1.1.3-mysql.sql
install/schemas/upgrade/1.1.2-1.1.3-postgresql.sql
install/schemas/upgrade/1.1.3-1.1.4-mysql.sql
install/schemas/upgrade/1.1.3-1.1.4-postgresql.sql
install/schemas/upgrade/1.1.4-1.1.5-mysql.sql
install/schemas/upgrade/1.1.4-1.1.5-postgresql.sql
install/schemas/upgrade/1.1.5-1.1.6-mysql.sql
install/schemas/upgrade/1.1.5-1.1.6-postgresql.sql
install/schemas/upgrade/1.1.5-1.1.6.php
install/schemas/upgrade/1.1.6-1.1.7-mysql.sql
install/schemas/upgrade/1.1.6-1.1.7-postgresql.sql
install/schemas/upgrade/1.1.6-1.1.7.php
install/schemas/upgrade/1.1.7-1.1.8-mysql.sql
install/schemas/upgrade/1.1.7-1.1.8-postgresql.sql
install/schemas/upgrade/1124.php
install/schemas/upgrade/1125.php
install/schemas/upgrade/mysql/1010.sql
install/schemas/upgrade/mysql/1019.sql
install/schemas/upgrade/mysql/1020.sql
install/schemas/upgrade/mysql/1030.sql
install/schemas/upgrade/mysql/1040.sql
install/schemas/upgrade/mysql/1050.sql
install/schemas/upgrade/mysql/1060.sql
install/schemas/upgrade/mysql/1061.sql
install/schemas/upgrade/mysql/1120.sql
install/schemas/upgrade/mysql/1121.sql
install/schemas/upgrade/mysql/1122.sql
install/schemas/upgrade/mysql/1123.sql
install/schemas/upgrade/mysql/1124.sql
install/schemas/upgrade/mysql/1125.sql
install/schemas/upgrade/postgresql/1120.sql
install/schemas/upgrade/postgresql/1121.sql
install/schemas/upgrade/postgresql/1122.sql
install/schemas/upgrade/postgresql/1123.sql
install/schemas/upgrade/postgresql/1124.sql
install/schemas/upgrade/postgresql/1125.sql
install/upgrade.php
language/english/admin.json
language/english/install.json
plugins/admin/Home.php
--- a/includes/common.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/includes/common.php	Thu Jul 01 20:24:19 2010 -0400
@@ -45,6 +45,12 @@
 // You'll want to change this for custom distributions.
 $version = '1.1.8';
 
+// Database schema version
+// This is incremented each time a change to the database structure is made.
+// If it doesn't match the version in the DB, the user will be asked to upgrade.
+// This must match install/includes/common.php!
+$db_version = 1125;
+
 /**
  * Returns a floating-point number with the current UNIX timestamp in microseconds. Defined very early because we gotta call it
  * from very early on in the script to measure the starting time of Enano.
@@ -263,10 +269,29 @@
 	return true;
 }
 
-// Now that we have the config, check the Enano version.
-if ( enano_version(false, true) != $version && !defined('IN_ENANO_UPGRADE') )
+// Now that we have the config, check the database version.
+// ...We do have a database version, right? This was only added in 1.1.8, so assign
+// a database revision number if there isn't one in the config already.
+if ( getConfig('db_version') === false )
+{
+	generate_db_version();
+}
+if ( ($current_db_revision = getConfig('db_version', 0)) < $db_version && !defined('IN_ENANO_UPGRADE') )
 {
-	grinding_halt('Version mismatch', '<p>It seems that the Enano release we\'re trying to run ('.$version.') is different from the version specified in your database ('.enano_version().'). Perhaps you need to <a href="'.scriptPath.'/install/index.php">upgrade</a>?</p>');
+	grinding_halt('Database out of date', '<p>Your Enano database is out of date and needs to be upgraded. To do this, use the <a href="'.scriptPath.'/install/index.php">upgrade script</a>.</p>'
+		. "<p>Your database version: $current_db_revision<br />Latest version: $db_version</p>");
+}
+else if ( $current_db_revision > $db_version )
+{
+	grinding_halt('Database newer than Enano', '<p>Your Enano database is a newer revision than what this Enano release calls for. Please upgrade your Enano files.</p>'
+		. "<p>Your database version: $current_db_revision<br />Latest version: $db_version</p>");
+}
+
+// If we made it here, DB is up to date.
+if ( getConfig('enano_version') !== $version && !preg_match('/^upg-/', getConfig('enano_version')) )
+{
+	setConfig('enano_version', $version);
+	setConfig('newly_upgraded', 1);
 }
 
 // Set our CDN path
--- a/includes/functions.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/includes/functions.php	Thu Jul 01 20:24:19 2010 -0400
@@ -1422,6 +1422,41 @@
 }
 
 /**
+ * Set the database revision number if we don't have one.
+ */
+
+function generate_db_version()
+{
+	if ( getConfig('db_version') !== false )
+		return;
+	
+	$dbversions = array(
+			'1.0' => 1000,
+			'1.0.1' => 1010,
+			'1.0.2b1' => 1019,
+			'1.0.2' => 1020,
+			'1.0.3' => 1030,
+			'1.0.4' => 1040,
+			'1.0.5' => 1050,
+			'1.0.6' => 1060,
+			'1.0.6pl1' => 1070,
+			'1.1.1' => 1119,
+			'1.1.2' => 1120,
+			'1.1.3' => 1121,
+			'1.1.4' => 1122,
+			'1.1.5' => 1123,
+			'1.1.6' => 1124,
+			'1.1.7' => 1125,
+			'1.1.7pl1' => 1125,
+			'1.1.8' => 1125
+		);
+	if ( isset($dbversions[ enano_version(true, false) ]) )
+	{
+		setConfig('db_version', $dbversions[ enano_version(true, false) ]);
+	}
+}
+
+/**
  * Badly named function to send back eval'able Javascript code with an error message. Deprecated, use JSON instead.
  * @param string Message to send
  */
--- a/install/includes/common.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/install/includes/common.php	Thu Jul 01 20:24:19 2010 -0400
@@ -21,6 +21,12 @@
 	// 'sub' => '3' will produce Enano 1.1.1a3 / Enano 1.1.1 alpha 3
 );
 
+// Database schema version
+// This is incremented each time a change to the database structure is made.
+// If it doesn't match the version in the DB, the user will be asked to upgrade.
+// This must match includes/common.php!
+$db_version = 1125;
+
 function installer_enano_version($long = false)
 {
 	global $installer_version;
--- a/install/includes/libenanoinstall.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/install/includes/libenanoinstall.php	Thu Jul 01 20:24:19 2010 -0400
@@ -116,7 +116,7 @@
 	exit;
 }
 
-function enano_perform_upgrade($target_branch)
+function enano_perform_upgrade($target_rev)
 {
 	global $db, $session, $paths, $template, $plugins; // Common objects
 	// Import version info
@@ -133,64 +133,52 @@
 		return true;
 	}
 	
+	//
 	// Main upgrade stage
-	
-	// Init vars
-	list($major_version, $minor_version) = explode('.', installer_enano_version());
-	$installer_branch = "$major_version.$minor_version";
-	$installer_branch = preg_replace('/^upg-/', '', $installer_branch);
-	$target_branch = preg_replace('/^upg-/', '', $target_branch);
-	
-	$version_flipped = array_flip($enano_versions[$target_branch]);
-	$version_curr = enano_version();
-	// Change this to be the last version in the current branch.
-	// If we're just upgrading within this branch, use the version the installer library
-	// reports to us. Else, use the latest in the old (current target) branch.
-	// $version_target = installer_enano_version();
-	$version_target = ( $target_branch === $installer_branch ) ? installer_enano_version() : $enano_versions[$target_branch][ count($enano_versions[$target_branch]) - 1 ];
+	//
 	
 	// Calculate which scripts to run
-	if ( !isset($version_flipped[$version_curr]) )
+	$versions_avail = array();
+	
+	$dir = ENANO_ROOT . "/install/schemas/upgrade/$dbdriver/";
+	if ( $dh = @opendir($dir) )
 	{
-		echo '<p>ERROR: Unsupported version</p>';
-		$ui->show_footer();
-		exit;
-	}
-	if ( !isset($version_flipped[$version_target]) )
-	{
-		echo '<p>ERROR: Upgrader doesn\'t support its own version</p>';
-		$ui->show_footer();
-		exit;
+		while ( $di = @readdir($dh) )
+		{
+			if ( preg_match('/^[0-9]+\.sql$/', $di) )
+				$versions_avail[] = intval($di);
+		}
 	}
-	$upg_queue = array();
-	for ( $i = $version_flipped[$version_curr]; $i < $version_flipped[$version_target]; $i++ )
+	else
 	{
-		if ( !isset($enano_versions[$target_branch][$i + 1]) )
-		{
-			echo '<p>ERROR: Unsupported intermediate version</p>';
-			$ui->show_footer();
-			exit;
-		}
-		$ver_this = $enano_versions[$target_branch][$i];
-		$ver_next = $enano_versions[$target_branch][$i + 1];
-		$upg_queue[] = array($ver_this, $ver_next);
+		return false;
 	}
 	
-	// Verify that all upgrade scripts are usable
-	foreach ( $upg_queue as $verset )
+	// sort version list numerically
+	asort($versions_avail);
+	$versions_avail = array_values($versions_avail);
+	
+	$last_rev = $versions_avail[ count($versions_avail) - 1 ];
+	
+	$current_rev = getConfig('db_version', 0);
+	
+	if ( $last_rev <= $current_rev )
+		return true;
+	
+	foreach ( $versions_avail as $i => $ver )
 	{
-		$file = ENANO_ROOT . "/install/schemas/upgrade/{$verset[0]}-{$verset[1]}-$dbdriver.sql";
-		if ( !file_exists($file) )
+		if ( $ver > $current_rev )
 		{
-			echo "<p>ERROR: Couldn't find required schema file: $file</p>";
-			$ui->show_footer();
-			exit;
+			$upg_queue = array_slice($versions_avail, $i);
+			break;
 		}
 	}
+	
 	// Perform upgrade
-	foreach ( $upg_queue as $verset )
+	foreach ( $upg_queue as $version )
 	{
-		$file = ENANO_ROOT . "/install/schemas/upgrade/{$verset[0]}-{$verset[1]}-$dbdriver.sql";
+		$file = "{$dir}$version.sql";
+		
 		try
 		{
 			$parser = new SQL_Parser($file);
@@ -210,7 +198,7 @@
 		{
 			// It's empty, report success for this version
 			// See below for explanation of why setConfig() is called here
-			setConfig('enano_version', $verset[1]);
+			setConfig('db_version', $version);
 			continue;
 		}
 		
@@ -231,7 +219,7 @@
 		}
 		
 		// Is there an additional script (logic) to be run after the schema?
-		$postscript = ENANO_ROOT . "/install/schemas/upgrade/{$verset[0]}-{$verset[1]}.php";
+		$postscript = ENANO_ROOT . "/install/schemas/upgrade/$version.php";
 		if ( file_exists($postscript) )
 			@include($postscript);
 		
@@ -242,7 +230,7 @@
 		// need some sort of query-numbering system that tracks in-progress
 		// upgrades.
 		
-		setConfig('enano_version', $verset[1]);
+		setConfig('db_version', $version);
 	}
 }
 
--- a/install/includes/payload.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/install/includes/payload.php	Thu Jul 01 20:24:19 2010 -0400
@@ -154,6 +154,10 @@
 			return false;
 		}
 	}
+	
+	global $db_version;
+	setConfig('db_version', $db_version);
+	
 	return true;
 }
 
@@ -569,13 +573,16 @@
 {
 	global $db, $session, $paths, $template, $plugins; // Common objects
 	// log the upgrade
+	global $db_version;
 	$q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,date_string,author,author_uid,page_text,edit_summary) VALUES'
- 				. '(\'security\', \'upgrade_enano\', ' . time() . ', \'[DEPRECATED]\', \'' . $db->escape($session->username) . '\', ' . $session->user_id . ', \'' . $db->escape(installer_enano_version()) . '\', \'' . $db->escape($_SERVER['REMOTE_ADDR']) . '\');');
+ 				. '(\'security\', \'upgrade_enano\', ' . time() . ', \'[DEPRECATED]\', \'' . $db->escape($session->username) . '\', ' . $session->user_id . ', \'' . $db->escape($db_version) . '\', \'' . $db->escape($_SERVER['REMOTE_ADDR']) . '\');');
 	if ( !$q )
 	{
 		$db->_die();
 		return false;
 	}
+	setConfig('db_version', $db_version);
 	setConfig('enano_version', installer_enano_version());
+	setConfig('newly_upgraded', 1);
 	return true;
 }
--- a/install/index.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/install/index.php	Thu Jul 01 20:24:19 2010 -0400
@@ -101,7 +101,7 @@
 										</a>
 									</li>
 									<?php
-									if ( installer_enano_version() == enano_version(true) )
+									if ( $db_version === getConfig('db_version') )
 									{
 										echo '<li>
 										<a class="upgrade-disabled icon icon-disabled">
--- a/install/schemas/upgrade/1.0-1.0.1-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
--- Enano CMS
--- Upgrade schema - Enano 1.0 - 1.0.1
-
--- Fix for obnoxious $_GET issue
-UPDATE {{TABLE_PREFIX}}sidebar SET block_type=1,block_content='<div class="slideblock2" style="padding: 0px;"><form action="$CONTENTPATH$$NS_SPECIAL$Search" method="get" style="padding: 0; margin: 0;"><p><input type="hidden" name="title" value="$NS_SPECIAL$Search" />$INPUT_AUTH$<input name="q" alt="Search box" type="text" size="10" style="width: 70%" /> <input type="submit" value="Go" style="width: 20%" /></p></form></div>' WHERE block_name='Search' AND item_id=4;
--- Added on advice from Neal
--- Remember that 1 = AUTH_DENY.
-INSERT INTO {{TABLE_PREFIX}}acl(target_type,target_id,page_id,namespace,rules) VALUES(2,1,'Memberlist','Special','read=1;mod_misc=1;upload_files=1;upload_new_version=1;create_page=1;edit_acl=1;');
--- Bugfix for MySQL 5.0.45, see http://forum.enanocms.org/viewtopic.php?f=5&t=8
-ALTER TABLE {{TABLE_PREFIX}}pages MODIFY COLUMN delvote_ips text DEFAULT NULL;
-CREATE TABLE {{TABLE_PREFIX}}page_groups( pg_id mediumint(8) NOT NULL auto_increment, pg_type tinyint(2) NOT NULL DEFAULT 1, pg_name varchar(255) NOT NULL DEFAULT '', pg_target varchar(255) DEFAULT NULL, PRIMARY KEY ( pg_id ) ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
-CREATE TABLE {{TABLE_PREFIX}}page_group_members( pg_member_id int(12) NOT NULL auto_increment, pg_id mediumint(8) NOT NULL, page_id varchar(63) NOT NULL, namespace varchar(63) NOT NULL DEFAULT 'Article', PRIMARY KEY ( pg_member_id ) ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
-CREATE TABLE {{TABLE_PREFIX}}tags( tag_id int(12) NOT NULL auto_increment, tag_name varchar(63) NOT NULL DEFAULT 'bla', page_id varchar(255) NOT NULL, namespace varchar(255) NOT NULL, user mediumint(8) NOT NULL DEFAULT 1, PRIMARY KEY ( tag_id ) ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
-UPDATE {{TABLE_PREFIX}}acl SET rules=CONCAT(rules,'tag_create=4;tag_delete_own=4;tag_delete_other=4;') WHERE target_type=1 AND target_id=2;
-DELETE FROM {{TABLE_PREFIX}}search_cache;
-
--- a/install/schemas/upgrade/1.0.1-1.0.2b1-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.0.2-1.0.3-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.0.2b1-1.0.2-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
--- Enano CMS
--- Upgrade schema - Enano 1.0.2 beta 1 - 1.0.2 release
-
--- This is really optional, but could reduce confusion if regex page groups get truncated for no apparent reason.
-ALTER TABLE {{TABLE_PREFIX}}page_groups MODIFY COLUMN pg_target text DEFAULT NULL;
-
--- I have no idea how or why, but the f'ing index didn't get created for who-knows-how-many releases.
--- We'll attempt to create it here, but don't die if it fails
-@ALTER TABLE {{TABLE_PREFIX}}page_text ENGINE = MYISAM, COLLATE = utf8_bin, CHARSET = utf8;
-ALTER TABLE {{TABLE_PREFIX}}search_index CHARSET = utf8, COLLATE = utf8_bin, MODIFY COLUMN word varchar(64) NOT NULL;
-
--- The search cache is no longer needed because of the new unified search engine (it's too f'ing fast to need a cache :-D)
-@DROP TABLE {{TABLE_PREFIX}}search_cache;
-
--- Yes, it appears we need pages with names this long after all
-ALTER TABLE {{TABLE_PREFIX}}pages MODIFY COLUMN urlname varchar(255), MODIFY COLUMN name varchar(255);
-
--- Make page_text a little more efficient to deal with
-ALTER TABLE {{TABLE_PREFIX}}page_text MODIFY COLUMN page_id varchar(255), MODIFY COLUMN namespace varchar(63), MODIFY COLUMN page_text longtext;
-
--- Now recreate the fulltext index
-@CREATE FULLTEXT INDEX {{TABLE_PREFIX}}page_search_idx ON {{TABLE_PREFIX}}page_text(page_id, namespace, page_text);
-
--- Addition of new file types
-UPDATE {{TABLE_PREFIX}}config SET config_value='cbf:len=185;crc=55fb6f14;data=0[1],1[4],0[3],1[1],0[22],1[1],0[16],1[3],0[16],1[1],0[1],1[2],0[6],1[1],0[1],1[1],0[4],1[2],0[3],1[1],0[48],1[2],0[2],1[1],0[4],1[1],0[37]|end' WHERE config_name = 'allowed_mime_types' AND config_value='cbf:len=168;crc=c3dcad3f;data=0[1],1[4],0[3],1[1],0[2],1[1],0[11],1[1],0[7],1[1],0[9],1[1],0[6],1[3],0[10],1[1],0[2],1[2],0[1],1[1],0[1],1[2],0[6],1[3],0[1],1[1],0[2],1[4],0[1],1[2],0[3],1[1],0[4],1[2],0[26],1[5],0[6],1[2],0[2],1[1],0[4],1[1],0[10],1[2],0[1],1[1],0[6]|end';
-
--- Reinforcement of "stable release" mentality
-@UPDATE {{TABLE_PREFIX}}users SET theme='oxygen', style='bleu' WHERE user_id = 2;
-
--- a/install/schemas/upgrade/1.0.3-1.0.4-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.0.4-1.0.5-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.0.5-1.0.6-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.0.6-1.0.6pl1-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.1.1-1.1.2-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
--- Enano CMS
--- Upgrade schema - Enano 1.1.1 - 1.1.2
-
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN log_id int(15) NOT NULL auto_increment, ADD PRIMARY KEY ( log_id );
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN is_draft tinyint(1) NOT NULL DEFAULT 0;
-
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank int(12) UNSIGNED NOT NULL DEFAULT 1;
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_timezone int(12) UNSIGNED NOT NULL DEFAULT 1440;
-
-@ALTER TABLE {{TABLE_PREFIX}}tags CHANGE user user_id mediumint(8) NOT NULL DEFAULT 1;
-ALTER TABLE {{TABLE_PREFIX}}themes
-  ADD COLUMN group_list text DEFAULT NULL,
-  ADD COLUMN group_policy ENUM('allow', 'deny') NOT NULL DEFAULT 'deny';
-
-CREATE TABLE {{TABLE_PREFIX}}ranks(
-  rank_id int(12) NOT NULL auto_increment,
-  rank_title varchar(63) NOT NULL DEFAULT '',
-  rank_style varchar(255) NOT NULL DEFAULT '',
-  PRIMARY KEY ( rank_id )
-) CHARACTER SET `utf8` COLLATE `utf8_bin`;
-
-CREATE TABLE {{TABLE_PREFIX}}captcha(
-  code_id int(12) NOT NULL auto_increment,
-  session_id varchar(40) NOT NULL DEFAULT '',
-  code varchar(64) NOT NULL DEFAULT '',
-  session_data text,
-  source_ip varchar(39),
-  user_id int(12),
-  PRIMARY KEY ( code_id )
-) CHARACTER SET `utf8` COLLATE `utf8_bin`;
-
-INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
-  (1, 'user_rank_member', ''),
-  (2, 'user_rank_mod', 'font-weight: bold; color: #00AA00;'),
-  (3, 'user_rank_admin', 'font-weight: bold; color: #AA0000;');
-
--- a/install/schemas/upgrade/1.1.1-1.1.2-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
--- Enano CMS
--- Upgrade schema - Enano 1.1.1 - 1.1.2
-
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN log_id SERIAL, ADD PRIMARY KEY ( log_id );
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN is_draft smallint NOT NULL DEFAULT 0;
-
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank int NOT NULL DEFAULT 1;
-@ALTER TABLE {{TABLE_PREFIX}}users DROP user_timezone;
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_timezone int NOT NULL DEFAULT 1440;
-
-ALTER TABLE {{TABLE_PREFIX}}themes
-  ADD COLUMN group_list text DEFAULT NULL,
-  ADD COLUMN group_policy varchar(5) NOT NULL DEFAULT 'deny',
-  ADD CHECK (group_policy IN ('allow', 'deny'));
-
-CREATE TABLE {{TABLE_PREFIX}}ranks(
-  rank_id SERIAL,
-  rank_title varchar(63) NOT NULL DEFAULT '',
-  rank_style varchar(255) NOT NULL DEFAULT '',
-  PRIMARY KEY ( rank_id )
-);
-
-CREATE TABLE {{TABLE_PREFIX}}captcha(
-  code_id SERIAL,
-  session_id varchar(40) NOT NULL DEFAULT '',
-  code varchar(64) NOT NULL DEFAULT '',
-  session_data text,
-  source_ip varchar(39),
-  user_id int,
-  PRIMARY KEY ( code_id )
-);
-
-INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
-  (1, 'user_rank_member', ''),
-  (2, 'user_rank_mod', 'font-weight: bold; color: #00AA00;'),
-  (3, 'user_rank_admin', 'font-weight: bold; color: #AA0000;');
-
--- For some reason this is required, it came up in my QA testing on a2hosting
-SELECT NEXTVAL('{{TABLE_PREFIX}}ranks_rank_id_seq'::regclass);
-
--- a/install/schemas/upgrade/1.1.2-1.1.3-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
--- Enano CMS
--- Upgrade schema: 1.1.2 - 1.1.3
-
--- Storing obscenely huge integers as strings since that's how php processes them.
-
-CREATE TABLE {{TABLE_PREFIX}}diffiehellman (
-  key_id int(12) NOT NULL auto_increment,
-  private_key text,
-  public_key text,
-  PRIMARY KEY ( key_id )
-) CHARACTER SET `utf8` COLLATE `utf8_bin`;
-
-ALTER TABLE {{TABLE_PREFIX}}session_keys MODIFY COLUMN source_ip varchar(39) NOT NULL DEFAULT '127.0.0.1';
-ALTER TABLE {{TABLE_PREFIX}}themes MODIFY COLUMN group_policy ENUM('allow_all', 'whitelist', 'blacklist') NOT NULL DEFAULT 'allow_all';
-UPDATE {{TABLE_PREFIX}}themes SET group_policy = 'allow_all';
--- a/install/schemas/upgrade/1.1.2-1.1.3-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
--- Enano CMS
--- Upgrade schema: 1.1.2 - 1.1.3
-
--- Storing obscenely huge integers as strings since that's how php processes them.
-
-CREATE TABLE {{TABLE_PREFIX}}diffiehellman (
-  key_id SERIAL,
-  private_key text,
-  public_key text,
-  PRIMARY KEY ( key_id )
-);
-
-ALTER TABLE {{TABLE_PREFIX}}themes DROP group_policy, ADD COLUMN group_policy varchar(9) NOT NULL DEFAULT 'allow_all', ADD CHECK ( group_policy IN ('allow_all', 'whitelist', 'blacklist') );
-
-ALTER TABLE {{TABLE_PREFIX}}session_keys ALTER COLUMN source_ip TYPE varchar(39),
-                                         ADD CHECK ( source_ip IS NOT NULL ),
-                                         ALTER COLUMN source_ip SET DEFAULT '127.0.0.1';
-
--- a/install/schemas/upgrade/1.1.3-1.1.4-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
--- This is really honestly a better way to handle plugins.
-
-CREATE TABLE {{TABLE_PREFIX}}plugins (
-  plugin_id int(12) NOT NULL auto_increment,
-  plugin_filename varchar(63),
-  plugin_flags int(12),
-  plugin_version varchar(16),
-  PRIMARY KEY ( plugin_id )
-) ENGINE `MyISAM` CHARACTER SET `utf8` COLLATE `utf8_bin`;
-
-ALTER TABLE {{TABLE_PREFIX}}search_index ADD COLUMN word_lcase varchar(64) NOT NULL;
-
--- User title
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_title varchar(64) DEFAULT NULL;
-ALTER TABLE {{TABLE_PREFIX}}users MODIFY COLUMN user_rank int(12) unsigned DEFAULT NULL;
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_group mediumint(5) NOT NULL DEFAULT 1;
-UPDATE {{TABLE_PREFIX}}users SET user_rank = NULL;
-
--- The "guest" rank
--- No frontend to this yet so ranks should not have been created.
-DELETE FROM {{TABLE_PREFIX}}ranks WHERE rank_id = 4;
-INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
-  (4, 'user_rank_guest', '');
-  
--- Other rank-related columns
-ALTER TABLE {{TABLE_PREFIX}}groups ADD COLUMN group_rank int(12) unsigned DEFAULT NULL;
-
--- Disable JS effects column
-ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN disable_js_fx tinyint(1) NOT NULL DEFAULT 0;
-
--- Add "grv" avatar type
-ALTER TABLE {{TABLE_PREFIX}}users MODIFY COLUMN avatar_type ENUM('png', 'gif', 'jpg', 'grv');
--- a/install/schemas/upgrade/1.1.3-1.1.4-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
--- This is really honestly a better way to handle plugins.
-
-CREATE TABLE {{TABLE_PREFIX}}plugins (
-  plugin_id SERIAL,
-  plugin_filename varchar(63),
-  plugin_flags int,
-  plugin_version varchar(16),
-  PRIMARY KEY ( plugin_id )
-);
-
--- User title
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_title varchar(64) DEFAULT NULL;
-
--- Modifications to user_rank column
--- http://pgsqld.active-venture.com/ddl-alter.html#AEN1984
-ALTER TABLE {{TABLE_PREFIX}}users ALTER COLUMN user_rank DROP NOT NULL,
-              ALTER COLUMN user_rank DROP DEFAULT;
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_group int NOT NULL DEFAULT 1;
-UPDATE {{TABLE_PREFIX}}users SET user_rank = NULL;
-              
--- Aggregate function array_accum
--- http://www.postgresql.org/docs/current/static/xaggr.html
-
-CREATE AGGREGATE {{TABLE_PREFIX}}array_accum (anyelement)
-(
-    sfunc = array_append,
-    stype = anyarray,
-    initcond = '{}'
-);
-
--- The "guest" rank
--- No frontend to this yet so ranks should not have been created.
-DELETE FROM {{TABLE_PREFIX}}ranks WHERE rank_id = 4;
-INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
-  (4, 'user_rank_guest', '');
-  
--- For some reason this is required, it came up in my QA testing on a2hosting
-SELECT NEXTVAL('{{TABLE_PREFIX}}ranks_rank_id_seq'::regclass);
-
--- Other rank-related columns
-ALTER TABLE {{TABLE_PREFIX}}groups ADD COLUMN group_rank int DEFAULT NULL;
-
--- Disable JS effects column
-ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN disable_js_fx smallint NOT NULL DEFAULT 0;
-
--- Add "grv" avatar type
-ALTER TABLE {{TABLE_PREFIX}}users DROP CONSTRAINT {{TABLE_PREFIX}}users_avatar_type_check;
-ALTER TABLE {{TABLE_PREFIX}}users ADD CONSTRAINT {{TABLE_PREFIX}}users_avatar_type_check CHECK ( avatar_type IN ( 'png', 'gif', 'jpg', 'grv' ) );
--- a/install/schemas/upgrade/1.1.4-1.1.5-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-ALTER TABLE {{TABLE_PREFIX}}session_keys ADD COLUMN key_type tinyint(1) NOT NULL DEFAULT 0;
-UPDATE {{TABLE_PREFIX}}session_keys SET key_type = 2 WHERE auth_level > 2;
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_dst varchar(11) NOT NULL DEFAULT '0;0;0;0;60';
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank_userset tinyint(1) NOT NULL DEFAULT 0;
--- a/install/schemas/upgrade/1.1.4-1.1.5-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-ALTER TABLE {{TABLE_PREFIX}}session_keys ADD COLUMN key_type smallint NOT NULL DEFAULT 0;
-UPDATE {{TABLE_PREFIX}}session_keys SET key_type = 2 WHERE auth_level > 2;
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_dst varchar(11) NOT NULL DEFAULT '0;0;0;0;60';
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank_userset smallint NOT NULL DEFAULT 0;
--- a/install/schemas/upgrade/1.1.5-1.1.6-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN password_salt varchar(40) NOT NULL DEFAULT '';
-ALTER TABLE {{TABLE_PREFIX}}pages ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
-
--- Make page_id and namespace column sizes consistent (former bug)
-
-ALTER TABLE {{TABLE_PREFIX}}comments MODIFY COLUMN page_id varchar(512) NOT NULL,
-  MODIFY COLUMN namespace varchar(16) NOT NULL;
-
-ALTER TABLE {{TABLE_PREFIX}}logs MODIFY COLUMN page_id varchar(512) NOT NULL,
-  MODIFY COLUMN namespace varchar(16) NOT NULL;
-
-ALTER TABLE {{TABLE_PREFIX}}page_text MODIFY COLUMN page_id varchar(512) NOT NULL;
-
-ALTER TABLE {{TABLE_PREFIX}}pages MODIFY COLUMN urlname varchar(512) NOT NULL;
-
-ALTER TABLE {{TABLE_PREFIX}}hits MODIFY COLUMN page_id varchar(512) NOT NULL,
-  MODIFY COLUMN namespace varchar(16) NOT NULL;
-
-ALTER TABLE {{TABLE_PREFIX}}acl MODIFY COLUMN page_id varchar(512),
-  MODIFY COLUMN namespace varchar(16);
-
-ALTER TABLE {{TABLE_PREFIX}}page_group_members MODIFY COLUMN page_id varchar(512) NOT NULL,
-  MODIFY COLUMN namespace varchar(16) NOT NULL;
-
-ALTER TABLE {{TABLE_PREFIX}}tags MODIFY COLUMN page_id varchar(512) NOT NULL,
-  MODIFY COLUMN namespace varchar(16) NOT NULL;
-
--- Added in 1.1.6: Indices for several tables
--- The size of 317 is a trial-and-error-produced value based on MySQL's index column size limit
--- of 1000 bytes. It's low like that because of the UTF-8 character set being used.
-
-@ALTER TABLE {{TABLE_PREFIX}}logs ADD INDEX {{TABLE_PREFIX}}logs_page_idx (page_id(317), namespace);
-@ALTER TABLE {{TABLE_PREFIX}}logs ADD INDEX {{TABLE_PREFIX}}logs_time_idx (time_id);
-@ALTER TABLE {{TABLE_PREFIX}}logs ADD INDEX {{TABLE_PREFIX}}logs_action_idx (log_type, action);
-@ALTER TABLE {{TABLE_PREFIX}}comments ADD INDEX {{TABLE_PREFIX}}comments_page_idx (page_id(317), namespace);
-@ALTER TABLE {{TABLE_PREFIX}}hits ADD INDEX {{TABLE_PREFIX}}hits_time_idx ( time );
-@ALTER TABLE {{TABLE_PREFIX}}hits ADD INDEX {{TABLE_PREFIX}}hits_page_idx (page_id(317), namespace);
-@ALTER TABLE {{TABLE_PREFIX}}pages ADD INDEX {{TABLE_PREFIX}}pages_page_idx (urlname(317), namespace);
-@ALTER TABLE {{TABLE_PREFIX}}page_text ADD INDEX {{TABLE_PREFIX}}page_text_page_idx (page_id(317), namespace);
-
--- a/install/schemas/upgrade/1.1.5-1.1.6-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN password_salt varchar(40) NOT NULL DEFAULT '';
-ALTER TABLE {{TABLE_PREFIX}}pages ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
-
---
--- Make page_id and namespace column sizes consistent (former bug)
--- Yes, this is a PITA in PostgreSQL.
---
-
--- comments
-ALTER TABLE {{TABLE_PREFIX}}comments ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}comments SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}comments DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}comments RENAME page_id_new TO page_id;
-
-ALTER TABLE {{TABLE_PREFIX}}comments ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}comments SET namespace_new = namespace;
-ALTER TABLE {{TABLE_PREFIX}}comments DROP namespace;
-ALTER TABLE {{TABLE_PREFIX}}comments RENAME namespace_new TO namespace;
-
--- logs
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}logs SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}logs DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}logs RENAME page_id_new TO page_id;
-
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}logs SET namespace_new = namespace;
-ALTER TABLE {{TABLE_PREFIX}}logs DROP namespace;
-ALTER TABLE {{TABLE_PREFIX}}logs RENAME namespace_new TO namespace;
-
--- page_text
-ALTER TABLE {{TABLE_PREFIX}}page_text ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}page_text SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}page_text DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}page_text RENAME page_id_new TO page_id;
-
--- pages
-ALTER TABLE {{TABLE_PREFIX}}pages ADD COLUMN urlname_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}pages SET urlname_new = urlname;
-ALTER TABLE {{TABLE_PREFIX}}pages DROP urlname;
-ALTER TABLE {{TABLE_PREFIX}}pages RENAME urlname_new TO urlname;
-
--- hits
-ALTER TABLE {{TABLE_PREFIX}}hits ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}hits SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}hits DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}hits RENAME page_id_new TO page_id;
-
-ALTER TABLE {{TABLE_PREFIX}}hits ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}hits SET namespace_new = namespace;
-ALTER TABLE {{TABLE_PREFIX}}hits DROP namespace;
-ALTER TABLE {{TABLE_PREFIX}}hits RENAME namespace_new TO namespace;
-
--- acl
-ALTER TABLE {{TABLE_PREFIX}}acl ADD COLUMN page_id_new varchar(512) DEFAULT NULL;
-UPDATE {{TABLE_PREFIX}}acl SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}acl DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}acl RENAME page_id_new TO page_id;
-
-ALTER TABLE {{TABLE_PREFIX}}acl ADD COLUMN namespace_new varchar(16) DEFAULT NULL;
-UPDATE {{TABLE_PREFIX}}acl SET namespace_new = namespace;
-ALTER TABLE {{TABLE_PREFIX}}acl DROP namespace;
-ALTER TABLE {{TABLE_PREFIX}}acl RENAME namespace_new TO namespace;
-
--- page_group_members
-ALTER TABLE {{TABLE_PREFIX}}page_group_members ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}page_group_members SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}page_group_members DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}page_group_members RENAME page_id_new TO page_id;
-
-ALTER TABLE {{TABLE_PREFIX}}page_group_members ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}page_group_members SET namespace_new = namespace;
-ALTER TABLE {{TABLE_PREFIX}}page_group_members DROP namespace;
-ALTER TABLE {{TABLE_PREFIX}}page_group_members RENAME namespace_new TO namespace;
-
--- tags
-ALTER TABLE {{TABLE_PREFIX}}tags ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}tags SET page_id_new = page_id;
-ALTER TABLE {{TABLE_PREFIX}}tags DROP page_id;
-ALTER TABLE {{TABLE_PREFIX}}tags RENAME page_id_new TO page_id;
-
-ALTER TABLE {{TABLE_PREFIX}}tags ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
-UPDATE {{TABLE_PREFIX}}tags SET namespace_new = namespace;
-ALTER TABLE {{TABLE_PREFIX}}tags DROP namespace;
-ALTER TABLE {{TABLE_PREFIX}}tags RENAME namespace_new TO namespace;
--- a/install/schemas/upgrade/1.1.5-1.1.6.php	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<?php
-
-// Migrate passwords to the new encryption scheme
-
-global $db, $session, $paths, $template, $plugins; // Common objects
-require_once(ENANO_ROOT . '/includes/hmac.php');
-
-@set_time_limit(0);
-
-$q = $db->sql_query('UPDATE ' . table_prefix . "users SET old_encryption = 2 WHERE user_id > 1 AND old_encryption = 0;");
-if ( !$q )
-	$db->_die();
-
-$q = $db->sql_query('SELECT user_id, password FROM ' . table_prefix . "users WHERE user_id > 1 AND old_encryption = 2;");
-if ( !$q )
-	$db->_die();
-
-while ( $row = $db->fetchrow($q) )
-{
-	$password = $session->pk_decrypt($row['password']);
-	if ( empty($password) )
-	{
-		global $ui;
-		echo '<p>1.1.5-1.1.6 migration script: ERROR: bad password returned from $session->pk_decrypt()</p>';
-		$ui->show_footer();
-		exit;
-	}
-	$hmac_secret = hexencode(AESCrypt::randkey(20), '', '');
-	$password = hmac_sha1($password, $hmac_secret);
-	$e = $db->sql_query('UPDATE ' . table_prefix . "users SET password = '{$password}', password_salt = '{$hmac_secret}', old_encryption = 0 WHERE user_id = {$row['user_id']};");
-	if ( !$e )
-		$db->_die();
-}
-
-
--- a/install/schemas/upgrade/1.1.6-1.1.7-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN date_format varchar(32) NOT NULL DEFAULT 'F d, Y';
-ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN time_format varchar(32) NOT NULL DEFAULT 'G:i';
-ALTER TABLE {{TABLE_PREFIX}}lockout ADD COLUMN username varchar(255) NOT NULL DEFAULT '';
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN author_uid mediumint(8) NOT NULL DEFAULT 1;
-UPDATE {{TABLE_PREFIX}}logs SET author_uid = 1;
--- a/install/schemas/upgrade/1.1.6-1.1.7-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN date_format varchar(32) NOT NULL DEFAULT 'F d, Y';
-ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN time_format varchar(32) NOT NULL DEFAULT 'G:i';
-ALTER TABLE {{TABLE_PREFIX}}lockout ADD COLUMN username varchar(255) NOT NULL DEFAULT '';
-ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN author_uid int NOT NULL DEFAULT 1;
-UPDATE {{TABLE_PREFIX}}logs SET author_uid = 1;
--- a/install/schemas/upgrade/1.1.6-1.1.7.php	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<?php
-
-// Migrate usernames in the logs table
-
-global $db, $session, $paths, $template, $plugins; // Common objects
-
-$q = $db->sql_query('SELECT user_id, username FROM ' . table_prefix . 'users;');
-if ( !$q )
-	$db->_die();
-
-$map = array();
-while($row = $db->fetchrow())
-{
-	$map[ $row['username'] ] = $row['user_id'];
-}
-$db->free_result();
-
-$q = $db->sql_query('SELECT author FROM ' . table_prefix . 'logs WHERE author_uid = 1;');
-if ( !$q )
-	$db->_die();
-
-$updated = array();
-
-while ( $row = $db->fetchrow($q) )
-{
-	if ( isset($map[ $row['author'] ]) && !is_valid_ip($row['author']) && !in_array($row['author'], $updated) )
-	{
-		$author = $db->escape($row['author']);
-		$sql = "UPDATE " . table_prefix . "logs SET author_uid = {$map[ $row['author'] ]} WHERE author = '$author';";
-		if ( !$db->sql_query($sql) )
-			$db->_die();
-		$updated[] = $row['author'];
-	}
-}
-
--- a/install/schemas/upgrade/1.1.7-1.1.8-mysql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- a/install/schemas/upgrade/1.1.7-1.1.8-postgresql.sql	Thu Jul 01 18:25:04 2010 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/1124.php	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,35 @@
+<?php
+
+// Migrate passwords to the new encryption scheme
+
+global $db, $session, $paths, $template, $plugins; // Common objects
+require_once(ENANO_ROOT . '/includes/hmac.php');
+
+@set_time_limit(0);
+
+$q = $db->sql_query('UPDATE ' . table_prefix . "users SET old_encryption = 2 WHERE user_id > 1 AND old_encryption = 0;");
+if ( !$q )
+  $db->_die();
+
+$q = $db->sql_query('SELECT user_id, password FROM ' . table_prefix . "users WHERE user_id > 1 AND old_encryption = 2;");
+if ( !$q )
+  $db->_die();
+
+while ( $row = $db->fetchrow($q) )
+{
+  $password = $session->pk_decrypt($row['password']);
+  if ( empty($password) )
+  {
+    global $ui;
+    echo '<p>1.1.5-1.1.6 migration script: ERROR: bad password returned from $session->pk_decrypt()</p>';
+    $ui->show_footer();
+    exit;
+  }
+  $hmac_secret = hexencode(AESCrypt::randkey(20), '', '');
+  $password = hmac_sha1($password, $hmac_secret);
+  $e = $db->sql_query('UPDATE ' . table_prefix . "users SET password = '{$password}', password_salt = '{$hmac_secret}', old_encryption = 0 WHERE user_id = {$row['user_id']};");
+  if ( !$e )
+    $db->_die();
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/1125.php	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,35 @@
+<?php
+
+// Migrate usernames in the logs table
+
+global $db, $session, $paths, $template, $plugins; // Common objects
+
+$q = $db->sql_query('SELECT user_id, username FROM ' . table_prefix . 'users;');
+if ( !$q )
+  $db->_die();
+
+$map = array();
+while($row = $db->fetchrow())
+{
+  $map[ $row['username'] ] = $row['user_id'];
+}
+$db->free_result();
+
+$q = $db->sql_query('SELECT author FROM ' . table_prefix . 'logs WHERE author_uid = 1;');
+if ( !$q )
+  $db->_die();
+
+$updated = array();
+
+while ( $row = $db->fetchrow($q) )
+{
+  if ( isset($map[ $row['author'] ]) && !is_valid_ip($row['author']) && !in_array($row['author'], $updated) )
+  {
+    $author = $db->escape($row['author']);
+    $sql = "UPDATE " . table_prefix . "logs SET author_uid = {$map[ $row['author'] ]} WHERE author = '$author';";
+    if ( !$db->sql_query($sql) )
+      $db->_die();
+    $updated[] = $row['author'];
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1010.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,16 @@
+-- Enano CMS
+-- Upgrade schema - Enano 1.0 - 1.0.1
+
+-- Fix for obnoxious $_GET issue
+UPDATE {{TABLE_PREFIX}}sidebar SET block_type=1,block_content='<div class="slideblock2" style="padding: 0px;"><form action="$CONTENTPATH$$NS_SPECIAL$Search" method="get" style="padding: 0; margin: 0;"><p><input type="hidden" name="title" value="$NS_SPECIAL$Search" />$INPUT_AUTH$<input name="q" alt="Search box" type="text" size="10" style="width: 70%" /> <input type="submit" value="Go" style="width: 20%" /></p></form></div>' WHERE block_name='Search' AND item_id=4;
+-- Added on advice from Neal
+-- Remember that 1 = AUTH_DENY.
+INSERT INTO {{TABLE_PREFIX}}acl(target_type,target_id,page_id,namespace,rules) VALUES(2,1,'Memberlist','Special','read=1;mod_misc=1;upload_files=1;upload_new_version=1;create_page=1;edit_acl=1;');
+-- Bugfix for MySQL 5.0.45, see http://forum.enanocms.org/viewtopic.php?f=5&t=8
+ALTER TABLE {{TABLE_PREFIX}}pages MODIFY COLUMN delvote_ips text DEFAULT NULL;
+CREATE TABLE {{TABLE_PREFIX}}page_groups( pg_id mediumint(8) NOT NULL auto_increment, pg_type tinyint(2) NOT NULL DEFAULT 1, pg_name varchar(255) NOT NULL DEFAULT '', pg_target varchar(255) DEFAULT NULL, PRIMARY KEY ( pg_id ) ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
+CREATE TABLE {{TABLE_PREFIX}}page_group_members( pg_member_id int(12) NOT NULL auto_increment, pg_id mediumint(8) NOT NULL, page_id varchar(63) NOT NULL, namespace varchar(63) NOT NULL DEFAULT 'Article', PRIMARY KEY ( pg_member_id ) ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
+CREATE TABLE {{TABLE_PREFIX}}tags( tag_id int(12) NOT NULL auto_increment, tag_name varchar(63) NOT NULL DEFAULT 'bla', page_id varchar(255) NOT NULL, namespace varchar(255) NOT NULL, user mediumint(8) NOT NULL DEFAULT 1, PRIMARY KEY ( tag_id ) ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
+UPDATE {{TABLE_PREFIX}}acl SET rules=CONCAT(rules,'tag_create=4;tag_delete_own=4;tag_delete_other=4;') WHERE target_type=1 AND target_id=2;
+DELETE FROM {{TABLE_PREFIX}}search_cache;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1019.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,29 @@
+-- Enano CMS
+-- Upgrade schema - Enano 1.0.2 beta 1 - 1.0.2 release
+
+-- This is really optional, but could reduce confusion if regex page groups get truncated for no apparent reason.
+ALTER TABLE {{TABLE_PREFIX}}page_groups MODIFY COLUMN pg_target text DEFAULT NULL;
+
+-- I have no idea how or why, but the f'ing index didn't get created for who-knows-how-many releases.
+-- We'll attempt to create it here, but don't die if it fails
+@ALTER TABLE {{TABLE_PREFIX}}page_text ENGINE = MYISAM, COLLATE = utf8_bin, CHARSET = utf8;
+ALTER TABLE {{TABLE_PREFIX}}search_index CHARSET = utf8, COLLATE = utf8_bin, MODIFY COLUMN word varchar(64) NOT NULL;
+
+-- The search cache is no longer needed because of the new unified search engine (it's too f'ing fast to need a cache :-D)
+@DROP TABLE {{TABLE_PREFIX}}search_cache;
+
+-- Yes, it appears we need pages with names this long after all
+ALTER TABLE {{TABLE_PREFIX}}pages MODIFY COLUMN urlname varchar(255), MODIFY COLUMN name varchar(255);
+
+-- Make page_text a little more efficient to deal with
+ALTER TABLE {{TABLE_PREFIX}}page_text MODIFY COLUMN page_id varchar(255), MODIFY COLUMN namespace varchar(63), MODIFY COLUMN page_text longtext;
+
+-- Now recreate the fulltext index
+@CREATE FULLTEXT INDEX {{TABLE_PREFIX}}page_search_idx ON {{TABLE_PREFIX}}page_text(page_id, namespace, page_text);
+
+-- Addition of new file types
+UPDATE {{TABLE_PREFIX}}config SET config_value='cbf:len=185;crc=55fb6f14;data=0[1],1[4],0[3],1[1],0[22],1[1],0[16],1[3],0[16],1[1],0[1],1[2],0[6],1[1],0[1],1[1],0[4],1[2],0[3],1[1],0[48],1[2],0[2],1[1],0[4],1[1],0[37]|end' WHERE config_name = 'allowed_mime_types' AND config_value='cbf:len=168;crc=c3dcad3f;data=0[1],1[4],0[3],1[1],0[2],1[1],0[11],1[1],0[7],1[1],0[9],1[1],0[6],1[3],0[10],1[1],0[2],1[2],0[1],1[1],0[1],1[2],0[6],1[3],0[1],1[1],0[2],1[4],0[1],1[2],0[3],1[1],0[4],1[2],0[26],1[5],0[6],1[2],0[2],1[1],0[4],1[1],0[10],1[2],0[1],1[1],0[6]|end';
+
+-- Reinforcement of "stable release" mentality
+@UPDATE {{TABLE_PREFIX}}users SET theme='oxygen', style='bleu' WHERE user_id = 2;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1020.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1030.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1040.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1050.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1060.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1061.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1120.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,36 @@
+-- Enano CMS
+-- Upgrade schema - Enano 1.1.1 - 1.1.2
+
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN log_id int(15) NOT NULL auto_increment, ADD PRIMARY KEY ( log_id );
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN is_draft tinyint(1) NOT NULL DEFAULT 0;
+
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank int(12) UNSIGNED NOT NULL DEFAULT 1;
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_timezone int(12) UNSIGNED NOT NULL DEFAULT 1440;
+
+@ALTER TABLE {{TABLE_PREFIX}}tags CHANGE user user_id mediumint(8) NOT NULL DEFAULT 1;
+ALTER TABLE {{TABLE_PREFIX}}themes
+  ADD COLUMN group_list text DEFAULT NULL,
+  ADD COLUMN group_policy ENUM('allow', 'deny') NOT NULL DEFAULT 'deny';
+
+CREATE TABLE {{TABLE_PREFIX}}ranks(
+  rank_id int(12) NOT NULL auto_increment,
+  rank_title varchar(63) NOT NULL DEFAULT '',
+  rank_style varchar(255) NOT NULL DEFAULT '',
+  PRIMARY KEY ( rank_id )
+) CHARACTER SET `utf8` COLLATE `utf8_bin`;
+
+CREATE TABLE {{TABLE_PREFIX}}captcha(
+  code_id int(12) NOT NULL auto_increment,
+  session_id varchar(40) NOT NULL DEFAULT '',
+  code varchar(64) NOT NULL DEFAULT '',
+  session_data text,
+  source_ip varchar(39),
+  user_id int(12),
+  PRIMARY KEY ( code_id )
+) CHARACTER SET `utf8` COLLATE `utf8_bin`;
+
+INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
+  (1, 'user_rank_member', ''),
+  (2, 'user_rank_mod', 'font-weight: bold; color: #00AA00;'),
+  (3, 'user_rank_admin', 'font-weight: bold; color: #AA0000;');
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1121.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,15 @@
+-- Enano CMS
+-- Upgrade schema: 1.1.2 - 1.1.3
+
+-- Storing obscenely huge integers as strings since that's how php processes them.
+
+CREATE TABLE {{TABLE_PREFIX}}diffiehellman (
+  key_id int(12) NOT NULL auto_increment,
+  private_key text,
+  public_key text,
+  PRIMARY KEY ( key_id )
+) CHARACTER SET `utf8` COLLATE `utf8_bin`;
+
+ALTER TABLE {{TABLE_PREFIX}}session_keys MODIFY COLUMN source_ip varchar(39) NOT NULL DEFAULT '127.0.0.1';
+ALTER TABLE {{TABLE_PREFIX}}themes MODIFY COLUMN group_policy ENUM('allow_all', 'whitelist', 'blacklist') NOT NULL DEFAULT 'allow_all';
+UPDATE {{TABLE_PREFIX}}themes SET group_policy = 'allow_all';
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1122.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,32 @@
+-- This is really honestly a better way to handle plugins.
+
+CREATE TABLE {{TABLE_PREFIX}}plugins (
+  plugin_id int(12) NOT NULL auto_increment,
+  plugin_filename varchar(63),
+  plugin_flags int(12),
+  plugin_version varchar(16),
+  PRIMARY KEY ( plugin_id )
+) ENGINE `MyISAM` CHARACTER SET `utf8` COLLATE `utf8_bin`;
+
+ALTER TABLE {{TABLE_PREFIX}}search_index ADD COLUMN word_lcase varchar(64) NOT NULL;
+
+-- User title
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_title varchar(64) DEFAULT NULL;
+ALTER TABLE {{TABLE_PREFIX}}users MODIFY COLUMN user_rank int(12) unsigned DEFAULT NULL;
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_group mediumint(5) NOT NULL DEFAULT 1;
+UPDATE {{TABLE_PREFIX}}users SET user_rank = NULL;
+
+-- The "guest" rank
+-- No frontend to this yet so ranks should not have been created.
+DELETE FROM {{TABLE_PREFIX}}ranks WHERE rank_id = 4;
+INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
+  (4, 'user_rank_guest', '');
+  
+-- Other rank-related columns
+ALTER TABLE {{TABLE_PREFIX}}groups ADD COLUMN group_rank int(12) unsigned DEFAULT NULL;
+
+-- Disable JS effects column
+ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN disable_js_fx tinyint(1) NOT NULL DEFAULT 0;
+
+-- Add "grv" avatar type
+ALTER TABLE {{TABLE_PREFIX}}users MODIFY COLUMN avatar_type ENUM('png', 'gif', 'jpg', 'grv');
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1123.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,4 @@
+ALTER TABLE {{TABLE_PREFIX}}session_keys ADD COLUMN key_type tinyint(1) NOT NULL DEFAULT 0;
+UPDATE {{TABLE_PREFIX}}session_keys SET key_type = 2 WHERE auth_level > 2;
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_dst varchar(11) NOT NULL DEFAULT '0;0;0;0;60';
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank_userset tinyint(1) NOT NULL DEFAULT 0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1124.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,41 @@
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN password_salt varchar(40) NOT NULL DEFAULT '';
+ALTER TABLE {{TABLE_PREFIX}}pages ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
+
+-- Make page_id and namespace column sizes consistent (former bug)
+
+ALTER TABLE {{TABLE_PREFIX}}comments MODIFY COLUMN page_id varchar(512) NOT NULL,
+  MODIFY COLUMN namespace varchar(16) NOT NULL;
+
+ALTER TABLE {{TABLE_PREFIX}}logs MODIFY COLUMN page_id varchar(512) NOT NULL,
+  MODIFY COLUMN namespace varchar(16) NOT NULL;
+
+ALTER TABLE {{TABLE_PREFIX}}page_text MODIFY COLUMN page_id varchar(512) NOT NULL;
+
+ALTER TABLE {{TABLE_PREFIX}}pages MODIFY COLUMN urlname varchar(512) NOT NULL;
+
+ALTER TABLE {{TABLE_PREFIX}}hits MODIFY COLUMN page_id varchar(512) NOT NULL,
+  MODIFY COLUMN namespace varchar(16) NOT NULL;
+
+ALTER TABLE {{TABLE_PREFIX}}acl MODIFY COLUMN page_id varchar(512),
+  MODIFY COLUMN namespace varchar(16);
+
+ALTER TABLE {{TABLE_PREFIX}}page_group_members MODIFY COLUMN page_id varchar(512) NOT NULL,
+  MODIFY COLUMN namespace varchar(16) NOT NULL;
+
+ALTER TABLE {{TABLE_PREFIX}}tags MODIFY COLUMN page_id varchar(512) NOT NULL,
+  MODIFY COLUMN namespace varchar(16) NOT NULL;
+
+-- Added in 1.1.6: Indices for several tables
+-- The size of 317 is a trial-and-error-produced value based on MySQL's index column size limit
+-- of 1000 bytes. It's low like that because of the UTF-8 character set being used.
+
+@ALTER TABLE {{TABLE_PREFIX}}logs ADD INDEX {{TABLE_PREFIX}}logs_page_idx (page_id(317), namespace);
+@ALTER TABLE {{TABLE_PREFIX}}logs ADD INDEX {{TABLE_PREFIX}}logs_time_idx (time_id);
+@ALTER TABLE {{TABLE_PREFIX}}logs ADD INDEX {{TABLE_PREFIX}}logs_action_idx (log_type, action);
+@ALTER TABLE {{TABLE_PREFIX}}comments ADD INDEX {{TABLE_PREFIX}}comments_page_idx (page_id(317), namespace);
+@ALTER TABLE {{TABLE_PREFIX}}hits ADD INDEX {{TABLE_PREFIX}}hits_time_idx ( time );
+@ALTER TABLE {{TABLE_PREFIX}}hits ADD INDEX {{TABLE_PREFIX}}hits_page_idx (page_id(317), namespace);
+@ALTER TABLE {{TABLE_PREFIX}}pages ADD INDEX {{TABLE_PREFIX}}pages_page_idx (urlname(317), namespace);
+@ALTER TABLE {{TABLE_PREFIX}}page_text ADD INDEX {{TABLE_PREFIX}}page_text_page_idx (page_id(317), namespace);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/mysql/1125.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,5 @@
+ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN date_format varchar(32) NOT NULL DEFAULT 'F d, Y';
+ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN time_format varchar(32) NOT NULL DEFAULT 'G:i';
+ALTER TABLE {{TABLE_PREFIX}}lockout ADD COLUMN username varchar(255) NOT NULL DEFAULT '';
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN author_uid mediumint(8) NOT NULL DEFAULT 1;
+UPDATE {{TABLE_PREFIX}}logs SET author_uid = 1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/postgresql/1120.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,40 @@
+-- Enano CMS
+-- Upgrade schema - Enano 1.1.1 - 1.1.2
+
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN log_id SERIAL, ADD PRIMARY KEY ( log_id );
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN is_draft smallint NOT NULL DEFAULT 0;
+
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank int NOT NULL DEFAULT 1;
+@ALTER TABLE {{TABLE_PREFIX}}users DROP user_timezone;
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_timezone int NOT NULL DEFAULT 1440;
+
+ALTER TABLE {{TABLE_PREFIX}}themes
+  ADD COLUMN group_list text DEFAULT NULL,
+  ADD COLUMN group_policy varchar(5) NOT NULL DEFAULT 'deny',
+  ADD CHECK (group_policy IN ('allow', 'deny'));
+
+CREATE TABLE {{TABLE_PREFIX}}ranks(
+  rank_id SERIAL,
+  rank_title varchar(63) NOT NULL DEFAULT '',
+  rank_style varchar(255) NOT NULL DEFAULT '',
+  PRIMARY KEY ( rank_id )
+);
+
+CREATE TABLE {{TABLE_PREFIX}}captcha(
+  code_id SERIAL,
+  session_id varchar(40) NOT NULL DEFAULT '',
+  code varchar(64) NOT NULL DEFAULT '',
+  session_data text,
+  source_ip varchar(39),
+  user_id int,
+  PRIMARY KEY ( code_id )
+);
+
+INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
+  (1, 'user_rank_member', ''),
+  (2, 'user_rank_mod', 'font-weight: bold; color: #00AA00;'),
+  (3, 'user_rank_admin', 'font-weight: bold; color: #AA0000;');
+
+-- For some reason this is required, it came up in my QA testing on a2hosting
+SELECT NEXTVAL('{{TABLE_PREFIX}}ranks_rank_id_seq'::regclass);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/postgresql/1121.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,18 @@
+-- Enano CMS
+-- Upgrade schema: 1.1.2 - 1.1.3
+
+-- Storing obscenely huge integers as strings since that's how php processes them.
+
+CREATE TABLE {{TABLE_PREFIX}}diffiehellman (
+  key_id SERIAL,
+  private_key text,
+  public_key text,
+  PRIMARY KEY ( key_id )
+);
+
+ALTER TABLE {{TABLE_PREFIX}}themes DROP group_policy, ADD COLUMN group_policy varchar(9) NOT NULL DEFAULT 'allow_all', ADD CHECK ( group_policy IN ('allow_all', 'whitelist', 'blacklist') );
+
+ALTER TABLE {{TABLE_PREFIX}}session_keys ALTER COLUMN source_ip TYPE varchar(39),
+                                         ADD CHECK ( source_ip IS NOT NULL ),
+                                         ALTER COLUMN source_ip SET DEFAULT '127.0.0.1';
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/postgresql/1122.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,48 @@
+-- This is really honestly a better way to handle plugins.
+
+CREATE TABLE {{TABLE_PREFIX}}plugins (
+  plugin_id SERIAL,
+  plugin_filename varchar(63),
+  plugin_flags int,
+  plugin_version varchar(16),
+  PRIMARY KEY ( plugin_id )
+);
+
+-- User title
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_title varchar(64) DEFAULT NULL;
+
+-- Modifications to user_rank column
+-- http://pgsqld.active-venture.com/ddl-alter.html#AEN1984
+ALTER TABLE {{TABLE_PREFIX}}users ALTER COLUMN user_rank DROP NOT NULL,
+              ALTER COLUMN user_rank DROP DEFAULT;
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_group int NOT NULL DEFAULT 1;
+UPDATE {{TABLE_PREFIX}}users SET user_rank = NULL;
+              
+-- Aggregate function array_accum
+-- http://www.postgresql.org/docs/current/static/xaggr.html
+
+CREATE AGGREGATE {{TABLE_PREFIX}}array_accum (anyelement)
+(
+    sfunc = array_append,
+    stype = anyarray,
+    initcond = '{}'
+);
+
+-- The "guest" rank
+-- No frontend to this yet so ranks should not have been created.
+DELETE FROM {{TABLE_PREFIX}}ranks WHERE rank_id = 4;
+INSERT INTO {{TABLE_PREFIX}}ranks(rank_id, rank_title, rank_style) VALUES
+  (4, 'user_rank_guest', '');
+  
+-- For some reason this is required, it came up in my QA testing on a2hosting
+SELECT NEXTVAL('{{TABLE_PREFIX}}ranks_rank_id_seq'::regclass);
+
+-- Other rank-related columns
+ALTER TABLE {{TABLE_PREFIX}}groups ADD COLUMN group_rank int DEFAULT NULL;
+
+-- Disable JS effects column
+ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN disable_js_fx smallint NOT NULL DEFAULT 0;
+
+-- Add "grv" avatar type
+ALTER TABLE {{TABLE_PREFIX}}users DROP CONSTRAINT {{TABLE_PREFIX}}users_avatar_type_check;
+ALTER TABLE {{TABLE_PREFIX}}users ADD CONSTRAINT {{TABLE_PREFIX}}users_avatar_type_check CHECK ( avatar_type IN ( 'png', 'gif', 'jpg', 'grv' ) );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/postgresql/1123.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,4 @@
+ALTER TABLE {{TABLE_PREFIX}}session_keys ADD COLUMN key_type smallint NOT NULL DEFAULT 0;
+UPDATE {{TABLE_PREFIX}}session_keys SET key_type = 2 WHERE auth_level > 2;
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_dst varchar(11) NOT NULL DEFAULT '0;0;0;0;60';
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank_userset smallint NOT NULL DEFAULT 0;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/postgresql/1124.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,86 @@
+ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN password_salt varchar(40) NOT NULL DEFAULT '';
+ALTER TABLE {{TABLE_PREFIX}}pages ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN page_format varchar(16) NOT NULL DEFAULT 'wikitext';
+
+--
+-- Make page_id and namespace column sizes consistent (former bug)
+-- Yes, this is a PITA in PostgreSQL.
+--
+
+-- comments
+ALTER TABLE {{TABLE_PREFIX}}comments ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}comments SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}comments DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}comments RENAME page_id_new TO page_id;
+
+ALTER TABLE {{TABLE_PREFIX}}comments ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}comments SET namespace_new = namespace;
+ALTER TABLE {{TABLE_PREFIX}}comments DROP namespace;
+ALTER TABLE {{TABLE_PREFIX}}comments RENAME namespace_new TO namespace;
+
+-- logs
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}logs SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}logs DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}logs RENAME page_id_new TO page_id;
+
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}logs SET namespace_new = namespace;
+ALTER TABLE {{TABLE_PREFIX}}logs DROP namespace;
+ALTER TABLE {{TABLE_PREFIX}}logs RENAME namespace_new TO namespace;
+
+-- page_text
+ALTER TABLE {{TABLE_PREFIX}}page_text ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}page_text SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}page_text DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}page_text RENAME page_id_new TO page_id;
+
+-- pages
+ALTER TABLE {{TABLE_PREFIX}}pages ADD COLUMN urlname_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}pages SET urlname_new = urlname;
+ALTER TABLE {{TABLE_PREFIX}}pages DROP urlname;
+ALTER TABLE {{TABLE_PREFIX}}pages RENAME urlname_new TO urlname;
+
+-- hits
+ALTER TABLE {{TABLE_PREFIX}}hits ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}hits SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}hits DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}hits RENAME page_id_new TO page_id;
+
+ALTER TABLE {{TABLE_PREFIX}}hits ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}hits SET namespace_new = namespace;
+ALTER TABLE {{TABLE_PREFIX}}hits DROP namespace;
+ALTER TABLE {{TABLE_PREFIX}}hits RENAME namespace_new TO namespace;
+
+-- acl
+ALTER TABLE {{TABLE_PREFIX}}acl ADD COLUMN page_id_new varchar(512) DEFAULT NULL;
+UPDATE {{TABLE_PREFIX}}acl SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}acl DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}acl RENAME page_id_new TO page_id;
+
+ALTER TABLE {{TABLE_PREFIX}}acl ADD COLUMN namespace_new varchar(16) DEFAULT NULL;
+UPDATE {{TABLE_PREFIX}}acl SET namespace_new = namespace;
+ALTER TABLE {{TABLE_PREFIX}}acl DROP namespace;
+ALTER TABLE {{TABLE_PREFIX}}acl RENAME namespace_new TO namespace;
+
+-- page_group_members
+ALTER TABLE {{TABLE_PREFIX}}page_group_members ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}page_group_members SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}page_group_members DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}page_group_members RENAME page_id_new TO page_id;
+
+ALTER TABLE {{TABLE_PREFIX}}page_group_members ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}page_group_members SET namespace_new = namespace;
+ALTER TABLE {{TABLE_PREFIX}}page_group_members DROP namespace;
+ALTER TABLE {{TABLE_PREFIX}}page_group_members RENAME namespace_new TO namespace;
+
+-- tags
+ALTER TABLE {{TABLE_PREFIX}}tags ADD COLUMN page_id_new varchar(512) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}tags SET page_id_new = page_id;
+ALTER TABLE {{TABLE_PREFIX}}tags DROP page_id;
+ALTER TABLE {{TABLE_PREFIX}}tags RENAME page_id_new TO page_id;
+
+ALTER TABLE {{TABLE_PREFIX}}tags ADD COLUMN namespace_new varchar(16) NOT NULL DEFAULT '';
+UPDATE {{TABLE_PREFIX}}tags SET namespace_new = namespace;
+ALTER TABLE {{TABLE_PREFIX}}tags DROP namespace;
+ALTER TABLE {{TABLE_PREFIX}}tags RENAME namespace_new TO namespace;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install/schemas/upgrade/postgresql/1125.sql	Thu Jul 01 20:24:19 2010 -0400
@@ -0,0 +1,5 @@
+ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN date_format varchar(32) NOT NULL DEFAULT 'F d, Y';
+ALTER TABLE {{TABLE_PREFIX}}users_extra ADD COLUMN time_format varchar(32) NOT NULL DEFAULT 'G:i';
+ALTER TABLE {{TABLE_PREFIX}}lockout ADD COLUMN username varchar(255) NOT NULL DEFAULT '';
+ALTER TABLE {{TABLE_PREFIX}}logs ADD COLUMN author_uid int NOT NULL DEFAULT 1;
+UPDATE {{TABLE_PREFIX}}logs SET author_uid = 1;
--- a/install/upgrade.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/install/upgrade.php	Thu Jul 01 20:24:19 2010 -0400
@@ -20,6 +20,8 @@
 $enano_versions['1.0'] = array('1.0', '1.0.1', '1.0.2b1', '1.0.2', '1.0.3', '1.0.4', '1.0.5', '1.0.6', '1.0.6pl1');
 $enano_versions['1.1'] = array('1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5', '1.1.6', '1.1.7', '1.1.8');
 
+define('BANSHEE_LATEST_DBREV', 1061);
+
 // If true, this will do a full langimport instead of only adding new strings.
 // Will probably be left on, but some change probably needs to be made to mark
 // strings as customized in the DB.
@@ -71,7 +73,7 @@
 $stg_finish  = $ui->add_stage($lang->get('upgrade_stg_finish'), true);
 
 // Version check
-if ( enano_version() == installer_enano_version() )
+if ( getConfig('db_version') === $db_version && !preg_match('/^upg-/', getConfig('enano_version')) )
 {
 	$ui->show_header();
 	$link_home = makeUrl(get_main_page(), false, true);
@@ -237,7 +239,7 @@
 	if ( $target_branch != $current_branch )
 	{
 		// First upgrade to the latest revision of the current branch
-		enano_perform_upgrade($current_branch);
+		enano_perform_upgrade(BANSHEE_LATEST_DBREV);
 		// Branch migration could be tricky and is often highly specific between
 		// major branches, so just include a custom migration script.
 		require(ENANO_ROOT . "/install/schemas/upgrade/migration/{$current_branch}-{$target_branch}.php");
@@ -248,10 +250,11 @@
 			$ui->show_footer();
 			exit;
 		}
+		setConfig('db_version', BANSHEE_LATEST_DBREV + 1);
 	}
 	
 	// Do the actual upgrade
-	enano_perform_upgrade($target_branch);
+	enano_perform_upgrade($db_version);
 	
 	// Mark as upgrade-in-progress
 	setConfig('enano_version', 'upg-' . installer_enano_version());
@@ -313,7 +316,7 @@
 {
 	?>
 	<h3><?php echo $lang->get('upgrade_confirm_title'); ?></h3>
-	<p><?php echo $lang->get('upgrade_confirm_body', array('enano_version' => installer_enano_version())); ?></p>
+	<p><?php echo $lang->get('upgrade_confirm_body', array('enano_version' => installer_enano_version(), 'db_version' => $db_version)); ?></p>
 	<ul>
 		<li><?php echo $lang->get('upgrade_confirm_objective_backup_fs', array('dir' => ENANO_ROOT)); ?></li>
 		<li><?php echo $lang->get('upgrade_confirm_objective_backup_db', array('dbname' => $dbname)); ?></li>
--- a/language/english/admin.json	Thu Jul 01 18:25:04 2010 -0400
+++ b/language/english/admin.json	Thu Jul 01 20:24:19 2010 -0400
@@ -237,6 +237,9 @@
 			
 			heading_alerts: 'Active alerts',
 			
+			msg_upgrade_success_title: 'Upgrade successful',
+			msg_upgrade_success_body: 'Enano was successfully upgraded to version %config.enano_version%. View <a href="http://enanocms.org/Release_notes/%config.enano_version%">release notes for this version</a>.',
+			
 			msg_demo_title: 'Enano is running in demo mode.',
 			msg_demo_body: 'If you borked something up, or if you\'re done testing, you can <a href="%reset_url%">reset this site</a>. The site is reset automatically once every two hours. When a reset is performed, all custom modifications to the site are lost and replaced with default values.',
 			
--- a/language/english/install.json	Thu Jul 01 18:25:04 2010 -0400
+++ b/language/english/install.json	Thu Jul 01 20:24:19 2010 -0400
@@ -435,7 +435,7 @@
 			login_err_failed: 'The following error occurred during the login process: %error_code%.',
 			
 			confirm_title: 'Confirm upgrade',
-			confirm_body: 'You are about to upgrade to Enano version <b>%enano_version%</b>. You should make sure that you\'ve done the following before you continue:',
+			confirm_body: 'You are about to upgrade to Enano version <b>%enano_version%</b> (database version <b>%db_version%</b>). You should make sure that you\'ve done the following before you continue:',
 			confirm_objective_backup_fs: 'Back up Enano installation directory (<b>%dir%</b>)',
 			confirm_objective_backup_db: 'Back up Enano database, including non-Enano tables if any (<b>%dbname%</b>)',
 			confirm_warning_langimport: '<b>Warning!</b> This release of Enano has some changed strings. If you\'ve customized any language strings, those changes will be lost.',
--- a/plugins/admin/Home.php	Thu Jul 01 18:25:04 2010 -0400
+++ b/plugins/admin/Home.php	Thu Jul 01 20:24:19 2010 -0400
@@ -50,6 +50,16 @@
 		echo '</div>';
 	}
 	
+	// Upgrade success
+	if ( getConfig('newly_upgraded') )
+	{
+		setConfig('newly_upgraded', false);
+		echo '<div class="acphome-box notice">'
+				. '<h3>' . $lang->get('acphome_msg_upgrade_success_title') . '</h3>'
+				. '<p>' . $lang->get('acphome_msg_upgrade_success_body') . '</p>'
+				. '</div>';
+	}
+	
 	// Check for the installer scripts
 	if( file_exists(ENANO_ROOT.'/install/install.php') && !defined('ENANO_DEMO_MODE') )
 	{