1#!/bin/sh
2#
3# Copyright (C) 2000-2020 Kern Sibbald
4# License: BSD 2-Clause; see file LICENSE-FOSS
5#
6# Shell script to update SQLite3 tables from Bacula
7#
8echo " "
9echo "This script will update a Bacula SQLite3 database from version 12-16 to 1022"
10echo "	which is needed to convert from Bacula Enterprise version 4.0.x to 12.4.x"
11echo "	or Bacula Community version 5.0.x, 5.2.x, 6.0.x to 11.0.x"
12echo " "
13
14bindir=@SQLITE_BINDIR@
15PATH="$bindir:$PATH"
16cd @working_dir@
17db_name=@db_name@
18
19DBVERSION=`sqlite3 ${db_name}.db <<END
20SELECT VersionId FROM Version LIMIT 1;
21END
22`
23if [ "$DBVERSION" -ne 1022 ] ; then
24  if [ "$DBVERSION" -lt 12 -o "$DBVERSION" -gt 16 ] ; then
25    echo " "
26    echo "The existing database is version $DBVERSION !!"
27    echo "This script can only update an existing version 12-16 database to version 1022."
28    echo "Error. Cannot upgrade this database."
29    echo " "
30    exit 1
31  fi
32fi
33
34if [ "$DBVERSION" = 12 ] ; then
35sqlite3 $* ${db_name}.db <<END-OF-DATA
36BEGIN;
37
38CREATE TABLE RestoreObject (
39   RestoreObjectId INTEGER,
40   ObjectName TEXT DEFAULT '',
41   RestoreObject TEXT DEFAULT '',
42   PluginName TEXT DEFAULT '',
43   ObjectLength INTEGER DEFAULT 0,
44   ObjectFullLength INTEGER DEFAULT 0,
45   ObjectIndex INTEGER DEFAULT 0,
46   ObjectType INTEGER DEFAULT 0,
47   FileIndex INTEGER UNSIGNED DEFAULT 0,
48   ObjectCompression INTEGER DEFAULT 0,
49   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
50   PRIMARY KEY(RestoreObjectId)
51   );
52CREATE INDEX restore_jobid_idx ON RestoreObject (JobId);
53
54UPDATE Version SET VersionId=13;
55COMMIT;
56
57END-OF-DATA
58DBVERSION=13
59fi
60
61if [ "$DBVERSION" = 13 ] ; then
62
63sqlite3 $* ${db_name}.db <<END-OF-DATA
64BEGIN;
65
66ALTER TABLE File ADD COLUMN DeltaSeq smallint default 0;
67UPDATE Version SET VersionId=14;
68
69COMMIT;
70
71END-OF-DATA
72
73DBVERSION=14
74
75fi
76
77if [ "$DBVERSION" = 14 ] ; then
78    sqlite3 $* ${db_name}.db  <<END-OF-DATA
79INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
80   ('I', 'Incomplete Job',25);
81UPDATE Version SET VersionId=1014;
82END-OF-DATA
83DBVERSION=1014
84fi
85
86if [ "$DBVERSION" = 1014 ] ; then
87    sqlite3 $* ${db_name}.db  <<END-OF-DATA
88.bail on
89ALTER TABLE Media ADD COLUMN VolABytes BIGINT UNSIGNED DEFAULT 0;
90ALTER TABLE Media ADD COLUMN VolAPadding BIGINT UNSIGNED DEFAULT 0;
91ALTER TABLE Media ADD COLUMN VolHoleBytes BIGINT UNSIGNED DEFAULT 0;
92ALTER TABLE Media ADD COLUMN VolHoles INTEGER UNSIGNED DEFAULT 0;
93ALTER TABLE Pool ADD COLUMN CacheRetention BIGINT DEFAULT 0;
94UPDATE Version SET VersionId=1015;
95END-OF-DATA
96DBVERSION=1015
97fi
98
99# Upgrade from the community edition
100# 15 to 1017 migration
101if [ "$DBVERSION" -eq 15 -o "$DBVERSION" -eq 16 ]; then
102    # In version 16, the upgrade 1018-1019 is already done
103    if [ "$DBVERSION" -eq 16 ]; then
104        SKIP1018=1
105    fi
106
107    if ! sqlite3 $* ${db_name}.db  <<END-OF-DATA
108.bail on
109BEGIN;
110
111DROP INDEX inx3;
112DROP INDEX file_jpf_idx;
113
114CREATE TABLE file_temp (
115   FileId INTEGER,
116   FileIndex INTEGER DEFAULT 0,
117   JobId INTEGER UNSIGNED  REFERENCES Job NOT NULL,
118   PathId INTEGER UNSIGNED REFERENCES Path NOT NULL,
119   Filename TEXT NOT NULL DEFAULT '',
120   DeltaSeq SMALLINT UNSIGNED DEFAULT 0,
121   MarkId INTEGER UNSIGNED DEFAULT 0,
122   LStat VARCHAR(255) NOT NULL,
123   MD5  VARCHAR(255) NOT NULL,
124   PRIMARY KEY (FileId)
125   );
126
127INSERT INTO file_temp (FileId, FileIndex, JobId, PathId, Filename, DeltaSeq,
128		       MarkId, LStat, Md5)
129   SELECT FileId, FileIndex, JobId, PathId, Filename.Name, DeltaSeq, 
130	  MarkId, LStat, Md5
131    FROM File JOIN Filename USING (FilenameId);
132
133DROP TABLE Filename;
134DROP TABLE File;
135
136ALTER TABLE file_temp RENAME TO File;
137CREATE INDEX inx3 ON File (JobId);
138CREATE INDEX file_jpf_idx ON File (JobId, PathId, Filename);
139
140ANALYZE File;
141
142DROP TABLE UnsavedFiles;
143CREATE TABLE UnsavedFiles (
144   UnsavedId INTEGER,
145   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
146   PathId INTEGER UNSIGNED REFERENCES Path NOT NULL,
147   Filename TEXT NOT NULL,
148   PRIMARY KEY (UnsavedId)
149   );
150
151UPDATE Version SET VersionId = 1017;
152
153COMMIT;
154END-OF-DATA
155    then
156	echo "File update for Bacula SQLite tables."
157	exit 1
158    fi
159    echo "Upgrade of the File table succeeded. Version 1017"
160    DBVERSION=1017
161fi
162
163if [ "$DBVERSION" = 1015 ] ; then
164    sqlite3 $* ${db_name}.db  <<END-OF-DATA
165.bail on
166begin;
167CREATE TABLE file_temp (
168   FileId INTEGER,
169   FileIndex INTEGER UNSIGNED NOT NULL,
170   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
171   PathId INTEGER UNSIGNED REFERENCES Path NOT NULL,
172   Filename TEXT NOT NULL DEFAULT '',
173   DeltaSeq SMALLINT UNSIGNED DEFAULT 0,
174   MarkId INTEGER UNSIGNED DEFAULT 0,
175   LStat VARCHAR(255) NOT NULL,
176   MD5 VARCHAR(255) NOT NULL,
177   PRIMARY KEY(FileId) 
178   );
179
180INSERT INTO file_temp (FileId, FileIndex, JobId, PathId, Filename, DeltaSeq,
181		       MarkId, LStat, Md5, llll)
182   SELECT FileId, FileIndex, JobId, PathId, Filename.Name, DeltaSeq, 
183	  MarkId, LStat, Md5
184    FROM File JOIN Filename USING (FilenameId);
185
186DROP TABLE File;
187DROP TABLE Filename;
188
189ALTER TABLE file_temp RENAME TO File;
190
191CREATE INDEX inx3 ON File (JobId);
192CREATE INDEX file_jpf_idx ON File (JobId, PathId, Filename);
193
194ALTER TABLE Job ADD COLUMN FileTable text default 'File';
195ALTER TABLE JobHisto ADD COLUMN FileTable text default 'File';
196UPDATE Version SET VersionId = 1016;
197commit;
198END-OF-DATA
199DBVERSION=1016
200fi
201
202if [ "$DBVERSION" = 1016 ] ; then
203    sqlite3 $* ${db_name}.db  <<END-OF-DATA
204.bail on
205ALTER TABLE Snapshot ADD COLUMN JobId integer default 0;
206ALTER TABLE Snapshot ADD COLUMN FileSetId integer default 0;
207UPDATE Version SET VersionId=1017;
208END-OF-DATA
209DBVERSION=1017
210fi
211
212if [ "$DBVERSION" = 1017 ] ; then
213    sqlite3 $* ${db_name}.db  <<END-OF-DATA
214.bail on
215CREATE TABLE FileMedia
216(
217    JobId	      integer	  not null,
218    FileIndex	      integer	  not null,
219    MediaId	      integer	  not null,
220    BlockAddress      bigint	  default 0,
221    RecordNo	      integer	  default 0,
222    FileOffset	      bigint	  default 0
223);
224CREATE INDEX file_media_idx on FileMedia (JobId, FileIndex);
225UPDATE Version SET VersionId=1018;
226END-OF-DATA
227DBVERSION=1018
228fi
229
230if [ "$DBVERSION" -eq 1018 -a "$SKIP1018" = 1 ]; then
231    # From version 16, the upgrade 1018-1019 is already done
232    if sqlite3 $* ${db_name}.db <<END-OF-DATA
233UPDATE Version SET VersionId=1019;
234END-OF-DATA
235    then
236	echo "Update of Bacula SQLITE tables 1018 to 1019 succeeded."
237        DBVERSION=1019
238    else
239	echo "Update of Bacula PostgreSQL tables 1018 to 1019 failed."
240	exit 1
241    fi
242fi
243
244if [ "$DBVERSION" -eq 1018 ] ; then
245    if sqlite3 $* ${db_name}.db  <<END-OF-DATA
246.bail on
247begin;
248CREATE TABLE basefiles_temp (
249   BaseId BIGINT,
250   BaseJobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
251   JobId INTEGER UNSIGNED REFERENCES Job NOT NULL,
252   FileId INTEGER UNSIGNED REFERENCES File NOT NULL,
253   FileIndex INTEGER UNSIGNED,
254   PRIMARY KEY(BaseId)
255   );
256
257INSERT INTO basefiles_temp (BaseId, BaseJobId, JobId,
258	FileId, FileIndex) 
259   SELECT BaseId, BaseJobId, JobId, FileId, FileIndex
260    FROM BaseFiles;
261
262DROP TABLE BaseFiles;
263ALTER TABLE basefiles_temp RENAME TO BaseFiles;
264
265ALTER TABLE Media RENAME TO Media_tmp;
266DROP INDEX inx8;
267DROP INDEX inx9;
268
269CREATE TABLE Media (
270   MediaId INTEGER,
271   VolumeName VARCHAR(128) NOT NULL,
272   Slot INTEGER DEFAULT 0,
273   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
274   MediaType VARCHAR(128) NOT NULL,
275   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType DEFAULT 0,
276   LabelType TINYINT DEFAULT 0,
277   FirstWritten DATETIME DEFAULT 0,
278   LastWritten DATETIME DEFAULT 0,
279   LabelDate DATETIME DEFAULT 0,
280   VolJobs INTEGER UNSIGNED DEFAULT 0,
281   VolFiles INTEGER UNSIGNED DEFAULT 0,
282   VolBlocks INTEGER UNSIGNED DEFAULT 0,
283   LastPartBytes BIGINT UNSIGNED DEFAULT 0,
284   VolMounts INTEGER UNSIGNED DEFAULT 0,
285   VolBytes BIGINT UNSIGNED DEFAULT 0,
286   VolABytes BIGINT UNSIGNED DEFAULT 0,
287   VolAPadding BIGINT UNSIGNED DEFAULT 0,
288   VolHoleBytes BIGINT UNSIGNED DEFAULT 0,
289   VolHoles INTEGER UNSIGNED DEFAULT 0,
290   VolType INTEGER UNSIGNED DEFAULT 0,
291   VolParts INTEGER UNSIGNED DEFAULT 0,
292   VolCloudParts INTEGER UNSIGNED DEFAULT 0,
293   VolErrors INTEGER UNSIGNED DEFAULT 0,
294   VolWrites BIGINT UNSIGNED DEFAULT 0,
295   VolCapacityBytes BIGINT UNSIGNED DEFAULT 0,
296   VolStatus VARCHAR(20) NOT NULL,
297   Enabled TINYINT DEFAULT 1,
298   Recycle TINYINT DEFAULT 0,
299   ActionOnPurge     TINYINT	DEFAULT 0,
300   CacheRetention BIGINT UNSIGNED DEFAULT 0,
301   VolRetention BIGINT UNSIGNED DEFAULT 0,
302   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
303   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
304   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
305   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
306   InChanger TINYINT DEFAULT 0,
307   StorageId INTEGER UNSIGNED REFERENCES Storage DEFAULT 0,
308   DeviceId INTEGER UNSIGNED REFERENCES Device DEFAULT 0,
309   MediaAddressing TINYINT DEFAULT 0,
310   VolReadTime BIGINT UNSIGNED DEFAULT 0,
311   VolWriteTime BIGINT UNSIGNED DEFAULT 0,
312   EndFile INTEGER UNSIGNED DEFAULT 0,
313   EndBlock INTEGER UNSIGNED DEFAULT 0,
314   LocationId INTEGER UNSIGNED REFERENCES Location DEFAULT 0,
315   RecycleCount INTEGER UNSIGNED DEFAULT 0,
316   InitialWrite DATETIME DEFAULT 0,
317   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
318   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
319   Comment TEXT,
320   PRIMARY KEY(MediaId)
321   );
322
323CREATE INDEX inx8 ON Media (PoolId);
324CREATE INDEX inx9 ON Media (StorageId);
325
326
327INSERT INTO Media (MediaId, VolumeName, Slot, PoolId, MediaType, MediaTypeId,
328   LabelType, FirstWritten, LastWritten, LabelDate, VolJobs, VolFiles, VolBlocks,
329   LastPartBytes, VolMounts, VolBytes, VolABytes, VolAPadding, VolHoleBytes,
330   VolHoles, VolType, VolParts, VolCloudParts, VolErrors, VolWrites,
331   VolCapacityBytes, VolStatus, Enabled, Recycle, ActionOnPurge, CacheRetention,
332   VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles, MaxVolBytes, InChanger,
333   StorageId, DeviceId, MediaAddressing, VolReadTime, VolWriteTime, EndFile,
334   EndBlock, LocationId, RecycleCount, InitialWrite, ScratchPoolId, RecyclePoolId,
335   Comment)
336   SELECT MediaId, VolumeName, Slot, PoolId, MediaType, MediaTypeId,
337   LabelType, FirstWritten, LastWritten, LabelDate, VolJobs, VolFiles, VolBlocks,
338   0, VolMounts, VolBytes, VolABytes, VolAPadding, VolHoleBytes,
339   VolHoles, VolParts, 0, VolCloudParts, VolErrors, VolWrites,
340   VolCapacityBytes, VolStatus, Enabled, Recycle, ActionOnPurge, 0,
341   VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles, MaxVolBytes, InChanger,
342   StorageId, DeviceId, MediaAddressing, VolReadTime, VolWriteTime, EndFile,
343   EndBlock, LocationId, RecycleCount, InitialWrite, ScratchPoolId, RecyclePoolId,
344   Comment from Media_tmp;
345
346DROP TABLE Media_tmp;
347
348UPDATE Version SET VersionId=1019;
349commit;
350END-OF-DATA
351    then
352	echo "Update of Bacula SQLite3 tables 1018 to 1019 succeeded."
353	    DBVERSION=1019
354    else
355	echo "Update of Bacula SQLite3 tables 1018 to 1019 failed."
356	exit 1
357    fi
358fi
359
360if [ "$DBVERSION" -eq 1019 ] ; then
361    if sqlite3 $* ${db_name}.db <<END-OF-DATA
362begin;
363ALTER TABLE Pool ADD COLUMN MaxPoolBytes BIGINT DEFAULT 0;
364ALTER TABLE Job ADD COLUMN PriorJob VARCHAR(128) DEFAULT '';
365ALTER TABLE JobHisto ADD COLUMN PriorJob VARCHAR(128) DEFAULT '';
366UPDATE Version SET VersionId=1020;
367commit;
368END-OF-DATA
369    then
370	echo "Update of Bacula SQLite3 tables 1019 to 1020 succeeded."
371	DBVERSION=1020
372    else
373	echo "Update of Bacula SQLite3 tables 1019 to 1020 failed."
374	exit 1
375    fi
376fi
377
378if [ "$DBVERSION" -eq 1020 ] ; then
379    if sqlite3 $* ${db_name}.db <<END-OF-DATA
380UPDATE Version SET VersionId=1021;
381END-OF-DATA
382    then
383	echo "Update of Bacula SQLite3 tables 1020 to 1021 succeeded."
384	DBVERSION=1021
385    else
386	echo "Update of Bacula SQLite3 tables 1020 to 1021 failed."
387	exit 1
388    fi
389fi
390
391if [ "$DBVERSION" -eq 1021 ] ; then
392    if sqlite3 $* ${db_name}.db <<END-OF-DATA
393.bail on
394begin;
395CREATE TABLE TagJob
396(
397   JobId integer not null,
398   Tag   text    not null,
399   primary key (JobId, Tag)
400);
401
402CREATE TABLE TagClient
403(
404   ClientId integer not null,
405   Tag      text    not null,
406   primary key (ClientId, Tag)
407);
408
409CREATE TABLE TagMedia
410(
411   MediaId integer not null,
412   Tag      text    not null,
413   primary key (MediaId, Tag)
414);
415
416CREATE TABLE TagObject
417(
418   ObjectId integer not null,
419   Tag      text    not null,
420   primary key (ObjectId, Tag)
421);
422
423CREATE TABLE Object
424(
425   ObjectId     integer  not null,
426
427   JobId        integer  not null,
428   Path         text     not null,
429   Filename     text     not null,
430   PluginName   text     not null,
431
432   ObjectType   text     not null,
433   ObjectName   text     not null,
434   ObjectSource text     not null,
435   ObjectUUID   text     not null,
436   ObjectSize   integer  not null,
437   primary key (ObjectId)
438);
439
440create index object_jobid_idx on Object (JobId);
441create index object_type_idx on Object  (ObjectType);
442create index object_name_idx on Object  (ObjectName);
443create index object_source_idx on Object  (ObjectSource);
444
445CREATE TABLE Events
446(
447    EventsId          INTEGER,
448    EventsCode        text        not null,
449    EventsType	      text	  not null,
450    EventsTime	      DATETIME,
451    EventsInsertTime  DATETIME DEFAULT current_timestamp,
452    EventsDaemon        text        default '',
453    EventsSource      text        default '',
454    EventsRef         text        default '',
455    EventsText	      text	  not null,
456    primary key (EventsId)
457);
458create index events_time_idx on Events (EventsTime);
459
460UPDATE Version SET VersionId=1022;
461commit;
462END-OF-DATA
463    then
464	echo "Update of Bacula SQLite3 tables 1021 to 1022 succeeded."
465	DBVERSION=1022
466    else
467	echo "Update of Bacula SQLite3 tables 1021 to 1022 failed."
468	exit 1
469    fi
470fi
471