From ea946eb23e405553861997b9158847dee59dd722 Mon Sep 17 00:00:00 2001
From: Max Kanat-Alexander <mkanat@bugzilla.org>
Date: Mon, 29 Aug 2011 15:22:47 -0700
Subject: [PATCH] Bug 629529: Make SQLite installs able to use jobqueue.pl
 r=glob, a=mkanat

---
 Bugzilla/DB/Schema/Sqlite.pm | 17 +++++++++++++++
 Bugzilla/DB/Sqlite.pm        | 41 ++++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/Bugzilla/DB/Schema/Sqlite.pm b/Bugzilla/DB/Schema/Sqlite.pm
index 4730c4f9f..aad1f17bc 100644
--- a/Bugzilla/DB/Schema/Sqlite.pm
+++ b/Bugzilla/DB/Schema/Sqlite.pm
@@ -162,6 +162,23 @@ sub get_create_database_sql {
     die "Reached an unreachable point";
 }
 
+sub _get_create_table_ddl {
+    my $self = shift;
+    my ($table) = @_;
+    my $ddl = $self->SUPER::_get_create_table_ddl(@_);
+
+    # TheSchwartz uses its own driver to access its tables, meaning
+    # that it doesn't understand "COLLATE bugzilla" and in fact
+    # SQLite throws an error when TheSchwartz tries to access its
+    # own tables, if COLLATE bugzilla is on them. We don't have
+    # to fix this elsewhere currently, because we only create
+    # TheSchwartz's tables, we never modify them.
+    if ($table =~ /^ts_/) {
+        $ddl =~ s/ COLLATE bugzilla//g;
+    }
+    return $ddl;
+}
+
 sub get_type_ddl {
     my $self = shift;
     my $def = dclone($_[0]);
diff --git a/Bugzilla/DB/Sqlite.pm b/Bugzilla/DB/Sqlite.pm
index fab1e3c87..fb6aaba97 100644
--- a/Bugzilla/DB/Sqlite.pm
+++ b/Bugzilla/DB/Sqlite.pm
@@ -25,6 +25,7 @@ use base qw(Bugzilla::DB);
 
 use Bugzilla::Constants;
 use Bugzilla::Error;
+use Bugzilla::Install::Util qw(install_string);
 
 use DateTime;
 use POSIX ();
@@ -246,6 +247,46 @@ sub sql_string_until {
 # bz_ methods #
 ###############
 
+sub bz_setup_database {
+    my $self = shift;
+    $self->SUPER::bz_setup_database(@_);
+
+    # If we created TheSchwartz tables with COLLATE bugzilla (during the
+    # 4.1.x development series) re-create them without it.
+    my @tables = $self->bz_table_list();
+    my @ts_tables = grep { /^ts_/ } @tables;
+    my $drop_ok;
+    foreach my $table (@ts_tables) {
+        my $create_table =
+            $self->_bz_real_schema->_sqlite_create_table($table);
+        if ($create_table =~ /COLLATE bugzilla/) {
+            if (!$drop_ok) {
+                _sqlite_jobqueue_drop_message();
+                $drop_ok = 1;
+            }
+            $self->bz_drop_table($table);
+            $self->bz_add_table($table);
+        }
+    }
+}
+
+sub _sqlite_jobqueue_drop_message {
+    # This is not translated because this situation will only happen if
+    # you are updating from a 4.1.x development version of Bugzilla using
+    # SQLite, and we don't want to maintain this string in strings.txt.pl
+    # forever for just this one uncommon circumstance.
+    print <<END;
+WARNING: We have to re-create all the database tables used by jobqueue.pl.
+If there are any pending jobs in the database (that is, emails that
+haven't been sent), they will be deleted.
+
+END
+    unless (Bugzilla->installation_answers->{NO_PAUSE}) {
+        print install_string('enter_or_ctrl_c');
+        getc;
+    }
+}
+
 # XXX This needs to be implemented.
 sub bz_explain { }
 
-- 
2.24.1