repairing faulty updatedatabase syntax
[koha.git] / installer / data / mysql / updatedatabase.pl
1 #!/usr/bin/perl
2
3
4 # Database Updater
5 # This script checks for required updates to the database.
6
7 # Part of the Koha Library Software www.koha.org
8 # Licensed under the GPL.
9
10 # Bugs/ToDo:
11 # - Would also be a good idea to offer to do a backup at this time...
12
13 # NOTE:  If you do something more than once in here, make it table driven.
14
15 # NOTE: Please keep the version in C4/Context.pm up-to-date!
16
17 use strict;
18
19 # CPAN modules
20 use DBI;
21 use Getopt::Long;
22 # Koha modules
23 use C4::Context;
24
25 use MARC::Record;
26 use MARC::File::XML ( BinaryEncoding => 'utf8' );
27  
28 # FIXME - The user might be installing a new database, so can't rely
29 # on /etc/koha.conf anyway.
30
31 my $debug = 0;
32
33 my (
34     $sth, $sti,
35     $query,
36     %existingtables,    # tables already in database
37     %types,
38     $table,
39     $column,
40     $type, $null, $key, $default, $extra,
41     $prefitem,          # preference item in systempreferences table
42 );
43
44 my $silent;
45 GetOptions(
46     's' =>\$silent
47     );
48 my $dbh = C4::Context->dbh;
49 $|=1; # flushes output
50
51 =item
52     Deal with virtualshelves
53 =cut
54
55 my $DBversion = "3.00.00.001";
56 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
57     # update virtualshelves table to
58     # 
59     $dbh->do("ALTER TABLE `bookshelf` RENAME `virtualshelves`");
60     $dbh->do("ALTER TABLE `shelfcontents` RENAME `virtualshelfcontents`");
61     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD `biblionumber` INT( 11 ) NOT NULL");
62     $dbh->do("UPDATE `virtualshelfcontents` SET biblionumber=(SELECT biblionumber FROM items WHERE items.itemnumber=virtualshelfcontents.itemnumber)");
63     # drop all foreign keys : otherwise, we can't drop itemnumber field.
64     DropAllForeignKeys('virtualshelfcontents');
65     # create the new foreign keys (on biblionumber)
66     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD FOREIGN KEY biblionumber_fk (biblionumber) REFERENCES biblio (biblionumber) ON UPDATE CASCADE ON DELETE CASCADE");
67     # re-create the foreign key on virtualshelf
68     $dbh->do("ALTER TABLE `virtualshelfcontents` ADD FOREIGN KEY shelfnumber_fk (shelfnumber) REFERENCES virtualshelves (shelfnumber) ON UPDATE CASCADE ON DELETE CASCADE");
69     # now we can drop the itemnumber column
70     $dbh->do("ALTER TABLE `virtualshelfcontents` DROP `itemnumber`");
71     print "Upgrade to $DBversion done (virtualshelves)\n";
72     SetVersion ($DBversion);
73 }
74
75
76 $DBversion = "3.00.00.002";
77 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
78     $dbh->do("DROP TABLE sessions");
79     $dbh->do("CREATE TABLE `sessions` (
80   `id` char(32) NOT NULL,
81   `a_session` text NOT NULL,
82   UNIQUE KEY `id` (`id`)
83 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
84     print "Upgrade to $DBversion done (sessions uses CGI::session, new table structure for sessions)\n";
85     SetVersion ($DBversion);
86 }
87
88
89 $DBversion = "3.00.00.003";
90 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
91     if (C4::Context->preference("opaclanguages") eq "fr") {
92         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ReservesNeedReturns','0','Si ce paramètre est mis à 1, une réservation posée sur un exemplaire présent sur le site devra être passée en retour pour être disponible. Sinon, elle sera automatiquement disponible, Koha considère que le bibliothécaire place la réservation en ayant le document en mains','','YesNo')");
93     } else {
94         $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES('ReservesNeedReturns','0','If set, a reserve done on an item available in this branch need a check-in, otherwise, a reserve on a specific item, that is on the branch & available is considered as available','','YesNo')");
95     }
96     print "Upgrade to $DBversion done (adding ReservesNeedReturns systempref, in circulation)\n";
97     SetVersion ($DBversion);
98 }
99
100
101 $DBversion = "3.00.00.004";
102 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
103     $dbh->do("INSERT INTO `systempreferences` VALUES ('DebugLevel','2','set the level of error info sent to the browser. 0=none, 1=some, 2=most','0|1|2','Choice')");    
104     print "Upgrade to $DBversion done (adding DebugLevel systempref, in 'Admin' tab)\n";
105     SetVersion ($DBversion);
106 }
107
108 $DBversion = "3.00.00.005";
109 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
110     $dbh->do("CREATE TABLE `tags` (
111                     `entry` varchar(255) NOT NULL default '',
112                     `weight` bigint(20) NOT NULL default 0,
113                     PRIMARY KEY  (`entry`)
114                     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
115                 ");
116         $dbh->do("CREATE TABLE `nozebra` (
117                 `server` varchar(20)     NOT NULL,
118                 `indexname` varchar(40)  NOT NULL,
119                 `value` varchar(250)     NOT NULL,
120                 `biblionumbers` longtext NOT NULL,
121                 KEY `indexname` (`server`,`indexname`),
122                 KEY `value` (`server`,`value`))
123                 ENGINE=InnoDB DEFAULT CHARSET=utf8;
124                 ");
125     print "Upgrade to $DBversion done (adding tags and nozebra tables )\n";
126     SetVersion ($DBversion);
127 }
128
129 $DBversion = "3.00.00.006";
130 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
131     $dbh->do("UPDATE issues SET issuedate=timestamp WHERE issuedate='0000-00-00'");
132     print "Upgrade to $DBversion done (filled issues.issuedate with timestamp)\n";
133     SetVersion ($DBversion);
134 }
135
136 $DBversion = "3.00.00.007";
137 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
138     $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('SessionStorage','mysql','Use mysql or a temporary file for storing session data','mysql|tmp','Choice')");
139     print "Upgrade to $DBversion done (set SessionStorage variable)\n";
140     SetVersion ($DBversion);
141 }
142
143 $DBversion = "3.00.00.008";
144 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
145     $dbh->do("ALTER TABLE `biblio` ADD `datecreated` DATE NOT NULL AFTER `timestamp` ;");
146     $dbh->do("UPDATE biblio SET datecreated=timestamp");
147     print "Upgrade to $DBversion done (biblio creation date)\n";
148     SetVersion ($DBversion);
149 }
150
151 $DBversion = "3.00.00.009";
152 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
153
154     # Create backups of call number columns
155     # in case default migration needs to be customized
156     #
157     # UPGRADE NOTE: temp_upg_biblioitems_call_num should be dropped 
158     #               after call numbers have been transformed to the new structure
159     #
160     # Not bothering to do the same with deletedbiblioitems -- assume
161     # default is good enough.
162     $dbh->do("CREATE TABLE `temp_upg_biblioitems_call_num` AS 
163               SELECT `biblioitemnumber`, `biblionumber`,
164                      `classification`, `dewey`, `subclass`,
165                      `lcsort`, `ccode`
166               FROM `biblioitems`");
167
168     # biblioitems changes
169     $dbh->do("ALTER TABLE `biblioitems` CHANGE COLUMN `volumeddesc` `volumedesc` TEXT,
170                                     ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `ccode`,
171                                     ADD `cn_class` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
172                                     ADD `cn_item` VARCHAR(10) DEFAULT NULL AFTER `cn_class`,
173                                     ADD `cn_suffix` VARCHAR(10) DEFAULT NULL AFTER `cn_item`,
174                                     ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_suffix`,
175                                     ADD `totalissues` INT(10) AFTER `cn_sort`");
176
177     # default mapping of call number columns:
178     #   cn_class = concatentation of classification + dewey, 
179     #              trimmed to fit -- assumes that most users do not
180     #              populate both classification and dewey in a single record
181     #   cn_item  = subclass
182     #   cn_source = left null 
183     #   cn_sort = lcsort 
184     #
185     # After upgrade, cn_sort will have to be set based on whatever
186     # default call number scheme user sets as a preference.  Misc
187     # script will be added at some point to do that.
188     #
189     $dbh->do("UPDATE `biblioitems` 
190               SET cn_class = SUBSTR(TRIM(CONCAT_WS(' ', `classification`, `dewey`)), 1, 30),
191                     cn_item = subclass,
192                     `cn_sort` = `lcsort`
193             ");
194
195     # Now drop the old call number columns
196     $dbh->do("ALTER TABLE `biblioitems` DROP COLUMN `classification`,
197                                         DROP COLUMN `dewey`,
198                                         DROP COLUMN `subclass`,
199                                         DROP COLUMN `lcsort`,
200                                         DROP COLUMN `ccode`");
201
202     # deletedbiblio changes
203     $dbh->do("ALTER TABLE `deletedbiblio` ALTER COLUMN `frameworkcode` SET DEFAULT '',
204                                         DROP COLUMN `marc`,
205                                         ADD `datecreated` DATE NOT NULL AFTER `timestamp`");
206     $dbh->do("UPDATE deletedbiblio SET datecreated = timestamp");
207
208     # deletedbiblioitems changes
209     $dbh->do("ALTER TABLE `deletedbiblioitems` 
210                         MODIFY `publicationyear` TEXT,
211                         CHANGE `volumeddesc` `volumedesc` TEXT,
212                         MODIFY `collectiontitle` MEDIUMTEXT DEFAULT NULL AFTER `volumedesc`,
213                         MODIFY `collectionissn` TEXT DEFAULT NULL AFTER `collectiontitle`,
214                         MODIFY `collectionvolume` MEDIUMTEXT DEFAULT NULL AFTER `collectionissn`,
215                         MODIFY `editionstatement` TEXT DEFAULT NULL AFTER `collectionvolume`,
216                         MODIFY `editionresponsibility` TEXT DEFAULT NULL AFTER `editionstatement`,
217                         MODIFY `place` VARCHAR(255) DEFAULT NULL AFTER `size`,
218                         MODIFY `marc` BLOB,
219                         ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `url`,
220                         ADD `cn_class` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
221                         ADD `cn_item` VARCHAR(10) DEFAULT NULL AFTER `cn_class`,
222                         ADD `cn_suffix` VARCHAR(10) DEFAULT NULL AFTER `cn_item`,
223                         ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_suffix`,
224                         ADD `totalissues` INT(10) AFTER `cn_sort`,
225                         ADD KEY `isbn` (`isbn`),
226                         ADD KEY `publishercode` (`publishercode`)
227                     ");
228
229     $dbh->do("UPDATE `deletedbiblioitems` 
230                 SET `cn_class` = SUBSTR(TRIM(CONCAT_WS(' ', `classification`, `dewey`)), 1, 30),
231                `cn_item` = `subclass`,
232                 `cn_sort` = `lcsort`
233             ");
234     $dbh->do("ALTER TABLE `deletedbiblioitems` 
235                         DROP COLUMN `classification`,
236                         DROP COLUMN `dewey`,
237                         DROP COLUMN `subclass`,
238                         DROP COLUMN `lcsort`,
239                         DROP COLUMN `ccode`
240             ");
241
242     # deleteditems changes
243     $dbh->do("ALTER TABLE `deleteditems` 
244                         MODIFY `barcode` VARCHAR(20) DEFAULT NULL,
245                         MODIFY `price` DECIMAL(8,2) DEFAULT NULL,
246                         MODIFY `replacementprice` DECIMAL(8,2) DEFAULT NULL,
247                         DROP `bulk`,
248                         MODIFY `itemcallnumber` VARCHAR(30) DEFAULT NULL AFTER `wthdrawn`,
249                         MODIFY `holdingbranch` VARCHAR(10) DEFAULT NULL,
250                         DROP `interim`,
251                         MODIFY `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP AFTER `paidfor`,
252                         DROP `cutterextra`,
253                         ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `onloan`,
254                         ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
255                         ADD `ccode` VARCHAR(10) DEFAULT NULL AFTER `cn_sort`,
256                         ADD `materials` VARCHAR(10) DEFAULT NULL AFTER `ccode`,
257                         ADD `uri` VARCHAR(255) DEFAULT NULL AFTER `materials`,
258                         MODIFY `marc` LONGBLOB AFTER `uri`,
259                         DROP KEY `barcode`,
260                         DROP KEY `itembarcodeidx`,
261                         DROP KEY `itembinoidx`,
262                         DROP KEY `itembibnoidx`,
263                         ADD UNIQUE KEY `delitembarcodeidx` (`barcode`),
264                         ADD KEY `delitembinoidx` (`biblioitemnumber`),
265                         ADD KEY `delitembibnoidx` (`biblionumber`),
266                         ADD KEY `delhomebranch` (`homebranch`),
267                         ADD KEY `delholdingbranch` (`holdingbranch`)");
268     $dbh->do("UPDATE deleteditems SET `ccode` = `itype`");
269     $dbh->do("ALTER TABLE deleteditems DROP `itype`");
270     $dbh->do("UPDATE `deleteditems` SET `cn_sort` = `itemcallnumber`");
271
272     # items changes
273     $dbh->do("ALTER TABLE `items` ADD `cn_source` VARCHAR(10) DEFAULT NULL AFTER `onloan`,
274                                 ADD `cn_sort` VARCHAR(30) DEFAULT NULL AFTER `cn_source`,
275                                 ADD `ccode` VARCHAR(10) DEFAULT NULL AFTER `cn_sort`,
276                                 ADD `materials` VARCHAR(10) DEFAULT NULL AFTER `ccode`,
277                                 ADD `uri` VARCHAR(255) DEFAULT NULL AFTER `materials`
278             ");
279     $dbh->do("ALTER TABLE `items` 
280                         DROP KEY `itembarcodeidx`,
281                         ADD UNIQUE KEY `itembarcodeidx` (`barcode`)");
282
283     # map items.itype to items.ccode and 
284     # set cn_sort to itemcallnumber -- as with biblioitems.cn_sort,
285     # will have to be subsequently updated per user's default 
286     # classification scheme
287     $dbh->do("UPDATE `items` SET `cn_sort` = `itemcallnumber`,
288                             `ccode` = `itype`");
289
290     $dbh->do("ALTER TABLE `items` DROP `cutterextra`,
291                                 DROP `itype`");
292
293     print "Upgrade to $DBversion done (major changes to biblio, biblioitems, items, and deleted* versions of same\n";
294     SetVersion ($DBversion);
295 }
296
297 $DBversion = "3.00.00.010";
298 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
299     $dbh->do("CREATE INDEX `userid` ON borrowers (`userid`) ");
300     print "Upgrade to $DBversion done (userid index added)\n";
301     SetVersion ($DBversion);
302 }
303
304 $DBversion = "3.00.00.011";
305 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
306     $dbh->do("ALTER TABLE `branchcategories` CHANGE `categorycode` `categorycode` char(10) ");
307     $dbh->do("ALTER TABLE `branchcategories` CHANGE `categoryname` `categoryname` varchar(32) ");
308     $dbh->do("ALTER TABLE `branchcategories` ADD COLUMN `categorytype` varchar(16) ");
309     $dbh->do("UPDATE `branchcategories` SET `categorytype` = 'properties'");
310     $dbh->do("ALTER TABLE `branchrelations` CHANGE `categorycode` `categorycode` char(10) ");
311     print "Upgrade to $DBversion done (added branchcategory type)\n";
312     SetVersion ($DBversion);
313 }
314
315 $DBversion = "3.00.00.012";
316 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
317     $dbh->do("CREATE TABLE `class_sort_rules` (
318                                `class_sort_rule` varchar(10) NOT NULL default '',
319                                `description` mediumtext,
320                                `sort_routine` varchar(30) NOT NULL default '',
321                                PRIMARY KEY (`class_sort_rule`),
322                                UNIQUE KEY `class_sort_rule_idx` (`class_sort_rule`)
323                              ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
324     $dbh->do("CREATE TABLE `class_sources` (
325                                `cn_source` varchar(10) NOT NULL default '',
326                                `description` mediumtext,
327                                `used` tinyint(4) NOT NULL default 0,
328                                `class_sort_rule` varchar(10) NOT NULL default '',
329                                PRIMARY KEY (`cn_source`),
330                                UNIQUE KEY `cn_source_idx` (`cn_source`),
331                                KEY `used_idx` (`used`),
332                                CONSTRAINT `class_source_ibfk_1` FOREIGN KEY (`class_sort_rule`) 
333                                           REFERENCES `class_sort_rules` (`class_sort_rule`)
334                              ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
335     $dbh->do("INSERT INTO `systempreferences` (variable,value,explanation,options,type) 
336               VALUES('DefaultClassificationSource','ddc',
337                      'Default classification scheme used by the collection. E.g., Dewey, LCC, etc.', NULL,'free')");
338     $dbh->do("INSERT INTO `class_sort_rules` (`class_sort_rule`, `description`, `sort_routine`) VALUES
339                                ('dewey', 'Default filing rules for DDC', 'Dewey'),
340                                ('lcc', 'Default filing rules for LCC', 'LCC'),
341                                ('generic', 'Generic call number filing rules', 'Generic')");
342     $dbh->do("INSERT INTO `class_sources` (`cn_source`, `description`, `used`, `class_sort_rule`) VALUES
343                             ('ddc', 'Dewey Decimal Classification', 1, 'dewey'),
344                             ('lcc', 'Library of Congress Classification', 1, 'lcc'),
345                             ('udc', 'Universal Decimal Classification', 0, 'generic'),
346                             ('sudocs', 'SuDoc Classification (U.S. GPO)', 0, 'generic'),
347                             ('z', 'Other/Generic Classification Scheme', 0, 'generic')");
348     print "Upgrade to $DBversion done (classification sources added)\n";
349     SetVersion ($DBversion);
350 }
351
352 $DBversion = "3.00.00.013";
353 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
354     $dbh->do("CREATE TABLE `import_batches` (
355               `import_batch_id` int(11) NOT NULL auto_increment,
356               `template_id` int(11) default NULL,
357               `branchcode` varchar(10) default NULL,
358               `num_biblios` int(11) NOT NULL default 0,
359               `num_items` int(11) NOT NULL default 0,