[Pkg-sympa-commits] [SCM] sympa Debian packaging branch, master, updated. debian/6.1.11_dfsg-4-2-g4650b32
Emmanuel Bouthenot
kolter at openics.org
Tue Nov 27 19:03:26 UTC 2012
The following commit has been merged in the master branch:
commit 2285f504fc627f19e6de8ef76f0b88bb874d4d5c
Author: Emmanuel Bouthenot <kolter at openics.org>
Date: Tue Nov 27 18:54:16 2012 +0000
Fix SQLite patch to avoid crash during installation from scratch and database schema updates failures on upgrade (#686845)
diff --git a/debian/patches/1011_fix_sqlite_db_upgrade b/debian/patches/1011_fix_sqlite_db_upgrade
index adbeede..c0a5bb0 100644
--- a/debian/patches/1011_fix_sqlite_db_upgrade
+++ b/debian/patches/1011_fix_sqlite_db_upgrade
@@ -11,19 +11,32 @@ Last-Update: 2011-11-19
'bounce_address_subscriber' => 'text',
'custom_attribute_subscriber' => 'text',
- 'suspend_subscriber' => "boolean",
-+ 'suspend_subscriber' => "numeric",
++ 'suspend_subscriber' => 'numeric',
'suspend_start_date_subscriber' => 'integer',
'suspend_end_date_subscriber' => 'integer'},
'admin_table' => {'list_admin' => 'text',
-@@ -974,11 +974,11 @@
+@@ -963,8 +963,8 @@
+ 'returnpath_bulkmailer' => 'text',
+ 'robot_bulkmailer' => 'text',
+ 'listname_bulkmailer' => 'text',
+- 'verp_bulkmailer' => 'integer',
+- 'merge_bulkmailer' => 'integer',
++ 'verp_bulkmailer' => 'numeric',
++ 'merge_bulkmailer' => 'numeric',
+ 'priority_message_bulkmailer' => 'integer',
+ 'priority_packet_bulkmailer' => 'integer',
+ 'reception_date_bulkmailer' => 'integer',
+@@ -973,26 +973,26 @@
+ 'bulkspool_table' => {'messagekey_bulkspool' => 'text',
'messageid_bulkspool' => 'text',
'message_bulkspool' => 'text',
- 'lock_bulkspool' => 'integer',
+- 'lock_bulkspool' => 'integer',
- 'dkim_privatekey_bulkspool' => 'varchar(1000)',
- 'dkim_selector_bulkspool' => 'varchar(50)',
- 'dkim_d_bulkspool' => 'varchar(50)',
- 'dkim_i_bulkspool' => 'varchar(100)',
- 'dkim_header_list_bulkspool' => 'varchar(500)'},
++ 'lock_bulkspool' => 'numeric',
+ 'dkim_privatekey_bulkspool' => 'text',
+ 'dkim_selector_bulkspool' => 'text',
+ 'dkim_d_bulkspool' => 'text',
@@ -32,3 +45,417 @@ Last-Update: 2011-11-19
'conf_table' => {'robot_conf' => 'text',
'label_conf' => 'text',
'value_conf' => 'text'},
+- 'list_table' => {'name_list'=>'varchar(100)',
+- 'path_list'=>'varchar(100)',
+- 'robot_list'=>'varchar(100)',
+- 'status_list'=>"enum('open','closed','pending','error_config','family_closed')",
+- 'creation_email_list'=>'varchar(100)',
+- 'creation_epoch_list'=>'datetime',
+- 'subject_list'=>'varchar(100)',
+- 'web_archive_list'=>'tinyint(1)',
+- 'topics_list'=>'varchar(100)',
+- 'editors_list'=>'varchar(100)',
+- 'owners_list'=>'varchar(100)'}
++ 'list_table' => {'name_list' => 'text',
++ 'path_list' => 'text',
++ 'robot_list' => 'text',
++ 'status_list' => 'text',
++ 'creation_email_list' => 'text',
++ 'creation_epoch_list' => 'numeric',
++ 'subject_list' => 'text',
++ 'web_archive_list' => 'integer',
++ 'topics_list' => 'text',
++ 'editors_list' => 'text',
++ 'owners_list' => 'text'}
+ });
+
+ my %not_null = ('email_user' => 1,
+@@ -1005,7 +1005,6 @@
+ 'user_admin' => 1,
+ 'role_admin' => 1,
+ 'date_admin' => 1,
+- 'list_exclusion' => 1,
+ 'user_exclusion' => 1,
+ 'robot_exclusion' => 1,
+ 'netid_netidmap' => 1,
+@@ -1022,16 +1021,8 @@
+ 'messagekey_bulkmailer' => 1,
+ 'packetid_bulkmailer' => 1,
+ 'messagekey_bulkspool' => 1,
+- 'name_list'=>1,
+- 'path_list'=>1,
+- 'robot_list'=>1,
+- 'status_list'=>1,
+- 'creation_email_list'=>1,
+- 'subject_list'=>1,
+- 'web_archive_list'=>1,
+- 'topics_list'=>1,
+- 'owners_list'=>1,
+- 'editors_list'=>1
++ 'name_list'=>1,
++ 'robot_list'=>1,
+ );
+
+ my %primary = ('user_table' => ['email_user'],
+@@ -1158,7 +1149,27 @@
+ $t =~ s/^"main"\.//; # needed for SQLite 3
+ $t =~ s/^.*\"([^"]+)\"$/$1/;
+ }
+-
++
++ ## Check required tables
++ foreach my $t1 (keys %{$db_struct{'SQLite'}}) {
++ my $found;
++ foreach my $t2 (@tables) {
++ $found = 1 if ($t1 eq $t2);
++ }
++ unless ($found) {
++ unless ($dbh->do("CREATE TABLE $t1 (temporary integer)")) {
++ &do_log('err', 'Could not create table %s in database %s : %s', $t1, $Conf::Conf{'db_name'}, $dbh->errstr);
++ next;
++ }
++
++ push @report, sprintf('Table %s created in database %s', $t1, $Conf::Conf{'db_name'});
++ &do_log('notice', 'Table %s created in database %s', $t1, $Conf::Conf{'db_name'});
++ push @tables, $t1;
++ $real_struct{$t1} = {};
++ }
++ }
++
++ ## Get fields
+ foreach my $t (@tables) {
+ next unless (defined $db_struct{$Conf::Conf{'db_type'}}{$t});
+
+@@ -1265,7 +1276,10 @@
+ my $options;
+ ## To prevent "Cannot add a NOT NULL column with default value NULL" errors
+ if ($not_null{$f}) {
+- $options .= 'NOT NULL';
++ $options .= 'NOT NULL';
++ if ($Conf::Conf{'db_type'} eq 'SQLite') {
++ $options .= ' DEFAULT ""';
++ }
+ }
+
+ unless ($dbh->do("ALTER TABLE $t ADD $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options")) {
+@@ -1278,6 +1292,7 @@
+ &do_log('info', 'Field %s added to table %s', $f, $t);
+ $added_fields{$f} = 1;
+
++ if ($Conf::Conf{'db_type'} eq 'mysql') {
+ ## Remove temporary DB field
+ if ($real_struct{$t}{'temporary'}) {
+ unless ($dbh->do("ALTER TABLE $t DROP temporary")) {
+@@ -1285,43 +1300,96 @@
+ }
+ delete $real_struct{$t}{'temporary'};
+ }
++ }
+
+ next;
+ }
+
+ ## Change DB types if different and if update_db_types enabled
+- if ($Conf::Conf{'update_db_field_types'} eq 'auto' && $Conf::Conf{'db_type'} ne 'SQLite') {
+- unless (&check_db_field_type(effective_format => $real_struct{$t}{$f},
+- required_format => $db_struct{$Conf::Conf{'db_type'}}{$t}{$f})) {
+- push @report, sprintf('Field \'%s\' (table \'%s\' ; database \'%s\') does NOT have awaited type (%s). Attempting to change it...',
+- $f, $t, $Conf::Conf{'db_name'}, $db_struct{$Conf::Conf{'db_type'}}{$t}{$f});
+- &do_log('notice', 'Field \'%s\' (table \'%s\' ; database \'%s\') does NOT have awaited type (%s). Attempting to change it...',
+- $f, $t, $Conf::Conf{'db_name'}, $db_struct{$Conf::Conf{'db_type'}}{$t}{$f});
+-
+- my $options;
+- if ($not_null{$f}) {
+- $options .= 'NOT NULL';
+- }
+-
+- push @report, sprintf("ALTER TABLE $t CHANGE $f $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options");
+- &do_log('notice', "ALTER TABLE $t CHANGE $f $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options");
+- unless ($dbh->do("ALTER TABLE $t CHANGE $f $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options")) {
+- &do_log('err', 'Could not change field \'%s\' in table\'%s\'.', $f, $t);
+- &do_log('err', 'Sympa\'s database structure may have change since last update ; please check RELEASE_NOTES');
+- return undef;
++ if ($Conf::Conf{'update_db_field_types'} eq 'auto') {
++ if (grep $_ eq $Conf::Conf{'db_type'}, qw(SQLite mysql)) {
++ unless (&check_db_field_type(effective_format => $real_struct{$t}{$f},
++ required_format => $db_struct{$Conf::Conf{'db_type'}}{$t}{$f})) {
++ push @report, sprintf('Field \'%s\' (table \'%s\' ; database \'%s\') does NOT have awaited type (%s). Attempting to change it...',
++ $f, $t, $Conf::Conf{'db_name'}, $db_struct{$Conf::Conf{'db_type'}}{$t}{$f});
++ &do_log('notice', 'Field \'%s\' (table \'%s\' ; database \'%s\') does NOT have awaited type (%s). Attempting to change it...',
++ $f, $t, $Conf::Conf{'db_name'}, $db_struct{$Conf::Conf{'db_type'}}{$t}{$f});
++
++ my $options;
++ if ($not_null{$f}) {
++ $options .= 'NOT NULL';
++ }
++
++ if ($Conf::Conf{'db_type'} eq 'mysql') {
++ push @report, sprintf("ALTER TABLE $t CHANGE $f $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options");
++ &do_log('notice', "ALTER TABLE $t CHANGE $f $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options");
++ unless ($dbh->do("ALTER TABLE $t CHANGE $f $f $db_struct{$Conf::Conf{'db_type'}}{$t}{$f} $options")) {
++ &do_log('err', 'Could not change field \'%s\' in table\'%s\'.', $f, $t);
++ &do_log('err', 'Sympa\'s database structure may have change since last update ; please check RELEASE_NOTES');
++ return undef;
++ }
++
++ }
++ if ($Conf::Conf{'db_type'} eq 'SQLite') {
++ # FIXME
++ print "${t}/${f} -> "; print $real_struct{$t}{$f}; print " => "; print $db_struct{$Conf::Conf{'db_type'}}{$t}{$f}; print "\n";
++
++ my @oldfields = ();
++ foreach my $oldfield (keys %{$real_struct{$t}}) {
++ if (defined $db_struct{$Conf::Conf{'db_type'}}{${t}}{$oldfield}) {
++ push(@oldfields, $oldfield);
++ }
++ }
++ my $sqloldfields = join(", ", @oldfields);
++ my $sqlnewfieldstype = join(", ", map { "$_ $db_struct{$Conf::Conf{'db_type'}}{${t}}{$_}" } keys $db_struct{$Conf::Conf{'db_type'}}{${t}});
++
++ # SQLite doesn't support changes on columns types hence we use a dirty workaround here:
++ # we create a temporary table (a clone of the table containing the field to update)
++ # we dump all the data into it
++ # we create a new table with the right schema
++ # we copy all the data from the temporary table into the new one
++ # we delete the temporay table
++ # see: http://www.sqlite.org/faq.html#q11
++ &do_log('notice', 'Using a dirty trick to change SQLite data type see http://www.sqlite.org/faq.html#q11');
++ my $sqlcode = "DROP TABLE IF EXISTS ${t}_backup;";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ $dbh->do($sqlcode);
++ $sqlcode = "CREATE TEMPORARY TABLE ${t}_backup(${sqloldfields});";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ $dbh->do($sqlcode);
++ $sqlcode = "INSERT INTO ${t}_backup SELECT ${sqloldfields} FROM ${t};";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ $dbh->do($sqlcode);
++ $sqlcode = "DROP TABLE ${t};";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ $dbh->do($sqlcode);
++ $sqlcode = "CREATE TABLE ${t}(${sqlnewfieldstype});";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ $dbh->do($sqlcode);
++ $sqlcode = "INSERT INTO ${t} (${sqloldfields}) SELECT ${sqloldfields} FROM ${t}_backup;";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ my $toto = $dbh->do($sqlcode);
++ $sqlcode = "DROP TABLE ${t}_backup;";
++ push @report, $sqlcode;
++ &do_log('notice', $sqlcode);
++ $dbh->do($sqlcode);
++ # Update real structure
++ foreach my $newfield (sort keys $db_struct{$Conf::Conf{'db_type'}}{${t}}) {
++ $real_struct{$t}{$newfield} = $db_struct{$Conf::Conf{'db_type'}}{${t}}{$newfield};
++ }
++ }
++ push @report, sprintf('Field %s in table %s, structure updated', $f, $t);
++ &do_log('info', 'Field %s in table %s, structure updated', $f, $t);
++ }
+ }
+-
+- push @report, sprintf('Field %s in table %s, structure updated', $f, $t);
+- &do_log('info', 'Field %s in table %s, structure updated', $f, $t);
+- }
+- }else {
+- unless ($real_struct{$t}{$f} eq $db_struct{$Conf::Conf{'db_type'}}{$t}{$f}) {
+- &do_log('err', 'Field \'%s\' (table \'%s\' ; database \'%s\') does NOT have awaited type (%s).', $f, $t, $Conf::Conf{'db_name'}, $db_struct{$Conf::Conf{'db_type'}}{$t}{$f});
+- &do_log('err', 'Sympa\'s database structure may have change since last update ; please check RELEASE_NOTES');
+- return undef;
+- }
+ }
+- }
++ }
+ if ($Conf::Conf{'db_type'} eq 'mysql') {
+ ## Check that primary key has the right structure.
+ my $should_update;
+@@ -1460,7 +1528,7 @@
+ ## drop previous index
+ my $success;
+ foreach my $field (@{$primary{$t}}) {
+- unless ($dbh->do("DROP INDEX $field")) {
++ unless ($dbh->do("DROP INDEX IF EXISTS $field")) {
+ next;
+ }
+ $success = 1; last;
+@@ -1474,7 +1542,7 @@
+ }
+
+ ## Add INDEX
+- unless ($dbh->do("CREATE INDEX IF NOT EXIST $t\_index ON $t ($fields)")) {
++ unless ($dbh->do("CREATE INDEX IF NOT EXISTS $t\_index ON $t ($fields)")) {
+ &do_log('err', 'Could not set INDEX on field \'%s\', table\'%s\'.', $fields, $t);
+ return undef;
+ }
+--- a/src/etc/script/create_db.SQLite
++++ b/src/etc/script/create_db.SQLite
+@@ -18,51 +18,50 @@
+ user_subscriber text NOT NULL,
+ custom_attribute_subscriber text,
+ robot_subscriber text NOT NULL,
+- date_subscriber timestamp NOT NULL,
+- update_subscriber timestamp,
++ date_subscriber numeric NOT NULL,
++ update_subscriber numeric,
+ visibility_subscriber text,
+ reception_subscriber text,
+ topics_subscriber text,
+ bounce_subscriber text,
+ bounce_address_subscriber text,
+ comment_subscriber text,
+- subscribed_subscriber boolean,
+- included_subscriber boolean,
++ subscribed_subscriber numeric,
++ included_subscriber numeric,
+ include_sources_subscriber text,
+ bounce_score_subscriber integer,
+- suspend_subscriber boolean,
++ suspend_subscriber numeric,
+ suspend_start_date_subscriber integer,
+ suspend_end_date_subscriber integer,
+ PRIMARY KEY (robot_subscriber, list_subscriber, user_subscriber)
+ );
+-CREATE INDEX subscriber_idx ON subscriber_table (user_subscriber,list_subscriber,robot_subscriber);
+
+ CREATE TABLE admin_table (
+ list_admin text NOT NULL,
+ user_admin text NOT NULL,
+ robot_admin text NOT NULL,
+ role_admin text NOT NULL,
+- date_admin timestamp NOT NULL,
+- update_admin timestamp,
++ date_admin numeric NOT NULL,
++ update_admin numeric,
+ reception_admin text,
+ visibility_admin text,
+ comment_admin text,
+- subscribed_admin boolean,
+- included_admin boolean,
++ subscribed_admin numeric,
++ included_admin numeric,
+ include_sources_admin text,
+ info_admin text,
+ profile_admin text,
+ PRIMARY KEY (robot_admin, list_admin, role_admin, user_admin)
+ );
+-CREATE INDEX admin_idx ON admin_table(list_admin, user_admin, robot_admin, role_admin);
++CREATE INDEX admin_user_index ON admin_table ( user_admin );
+
+ CREATE TABLE exclusion_table (
+- list_exclusion text,
+- user_exclusion text,
++ list_exclusion text NOT NULL,
++ user_exclusion text NOT NULL,
++ robot_exclusion text NOT NULL,
+ date_exclusion integer,
+- PRIMARY KEY (list_exclusion, user_exclusion)
++ PRIMARY KEY (list_exclusion, user_exclusion, robot_exclusion)
+ );
+-CREATE INDEX exclusion_idx ON exclusion_table(list_exclusion, user_exclusion);
+
+ CREATE TABLE netidmap_table (
+ netid_netidmap text NOT NULL,
+@@ -89,7 +88,6 @@
+ daemon_logs text NOT NULL,
+ PRIMARY KEY (id_logs)
+ );
+-CREATE INDEX logs_idx ON logs_table(id_logs);
+
+ CREATE TABLE session_table (
+ id_session text NOT NULL,
+@@ -102,10 +100,9 @@
+ data_session text,
+ PRIMARY KEY (id_session)
+ );
+-CREATE INDEX session_idx ON session_table(id_session);
+
+ CREATE TABLE one_time_ticket_table (
+- ticket_one_time_ticket text NOT NULL,
++ ticket_one_time_ticket text,
+ robot_one_time_ticket text,
+ email_one_time_ticket text,
+ date_one_time_ticket integer,
+@@ -114,45 +111,56 @@
+ status_one_time_ticket text,
+ PRIMARY KEY (ticket_one_time_ticket)
+ );
+-CREATE INDEX one_time_ticket_idx ON one_time_ticket_table(ticket_one_time_ticket);
+
+ CREATE TABLE bulkmailer_table(
+- messagekey_bulkmailer varchar(80) NOT NULL,
+- packetid_bulkmailer varchar(33) NOT NULL,
+- messageid_bulkmailer varchar(100),
++ messagekey_bulkmailer text NOT NULL,
++ packetid_bulkmailer text NOT NULL,
++ messageid_bulkmailer text,
+ receipients_bulkmailer text,
+- returnpath_bulkmailer varchar(100),
+- robot_bulkmailer varchar(80),
+- listname_bulkmailer varchar(50),
+- verp_bulkmailer integer,
+- merge_bulkmailer integer,
++ returnpath_bulkmailer text,
++ robot_bulkmailer text,
++ listname_bulkmailer text,
++ verp_bulkmailer numeric,
++ merge_bulkmailer numeric,
+ priority_message_bulkmailer integer,
+ priority_packet_bulkmailer integer,
+ reception_date_bulkmailer integer,
+ delivery_date_bulkmailer integer,
+- lock_bulkmailer varchar(30),
++ lock_bulkmailer text,
+ PRIMARY KEY (messagekey_bulkmailer, packetid_bulkmailer)
+ );
+-CREATE INDEX bulkmailer_idx ON bulkmailer_table(messagekey_bulkmailer,packetid_bulkmailer);
+
+ CREATE TABLE bulkspool_table (
+- messagekey_bulkspool varchar(33) NOT NULL,
+- messageid_bulkspool varchar(100),
++ messagekey_bulkspool text NOT NULL,
++ messageid_bulkspool text,
+ message_bulkspool text,
+- lock_bulkspool integer,
+- dkim_privatekey_bulkspool varchar(100),
+- dkim_selector_bulkspool varchar(50),
+- dkim_d_bulkspool varchar(50),
+- dkim_i_bulkspool varchar(50),
++ lock_bulkspool numeric,
++ dkim_privatekey_bulkspool text,
++ dkim_selector_bulkspool text,
++ dkim_d_bulkspool text,
++ dkim_i_bulkspool text,
+ dkim_header_list_bulkspool varchar(500),
+ PRIMARY KEY (messagekey_bulkspool)
+ );
+-CREATE INDEX bulkspool_idx ON bulkspool_table(messagekey_bulkspool);
+
+ CREATE TABLE conf_table (
+- robot_conf text DEFAULT NULL,
+- label_conf text DEFAULT NULL,
+- value_conf text DEFAULT NULL,
++ robot_conf text,
++ label_conf text,
++ value_conf text,
+ PRIMARY KEY (robot_conf,label_conf)
+ );
+-CREATE INDEX conf_idx ON conf_table(robot_conf,label_conf);
++
++CREATE TABLE list_table (
++ creation_email_list text,
++ creation_epoch_list numeric,
++ editors_list text,
++ name_list text NOT NULL,
++ owners_list text,
++ path_list text,
++ robot_list text NOT NULL,
++ status_list text,
++ subject_list text,
++ topics_list text,
++ web_archive_list integer,
++ PRIMARY KEY (name_list, robot_list)
++);
--
sympa Debian packaging
More information about the Pkg-sympa-commits
mailing list