add DB2 support for adding keys to tables
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@7323 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
80bcccc1eb
commit
1eeae6603c
@ -1005,60 +1005,68 @@ sub updateschema
|
||||
}
|
||||
}
|
||||
|
||||
#for existing columns that are new keys now,
|
||||
#for existing columns that are new keys now
|
||||
# note new keys can only be created from existing columns
|
||||
# since keys cannot be null, the copy from the backup table will fail if
|
||||
# the old value was null.
|
||||
|
||||
my @new_dbkeys=@{$descr->{keys}};
|
||||
my @old_dbkeys=keys %dbkeys;
|
||||
#print "new_dbkeys=@new_dbkeys; old_dbkeys=@old_dbkeys; columns=@columns\n";
|
||||
my $change_keys=0;
|
||||
#Add the new key columns to the table
|
||||
foreach my $dbkey (@new_dbkeys) {
|
||||
if (! exists($dbkeys{$dbkey})) {
|
||||
$change_keys=1;
|
||||
#for my sql, we do not have to recreate table, but we have to make sure the type is correct,
|
||||
#TEXT is not a valid type for a primary key
|
||||
my $datatype;
|
||||
if (($xcatcfg =~ /^mysql:/) || ($xcatcfg =~ /^DB2:/)) {
|
||||
if ($xcatcfg =~ /^mysql:/) {
|
||||
$datatype=get_datatype_string($dbkey, $xcatcfg, $types);
|
||||
} else { # db2
|
||||
$datatype=get_datatype_string_db2($dbkey, $types, $tn,$descr);
|
||||
}
|
||||
if ($datatype eq "TEXT") {
|
||||
if ($xcatcfg =~ /^mysql:/) {
|
||||
$datatype=get_datatype_string($dbkey, $xcatcfg, $types);
|
||||
} else { # db2
|
||||
$datatype=get_datatype_string_db2($dbkey, $types, $tn,$descr);
|
||||
}
|
||||
if ($datatype eq "TEXT") {
|
||||
if (isAKey(\@{$descr->{keys}}, $dbkey)) { # keys need defined length
|
||||
$datatype = "VARCHAR(128) ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (grep /^$dbkey$/, @{$descr->{required}})
|
||||
{
|
||||
$datatype .= " NOT NULL";
|
||||
}
|
||||
my $stmt =
|
||||
"ALTER TABLE " . $self->{tabname} . " MODIFY COLUMN $dbkey $datatype";
|
||||
print "stmt=$stmt\n";
|
||||
$self->{dbh}->do($stmt);
|
||||
if ($self->{dbh}->errstr) {
|
||||
my $tmpkey=$dbkey; # for sqlite
|
||||
if ($xcatcfg =~ /^DB2:/){
|
||||
$tmpkey="\"$dbkey\"";
|
||||
# get rid of NOT NULL, cannot modify with NOT NULL
|
||||
my ($tmptype,$nullvalue)= split('NOT NULL',$datatype );
|
||||
$datatype=$tmptype;
|
||||
|
||||
} else {
|
||||
if ($xcatcfg =~ /^mysql:/) {
|
||||
$tmpkey="\`$dbkey\`";
|
||||
}
|
||||
}
|
||||
my $stmt;
|
||||
if ($xcatcfg =~ /^DB2:/){
|
||||
$stmt =
|
||||
"ALTER TABLE " . $self->{tabname} . " ALTER COLUMN $tmpkey SET DATA TYPE $datatype";
|
||||
} else {
|
||||
$stmt =
|
||||
"ALTER TABLE " . $self->{tabname} . " MODIFY COLUMN $tmpkey $datatype";
|
||||
}
|
||||
xCAT::MsgUtils->message("S", $stmt);
|
||||
#print "stmt=$stmt\n";
|
||||
$self->{dbh}->do($stmt);
|
||||
if ($self->{dbh}->errstr) {
|
||||
xCAT::MsgUtils->message("S", "Error changing the keys for table " . $self->{tabname} .":" . $self->{dbh}->errstr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#check for cloumns that used to be keys but now are not
|
||||
if (!$change_keys) {
|
||||
foreach(keys %dbkeys) {
|
||||
if (! isAKey(\@new_dbkeys, $_)) {
|
||||
$change_keys=1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#finally drop the old keys and add the new keys
|
||||
#finally add the new keys
|
||||
if ($change_keys) {
|
||||
if ($xcatcfg =~ /^mysql:/) { #for mysql, just alter the table
|
||||
my $tmp=join(',',@new_dbkeys);
|
||||
my $stmt =
|
||||
"ALTER TABLE " . $self->{tabname} . " DROP PRIMARY KEY, ADD PRIMARY KEY ($tmp)";
|
||||
print "stmt=$stmt\n";
|
||||
#print "stmt=$stmt\n";
|
||||
$self->{dbh}->do($stmt);
|
||||
if ($self->{dbh}->errstr) {
|
||||
xCAT::MsgUtils->message("S", "Error changing the keys for table " . $self->{tabname} .":" . $self->{dbh}->errstr);
|
||||
@ -1068,15 +1076,28 @@ sub updateschema
|
||||
my $btn=$tn . "_xcatbackup";
|
||||
|
||||
#remove the backup table just in case;
|
||||
# gets error if not there
|
||||
#my $str="DROP TABLE $btn";
|
||||
#$self->{dbh}->do($str);
|
||||
|
||||
# Call tabdump plugin to create a CSV file
|
||||
#rename the table name to name_xcatbackup
|
||||
my $str = "ALTER TABLE $tn RENAME TO $btn";
|
||||
my $str;
|
||||
if ($xcatcfg =~ /^DB2:/){
|
||||
$str = "RENAME TABLE $tn TO $btn";
|
||||
} else {
|
||||
$str = "ALTER TABLE $tn RENAME TO $btn";
|
||||
}
|
||||
$self->{dbh}->do($str);
|
||||
if (!$self->{dbh}->{AutoCommit}) {
|
||||
$self->{dbh}->commit;
|
||||
}
|
||||
if ($self->{dbh}->errstr) {
|
||||
xCAT::MsgUtils->message("S", "Error renaming the table from $tn to $btn:" . $self->{dbh}->errstr);
|
||||
}
|
||||
if (!$self->{dbh}->{AutoCommit}) {
|
||||
$self->{dbh}->commit;
|
||||
}
|
||||
|
||||
#create the table again
|
||||
$str =
|
||||
@ -1087,6 +1108,9 @@ sub updateschema
|
||||
if ($self->{dbh}->errstr) {
|
||||
xCAT::MsgUtils->message("S", "Error recreating table $tn:" . $self->{dbh}->errstr);
|
||||
}
|
||||
if (!$self->{dbh}->{AutoCommit}) {
|
||||
$self->{dbh}->commit;
|
||||
}
|
||||
|
||||
#copy the data from backup to the table
|
||||
$str = "INSERT INTO $tn SELECT * FROM $btn";
|
||||
|
Loading…
Reference in New Issue
Block a user