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