koha-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Koha-cvs] koha/updater updatedatabase


From: paul poulain
Subject: [Koha-cvs] koha/updater updatedatabase
Date: Tue, 24 Jan 2006 17:57:17 +0000

CVSROOT:        /cvsroot/koha
Module name:    koha
Branch:         
Changes by:     paul poulain <address@hidden>   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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]