8d868bb448
This field is useful when the callnumber contains no information on the room where the item is stored. With this field, we now have 3 levels of informations to find a book : * the branch. * the location. * the callnumber. This should be versatile enough to solve any storing method. This hack is quite simple, due to the nice Biblio.pm API. The MARC => koha db link is automatically managed. Just add the link in the parameters section.
1458 lines
48 KiB
Perl
Executable file
1458 lines
48 KiB
Perl
Executable file
#!/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 = (
|
|
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,
|
|
authtypecode char(10) NOT NULL default '',
|
|
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)
|
|
)",
|
|
suggestions => "(
|
|
suggestionid int(8) NOT NULL auto_increment,
|
|
suggestedby int(11) NOT NULL default '0',
|
|
managedby int(11) default NULL ,
|
|
STATUS varchar(10) NOT NULL default '',
|
|
note text,
|
|
author varchar(80) default NULL ,
|
|
title varchar(80) default NULL ,
|
|
copyrightdate smallint(6) default NULL ,
|
|
publishercode varchar(255) default NULL ,
|
|
date timestamp(8) NOT NULL ,
|
|
volumedesc varchar(255) default NULL ,
|
|
publicationyear smallint(6) default '0',
|
|
place varchar(255) default NULL ,
|
|
isbn varchar(10) default NULL ,
|
|
mailoverseeing smallint(1) default '0',
|
|
biblionumber int(11) default NULL ,
|
|
PRIMARY KEY (suggestionid) ,
|
|
KEY suggestedby(suggestedby) ,
|
|
KEY managedby(managedby)
|
|
)",
|
|
aqbasket => "(basketno int(11) NOT NULL auto_increment,
|
|
creationdate date,
|
|
closedate date,
|
|
booksellerid varchar(10),
|
|
authorisedby varchar(10),
|
|
booksellerinvoicenumber text,
|
|
PRIMARY KEY (basketno)
|
|
)",
|
|
serial => "(serialid int(11) NOT NULL auto_increment,
|
|
biblionumber varchar(100) NOT NULL default '',
|
|
subscriptionid varchar(100) NOT NULL default '',
|
|
serialseq varchar(100) NOT NULL default '',
|
|
status tinyint(4) NOT NULL default '0',
|
|
planneddate date NOT NULL default '0000-00-00',
|
|
PRIMARY KEY (serialid)
|
|
)",
|
|
subscription => "(biblionumber int(11) NOT NULL default '0',
|
|
subscriptionid int(11) NOT NULL auto_increment,
|
|
librarian varchar(100) default '',
|
|
startdate date default '0000-00-00',
|
|
aqbooksellerid int(11) default '0',
|
|
cost int(11) default '0',
|
|
aqbudgetid int(11) default '0',
|
|
weeklength tinyint(4) default '0',
|
|
monthlength tinyint(4) default '0',
|
|
numberlength tinyint(4) default '0',
|
|
periodicity tinyint(4) default '0',
|
|
dow varchar(100) default '',
|
|
numberingmethod varchar(100) default '',
|
|
notes text,
|
|
status varchar(100) NOT NULL default '',
|
|
add1 int(11) default 0,
|
|
every1 int(11) default 0,
|
|
whenmorethan1 int(11) default 0,
|
|
setto1 int(11),
|
|
lastvalue1 int(11),
|
|
add2 int(11) default 0,
|
|
every2 int(11) default 0,
|
|
whenmorethan2 int(11) default 0,
|
|
setto2 int(11),
|
|
lastvalue2 int(11),
|
|
add3 int(11) default 0,
|
|
every3 int(11) default 0,
|
|
innerloop1 int(11) default 0,
|
|
innerloop2 int(11) default 0,
|
|
innerloop3 int(11) default 0,
|
|
whenmorethan3 int(11) default 0,
|
|
setto3 int(11),
|
|
lastvalue3 int(11),
|
|
PRIMARY KEY (subscriptionid)
|
|
)",
|
|
subscriptionhistory => "(biblionumber int(11) NOT NULL default '0',
|
|
subscriptionid int(11) NOT NULL default '0',
|
|
histstartdate date NOT NULL default '0000-00-00',
|
|
enddate date default '0000-00-00',
|
|
missinglist longtext NOT NULL,
|
|
recievedlist longtext NOT NULL,
|
|
opacnote varchar(150) NOT NULL default '',
|
|
librariannote varchar(150) NOT NULL default '',
|
|
PRIMARY KEY (subscriptionid),
|
|
KEY biblionumber (biblionumber)
|
|
)",
|
|
);
|
|
|
|
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)',
|
|
'sort1' => 'char(80)',
|
|
'sort2' => 'char(80)',
|
|
},
|
|
aqorders => { 'budgetdate' => 'date',
|
|
'sort1' => 'char(80)',
|
|
'sort2' => 'char(80)', },
|
|
aqbudget => {'aqbudgetid' => 'tinyint(4) auto_increment primary key'},
|
|
items => {'paidfor' => 'text', 'location' => 'char(80)'},
|
|
|
|
#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)',
|
|
'link' => 'char(80)',
|
|
},
|
|
bookshelf => {'owner' => 'char(80)',
|
|
'category' => 'char(1)',
|
|
},
|
|
marc_biblio => { 'frameworkcode' => 'char(4) not NULL default \'\'' },
|
|
);
|
|
|
|
my %dropable_table = (
|
|
classification => 'classification',
|
|
multipart => 'multipart',
|
|
multivolume => 'multivolume',
|
|
newitems => 'newitems',
|
|
procedures => 'procedures',
|
|
publisher => 'publisher',
|
|
searchstats => 'searchstats',
|
|
serialissues => 'serialissues',
|
|
);
|
|
|
|
my %uselessfields = (
|
|
aqorders => "requisitionedby,authorisedby,booksellerid,
|
|
deliverydays,followupdays,
|
|
numberfollowupsallowed,numberfollowupssent,
|
|
dateprinted,sourced,quantityreceiveddamaged,
|
|
subscriptionfrom,subscriptionto
|
|
"
|
|
);
|
|
# 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 = (
|
|
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
|
|
},
|
|
],
|
|
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',
|
|
forceupdate => { 'explanation' => 1,
|
|
'type' => 1 },
|
|
value => '0',
|
|
explanation => 'if set to 1, suggestions are activated in OPAC',
|
|
type => 'free'
|
|
},
|
|
{
|
|
uniquefieldrequired => 'variable',
|
|
variable => 'ISBD',
|
|
forceupdate => { 'explanation' => 1,
|
|
'type' => 1 },
|
|
value => 'Fill with appropriate value...',
|
|
explanation => 'ISBD',
|
|
type => 'free'
|
|
},
|
|
{
|
|
uniquefieldrequired => 'variable',
|
|
variable => 'virtualshelves',
|
|
forceupdate => { 'explanation' => 1,
|
|
'type' => 1 },
|
|
value => '0',
|
|
explanation => 'Set virtual shelves management ON or OFF',
|
|
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 => ''
|
|
},
|
|
],
|
|
);
|
|
|
|
#-------------------
|
|
# 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";
|
|
}
|
|
}
|
|
}
|
|
unless ( $existingtables{'z3950servers'} ) {
|
|
#MJR: added syntax entries to close bug 624
|
|
print "Adding z3950servers table...\n" unless $silent;
|
|
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");
|
|
$dbh->do("ALTER TABLE issuingrules ADD maxissueqty int(4) default NULL");
|
|
$dbh->do("ALTER TABLE issuingrules ADD issuelength int(4) default NULL");
|
|
$dbh->do("ALTER TABLE issuingrules ADD branchcode varchar(4) NOT NULL default ''");
|
|
print "renaming categoryitem\n" unless $silent;
|
|
}
|
|
|
|
|
|
#---------------------------------
|
|
# 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;
|
|
}
|
|
}
|
|
}
|
|
|
|
# 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" unless $silent;
|
|
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" unless $silent;
|
|
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" unless $silent;
|
|
$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 or $silent;
|
|
$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 or $silent;
|
|
$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" unless $silent;
|
|
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" unless $silent;
|
|
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" unless $silent;
|
|
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" unless $silent;
|
|
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" unless $silent;
|
|
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" unless $silent;
|
|
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" unless $silent;
|
|
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 issuing rules\n" unless $exists or $silent;
|
|
$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" unless $silent;
|
|
$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
|
|
|
|
# fill aqbasket if it's empty and aqorder is not
|
|
# => it means it has just been created & must be filled
|
|
$sth = $dbh->prepare("select count(*) from aqbasket");
|
|
$sth->execute;
|
|
if ($sth->fetchrow == 0) {
|
|
$sth = $dbh->prepare("select count(*) from aqorders");
|
|
$sth->execute;
|
|
if ($sth->fetchrow >0) {
|
|
print "Populating new table aqbasket\n";
|
|
print "IMPORTANT NOTE: error message \"Duplicate entry 'X' for key 1\" may appear. it should not be a real trouble\n";
|
|
$sth=$dbh->prepare("select distinct basketno,booksellerid,authorisedby,entrydate,booksellerinvoicenumber from aqorders");
|
|
$sth->execute;
|
|
my ($basketno,$booksellerid,$authorisedby,$entrydate,$booksellerinvoicenumber);
|
|
my $sth2 = $dbh->prepare("insert into aqbasket (basketno,creationdate,booksellerid,authorisedby,booksellerinvoicenumber) values (?,?,?,?,?)");
|
|
while (($basketno,$booksellerid,$authorisedby,$entrydate,$booksellerinvoicenumber) = $sth->fetchrow) {
|
|
print "$basketno,$entrydate,$booksellerid,$authorisedby,$booksellerinvoicenumber\n";
|
|
$sth2->execute($basketno,$entrydate,$booksellerid,$authorisedby,$booksellerinvoicenumber);
|
|
}
|
|
}
|
|
}
|
|
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.94 2004/09/06 10:00:29 tipaul
|
|
# adding a "location" field to the library.
|
|
# This field is useful when the callnumber contains no information on the room where the item is stored.
|
|
# With this field, we now have 3 levels of informations to find a book :
|
|
# * the branch.
|
|
# * the location.
|
|
# * the callnumber.
|
|
#
|
|
# This should be versatile enough to solve any storing method.
|
|
# This hack is quite simple, due to the nice Biblio.pm API. The MARC => koha db link is automatically managed. Just add the link in the parameters section.
|
|
#
|
|
# Revision 1.93 2004/08/12 14:50:50 tipaul
|
|
# bugfixes
|
|
#
|
|
# Revision 1.92 2004/08/06 16:38:42 tipaul
|
|
# changing DB structure to calculate next issue number.
|
|
# Seems to work fine.
|
|
#
|
|
# Still misses the date calculation & the test of end of subscription (maybe for monday ?)
|
|
#
|
|
# Revision 1.91 2004/07/15 09:52:28 tipaul
|
|
# Acquisition & Suggestion :
|
|
# * acquisition rewritte : create a aqbasket table to deal with "bookseller order header".
|
|
# * add "close basket" feature : a closed basket can't be modified
|
|
# * suggestion feature : manage suggestions in acquisition (after suggestion filled in OPAC)
|
|
#
|
|
# Revision 1.90 2004/07/06 08:24:18 tipaul
|
|
# adding 2 free fields that can be used for sorting purposes
|
|
#
|
|
# Revision 1.89 2004/07/02 15:55:08 tipaul
|
|
# Adding 2 new fields, called "sort1" and "sort2"
|
|
# They can be used for sorting & statistics reasons by the library.
|
|
#
|
|
# Revision 1.88 2004/06/26 23:34:26 rangi
|
|
# Fixing typo
|
|
#
|
|
# Revision 1.87 2004/06/23 13:03:09 tipaul
|
|
# fixes in DB structure
|
|
#
|
|
# Revision 1.86 2004/06/22 11:30:57 tipaul
|
|
# adding -s (silent) flag, to have a silent install.
|
|
# only updater will be verbose
|
|
#
|
|
# Revision 1.85 2004/06/17 15:19:44 tipaul
|
|
# missing Marc_Search index on marc_word
|
|
#
|
|
# Revision 1.84 2004/06/17 08:25:21 tipaul
|
|
# DB modifs : merging tag & subfield in marc_word table
|
|
#
|
|
# Revision 1.83 2004/06/10 08:32:02 tipaul
|
|
# MARC authority management (continued)
|
|
#
|
|
# Revision 1.82 2004/06/03 12:46:58 tipaul
|
|
# * frameworks and itemtypes are independant
|
|
#
|
|
# 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.
|
|
#
|
|
# Revision 1.81 2004/05/28 09:56:21 tipaul
|
|
# bugfix
|
|
#
|
|
# Revision 1.80 2004/05/28 08:32:00 tipaul
|
|
# adding :
|
|
# * MARC authority file
|
|
# * seealso & hidden in MARC biblio structure.
|
|
#
|
|
# Revision 1.79 2004/05/18 09:50:07 tipaul
|
|
# *** empty log message ***
|
|
#
|
|
# 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.
|
|
#
|
|
# Revision 1.77 2004/05/06 14:56:51 tipaul
|
|
# adding table issuingrules (previously called categoryitem
|
|
#
|
|
# Revision 1.76 2004/05/03 09:32:25 tipaul
|
|
# adding printcirculationsplit parameter (already existed, but was not in systempref by defaul)
|
|
#
|
|
# Revision 1.75 2004/04/14 19:49:00 tipaul
|
|
# seealso field set to 255 chars
|
|
#
|
|
# Revision 1.74 2004/03/11 16:10:16 tipaul
|
|
# *** empty log message ***
|
|
#
|
|
# Revision 1.73 2004/03/06 20:26:13 tipaul
|
|
# adding seealso feature in MARC searches
|
|
#
|