diff --git a/upgrade.php b/upgrade.php index 6730483e..6db640c6 100644 --- a/upgrade.php +++ b/upgrade.php @@ -53,7 +53,7 @@ if($CONF['database_type'] == 'pgsql') { $r = db_query("SELECT relname FROM pg_class WHERE relname = 'config'"); if($r['rows'] == 0) { $pgsql = " - CREATE TABLE config ( + CREATE TABLE " . table_by_key ('config') . " ( id SERIAL, name VARCHAR(20) NOT NULL UNIQUE, value VARCHAR(20) NOT NULL, @@ -69,8 +69,8 @@ else { `name` VARCHAR(20) {LATIN1} NOT NULL DEFAULT '', `value` VARCHAR(20) {LATIN1} NOT NULL DEFAULT '', UNIQUE name ( `name` ) - ) - "; + ) + "; db_query_parsed($mysql, 0, " ENGINE = MYISAM COMMENT = 'PostfixAdmin settings'"); } @@ -369,6 +369,13 @@ function upgrade_4_pgsql() { } } + +# Possible errors that can be ignored: +# +# NO MySQL errors should be ignored below this line! + + + /** * create tables * version: Sourceforge SVN r1 of DATABASE_MYSQL.txt @@ -387,7 +394,7 @@ function upgrade_5_mysql() { `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`username`), KEY username (`username`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Admins'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Virtual Admins'; "); $result = db_query_parsed(" @@ -400,7 +407,7 @@ function upgrade_5_mysql() { `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`address`), KEY address (`address`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Virtual Aliases'; "); $result = db_query_parsed(" @@ -418,7 +425,7 @@ function upgrade_5_mysql() { `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`domain`), KEY domain (`domain`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Virtual Domains'; "); $result = db_query_parsed(" @@ -428,7 +435,7 @@ function upgrade_5_mysql() { `created` datetime NOT NULL default '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL default '1', KEY username (`username`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Domain Admins'; "); $result = db_query_parsed(" @@ -439,7 +446,7 @@ function upgrade_5_mysql() { `action` varchar(255) NOT NULL default '', `data` varchar(255) NOT NULL default '', KEY timestamp (`timestamp`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Log'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Log'; "); $result = db_query_parsed(" @@ -455,7 +462,7 @@ function upgrade_5_mysql() { `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`username`), KEY username (`username`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Virtual Mailboxes'; "); $result = db_query_parsed(" @@ -469,10 +476,8 @@ function upgrade_5_mysql() { `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`email`), KEY email (`email`) - ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation'; + ) TYPE=MyISAM DEFAULT {LATIN1} COMMENT='Postfix Admin - Virtual Vacation'; "); - # Possible errors that can be ignored: - # - (none) } /** @@ -498,26 +503,14 @@ function upgrade_81_mysql() { # MySQL only ALTER TABLE `$table_vacation` CHANGE `active` `active` TINYINT( 1 ) NOT NULL DEFAULT '1' ALTER TABLE `$table_vacation` DEFAULT {LATIN1} ALTER TABLE `$table_vacation` ENGINE = INNODB - ")); + ")); foreach ($all_sql as $sql) { $result = db_query_parsed($sql, TRUE); } - db_query_parsed( - " CREATE TABLE {IF_NOT_EXISTS} $table_vacation_notification ( - on_vacation varchar(255) NOT NULL, - notified varchar(255) NOT NULL, - notified_at timestamp NOT NULL default now(), - CONSTRAINT vacation_notification_pkey PRIMARY KEY(on_vacation, notified), - FOREIGN KEY (on_vacation) REFERENCES vacation(email) ON DELETE CASCADE - ) - ", - TRUE, - " ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci TYPE=InnoDB - COMMENT='Postfix Admin - Virtual Vacation Notifications' - " - ); + # creation of vacation_notification table moved to upgrade_318_mysql because + # the query in this function was broken (key length vs. utf8 charset) } /** @@ -542,6 +535,49 @@ function upgrade_169_mysql() { } +/** + * Create / modify vacation_notification table. + * Note: This might not work if users used workarounds to create the table before. + * In this case, dropping the table is the easiest solution. + */ +function upgrade_318_mysql() { + $table_vacation_notification = table_by_key('vacation_notification'); + + # create table without constraint for now... + db_query_parsed( " + CREATE TABLE {IF_NOT_EXISTS} $table_vacation_notification ( + on_vacation varchar(255) NOT NULL, + notified varchar(255) NOT NULL, + notified_at timestamp NOT NULL default now(), + PRIMARY KEY on_vacation (`on_vacation`, `notified`) + ) + ENGINE=InnoDB DEFAULT {LATIN1} TYPE=InnoDB + COMMENT='Postfix Admin - Virtual Vacation Notifications' + "); + + # in case someone has manually created the table with utf8 fields before: + $all_sql = split("\n", trim(" + ALTER TABLE `$table_vacation_notification` DROP FOREIGN KEY `vacation_notification_pkey` + ALTER TABLE `$table_vacation_notification` CHANGE `on_vacation` `on_vacation` VARCHAR( 255 ) {LATIN1} NOT NULL + ALTER TABLE `$table_vacation_notification` CHANGE `notified` `notified` VARCHAR( 255 ) {LATIN1} NOT NULL + ALTER TABLE `$table_vacation_notification` DEFAULT {LATIN1} + ")); + # Possible errors that can be ignored: + # None. + # If something goes wrong, the user should drop the vacation_notification table + # (not a great loss) and re-create it using this function. + + foreach ($all_sql as $sql) { + $result = db_query_parsed($sql); + } + + # create constraint... + $result = db_query_parsed(" + ALTER TABLE $table_vacation_notification ADD CONSTRAINT `vacation_notification_pkey` + FOREIGN KEY (`on_vacation`) REFERENCES vacation(`email`) ON DELETE CASCADE + "); +} + /* TODO @@ -549,15 +585,10 @@ function upgrade_169_mysql() { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MySQL: - * vacation: +* vacation: - DROP INDEX email - 'cache' field might be obsolete with vacation_notification - needs to be checked! - * vacation_notification: - - DEFAULT CHARSET and COLLATE should be changed - - change all varchar fields to latin1 (email addresses don't contain utf8 characters) * charset of equal fields MUST be the same (see bugreport) -* if necessary, delete the CONSTRAINT before changing field type and create it again - http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html */