Commit cc8d6d39 authored by mkanat%kerio.com's avatar mkanat%kerio.com

Bug 287986: Bugzilla::DB::Mysql needs a way to read in a Schema object from the disk

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=Tomas.Kopal, a=justdave
parent 372be50d
...@@ -304,26 +304,15 @@ sub bz_get_field_defs { ...@@ -304,26 +304,15 @@ sub bz_get_field_defs {
sub bz_setup_database { sub bz_setup_database {
my ($self) = @_; my ($self) = @_;
# Get a list of the existing tables (if any) in the database # If we haven't ever stored a serialized schema,
my @current_tables = $self->bz_table_list_real(); # set up the bz_schema table and store it.
$self->_bz_init_schema_storage();
my @desired_tables = $self->_bz_schema->get_table_list(); my @desired_tables = $self->_bz_schema->get_table_list();
foreach my $table_name (@desired_tables) { foreach my $table_name (@desired_tables) {
next if grep($_ eq $table_name, @current_tables); $self->bz_add_table($table_name);
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);
}
} }
# 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. ...@@ -775,17 +764,42 @@ These methods really are private. Do not override them in subclasses.
sub _bz_init_schema_storage { sub _bz_init_schema_storage {
my ($self) = @_; 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"; 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 " my $sth = $self->prepare("INSERT INTO bz_schema "
." (schema_data, version) VALUES (?,?)"); ." (schema_data, version) VALUES (?,?)");
$sth->bind_param(1, $store_me, $self->BLOB_TYPE); $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(); $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 # Sanity check
elsif ($table_size > 1) { elsif ($table_size > 1) {
......
...@@ -198,6 +198,12 @@ sub bz_rollback_transaction { ...@@ -198,6 +198,12 @@ sub bz_rollback_transaction {
die("Attempt to rollback transaction on DB without transaction support"); 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 # Database Setup
##################################################################### #####################################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment