[Koha-cvs] CVS: koha/updater updatedatabase,1.112,1.113
Paul POULAIN
tipaul at users.sourceforge.net
Thu Jul 28 10:38:46 CEST 2005
Update of /cvsroot/koha/koha/updater
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26990/updater
Modified Files:
updatedatabase
Log Message:
For instance, the return date does not rely on the borrower expiration date. A systempref will be added in Koha, to modify return date calculation schema :
* ReturnBeforeExpiry = yes => return date can't be after expiry date
* ReturnBeforeExpiry = no => return date can be after expiry date
Index: updatedatabase
===================================================================
RCS file: /cvsroot/koha/koha/updater/updatedatabase,v
retrieving revision 1.112
retrieving revision 1.113
diff -C2 -r1.112 -r1.113
*** updatedatabase 26 Jul 2005 08:19:47 -0000 1.112
--- updatedatabase 28 Jul 2005 08:38:41 -0000 1.113
***************
*** 114,117 ****
--- 114,482 ----
type => 'YesNo',
},
+ {
+ uniquefieldrequired => 'variable',
+ variable => 'ReturnBeforeExpiry',
+ value => 'Off',
+ forceupdate => { 'explanation' => 1,
+ 'type' => 1},
+ explanation => 'If Yes, Returndate on issuing can\'t be after borrower card expiry',
+ type => 'YesNo',
+ },
+ ],
+
+ );
+
+ my %fielddefinitions = (
+ # fieldname => [
+ # { field => 'fieldname',
+ # type => 'fieldtype',
+ # null => '',
+ # key => '',
+ # default => ''
+ # },
+ # ],
+ );
+
+ #-------------------
+ # Initialize
+
+ # Start checking
+
+ # Get version of MySQL database engine.
+ my $mysqlversion = `mysqld --version`;
+ $mysqlversion =~ /Ver (\S*) /;
+ $mysqlversion = $1;
+ if ( $mysqlversion ge '3.23' ) {
+ print "Could convert to MyISAM database tables...\n" unless $silent;
+ }
+
+ #---------------------------------
+ # Tables
+
+ # Collect all tables into a list
+ $sth = $dbh->prepare("show tables");
+ $sth->execute;
+ while ( my ($table) = $sth->fetchrow ) {
+ $existingtables{$table} = 1;
+ }
+
+
+ # Now add any missing tables
+ foreach $table ( keys %requiretables ) {
+ unless ( $existingtables{$table} ) {
+ print "Adding $table table...\n" unless $silent;
+ my $sth = $dbh->prepare("create table $table $requiretables{$table}");
+ $sth->execute;
+ if ( $sth->err ) {
+ print "Error : $sth->errstr \n";
+ $sth->finish;
+ } # if error
+ } # unless exists
+ } # foreach
+
+ # now drop useless tables
+ foreach $table ( keys %dropable_table ) {
+ if ( $existingtables{$table} ) {
+ print "Dropping unused table $table\n" if $debug and not $silent;
+ $dbh->do("drop table $table");
+ if ( $dbh->err ) {
+ print "Error : $dbh->errstr \n";
+ }
+ }
+ }
+
+ #---------------------------------
+ # Columns
+
+ foreach $table ( keys %requirefields ) {
+ print "Check table $table\n" if $debug and not $silent;
+ $sth = $dbh->prepare("show columns from $table");
+ $sth->execute();
+ undef %types;
+ while ( ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
+ {
+ $types{$column} = $type;
+ } # while
+ foreach $column ( keys %{ $requirefields{$table} } ) {
+ print " Check column $column [$types{$column}]\n" if $debug and not $silent;
+ if ( !$types{$column} ) {
+
+ # column doesn't exist
+ print "Adding $column field to $table table...\n" unless $silent;
+ $query = "alter table $table
+ add column $column " . $requirefields{$table}->{$column};
+ print "Execute: $query\n" if $debug;
+ my $sti = $dbh->prepare($query);
+ $sti->execute;
+ if ( $sti->err ) {
+ print "**Error : $sti->errstr \n";
+ $sti->finish;
+ } # if error
+ } # if column
+ } # foreach column
+ } # foreach table
+
+ foreach $table ( keys %fielddefinitions ) {
+ print "Check table $table\n" if $debug;
+ $sth = $dbh->prepare("show columns from $table");
+ $sth->execute();
+ my $definitions;
+ while ( ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
+ {
+ $definitions->{$column}->{type} = $type;
+ $definitions->{$column}->{null} = $null;
+ $definitions->{$column}->{key} = $key;
+ $definitions->{$column}->{default} = $default;
+ $definitions->{$column}->{extra} = $extra;
+ } # while
+ my $fieldrow = $fielddefinitions{$table};
+ foreach my $row (@$fieldrow) {
+ my $field = $row->{field};
+ my $type = $row->{type};
+ my $null = $row->{null};
+ my $key = $row->{key};
+ my $default = $row->{default};
+ $default="''" unless $default;
+ my $extra = $row->{extra};
+ my $def = $definitions->{$field};
+ unless ( $type eq $def->{type}
+ && $null eq $def->{null}
+ && $key eq $def->{key}
+ && $default eq $def->{default}
+ && $extra eq $def->{extra} )
+ {
+
+ if ( $null eq '' ) {
+ $null = 'NOT NULL';
+ }
+ if ( $key eq 'PRI' ) {
+ $key = 'PRIMARY KEY';
+ }
+ unless ( $extra eq 'auto_increment' ) {
+ $extra = '';
+ }
+ # if it's a new column use "add", if it's an old one, use "change".
+ my $action;
+ if ($definitions->{$field}->{type}) {
+ $action="change $field"
+ } else {
+ $action="add";
+ }
+ # if it's a primary key, drop the previous pk, before altering the table
+ my $sth;
+ if ($key ne 'PRIMARY KEY') {
+ $sth =$dbh->prepare("alter table $table $action $field $type $null $key $extra default ?");
+ } else {
+ $sth =$dbh->prepare("alter table $table drop primary key, $action $field $type $null $key $extra default ?");
+ }
+ $sth->execute($default);
+ print " Alter $field in $table\n" unless $silent;
+ }
+ }
+ }
+
+
+ # Populate tables with required data
+ foreach my $table ( keys %tabledata ) {
+ print "Checking for data required in table $table...\n" unless $silent;
+ my $tablerows = $tabledata{$table};
+ foreach my $row (@$tablerows) {
+ my $uniquefieldrequired = $row->{uniquefieldrequired};
+ my $uniquevalue = $row->{$uniquefieldrequired};
+ my $forceupdate = $row->{forceupdate};
+ my $sth =
+ $dbh->prepare(
+ "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);
+ }
+ }
+ } 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);
+ }
+ }
+ }
+
+ # at last, remove useless fields
+ foreach $table ( keys %uselessfields ) {
+ my @fields = split /,/,$uselessfields{$table};
+ my $fields;
+ my $exists;
+ foreach my $fieldtodrop (@fields) {
+ $fieldtodrop =~ s/\t//g;
+ $fieldtodrop =~ s/\n//g;
+ $exists =0;
+ $sth = $dbh->prepare("show columns from $table");
+ $sth->execute;
+ while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
+ {
+ $exists =1 if ($column eq $fieldtodrop);
+ }
+ if ($exists) {
+ print "deleting $fieldtodrop field in $table...\n" unless $silent;
+ my $sth = $dbh->prepare("alter table $table drop $fieldtodrop");
+ $sth->execute;
+ }
+ }
+ } # foreach
+
+
+ $sth->finish;
+
+ exit;
+
+ # $Log$
+ # Revision 1.113 2005/07/28 08:38:41 tipaul
+ # For instance, the return date does not rely on the borrower expiration date. A systempref will be added in Koha, to modify return date calculation schema :
+ # * ReturnBeforeExpiry = yes => return date can't be after expiry date
+ # * ReturnBeforeExpiry = no => return date can be after expiry date
+ #
+ # Revision 1.112 2005/07/26 08:19:47 hdl
+ # Adding IndependantBranches System preference variable in order to manage Branch independancy.
+ #
+ # Revision 1.111 2005/07/25 15:35:38 tipaul
+ # we have decided that moving to Koha 3.0 requires being already in Koha 2.2.x
+ # So, the updatedatabase script can highly be cleaned (90% removed).
+ # Let's play with the new Koha DB structure now ;-)
+ #
+ #!/usr/bin/perl
+
+ # $Id$
+
+ # Database Updater
+ # This script checks for required updates to the database.
+
+ # Part of the Koha Library Software www.koha.org
+ # Licensed under the GPL.
+
+ # Bugs/ToDo:
+ # - Would also be a good idea to offer to do a backup at this time...
+
+ # NOTE: If you do something more than once in here, make it table driven.
+ use strict;
+
+ # CPAN modules
+ use DBI;
+ use Getopt::Long;
+ # Koha modules
+ use C4::Context;
+
+ # FIXME - The user might be installing a new database, so can't rely
+ # on /etc/koha.conf anyway.
+
+ my $debug = 0;
+
+ my (
+ $sth, $sti,
+ $query,
+ %existingtables, # tables already in database
+ %types,
+ $table,
+ $column,
+ $type, $null, $key, $default, $extra,
+ $prefitem, # preference item in systempreferences table
+ );
+
+ my $silent;
+ GetOptions(
+ 's' =>\$silent
+ );
+ my $dbh = C4::Context->dbh;
+ print "connected to your DB. Checking & modifying it\n" unless $silent;
+
+ #-------------------
+ # Defines
+
+ # Tables to add if they don't exist
+ my %requiretables = (
+ categorytable => "(categorycode char(5) NOT NULL default '',
+ description text default '',
+ itemtypecodes text default '',
+ PRIMARY KEY (categorycode)
+ )",
+ subcategorytable => "(subcategorycode char(5) NOT NULL default '',
+ description text default '',
+ itemtypecodes text default '',
+ PRIMARY KEY (subcategorycode)
+ )",
+ mediatypetable => "(mediatypecode char(5) NOT NULL default '',
+ description text default '',
+ itemtypecodes text default '',
+ PRIMARY KEY (mediatypecode)
+ )",
+ action_logs => "(
+ `timestamp` TIMESTAMP NOT NULL ,
+ `user` INT( 11 ) NOT NULL ,
+ `module` TEXT default '',
+ `action` TEXT default '' ,
+ `object` INT(11) default '' ,
+ `info` TEXT default '' ,
+ PRIMARY KEY ( `timestamp` , `user` )
+ )",
+ );
+
+ my %requirefields = (
+ # tablename => { 'field' => 'fieldtype' },
+ );
+
+ my %dropable_table = (
+ # tablename => 'tablename',
+ );
+
+ my %uselessfields = (
+ # tablename => "field1,field2",
+ );
+ # the other hash contains other actions that can't be done elsewhere. they are done
+ # either BEFORE of AFTER everything else, depending on "when" entry (default => AFTER)
+
+ # The tabledata hash contains data that should be in the tables.
+ # The uniquefieldrequired hash entry is used to determine which (if any) fields
+ # must not exist in the table for this row to be inserted. If the
+ # uniquefieldrequired entry is already in the table, the existing data is not
+ # modified, unless the forceupdate hash entry is also set. Fields in the
+ # anonymous "forceupdate" hash will be forced to be updated to the default
+ # values given in the %tabledata hash.
+
+ my %tabledata = (
+ # tablename => [
+ # { uniquefielrequired => 'fieldname', # the primary key in the table
+ # fieldname => fieldvalue,
+ # fieldname2 => fieldvalue2,
+ # },
+ # ],
+ systempreferences => [
+ {
+ uniquefieldrequired => 'variable',
+ variable => 'Activate_Log',
+ value => 'On',
+ forceupdate => { 'explanation' => 1,
+ 'type' => 1},
+ explanation => 'Turn Log Actions on DB On an Off',
+ type => 'YesNo',
+ },
{
uniquefieldrequired => 'variable',
***************
*** 352,355 ****
--- 717,725 ----
# $Log$
+ # Revision 1.113 2005/07/28 08:38:41 tipaul
+ # For instance, the return date does not rely on the borrower expiration date. A systempref will be added in Koha, to modify return date calculation schema :
+ # * ReturnBeforeExpiry = yes => return date can't be after expiry date
+ # * ReturnBeforeExpiry = no => return date can be after expiry date
+ #
# Revision 1.112 2005/07/26 08:19:47 hdl
# Adding IndependantBranches System preference variable in order to manage Branch independancy.
More information about the Koha-cvs
mailing list