From a4b66874db35b0ad64257b202dc48d43924eb14e Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Thu, 13 Dec 2007 09:14:32 +0000 Subject: Bug 408032: [Oracle] Make bzdbcopy.pl work with Oracle Patch By Max Kanat-Alexander (module owner) a=mkanat --- Bugzilla/DB/Oracle.pm | 23 +++++++++++++++++++++++ Bugzilla/DB/Schema.pm | 6 +++--- Bugzilla/DB/Schema/Mysql.pm | 6 +++--- Bugzilla/DB/Schema/Oracle.pm | 29 +++++++++++++++++++++-------- 4 files changed, 50 insertions(+), 14 deletions(-) (limited to 'Bugzilla/DB') diff --git a/Bugzilla/DB/Oracle.pm b/Bugzilla/DB/Oracle.pm index 509dedaa1..a970e3193 100644 --- a/Bugzilla/DB/Oracle.pm +++ b/Bugzilla/DB/Oracle.pm @@ -406,7 +406,30 @@ sub quote_identifier { return $id; } +##################################################################### +# Protected "Real Database" Schema Information Methods +##################################################################### +sub bz_table_columns_real { + my ($self, $table) = @_; + $table = uc($table); + my @cols = $self->SUPER::bz_table_columns_real($table); + return map { lc($_) } @cols; +} + +sub bz_table_list_real { + my ($self) = @_; + # Oracle only accepts the username in uppercase. + my $db_user = uc(Bugzilla->localconfig->{db_user}); + my $table_sth = $self->table_info(undef, $db_user, undef, "TABLE"); + my @tables = @{$self->selectcol_arrayref($table_sth, { Columns => [3] })}; + # Oracle returns uppercase table names, but Bugzilla expects lowercase + # names. + @tables = map { lc($_) } @tables; + # Oracle has certain tables that start with DR$_IDX. + @tables = grep { $_ !~ /^dr\$/ } @tables; + return @tables; +} ##################################################################### # Custom Database Setup diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index 023f01860..2be64cab3 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -1533,9 +1533,9 @@ sub get_add_fk_sql { return ("ALTER TABLE $table ADD $fk_string"); } -sub _get_drop_fk_sql { - my ($self, $table, $column, $old_def) = @_; - my $fk_name = $self->_get_fk_name($table, $column, $old_def->{REFERENCES}); +sub get_drop_fk_sql { + my ($self, $table, $column, $references) = @_; + my $fk_name = $self->_get_fk_name($table, $column, $references); return ("ALTER TABLE $table DROP CONSTRAINT $fk_name"); } diff --git a/Bugzilla/DB/Schema/Mysql.pm b/Bugzilla/DB/Schema/Mysql.pm index 300b1a0f1..2f4bc42b2 100644 --- a/Bugzilla/DB/Schema/Mysql.pm +++ b/Bugzilla/DB/Schema/Mysql.pm @@ -193,9 +193,9 @@ sub get_alter_column_ddl { return @statements; } -sub _get_drop_fk_sql { - my ($self, $table, $column, $old_def) = @_; - my $fk_name = $self->_get_fk_name($table, $column, $old_def->{REFERENCES}); +sub get_drop_fk_sql { + my ($self, $table, $column, $references) = @_; + my $fk_name = $self->_get_fk_name($table, $column, $references); my @sql = ("ALTER TABLE $table DROP FOREIGN KEY $fk_name"); my $dbh = Bugzilla->dbh; diff --git a/Bugzilla/DB/Schema/Oracle.pm b/Bugzilla/DB/Schema/Oracle.pm index 77024507b..8f0f880be 100644 --- a/Bugzilla/DB/Schema/Oracle.pm +++ b/Bugzilla/DB/Schema/Oracle.pm @@ -93,7 +93,7 @@ sub get_table_ddl { } # Create sequences and triggers to emulate SERIAL datatypes. if ( $field_info->{TYPE} =~ /SERIAL/i ) { - push (@ddl, _get_create_seq_ddl($table, $field_name)); + push (@ddl, $self->_get_create_seq_ddl($table, $field_name)); } } return @ddl; @@ -140,17 +140,17 @@ sub get_fk_ddl { $fk_string = $fk_string . " ON DELETE $delete" if $delete; if ( $update =~ /CASCADE/i ){ - my $tr_str = "CREATE OR REPLACE TRIGGER ". $table . "_uc" + my $tr_str = "CREATE OR REPLACE TRIGGER ${fk_name}_UC" . " AFTER UPDATE ON ". $table . " REFERENCING " . " NEW AS NEW " . " OLD AS OLD " . " FOR EACH ROW " . " BEGIN " - . " UPDATE ". $to_table - . " SET ". $to_column . " = :NEW.". $column - . " WHERE ". $to_column . " = :OLD.". $column . ";" - . " END ". $table . "_uc;"; + . " UPDATE $to_table" + . " SET $to_column = :NEW.$column" + . " WHERE $to_column = :OLD.$column;" + . " END ${fk_name}_UC;"; my $dbh = Bugzilla->dbh; $dbh->do($tr_str); } @@ -158,6 +158,18 @@ sub get_fk_ddl { return $fk_string; } +sub get_drop_fk_sql { + my $self = shift; + my ($table, $column, $references) = @_; + my $fk_name = $self->_get_fk_name(@_); + my @sql; + if (!$references->{UPDATE} || $references->{UPDATE} =~ /CASCADE/i) { + push(@sql, "DROP TRIGGER ${fk_name}_uc"); + } + push(@sql, $self->SUPER::get_drop_fk_sql(@_)); + return @sql; +} + sub _get_fk_name { my ($self, $table, $column, $references) = @_; my $to_table = $references->{TABLE}; @@ -185,12 +197,13 @@ sub _get_notnull_trigger_ddl { } sub _get_create_seq_ddl { - my ($table, $column) = @_; + my ($self, $table, $column, $start_with) = @_; + $start_with ||= 1; my @ddl; my $seq_name = "${table}_${column}_SEQ"; my $seq_sql = "CREATE SEQUENCE $seq_name " . " INCREMENT BY 1 " - . " START WITH 1 " + . " START WITH $start_with " . " NOMAXVALUE " . " NOCYCLE " . " NOCACHE"; -- cgit v1.2.3-24-g4f1b