[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