[Koha-cvs] koha/updater updatedatabase
paul poulain
paul at koha-fr.org
Tue Jan 24 18:57:17 CET 2006
CVSROOT: /cvsroot/koha
Module name: koha
Branch:
Changes by: paul poulain <tipaul at savannah.gnu.org> 06/01/24 17:57:17
Modified files:
updater : updatedatabase
Log message:
DB improvements : adding foreign keys on some tables. partial stuff done.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/koha/updater/updatedatabase.diff?tr1=1.126&tr2=1.127&r1=text&r2=text
Patches:
Index: koha/updater/updatedatabase
diff -u koha/updater/updatedatabase:1.126 koha/updater/updatedatabase:1.127
--- koha/updater/updatedatabase:1.126 Fri Jan 6 16:39:42 2006
+++ koha/updater/updatedatabase Tue Jan 24 17:57:17 2006
@@ -1,6 +1,6 @@
#!/usr/bin/perl
-# $Id: updatedatabase,v 1.126 2006/01/06 16:39:42 tipaul Exp $
+# $Id: updatedatabase,v 1.127 2006/01/24 17:57:17 tipaul Exp $
# Database Updater
# This script checks for required updates to the database.
@@ -310,6 +310,164 @@
extra => ''
},
],
+ aqbasket => [
+ {
+ field => 'booksellerid',
+ type => 'int(11)',
+ null => 'NOT NULL',
+ key => '',
+ default => '1',
+ extra => '',
+ },
+ ],
+);
+
+my %indexes = (
+# table => [
+# { indexname => 'index detail'
+# }
+# ],
+ shelfcontents => [
+ { indexname => 'shelfnumber',
+ content => 'shelfnumber',
+ },
+ { indexname => 'itemnumber',
+ content => 'itemnumber',
+ }
+ ],
+ bibliosubject => [
+ { indexname => 'biblionumber',
+ content => 'biblionumber',
+ }
+ ],
+ items => [
+ { indexname => 'homebranch',
+ content => 'homebranch',
+ },
+ { indexname => 'holdingbranch',
+ content => 'holdingbranch',
+ }
+ ],
+ aqbooksellers => [
+ { indexname => 'PRIMARY',
+ content => 'id',
+ type => 'PRIMARY',
+ }
+ ],
+ aqbasket => [
+ { indexname => 'booksellerid',
+ content => 'booksellerid',
+ },
+ ],
+ aqorders => [
+ { indexname => 'basketno',
+ content => 'basketno',
+ },
+ ],
+ aqorderbreakdown => [
+ { indexname => 'ordernumber',
+ content => 'ordernumber',
+ },
+ ],
+);
+
+my %foreign_keys = (
+# table => [
+# { key => 'the key in table' (must be indexed)
+# foreigntable => 'the foreigntable name', # (the parent)
+# foreignkey => 'the foreign key column(s)' # (in the parent)
+# onUpdate => 'CASCADE|SET NULL|NO ACTION| RESTRICT',
+# onDelete => 'CASCADE|SET NULL|NO ACTION| RESTRICT',
+# }
+# ],
+ shelfcontents => [
+ { key => 'shelfnumber',
+ foreigntable => 'bookshelf',
+ foreignkey => 'shelfnumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ { key => 'itemnumber',
+ foreigntable => 'items',
+ foreignkey => 'itemnumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ ],
+ biblioitems => [
+ { key => 'biblionumber',
+ foreigntable => 'biblio',
+ foreignkey => 'biblionumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ ],
+ items => [
+ { key => 'biblioitemnumber',
+ foreigntable => 'biblioitems',
+ foreignkey => 'biblioitemnumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ { key => 'homebranch',
+ foreigntable => 'branches',
+ foreignkey => 'branchcode',
+ onUpdate => 'RESTRICT',
+ onDelete => 'RESTRICT',
+ },
+ { key => 'holdingbranch',
+ foreigntable => 'branches',
+ foreignkey => 'branchcode',
+ onUpdate => 'RESTRICT',
+ onDelete => 'RESTRICT',
+ },
+ ],
+ additionalauthors => [
+ { key => 'biblionumber',
+ foreigntable => 'biblio',
+ foreignkey => 'biblionumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ ],
+ bibliosubject => [
+ { key => 'biblionumber',
+ foreigntable => 'biblio',
+ foreignkey => 'biblionumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ ],
+ aqbasket => [
+ { key => 'booksellerid',
+ foreigntable => 'aqbooksellers',
+ foreignkey => 'id',
+ onUpdate => 'CASCADE',
+ onDelete => 'RESTRICT',
+ },
+# { key => 'booksellerid',
+# foreigntable => 'aqbooksellers',
+# foreignkey => 'id',
+# onUpdate => 'CASCADE',
+# onDelete => 'RESTRICT',
+# },
+ ],
+ aqorders => [
+ { key => 'basketno',
+ foreigntable => 'aqbasket',
+ foreignkey => 'basketno',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ ],
+ aqorderbreakdown => [
+ { key => 'ordernumber',
+ foreigntable => 'aqorders',
+ foreignkey => 'ordernumber',
+ onUpdate => 'CASCADE',
+ onDelete => 'CASCADE',
+ },
+ ],
);
#-------------------
@@ -498,36 +656,102 @@
"select $uniquefieldrequired from $table where $uniquefieldrequired=?"
);
$sth->execute($uniquevalue);
- if ($sth->rows) {
- foreach my $field (keys %$forceupdate) {
- if ($forceupdate->{$field}) {
- my $sth=$dbh->prepare("update systempreferences set $field=? where $uniquefieldrequired=?");
- $sth->execute($row->{$field}, $uniquevalue);
+ if ($sth->rows) {
+ foreach my $field (keys %$forceupdate) {
+ if ($forceupdate->{$field}) {
+ my $sth=$dbh->prepare("update systempreferences set $field=? where $uniquefieldrequired=?");
+ $sth->execute($row->{$field}, $uniquevalue);
+ }
+ }
+ } else {
+ print "Adding row to $table: " unless $silent;
+ my @values;
+ my $fieldlist;
+ my $placeholders;
+ foreach my $field ( keys %$row ) {
+ next if $field eq 'uniquefieldrequired';
+ next if $field eq 'forceupdate';
+ my $value = $row->{$field};
+ push @values, $value;
+ print " $field => $value" unless $silent;
+ $fieldlist .= "$field,";
+ $placeholders .= "?,";
+ }
+ print "\n" unless $silent;
+ $fieldlist =~ s/,$//;
+ $placeholders =~ s/,$//;
+ my $sth =
+ $dbh->prepare(
+ "insert into $table ($fieldlist) values ($placeholders)");
+ $sth->execute(@values);
}
- }
- } else {
- print "Adding row to $table: " unless $silent;
- my @values;
- my $fieldlist;
- my $placeholders;
- foreach my $field ( keys %$row ) {
- next if $field eq 'uniquefieldrequired';
- next if $field eq 'forceupdate';
- my $value = $row->{$field};
- push @values, $value;
- print " $field => $value" unless $silent;
- $fieldlist .= "$field,";
- $placeholders .= "?,";
- }
- print "\n" unless $silent;
- $fieldlist =~ s/,$//;
- $placeholders =~ s/,$//;
- my $sth =
- $dbh->prepare(
- "insert into $table ($fieldlist) values ($placeholders)");
- $sth->execute(@values);
- }
- }
+ }
+}
+
+#
+# check indexes and create them when needed
+#
+print "Checking for index required...\n" unless $silent;
+foreach my $table ( keys %indexes ) {
+ #
+ # read all indexes from $table
+ #
+ $sth = $dbh->prepare("show index from $table");
+ $sth->execute;
+ my %existingindexes;
+ while ( my ( $table, $non_unique, $key_name, $Seq_in_index, $Column_name, $Collation, $cardinality, $sub_part, $Packed, $comment ) = $sth->fetchrow ) {
+ $existingindexes{$key_name} = 1;
+ }
+ # read indexes to check
+ my $tablerows = $indexes{$table};
+ foreach my $row (@$tablerows) {
+ my $key_name=$row->{indexname};
+ if ($existingindexes{$key_name} eq 1) {
+# print "$key_name existing";
+ } else {
+ print "Creating $key_name in $table\n";
+ my $sql;
+ if ($row->{indexname} eq 'PRIMARY') {
+ $sql = "alter table $table ADD PRIMARY KEY ($row->{content})";
+ } else {
+ $sql = "alter table $table ADD INDEX $key_name ($row->{content}) $row->{type}";
+ }
+ $dbh->do($sql);
+ print "Error $sql : $dbh->err \n" if $dbh->err;
+ }
+ }
+}
+
+#
+# check foreign keys and create them when needed
+#
+print "Checking for foreign keys required...\n" unless $silent;
+foreach my $table ( keys %foreign_keys ) {
+ #
+ # read all indexes from $table
+ #
+ $sth = $dbh->prepare("show table status like '$table'");
+ $sth->execute;
+ my $stat = $sth->fetchrow_hashref;
+ # read indexes to check
+ my $tablerows = $foreign_keys{$table};
+ foreach my $row (@$tablerows) {
+ my $foreign_table=$row->{foreigntable};
+ if ($stat->{'Comment'} =~/$foreign_table/) {
+# print "$foreign_table existing\n";
+ } else {
+ print "Creating $foreign_table in $table\n";
+ # first, drop any orphan value in child table
+ my $sql = "delete from $table where $row->{key} not in (select $row->{foreignkey} from $row->{foreigntable})";
+ $dbh->do($sql);
+ print "SQL ERROR: $sql : $dbh->err \n" if $dbh->err;
+ $sql="alter table $table ADD FOREIGN KEY $row->{key} ($row->{key}) REFERENCES $row->{foreigntable} ($row->{foreignkey})";
+ $sql .= " on update ".$row->{onUpdate} if $row->{onUpdate};
+ $sql .= " on delete ".$row->{onDelete} if $row->{onDelete};
+ $dbh->do($sql);
+ print "SQL ERROR: $sql : $dbh->errstr \n" if $dbh->err;
+ }
+ }
}
#
@@ -802,6 +1026,9 @@
exit;
# $Log: updatedatabase,v $
+# Revision 1.127 2006/01/24 17:57:17 tipaul
+# DB improvements : adding foreign keys on some tables. partial stuff done.
+#
# Revision 1.126 2006/01/06 16:39:42 tipaul
# synch'ing head and rel_2_2 (from 2.2.5, including npl templates)
# Seems not to break too many things, but i'm probably wrong here.
More information about the Koha-cvs
mailing list