# - 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;
$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";
+print "connected to your DB. Checking & modifying it\n" unless $silent;
#-------------------
# Defines
# Tables to add if they don't exist
my %requiretables = (
- shelfcontents => "( shelfnumber int not null,
- itemnumber int not null,
- flags int)",
- bookshelf => "( shelfnumber int auto_increment primary key,
- shelfname char(255))",
- z3950queue => "( id int auto_increment primary key,
- term text,
- type char(10),
- startdate int,
- enddate int,
- done smallint,
- results longblob,
- numrecords int,
- servers text,
- identifier char(30))",
- z3950results => "( id int auto_increment primary key,
- queryid int,
- server char(255),
- startdate int,
- enddate int,
- results longblob,
- numrecords int,
- numdownloaded int,
- highestseen int,
- active smallint)",
- branchrelations => "( branchcode varchar(4),
- categorycode varchar(4))",
- websites => "( websitenumber int(11) NOT NULL auto_increment,
- biblionumber int(11) NOT NULL default '0',
- title text,
- description text,
- url varchar(255),
- PRIMARY KEY (websitenumber) )",
- marcrecorddone => "( isbn char(40),
- issn char(40),
- lccn char(40),
- controlnumber char(40))",
- uploadedmarc => "( id int(11) NOT NULL auto_increment PRIMARY KEY,
- marc longblob,
- hidden smallint(6) default NULL,
- name varchar(255) default NULL)",
- ethnicity => "( code varchar(10) NOT NULL default '',
- name varchar(255) default NULL,
- PRIMARY KEY (code) )",
- sessions => "( sessionID varchar(255) NOT NULL default '',
- userid varchar(255) default NULL,
- ip varchar(16) default NULL,
- lasttime int,
- PRIMARY KEY (sessionID) )",
- sessionqueries => "( sessionID varchar(255) NOT NULL default '',
- userid char(100) NOT NULL default '',
- ip char(18) NOT NULL default '',
- url text NOT NULL default '' )",
- bibliothesaurus => "( id bigint(20) NOT NULL auto_increment,
- freelib char(255) NOT NULL default '',
- stdlib char(255) NOT NULL default '',
- category char(10) NOT NULL default '',
- level tinyint(4) NOT NULL default '1',
- hierarchy char(80) NOT NULL default '',
- father char(80) NOT NULL default '',
- PRIMARY KEY (id),
- KEY freelib (freelib),
- KEY stdlib (stdlib),
- KEY category (category),
- KEY hierarchy (hierarchy)
- )",
- marc_biblio => "(
- bibid bigint(20) unsigned NOT NULL auto_increment,
- biblionumber int(11) NOT NULL default '0',
- datecreated date NOT NULL default '0000-00-00',
- datemodified date default NULL,
- origincode char(20) default NULL,
- PRIMARY KEY (bibid),
- KEY origincode (origincode),
- KEY biblionumber (biblionumber)
- ) ",
- marc_blob_subfield => "(
- blobidlink bigint(20) NOT NULL auto_increment,
- subfieldvalue longtext NOT NULL,
- PRIMARY KEY (blobidlink)
- ) ",
- marc_subfield_structure => "(
- tagfield char(3) NOT NULL default '',
- tagsubfield char(1) NOT NULL default '',
- liblibrarian char(255) NOT NULL default '',
- libopac char(255) NOT NULL default '',
- repeatable tinyint(4) NOT NULL default '0',
- mandatory tinyint(4) NOT NULL default '0',
- kohafield char(40) default NULL,
- tab tinyint(1) default NULL,
- authorised_value char(10) default NULL,
- thesaurus_category char(10) default NULL,
- value_builder char(80) default NULL,
- PRIMARY KEY (tagfield,tagsubfield),
- KEY kohafield (kohafield),
- KEY tab (tab)
- )",
- marc_subfield_table => "(
- subfieldid bigint(20) unsigned NOT NULL auto_increment,
- bibid bigint(20) unsigned NOT NULL default '0',
- tag char(3) NOT NULL default '',
- tagorder tinyint(4) NOT NULL default '1',
- tag_indicator char(2) NOT NULL default '',
- subfieldcode char(1) NOT NULL default '',
- subfieldorder tinyint(4) NOT NULL default '1',
- subfieldvalue varchar(255) default NULL,
- valuebloblink bigint(20) default NULL,
- PRIMARY KEY (subfieldid),
- KEY bibid (bibid),
- KEY tag (tag),
- KEY tag_indicator (tag_indicator),
- KEY subfieldorder (subfieldorder),
- KEY subfieldcode (subfieldcode),
- KEY subfieldvalue (subfieldvalue),
- KEY tagorder (tagorder)
- )",
- marc_tag_structure => "(
- tagfield char(3) NOT NULL default '',
- liblibrarian char(255) NOT NULL default '',
- libopac char(255) NOT NULL default '',
- repeatable tinyint(4) NOT NULL default '0',
- mandatory tinyint(4) NOT NULL default '0',
- authorised_value char(10) default NULL,
- PRIMARY KEY (tagfield)
- )",
- marc_word => "(
- bibid bigint(20) NOT NULL default '0',
- tag char(3) NOT NULL default '',
- tagorder tinyint(4) NOT NULL default '1',
- subfieldid char(1) NOT NULL default '',
- subfieldorder tinyint(4) NOT NULL default '1',
- word varchar(255) NOT NULL default '',
- sndx_word varchar(255) NOT NULL default '',
- KEY bibid (bibid),
- KEY tag (tag),
- KEY tagorder (tagorder),
- KEY subfieldid (subfieldid),
- KEY subfieldorder (subfieldorder),
- KEY word (word),
- KEY sndx_word (sndx_word)
- )",
- marc_breeding => "( id bigint(20) NOT NULL auto_increment,
- file varchar(80) NOT NULL default '',
- isbn varchar(10) NOT NULL default '',
- title varchar(128) default NULL,
- author varchar(80) default NULL,
- marc text NOT NULL,
- encoding varchar(40) default NULL,
- PRIMARY KEY (id),
- KEY title (title),
- KEY isbn (isbn)
- )",
- authorised_values => "(id int(11) NOT NULL auto_increment,
- category char(10) NOT NULL default '',
- authorised_value char(80) NOT NULL default '',
- lib char(80) NULL,
- PRIMARY KEY (id),
- KEY name (category)
- )",
- userflags => "( bit int(11) NOT NULL default '0',
- flag char(30), flagdesc char(255),
- defaulton int(11)
- )",
- auth_types => "(
- authtypecode char(10) not NULL,
- authtypetext char(255) not NULL,
- auth_tag_to_report char(3) not NULL,
- summary text not NULL,
- PRIMARY KEY (authtypecode)
- )",
- biblio_framework => "(
- frameworkcode char(4) not NULL,
- frameworktext char(255) not NULL,
- PRIMARY KEY (frameworkcode)
- )",
- auth_subfield_structure => "(
- authtypecode char(10) NOT NULL default '',
- tagfield char(3) NOT NULL default '',
- tagsubfield char(1) NOT NULL default '',
- liblibrarian char(255) NOT NULL default '',
- libopac char(255) NOT NULL default '',
- repeatable tinyint(4) NOT NULL default '0',
- mandatory tinyint(4) NOT NULL default '0',
- tab tinyint(1) default NULL,
- authorised_value char(10) default NULL,
- value_builder char(80) default NULL,
- seealso char(255) default NULL,
- PRIMARY KEY (authtypecode,tagfield,tagsubfield),
- KEY tab (authtypecode,tab)
- )",
- auth_tag_structure => "(
- authtypecode char(10) NOT NULL default '',
- tagfield char(3) NOT NULL default '',
- liblibrarian char(255) NOT NULL default '',
- libopac char(255) NOT NULL default '',
- repeatable tinyint(4) NOT NULL default '0',
- mandatory tinyint(4) NOT NULL default '0',
- authorised_value char(10) default NULL,
- PRIMARY KEY (authtypecode,tagfield)
- )",
- auth_header => "(
- authid bigint(20) unsigned NOT NULL auto_increment,
- datecreated date NOT NULL default '0000-00-00',
- datemodified date default NULL,
- origincode char(20) default NULL,
- PRIMARY KEY (authid),
- KEY origincode (origincode),
- ) ",
- auth_subfield_table => "(
- subfieldid bigint(20) unsigned NOT NULL auto_increment,
- authid bigint(20) unsigned NOT NULL default '0',
- tag char(3) NOT NULL default '',
- tagorder tinyint(4) NOT NULL default '1',
- tag_indicator char(2) NOT NULL default '',
- subfieldcode char(1) NOT NULL default '',
- subfieldorder tinyint(4) NOT NULL default '1',
- subfieldvalue varchar(255) default NULL,
- PRIMARY KEY (subfieldid),
- KEY authid (authid),
- KEY tag (tag),
- KEY subfieldcode (subfieldcode),
- KEY subfieldvalue (subfieldvalue)
- )",
- auth_word => "(
- authid bigint(20) NOT NULL default '0',
- tagsubfield char(4) NOT NULL default '',
- tagorder tinyint(4) NOT NULL default '1',
- subfieldorder tinyint(4) NOT NULL default '1',
- word varchar(255) NOT NULL default '',
- sndx_word varchar(255) NOT NULL default '',
- KEY authid (authid),
- KEY marc_search (tagsubfield,word),
- KEY word (word),
- KEY sndx_word (sndx_word)
- )",
+ 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` )
+ )",
+ letter => "(
+ module varchar(20) NOT NULL default '',
+ code varchar(20) NOT NULL default '',
+ name varchar(100) NOT NULL default '',
+ title varchar(200) NOT NULL default '',
+ content text,
+ PRIMARY KEY (module,code)
+ )",
+ alert =>"(
+ alertid int(11) NOT NULL auto_increment,
+ borrowernumber int(11) NOT NULL default '0',
+ type varchar(10) NOT NULL default '',
+ externalid varchar(20) NOT NULL default '',
+ PRIMARY KEY (alertid),
+ KEY borrowernumber (borrowernumber),
+ KEY type (type,externalid)
+ )",
+
);
my %requirefields = (
- biblio => { 'abstract' => 'text' },
- deletedbiblio => { 'abstract' => 'text', 'marc' => 'blob' },
- deleteditems => { 'marc' => 'blob', 'paidfor' => 'text' },
- biblioitems => {
- 'lccn' => 'char(25)',
- 'url' => 'varchar(255)',
- 'marc' => 'text'
- },
- deletedbiblioitems => {
- 'lccn' => 'char(25)',
- 'url' => 'varchar(255)',
- 'marc' => 'text'
- },
- branchtransfers => { 'datearrived' => 'datetime' },
- statistics => { 'borrowernumber' => 'int(11)' },
- aqbooksellers => {
- 'invoicedisc' => 'float(6,4)',
- 'nocalc' => 'int(11)'
- },
- borrowers => {
- 'userid' => 'char(30)',
- 'password' => 'char(30)',
- 'flags' => 'int(11)',
- 'textmessaging' => 'varchar(30)',
- 'zipcode' => 'varchar(25)',
- 'homezipcode' => 'varchar(25)',
- },
- aqorders => { 'budgetdate' => 'date' },
- aqbudget => {'aqbudgetid' => 'tinyint(4) auto_increment primary key'},
- items => {'paidfor' => 'text'},
-
- #added so that reference items are not available for reserves...
- itemtypes => { 'notforloan' => 'smallint(6)' },
- systempreferences => { 'explanation' => 'char(80)',
- 'type' => 'char(20)',
- 'options' => 'text' },
- z3950servers => { 'syntax' => 'char(80)' },
- marc_tag_structure =>{
- 'frameworkcode' => 'char(4) not NULL default \'\''},
- marc_subfield_structure =>{'seealso' => 'char(255)',
- 'frameworkcode' => 'char(4) not NULL default \'\'',
- 'hidden' => 'tinyint(1)',
- 'isurl' => 'tinyint(1)',
- },
- bookshelf => {'owner' => 'char(80)',
- 'category' => 'char(1)',
- },
- marc_biblio => { 'frameworkcode' => 'char(4) not NULL default \'\'' },
+ subscription => { 'letter' => 'char(20) NULL'},
+# tablename => { 'field' => 'fieldtype' },
);
my %dropable_table = (
- classification => 'classification',
- multipart => 'multipart',
- multivolume => 'multivolume',
- newitems => 'newitems',
- procedures => 'procedures',
- publisher => 'publisher',
- searchstats => 'searchstats',
- serialissues => 'serialissues',
+# 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)
# values given in the %tabledata hash.
my %tabledata = (
- userflags => [
- {
- uniquefieldrequired => 'bit',
- bit => 0,
- flag => 'superlibrarian',
- flagdesc => 'Access to all librarian functions',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 1,
- flag => 'circulate',
- flagdesc => 'Circulate books',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 2,
- flag => 'catalogue',
- flagdesc => 'View Catalogue (Librarian Interface)',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 3,
- flag => 'parameters',
- flagdesc => 'Set Koha system paramters',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 4,
- flag => 'borrowers',
- flagdesc => 'Add or modify borrowers',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 5,
- flag => 'permissions',
- flagdesc => 'Set user permissions',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 6,
- flag => 'reserveforothers',
- flagdesc => 'Reserve books for patrons',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 7,
- flag => 'borrow',
- flagdesc => 'Borrow books',
- defaulton => 1
- },
- {
- uniquefieldrequired => 'bit',
- bit => 8,
- flag => 'reserveforself',
- flagdesc => 'Reserve books for self',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 9,
- flag => 'editcatalogue',
- flagdesc => 'Edit Catalogue (Modify bibliographic/holdings data)',
- defaulton => 0
- },
- {
- uniquefieldrequired => 'bit',
- bit => 10,
- flag => 'updatecharges',
- flagdesc => 'Update borrower charges',
- defaulton => 0
- },
- ],
+# tablename => [
+# { uniquefielrequired => 'fieldname', # the primary key in the table
+# fieldname => fieldvalue,
+# fieldname2 => fieldvalue2,
+# },
+# ],
systempreferences => [
- {
- uniquefieldrequired => 'variable',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- variable => 'LibraryName',
- value => '<i><b>Koha<br/>Free Software ILS<br/><br/></b>Koha : a gift, a contribution<br/> in Maori</i>',
- explanation => 'Library name as shown on main opac page',
- type => ''
-
- },
- {
- uniquefieldrequired => 'variable',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- variable => 'autoMemberNum',
- value => '1',
- explanation => 'Member number is auto-calculated',
- type => 'YesNo'
-
- },
- {
- uniquefieldrequired => 'variable',
- forceupdate => { 'explanation' => 1,
- 'type' => 1,
- 'options' => 1 },
- variable => 'acquisitions',
- value => 'normal',
- explanation =>
-'Normal, budget-based acquisitions, or Simple bibliographic-data acquisitions',
- type => 'Choice',
- options => 'simple|normal'
- },
- {
- uniquefieldrequired => 'variable',
- forceupdate => { 'explanation' => 1,
- 'type' => 1,
- 'options' => 1 },
- variable => 'dateformat',
- value => 'metric',
- explanation =>
- 'date format (us mm/dd/yyyy, metric dd/mm/yyy, ISO yyyy/mm/dd)',
- type => 'Choice',
- options => 'metric|us|iso'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'template',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'default',
- explanation => 'Preference order for intranet interface templates',
- type => 'Themes'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'autoBarcode',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'yes',
- explanation => 'Barcode is auto-calculated',
- type => 'YesNo'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'insecure',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'no',
- explanation =>
-'If YES, no auth at all is needed. Be careful if you set this to yes!',
- type => 'YesNo'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'authoritysep',
- forceupdate => { 'explanation' => 1,
- 'type' => 1,
- 'options' => 1 },
- value => '--',
- explanation =>
- 'the separator used in authority/thesaurus. Usually --',
- type => 'free',
- options => '10'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'opaclanguages',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'en',
- explanation => 'Set the preferred order for translations. The top language will be tried first.',
- type => 'Languages'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'opacthemes',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'css',
- explanation => 'Set the preferred order for themes. The top theme will be tried first.',
- type => 'Themes'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'timeout',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '1200',
- explanation => 'Inactivity timeout for cookies authentication (in seconds)',
- type => 'Integer'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'marc',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'yes',
- explanation => 'Turn on MARC support',
- type => 'YesNo'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'marcflavour',
- forceupdate => { 'explanation' => 1,
- 'type' => 1,
- 'options' => 1},
- value => 'MARC21',
- explanation =>
- 'your MARC flavor (MARC21 or UNIMARC) used for character encoding',
- type => 'Choice',
- options => 'MARC21|UNIMARC'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'checkdigit',
- value => 'none',
- forceupdate => { 'explanation' => 1,
- 'type' => 1,
- 'options' => 1},
- explanation => 'Validity checks on membership number: none or "Katipo" style checks',
- type => 'Choice',
- options => 'none|katipo'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'maxoutstanding',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '5',
- explanation =>
- 'maximum amount withstanding to be able make reserves ',
- type => 'Integer'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'maxreserves',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '5',
- explanation =>
- 'maximum number of reserves a member can make',
- type => 'Integer'
-
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'noissuescharge',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '5',
- explanation =>
- 'maximum amount withstanding to be able to check out an item',
- type => 'Integer'
-
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'KohaAdminEmailAddress',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'your.mail@here',
- explanation => 'the email address where borrowers modifs are sent',
- type => 'free'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'gist',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '0.125',
- explanation => 'the gist rate. NOT in %, but in numeric form (0.12 for 12%)',
- type => 'free'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'ldapserver',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '',
- explanation => 'your ldap server',
- type => 'free'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'ldapinfos',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '',
- explanation => 'ldap info. The ldap will be used in dn : uid=xxx, <ldapinfos>',
- type => 'free'
- },
- {
- uniquefieldrequired => 'variable',
- variable => 'printcirculationslips',
- forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '0',
- explanation => 'if set to 1, print circulation slips. If set to 0, don\'t',
- type => 'free'
- },
- {
+ {
uniquefieldrequired => 'variable',
- variable => 'suggestion',
+ variable => 'Activate_Log',
+ value => 'On',
forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '0',
- explanation => 'if set to 1, suggestions are activated in OPAC',
- type => 'free'
+ 'type' => 1},
+ explanation => 'Turn Log Actions on DB On an Off',
+ type => 'YesNo',
},
{
uniquefieldrequired => 'variable',
- variable => 'ISBD',
+ variable => 'IndependantBranches',
+ value => 0,
forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => 'Fill with appropriate value...',
- explanation => 'ISBD',
- type => 'free'
+ 'type' => 1},
+ explanation => 'Turn Branch independancy management On an Off',
+ type => 'YesNo',
},
- {
+ {
uniquefieldrequired => 'variable',
- variable => 'virtualshelves',
+ variable => 'ReturnBeforeExpiry',
+ value => 'Off',
forceupdate => { 'explanation' => 1,
- 'type' => 1 },
- value => '0',
- explanation => 'Set virtual shelves management ON or OFF',
- type => 'YesNo'
+ 'type' => 1},
+ explanation => 'If Yes, Returndate on issuing can\'t be after borrower card expiry',
+ type => 'YesNo',
},
],
);
my %fielddefinitions = (
- printers => [
- {
- field => 'printername',
- type => 'char(40)',
- null => '',
- key => 'PRI',
- default => ''
- },
- ],
- aqbookfund => [
- {
- field => 'bookfundid',
- type => 'char(5)',
- null => '',
- key => 'PRI',
- default => ''
- },
- ],
- aqbudget => [
- {
- field => 'aqbudgetid',
- type => 'tinyint(4)',
- null => '',
- key => 'PRI',
- default =>'',
- extra => 'auto_increment'
- },
- ],
- z3950servers => [
- {
- field => 'id',
- type => 'int',
- null => '',
- key => 'PRI',
- default => '',
- extra => 'auto_increment'
- },
- ],
- marc_breeding => [
- {
- field => 'z3950random',
- type => 'varchar(40)',
- null => 'NULL',
- key => '',
- default => '',
- extra => ''
- },
- {
- field => 'encoding',
- type => 'varchar(40)',
- null => '',
- key => '',
- default => '',
- extra => ''
- },
- ],
+# fieldname => [
+# { field => 'fieldname',
+# type => 'fieldtype',
+# null => '',
+# key => '',
+# default => ''
+# },
+# ],
);
#-------------------
$mysqlversion =~ /Ver (\S*) /;
$mysqlversion = $1;
if ( $mysqlversion ge '3.23' ) {
- print "Could convert to MyISAM database tables...\n";
+ print "Could convert to MyISAM database tables...\n" unless $silent;
}
#---------------------------------
# Now add any missing tables
foreach $table ( keys %requiretables ) {
unless ( $existingtables{$table} ) {
- print "Adding $table table...\n";
+ print "Adding $table table...\n" unless $silent;
my $sth = $dbh->prepare("create table $table $requiretables{$table}");
$sth->execute;
if ( $sth->err ) {
# now drop useless tables
foreach $table ( keys %dropable_table ) {
if ( $existingtables{$table} ) {
- print "Dropping unused table $table\n" if $debug;
+ print "Dropping unused table $table\n" if $debug and not $silent;
$dbh->do("drop table $table");
if ( $dbh->err ) {
print "Error : $dbh->errstr \n";
}
}
}
-unless ( $existingtables{'z3950servers'} ) {
- #MJR: added syntax entries to close bug 624
- print "Adding z3950servers table...\n";
- my $sti = $dbh->prepare( "create table z3950servers (
- host char(255),
- port int,
- db char(255),
- userid char(255),
- password char(255),
- name text,
- id int,
- checked smallint,
- rank int,
- syntax char(80))"
- );
- $sti->execute;
- $sti = $dbh->prepare( "insert into z3950servers
- values ('z3950.loc.gov',
- 7090,
- 'voyager',
- '', '',
- 'Library of Congress',
- 1, 1, 1, 'USMARC')"
- );
- $sti->execute;
-}
-unless ( $existingtables{'issuingrules'} ) {
- $dbh->do("alter table categoryitem rename issuingrules");
- print "renaming categoryitem\n";
-}
-
#---------------------------------
# Columns
foreach $table ( keys %requirefields ) {
- print "Check table $table\n" if $debug;
+ print "Check table $table\n" if $debug and not $silent;
$sth = $dbh->prepare("show columns from $table");
$sth->execute();
undef %types;
$types{$column} = $type;
} # while
foreach $column ( keys %{ $requirefields{$table} } ) {
- print " Check column $column [$types{$column}]\n" if $debug;
+ 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";
+ 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;
$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";
+ print " Alter $field in $table\n" unless $silent;
}
}
}
-# Get list of columns from borrowers table
-my %itemtypes;
-my %nullenabled;
-$sth = $dbh->prepare("show columns from borrowers");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $itemtypes{$column} = $type;
- $nullenabled{$column} = $null;
-}
-
-unless ( $itemtypes{'cardnumber'} eq 'varchar(20)' ) {
- $itemtypes{'cardnumber'} =~ /varchar\((\d+)\)/;
- my $oldlength = $1;
- if ( $oldlength < 16 ) {
- print "Setting maximum cardnumber length to 16 (was $oldlength) and marking unique.\n";
- my $sti =
- $dbh->prepare(
- "alter table borrowers change cardnumber cardnumber varchar(16)");
- $sti->execute;
- $sti->finish;
- $sti =
- $dbh->prepare(
- "alter table borrowers drop index cardnumber");
- $sti->execute;
- $sti->finish;
- $sti =
- $dbh->prepare(
- "alter table borrowers add unique(cardnumber)");
- $sti->execute;
- $sti->finish;
- }
-}
-#
-# Get list of columns from items table
-$sth = $dbh->prepare("show columns from items");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $itemtypes{$column} = $type;
- $nullenabled{$column} = $null;
-}
-
-unless ( $itemtypes{'barcode'} eq 'varchar(20)' ) {
- $itemtypes{'barcode'} =~ /varchar\((\d+)\)/;
- my $oldlength = $1;
- if ( $oldlength < 20 ) {
- print "Setting maximum barcode length to 20 (was $oldlength).\n";
- my $sti =
- $dbh->prepare(
- "alter table items change barcode barcode varchar(20)");
- $sti->execute;
- }
-}
-#
-# dropping unique barcode index & setting barcode to null allowed.
-#
-$sth = $dbh->prepare("show index from items");
-$sth->execute;
-while ( my ( $table, $non_unique, $key_name, $Seq_in_index, $Column_name, $Collation, $cardinality, $sub_part, $Packed, $comment ) = $sth->fetchrow )
-{
- if ($key_name eq 'barcode' && $non_unique eq 0) {
- print "dropping BARCODE index to enable empty barcodes\n";
- $dbh->do("ALTER TABLE `items` DROP INDEX `barcode`");
- }
-}
-$dbh->do("ALTER TABLE `items` CHANGE `barcode` `barcode` VARCHAR( 20 )") unless ($nullenabled{barcode} eq 'YES');
-
-#
-# creating fulltext index in bibliothesaurus if needed
-#
-$sth = $dbh->prepare("show index from bibliothesaurus");
-$sth->execute;
-my $exists=0;
-while ( my ( $table, $non_unique, $key_name, $Seq_in_index, $Column_name, $Collation, $cardinality, $sub_part, $Packed, $comment ) = $sth->fetchrow )
-{
- if ($key_name eq 'category_2') {
- $exists=1;
- }
-}
-print "Creating fulltext index on bibliothesaurus\n" unless $exists;
-$dbh->do('create fulltext index category_2 on bibliothesaurus (category,freelib)') unless $exists;
-
-#
-# creating index in z3950results if needed
-#
-$sth = $dbh->prepare("show index from z3950results");
-$sth->execute;
-my $exists=0;
-while ( my ( $table, $non_unique, $key_name, $Seq_in_index, $Column_name, $Collation, $cardinality, $sub_part, $Packed, $comment ) = $sth->fetchrow )
-{
- if ($key_name eq 'query_server') {
- $exists=1;
- }
-}
-print "Creating index on z3950results\n" unless $exists;
-$dbh->do('create unique index query_server on z3950results (queryid,server)') unless $exists;
-
-# changing z3950daemon field to NULL in marc_breeding
-$dbh->do("ALTER TABLE `marc_breeding` CHANGE `z3950random` `z3950random` VARCHAR( 40 )");
-
-# making borrowernumber an auto_increment field
-$dbh->do("ALTER TABLE `borrowers` CHANGE `borrowernumber` `borrowernumber` INTEGER auto_increment");
-
-# changing indexes in marc_*_structure to use frameworkcode
-$dbh->do('alter table marc_subfield_structure drop index tab');
-$dbh->do('create index tab on marc_subfield_structure (frameworkcode,tab)');
-$dbh->do('alter table marc_subfield_structure drop index kohafield');
-$dbh->do('create index kohafield on marc_subfield_structure (frameworkcode,kohafield)');
-
-# extending the timestamp in branchtransfers...
-my %branchtransfers;
-
-$sth = $dbh->prepare("show columns from branchtransfers");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $branchtransfers{$column} = $type;
-}
-
-unless ( $branchtransfers{'datesent'} eq 'datetime' ) {
- print "Setting type of datesent in branchtransfers to datetime.\n";
- my $sti =
- $dbh->prepare(
- "alter table branchtransfers change datesent datesent datetime");
- $sti->execute;
-}
-
-unless ( $branchtransfers{'datearrived'} eq 'datetime' ) {
- print "Setting type of datearrived in branchtransfers to datetime.\n";
- my $sti =
- $dbh->prepare(
- "alter table branchtransfers change datearrived datearrived datetime");
- $sti->execute;
-}
-
-# changing the branchcategories table around...
-my %branchcategories;
-
-$sth = $dbh->prepare("show columns from branchcategories");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $branchcategories{$column} = $type;
-}
-
-unless ( $branchcategories{'categorycode'} eq 'varchar(4)' ) {
- print
-"Setting type of categorycode in branchcategories to varchar(4),\n and making the primary key.\n";
- my $sti =
- $dbh->prepare(
-"alter table branchcategories change categorycode categorycode varchar(4) not null"
- );
- $sti->execute;
- $sti =
- $dbh->prepare(
- "alter table branchcategories add primary key (categorycode)");
- $sti->execute;
-}
-
-unless ( $branchcategories{'categoryname'} eq 'text' ) {
- print "Changing branchcode in branchcategories to categoryname text.\n";
- my $sth =
- $dbh->prepare(
- "alter table branchcategories change branchcode categoryname text");
- $sth->execute;
-}
-
-unless ( $branchcategories{'codedescription'} eq 'text' ) {
- print
-"Replacing branchholding in branchcategories with codedescription text.\n";
- my $sth =
- $dbh->prepare(
- "alter table branchcategories change branchholding codedescription text"
- );
- $sth->execute;
-}
-
-# changing the items table around...
-my %items;
-
-$sth = $dbh->prepare("show columns from items");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $items{$column} = $type;
-}
-
-if ($items{'bulk'} eq "varchar(30)") {
- print " Setting callnumber in items table\n";
- my $sti =
- $dbh->prepare("ALTER TABLE `items` CHANGE `bulk` `itemcallnumber` VARCHAR( 30 ) DEFAULT NULL");
- $sti->execute;
- $sti = $dbh->prepare("update marc_subfield_structure set kohafield=\"items.itemcallnumber\" where kohafield=\"items.bulk\"");
- $sti->execute;
-}
-
-# changing the marc_subfield_structure table around...
-my %marc_subfield_structure;
-
-$sth = $dbh->prepare("show columns from marc_subfield_structure");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $marc_subfield_structure{$column} = $type;
-}
-
-if ($marc_subfield_structure{thesaurus_category}) {
- print " changing thesaurus_category in marc_subfield_structure table\n";
- my $sti =
- $dbh->prepare("ALTER TABLE marc_subfield_structure CHANGE `thesaurus_category` `authtypecode` VARCHAR(10 ) DEFAULT NULL");
- $sti->execute;
-}
-
-#
-# creating index in issuingrules if needed
-#
-$sth = $dbh->prepare("show index from issuingrules");
-$sth->execute;
-my $exists=0;
-while ( my ( $table, $non_unique, $key_name, $Seq_in_index, $Column_name, $Collation, $cardinality, $sub_part, $Packed, $comment ) = $sth->fetchrow )
-{
- if ($key_name eq 'PRIMARY') {
- $exists=1;
- }
-}
-print "Creating index on z3950results\n" unless $exists;
-$dbh->do('ALTER TABLE issuingrules ADD PRIMARY KEY ( branchcode, categorycode, itemtype )') unless $exists;
-
-$dbh->do('ALTER TABLE marc_tag_structure drop primary key');
-$dbh->do('ALTER TABLE marc_tag_structure ADD PRIMARY KEY ( frameworkcode, tagfield )');
-
-$dbh->do('ALTER TABLE marc_subfield_structure drop primary key');
-$dbh->do('ALTER TABLE marc_subfield_structure ADD PRIMARY KEY ( frameworkcode, tagfield, tagsubfield )');
-
-# Get list of columns from marc_word table
-my %marc_word;
-my %nullenabled;
-$sth = $dbh->prepare("show columns from marc_word");
-$sth->execute;
-while ( my ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow )
-{
- $marc_word{$column} = $type;
- $nullenabled{$column} = $null;
-}
-if ($marc_word{subfieldid}) {
- #create field tagsubfield, copy tag+subfieldid, then drop tag and subfieldid
- print "Modifying marc_word (concat on tag and subfield for better perfs)\n";
- $dbh->do("ALTER TABLE `marc_word` ADD `tagsubfield` CHAR( 4 ) NOT NULL AFTER `bibid`");
- $dbh->do("update marc_word set tagsubfield=concat(tag,subfieldid)");
- $dbh->do("alter table marc_word drop tag");
- $dbh->do("alter table marc_word drop subfieldid");
- $dbh->do("create index Search_Marc on marc_word (tagsubfield,word)");
-}
# Populate tables with required data
-
foreach my $table ( keys %tabledata ) {
- print "Checking for data required in table $table...\n";
+ print "Checking for data required in table $table...\n" unless $silent;
my $tablerows = $tabledata{$table};
foreach my $row (@$tablerows) {
my $uniquefieldrequired = $row->{uniquefieldrequired};
}
}
} else {
- print "Adding row to $table: ";
+ print "Adding row to $table: " unless $silent;
my @values;
my $fieldlist;
my $placeholders;
next if $field eq 'forceupdate';
my $value = $row->{$field};
push @values, $value;
- print " $field => $value";
+ print " $field => $value" unless $silent;
$fieldlist .= "$field,";
$placeholders .= "?,";
}
- print "\n";
+ print "\n" unless $silent;
$fieldlist =~ s/,$//;
$placeholders =~ s/,$//;
my $sth =
}
}
+# 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.85 2004/06/17 15:19:44 tipaul
-# missing Marc_Search index on marc_word
+# Revision 1.119 2005/08/04 16:07:58 tipaul
+# Synch really broke this script...
#
-# Revision 1.84 2004/06/17 08:25:21 tipaul
-# DB modifs : merging tag & subfield in marc_word table
+# Revision 1.118 2005/08/04 16:02:55 tipaul
+# oops... error in synch between 2.2 and head
#
-# Revision 1.83 2004/06/10 08:32:02 tipaul
-# MARC authority management (continued)
+# Revision 1.117 2005/08/04 14:24:39 tipaul
+# synch'ing 2.2 and head
#
-# Revision 1.82 2004/06/03 12:46:58 tipaul
-# * frameworks and itemtypes are independant
+# Revision 1.116 2005/08/04 08:55:54 tipaul
+# Letters / alert system, continuing...
#
-# WARNING : will work only if applied to a 2.0 base. some modifs have been done since last commit that will NOT be applied if you run updatedatabase again.
+# * adding a package Letters.pm, that manages Letters & alerts.
+# * adding feature : it's now possible to define a "letter" for any subscription created. If a letter is defined, users in OPAC can put an alert on the subscription. When an issue is marked "arrived", all users in the alert will recieve a mail (as defined in the "letter"). This last part (= send the mail) is not yet developped. (Should be done this week)
+# * adding feature : it's now possible to "put to an alert" in OPAC, for any serial subscription. The alert is stored in a new table, called alert. An alert can be put only if the librarian has activated them in subscription (and they activate it just by choosing a "letter" to sent to borrowers on new issues)
+# * adding feature : librarian can see in borrower detail which alerts they have put, and a user can see in opac-detail which alert they have put too.
#
-# Revision 1.81 2004/05/28 09:56:21 tipaul
-# bugfix
+# Note that the system should be generic enough to manage any type of alert.
+# I plan to extend it soon to virtual shelves : a borrower will be able to put an alert on a virtual shelf, to be warned when something is changed in the virtual shelf (mail being sent once a day by cron, or manually by the shelf owner. Anyway, a mail won't be sent on every change, users would be spammed by Koha ;-) )
#
-# Revision 1.80 2004/05/28 08:32:00 tipaul
-# adding :
-# * MARC authority file
-# * seealso & hidden in MARC biblio structure.
+# Revision 1.115 2005/08/02 16:15:34 tipaul
+# adding 2 fields to letter system :
+# * module (acquisition, catalogue...) : it will be usefull to show the librarian only letters he may be interested by.
+# * title, that will be used as mail subject.
#
-# Revision 1.79 2004/05/18 09:50:07 tipaul
-# *** empty log message ***
+# Revision 1.114 2005/07/28 15:10:13 tipaul
+# Introducing new "Letters" system : Letters will be used everytime you want to sent something to someone (through mail or paper). For example, sending a mail for overdues use letter that you can put as parameters. Sending a mail to a borrower when a suggestion is validated uses a letter too.
+# the letter table contains 3 fields :
+# * code => the code of the letter
+# * name => the complete name of the letter
+# * content => the complete text. It's a TEXT field type, so has no limits.
#
-# Revision 1.78 2004/05/10 09:29:33 tipaul
-# css is now the default theme for OPAC.
-# It will be the theme used for improvements and new things in OPAC.
+# My next goal now is to work on point 2-I "serial issue alert"
+# With this feature, in serials, a user can subscribe the "issue alert". For every issue arrived/missing, a mail is sent to all subscribers of this list. The mail warns the user that the issue is arrive or missing. Will be in head.
+# (see mail on koha-devel, 2005/04/07)
#
-# Revision 1.77 2004/05/06 14:56:51 tipaul
-# adding table issuingrules (previously called categoryitem
+# The "serial issue alert" will be the 1st to use this letter system that probably needs some tweaking ;-)
#
-# Revision 1.76 2004/05/03 09:32:25 tipaul
-# adding printcirculationsplit parameter (already existed, but was not in systempref by defaul)
+# Once it will be stabilised default letters (in any languages) could be added during installer to help the library begin with this new feature.
#
-# Revision 1.75 2004/04/14 19:49:00 tipaul
-# seealso field set to 255 chars
+# 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.74 2004/03/11 16:10:16 tipaul
-# *** empty log message ***
+# Revision 1.112 2005/07/26 08:19:47 hdl
+# Adding IndependantBranches System preference variable in order to manage Branch independancy.
#
-# Revision 1.73 2004/03/06 20:26:13 tipaul
-# adding seealso feature in MARC searches
+# 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 ;-)
#