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:
lissav 2010-08-31 17:23:28 +00:00
parent 80bcccc1eb
commit 1eeae6603c

View File

@ -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";