]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 287986: Bugzilla::DB::Mysql needs a way to read in a Schema object from the disk
authormkanat%kerio.com <>
Sat, 23 Apr 2005 09:11:51 +0000 (09:11 +0000)
committermkanat%kerio.com <>
Sat, 23 Apr 2005 09:11:51 +0000 (09:11 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=Tomas.Kopal, a=justdave

Bugzilla/DB.pm
Bugzilla/DB/Mysql.pm

index b6025791f0de2bd88f65cbbb184934ec54cfb1ff..850ea683a2c71a2114abf0070e31c05dfe47e476 100644 (file)
@@ -304,26 +304,15 @@ sub bz_get_field_defs {
 sub bz_setup_database {
     my ($self) = @_;
 
-    # Get a list of the existing tables (if any) in the database
-    my @current_tables = $self->bz_table_list_real();
+    # If we haven't ever stored a serialized schema,
+    # set up the bz_schema table and store it.
+    $self->_bz_init_schema_storage();
+    
     my @desired_tables = $self->_bz_schema->get_table_list();
 
     foreach my $table_name (@desired_tables) {
-        next if grep($_ eq $table_name, @current_tables);
-        print "Creating table $table_name ...\n";
-
-        my @table_sql = $self->_bz_schema->get_table_ddl($table_name);
-        foreach my $sql_statement (@table_sql) {
-            $self->do($sql_statement);
-        }
+        $self->bz_add_table($table_name);
     }
-
-    # And now, if we haven't already stored the serialized schema,
-    # store the ABSTRACT_SCHEMA from Bugzilla::DB::Schema.
-    # XXX - The code is not ready for this yet, but once
-    #       all the deps of bug 285111 are checked-in and 
-    #       tested, this should be uncommented.
-    #$self->_bz_init_schema_storage();
 }
 
 #####################################################################
@@ -775,17 +764,42 @@ These methods really are private. Do not override them in subclasses.
 sub _bz_init_schema_storage {
     my ($self) = @_;
 
-    my $table_size = $self->selectrow_array("SELECT COUNT(*) FROM bz_schema");
+    my $table_size;
+    eval {
+        $table_size = 
+            $self->selectrow_array("SELECT COUNT(*) FROM bz_schema");
+    };
+
+    if (!$table_size) {
+        my $init_schema = $self->_bz_get_initial_schema;
+        my $store_me = $init_schema->serialize_abstract();
+        my $schema_version = $init_schema->SCHEMA_VERSION;
+
+        # If table_size is not defined, then we hit an error reading the
+        # bz_schema table, which means it probably doesn't exist yet. So,
+        # we have to create it. If we failed above for some other reason,
+        # we'll see the failure here.
+        # However, we must create the table after we do get_initial_schema,
+        # because some versions of get_initial_schema read that the table
+        # exists and then add it to the Schema, where other versions don't.
+        if (!defined $table_size) {
+            $self->_bz_add_table_raw('bz_schema');
+        }
 
-    if ($table_size == 0) {
         print "Initializing the new Schema storage...\n";
-        my $store_me = $self->_bz_schema->serialize_abstract();
-        my $schema_version = $self->_bz_schema->SCHEMA_VERSION;
         my $sth = $self->prepare("INSERT INTO bz_schema "
                                  ." (schema_data, version) VALUES (?,?)");
         $sth->bind_param(1, $store_me, $self->BLOB_TYPE);
-        $sth->bind_param(2, Bugzilla::DB::Schema::SCHEMA_VERSION);
+        $sth->bind_param(2, $schema_version);
         $sth->execute();
+
+        # And now we have to update the on-disk schema to hold the bz_schema
+        # table, if the bz_schema table didn't exist when we were called.
+        if (!defined $table_size) {
+            $self->_bz_real_schema->add_table('bz_schema',
+                $self->_bz_schema->get_table_abstract('bz_schema'));
+            $self->_bz_store_real_schema;
+        }
     } 
     # Sanity check
     elsif ($table_size > 1) {
index 08d72e4d35d2936506fcf6812a0dc93b62dce820..2ca0f52e648b58a90ebd613c9a2b7016d0bb6dfd 100644 (file)
@@ -198,6 +198,12 @@ sub bz_rollback_transaction {
     die("Attempt to rollback transaction on DB without transaction support");
 }
 
+
+sub _bz_get_initial_schema {
+    my ($self) = @_;
+    return $self->_bz_build_schema_from_disk();
+}
+
 #####################################################################
 # Database Setup
 #####################################################################