]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/next-beta.patch
ebl fix new update stats query
[bacula/bacula] / bacula / patches / testing / next-beta.patch
1 Index: src/dird/job.c
2 ===================================================================
3 --- src/dird/job.c      (revision 8456)
4 +++ src/dird/job.c      (working copy)
5 @@ -860,6 +860,7 @@
6     jcr->jr.JobStatus = jcr->JobStatus;
7     jcr->jr.JobFiles = jcr->JobFiles;
8     jcr->jr.JobBytes = jcr->JobBytes;
9 +   jcr->jr.ReadBytes = jcr->ReadBytes;
10     jcr->jr.VolSessionId = jcr->VolSessionId;
11     jcr->jr.VolSessionTime = jcr->VolSessionTime;
12     jcr->jr.JobErrors = jcr->Errors;
13 Index: src/dird/ua_prune.c
14 ===================================================================
15 --- src/dird/ua_prune.c (revision 8456)
16 +++ src/dird/ua_prune.c (working copy)
17 @@ -194,12 +194,12 @@
18     utime_t now = (utime_t)time(NULL);
19  
20     db_lock(ua->db);
21 -   Mmsg(query, "DELETE FROM JobHistory WHERE JobTDate < %s", 
22 +   Mmsg(query, "DELETE FROM JobHisto WHERE JobTDate < %s", 
23          edit_int64(now - retention, ed1));
24     db_sql_query(ua->db, query.c_str(), NULL, NULL);
25     db_unlock(ua->db);
26  
27 -   ua->info_msg(_("Pruned Jobs from JobHistory catalog.\n"));
28 +   ua->info_msg(_("Pruned Jobs from JobHisto catalog.\n"));
29  
30     return true;
31  }
32 Index: src/cats/sql_update.c
33 ===================================================================
34 --- src/cats/sql_update.c       (revision 8456)
35 +++ src/cats/sql_update.c       (working copy)
36 @@ -136,13 +136,7 @@
37     utime_t now = (utime_t)time(NULL);
38     edit_uint64(now - age, ed1);
39  
40 -   Mmsg(mdb->cmd,
41 -        "INSERT INTO JobHistory " 
42 -         "SELECT * " 
43 -          "FROM Job "
44 -         "WHERE JobStatus IN ('T', 'f', 'A', 'E') "
45 -           "AND JobId NOT IN (SELECT JobId FROM JobHistory) "
46 -           "AND JobTDate < %s ", ed1);
47 +   Mmsg(mdb->cmd, fill_jobhisto, ed1);
48     QUERY_DB(jcr, mdb, mdb->cmd); /* TODO: get a message ? */
49     return sql_affected_rows(mdb);
50  }
51 @@ -161,7 +155,7 @@
52     time_t ttime;
53     struct tm tm;
54     int stat;
55 -   char ed1[30], ed2[30], ed3[50];
56 +   char ed1[30], ed2[30], ed3[50], ed4[50];
57     btime_t JobTDate;
58     char PriorJobId[50];
59  
60 @@ -187,10 +181,11 @@
61     db_lock(mdb);
62     Mmsg(mdb->cmd,
63        "UPDATE Job SET JobStatus='%c',EndTime='%s',"
64 -"ClientId=%u,JobBytes=%s,JobFiles=%u,JobErrors=%u,VolSessionId=%u,"
65 +"ClientId=%u,JobBytes=%s,ReadBytes=%s,JobFiles=%u,JobErrors=%u,VolSessionId=%u,"
66  "VolSessionTime=%u,PoolId=%u,FileSetId=%u,JobTDate=%s,"
67  "RealEndTime='%s',PriorJobId=%s WHERE JobId=%s",
68        (char)(jr->JobStatus), dt, jr->ClientId, edit_uint64(jr->JobBytes, ed1),
69 +      edit_uint64(jr->ReadBytes, ed4),
70        jr->JobFiles, jr->JobErrors, jr->VolSessionId, jr->VolSessionTime,
71        jr->PoolId, jr->FileSetId, edit_uint64(JobTDate, ed2), 
72        rdt,
73 Index: src/cats/drop_postgresql_tables.in
74 ===================================================================
75 --- src/cats/drop_postgresql_tables.in  (revision 8456)
76 +++ src/cats/drop_postgresql_tables.in  (working copy)
77 @@ -11,7 +11,7 @@
78  drop table jobmedia;
79  drop table file;
80  drop table job;
81 -drop table jobhistory;
82 +drop table jobhisto;
83  drop table media;
84  drop table client;
85  drop table pool;
86 Index: src/cats/update_postgresql_tables.in
87 ===================================================================
88 --- src/cats/update_postgresql_tables.in        (revision 8456)
89 +++ src/cats/update_postgresql_tables.in        (working copy)
90 @@ -11,13 +11,28 @@
91  
92  if $bindir/psql -f - -d ${db_name} $* <<END-OF-DATA
93  
94 +-- The alter table operation can be faster with a big maintenance_work_mem
95 +-- Uncomment and adapt this value to your environment
96 +-- SET maintenance_work_mem = '1GB';
97 +
98 +BEGIN;
99 +ALTER TABLE file ALTER fileid TYPE bigint ;
100 +ALTER TABLE basefiles ALTER fileid TYPE bigint;
101 +ALTER TABLE job ADD COLUMN readbytes bigint default 0;
102 +ALTER TABLE media ADD COLUMN ActionOnPurge smallint default 0;
103 +ALTER TABLE pool ADD COLUMN ActionOnPurge smallint default 0;
104 +
105  -- Create a table like Job for long term statistics
106 -CREATE TABLE JobHistory (LIKE Job);
107 +CREATE TABLE JobHisto (LIKE Job);
108 +CREATE INDEX jobhisto_idx ON JobHisto ( starttime );
109  
110  UPDATE Version SET VersionId=11;
111 +COMMIT;
112  
113 +-- If you have already this table, you can remove it with:
114 +-- DROP TABLE JobHistory;
115 +
116  -- vacuum analyse;
117 -
118  END-OF-DATA
119  then
120     echo "Update of Bacula PostgreSQL tables succeeded."
121 Index: src/cats/make_sqlite3_tables.in
122 ===================================================================
123 --- src/cats/make_sqlite3_tables.in     (revision 8456)
124 +++ src/cats/make_sqlite3_tables.in     (working copy)
125 @@ -64,6 +64,7 @@
126     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
127     JobFiles INTEGER UNSIGNED DEFAULT 0,
128     JobBytes BIGINT UNSIGNED DEFAULT 0,
129 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
130     JobErrors INTEGER UNSIGNED DEFAULT 0,
131     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
132     PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
133 @@ -76,13 +77,13 @@
134  CREATE INDEX inx6 ON Job (Name);
135  
136  -- Create a table like Job for long term statistics 
137 -CREATE TABLE JobHistory (
138 +CREATE TABLE JobHisto (
139     JobId INTEGER,
140     Job VARCHAR(128) NOT NULL,
141     Name VARCHAR(128) NOT NULL,
142     Type CHAR(1) NOT NULL,
143     Level CHAR(1) NOT NULL,
144 -   ClientId INTEGER REFERENCES Client DEFAULT 0,
145 +   ClientId INTEGER DEFAULT 0,
146     JobStatus CHAR(1) NOT NULL,
147     SchedTime DATETIME NOT NULL,
148     StartTime DATETIME DEFAULT 0,
149 @@ -93,16 +94,16 @@
150     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
151     JobFiles INTEGER UNSIGNED DEFAULT 0,
152     JobBytes BIGINT UNSIGNED DEFAULT 0,
153 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
154     JobErrors INTEGER UNSIGNED DEFAULT 0,
155     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
156 -   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
157 -   FileSetId INTEGER UNSIGNED REFERENCES FileSet DEFAULT 0,
158 -   PriorJobId INTEGER UNSIGNED REFERENCES Job DEFAULT 0,
159 +   PoolId INTEGER UNSIGNED DEFAULT 0,
160 +   FileSetId INTEGER UNSIGNED DEFAULT 0,
161 +   PriorJobId INTEGER UNSIGNED DEFAULT 0,
162     PurgedFiles TINYINT DEFAULT 0,
163 -   HasBase TINYINT DEFAULT 0,
164 -   PRIMARY KEY(JobId) 
165 +   HasBase TINYINT DEFAULT 0
166     );
167 -CREATE INDEX inx61 ON JobHistory (Name);
168 +CREATE INDEX inx61 ON JobHisto (Name);
169  
170  CREATE TABLE Location (
171     LocationId INTEGER,
172 @@ -183,6 +184,7 @@
173     VolStatus VARCHAR(20) NOT NULL,
174     Enabled TINYINT DEFAULT 1,
175     Recycle TINYINT DEFAULT 0,
176 +   ActionOnPurge     TINYINT    DEFAULT 0,
177     VolRetention BIGINT UNSIGNED DEFAULT 0,
178     VolUseDuration BIGINT UNSIGNED DEFAULT 0,
179     MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
180 @@ -256,6 +258,7 @@
181     MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
182     AutoPrune TINYINT DEFAULT 0,
183     Recycle TINYINT DEFAULT 0,
184 +   ActionOnPurge     TINYINT    DEFAULT 0,
185     PoolType VARCHAR(20) NOT NULL,
186     LabelType TINYINT DEFAULT 0,
187     LabelFormat VARCHAR(128) NOT NULL,
188 @@ -383,7 +386,7 @@
189  
190  
191  -- Initialize Version           
192 -INSERT INTO Version (VersionId) VALUES (10);
193 +INSERT INTO Version (VersionId) VALUES (11);
194  
195  
196  PRAGMA default_cache_size = 100000;
197 Index: src/cats/cats.h
198 ===================================================================
199 --- src/cats/cats.h     (revision 8456)
200 +++ src/cats/cats.h     (working copy)
201 @@ -88,7 +88,7 @@
202  #if defined(BUILDING_CATS)
203  #ifdef HAVE_SQLITE
204  
205 -#define BDB_VERSION 10
206 +#define BDB_VERSION 11
207  
208  #include <sqlite.h>
209  
210 @@ -208,7 +208,7 @@
211  #ifdef HAVE_SQLITE3
212  
213  
214 -#define BDB_VERSION 10
215 +#define BDB_VERSION 11
216  
217  #include <sqlite3.h>
218  
219 @@ -334,7 +334,7 @@
220  
221  #ifdef HAVE_MYSQL
222  
223 -#define BDB_VERSION 10
224 +#define BDB_VERSION 11
225  
226  #include <mysql.h>
227  
228 @@ -417,7 +417,7 @@
229  
230  #ifdef HAVE_POSTGRESQL
231  
232 -#define BDB_VERSION 10
233 +#define BDB_VERSION 11
234  
235  #include <libpq-fe.h>
236  
237 @@ -531,7 +531,7 @@
238  
239  #ifdef HAVE_DBI
240  
241 -#define BDB_VERSION 10
242 +#define BDB_VERSION 11
243  
244  #include <dbi/dbi.h>
245  
246 @@ -790,6 +790,7 @@
247     uint32_t JobErrors;
248     uint32_t JobMissingFiles;
249     uint64_t JobBytes;
250 +   uint64_t ReadBytes;
251     int PurgedFiles;
252     int HasBase;
253  
254 Index: src/cats/update_sqlite3_tables.in
255 ===================================================================
256 --- src/cats/update_sqlite3_tables.in   (revision 8456)
257 +++ src/cats/update_sqlite3_tables.in   (working copy)
258 @@ -15,10 +15,15 @@
259  db_name=@db_name@
260  
261  ${bindir}/${sqlite} $* ${db_name}.db <<END-OF-DATA
262 +-- Can be replaced by 
263 +-- ALTER TABLE Job ADD COLUMN (ReadBytes BIGINT UNSIGNED DEFAULT 0);
264 +
265  BEGIN TRANSACTION;
266 +CREATE TEMPORARY TABLE job_backup AS SELECT * FROM Job;
267 +DROP TABLE Job;
268  
269 --- Create a table like Job for long term statistics
270 -CREATE TABLE JobHistory (
271 +CREATE TABLE Job
272 +(
273     JobId INTEGER,
274     Job VARCHAR(128) NOT NULL,
275     Name VARCHAR(128) NOT NULL,
276 @@ -35,6 +40,7 @@
277     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
278     JobFiles INTEGER UNSIGNED DEFAULT 0,
279     JobBytes BIGINT UNSIGNED DEFAULT 0,
280 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
281     JobErrors INTEGER UNSIGNED DEFAULT 0,
282     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
283     PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
284 @@ -42,12 +48,180 @@
285     PriorJobId INTEGER UNSIGNED REFERENCES Job DEFAULT 0,
286     PurgedFiles TINYINT DEFAULT 0,
287     HasBase TINYINT DEFAULT 0,
288 -   PRIMARY KEY(JobId) 
289 +   PRIMARY KEY(JobId)
290     );
291 -CREATE INDEX inx61 ON JobHistory (Name);
292 +CREATE INDEX inx6 ON Job (Name);
293  
294 +INSERT INTO Job (JobId, Job, Name, Type, Level, ClientId, JobStatus,
295 +SchedTime, StartTime, EndTime, RealEndTime, JobTDate, VolSessionId,
296 +VolSessionTime, JobFiles, JobBytes, JobErrors, JobMissingFiles,
297 +PoolId, FileSetId, PriorJobId, PurgedFiles, HasBase) SELECT
298 +JobId, Job, Name, Type, Level, ClientId, JobStatus, SchedTime, StartTime,
299 +EndTime, RealEndTime, JobTDate, VolSessionId, VolSessionTime, JobFiles,
300 +JobBytes, JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId,
301 +PurgedFiles, HasBase FROM Job_backup;
302 +
303 +DROP TABLE Job_backup;
304 +
305 +
306 +-- ----------------------------------------------------------------
307 +-- New ActionOnPurge field
308 +
309 +CREATE TEMPORARY TABLE pool_backup AS SELECT * FROM Pool;
310 +DROP TABLE Pool;
311 +
312 +CREATE TABLE Pool (
313 +   PoolId INTEGER,
314 +   Name VARCHAR(128) NOT NULL,
315 +   NumVols INTEGER UNSIGNED DEFAULT 0,
316 +   MaxVols INTEGER UNSIGNED DEFAULT 0,
317 +   UseOnce TINYINT DEFAULT 0,
318 +   UseCatalog TINYINT DEFAULT 1,
319 +   AcceptAnyVolume TINYINT DEFAULT 0,
320 +   VolRetention BIGINT UNSIGNED DEFAULT 0,
321 +   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
322 +   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
323 +   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
324 +   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
325 +   AutoPrune TINYINT DEFAULT 0,
326 +   Recycle TINYINT DEFAULT 0,
327 +   ActionOnPurge     TINYINT    DEFAULT 0,
328 +   PoolType VARCHAR(20) NOT NULL,
329 +   LabelType TINYINT DEFAULT 0,
330 +   LabelFormat VARCHAR(128) NOT NULL,
331 +   Enabled TINYINT DEFAULT 1,
332 +   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
333 +   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
334 +   NextPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
335 +   MigrationHighBytes BIGINT UNSIGNED DEFAULT 0,
336 +   MigrationLowBytes BIGINT UNSIGNED DEFAULT 0,
337 +   MigrationTime BIGINT UNSIGNED DEFAULT 0,
338 +   UNIQUE (Name),
339 +   PRIMARY KEY (PoolId)
340 +   );
341 +
342 +INSERT INTO Pool (PoolId, Name, NumVols, MaxVols, UseOnce, UseCatalog,
343 +AcceptAnyVolume, VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles,
344 +MaxVolBytes, AutoPrune, Recycle, PoolType, LabelType,
345 +LabelFormat, Enabled, ScratchPoolId, RecyclePoolId, NextPoolId,
346 +MigrationHighBytes, MigrationLowBytes, MigrationTime) 
347 +SELECT PoolId, Name, NumVols, MaxVols, UseOnce, UseCatalog, AcceptAnyVolume,
348 +VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles, MaxVolBytes, AutoPrune,
349 +Recycle, PoolType, LabelType, LabelFormat, Enabled,
350 +ScratchPoolId, RecyclePoolId, NextPoolId, MigrationHighBytes,
351 +MigrationLowBytes, MigrationTime FROM pool_backup;
352 +
353 +DROP TABLE pool_backup;
354 +
355 +-- ----------------------------------------------------------------
356 +-- New ActionOnPurge field
357 +
358 +CREATE TEMPORARY TABLE media_backup AS SELECT * FROM Media;
359 +DROP TABLE Media;
360 +
361 +CREATE TABLE Media (
362 +   MediaId INTEGER,
363 +   VolumeName VARCHAR(128) NOT NULL,
364 +   Slot INTEGER DEFAULT 0,
365 +   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
366 +   MediaType VARCHAR(128) NOT NULL,
367 +   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType DEFAULT 0,
368 +   LabelType TINYINT DEFAULT 0,
369 +   FirstWritten DATETIME DEFAULT 0,
370 +   LastWritten DATETIME DEFAULT 0,
371 +   LabelDate DATETIME DEFAULT 0,
372 +   VolJobs INTEGER UNSIGNED DEFAULT 0,
373 +   VolFiles INTEGER UNSIGNED DEFAULT 0,
374 +   VolBlocks INTEGER UNSIGNED DEFAULT 0,
375 +   VolMounts INTEGER UNSIGNED DEFAULT 0,
376 +   VolBytes BIGINT UNSIGNED DEFAULT 0,
377 +   VolParts INTEGER UNSIGNED DEFAULT 0,
378 +   VolErrors INTEGER UNSIGNED DEFAULT 0,
379 +   VolWrites INTEGER UNSIGNED DEFAULT 0,
380 +   VolCapacityBytes BIGINT UNSIGNED DEFAULT 0,
381 +   VolStatus VARCHAR(20) NOT NULL,
382 +   Enabled TINYINT DEFAULT 1,
383 +   Recycle TINYINT DEFAULT 0,
384 +   ActionOnPurge     TINYINT    DEFAULT 0,
385 +   VolRetention BIGINT UNSIGNED DEFAULT 0,
386 +   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
387 +   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
388 +   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
389 +   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
390 +   InChanger TINYINT DEFAULT 0,
391 +   StorageId INTEGER UNSIGNED REFERENCES Storage DEFAULT 0,
392 +   DeviceId INTEGER UNSIGNED REFERENCES Device DEFAULT 0,
393 +   MediaAddressing TINYINT DEFAULT 0,
394 +   VolReadTime BIGINT UNSIGNED DEFAULT 0,
395 +   VolWriteTime BIGINT UNSIGNED DEFAULT 0,
396 +   EndFile INTEGER UNSIGNED DEFAULT 0,
397 +   EndBlock INTEGER UNSIGNED DEFAULT 0,
398 +   LocationId INTEGER UNSIGNED REFERENCES Location DEFAULT 0,
399 +   RecycleCount INTEGER UNSIGNED DEFAULT 0,
400 +   InitialWrite DATETIME DEFAULT 0,
401 +   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
402 +   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
403 +   Comment TEXT,
404 +   PRIMARY KEY(MediaId)
405 +   );
406 +
407 +CREATE INDEX inx8 ON Media (PoolId);
408 +
409 +INSERT INTO Media (
410 +   MediaId, VolumeName, Slot, PoolId, MediaType, MediaTypeId,
411 +   LabelType, FirstWritten, LastWritten, LabelDate, VolJobs,
412 +   VolFiles, VolBlocks, VolMounts, VolBytes, VolParts, VolErrors,
413 +   VolWrites, VolCapacityBytes, VolStatus, Enabled, Recycle,
414 +   VolRetention, VolUseDuration, MaxVolJobs,
415 +   MaxVolFiles, MaxVolBytes, InChanger, StorageId, DeviceId,
416 +   MediaAddressing, VolReadTime, VolWriteTime, EndFile, EndBlock,
417 +   LocationId, RecycleCount, InitialWrite, ScratchPoolId,
418 +   RecyclePoolId, Comment)
419 +SELECT MediaId, VolumeName, Slot, PoolId, MediaType, MediaTypeId,
420 +   LabelType, FirstWritten, LastWritten, LabelDate, VolJobs,
421 +   VolFiles, VolBlocks, VolMounts, VolBytes, VolParts, VolErrors,
422 +   VolWrites, VolCapacityBytes, VolStatus, Enabled, Recycle,
423 +   VolRetention, VolUseDuration, MaxVolJobs,
424 +   MaxVolFiles, MaxVolBytes, InChanger, StorageId, DeviceId,
425 +   MediaAddressing, VolReadTime, VolWriteTime, EndFile, EndBlock,
426 +   LocationId, RecycleCount, InitialWrite, ScratchPoolId,
427 +   RecyclePoolId, Comment FROM media_backup;
428 +
429 +DROP TABLE media_backup;
430 +
431  UPDATE Version SET VersionId=11;
432 -
433  COMMIT;
434  
435 +-- If you have already this table, you can remove it with:
436 +-- DROP TABLE JobHistory;
437 +
438 +-- Create a table like Job for long term statistics
439 +CREATE TABLE JobHisto (
440 +   JobId INTEGER,
441 +   Job VARCHAR(128) NOT NULL,
442 +   Name VARCHAR(128) NOT NULL,
443 +   Type CHAR NOT NULL,
444 +   Level CHAR NOT NULL,
445 +   ClientId INTEGER REFERENCES Client DEFAULT 0,
446 +   JobStatus CHAR NOT NULL,
447 +   SchedTime DATETIME NOT NULL,
448 +   StartTime DATETIME DEFAULT 0,
449 +   EndTime DATETIME DEFAULT 0,
450 +   RealEndTime DATETIME DEFAULT 0,
451 +   JobTDate BIGINT UNSIGNED DEFAULT 0,
452 +   VolSessionId INTEGER UNSIGNED DEFAULT 0,
453 +   VolSessionTime INTEGER UNSIGNED DEFAULT 0,
454 +   JobFiles INTEGER UNSIGNED DEFAULT 0,
455 +   JobBytes BIGINT UNSIGNED DEFAULT 0,
456 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
457 +   JobErrors INTEGER UNSIGNED DEFAULT 0,
458 +   JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
459 +   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
460 +   FileSetId INTEGER UNSIGNED REFERENCES FileSet DEFAULT 0,
461 +   PriorJobId INTEGER UNSIGNED REFERENCES Job DEFAULT 0,
462 +   PurgedFiles TINYINT DEFAULT 0,
463 +   HasBase TINYINT DEFAULT 0
464 +   );
465 +CREATE INDEX inx61 ON JobHisto (Name);
466 +
467  END-OF-DATA
468 Index: src/cats/make_postgresql_tables.in
469 ===================================================================
470 --- src/cats/make_postgresql_tables.in  (revision 8456)
471 +++ src/cats/make_postgresql_tables.in  (working copy)
472 @@ -15,7 +15,7 @@
473  );
474  
475  ALTER TABLE filename ALTER COLUMN name SET STATISTICS 1000;
476 -CREATE INDEX filename_name_idx on filename (name);
477 +CREATE UNIQUE INDEX filename_name_idx on filename (name);
478  
479  CREATE TABLE path
480  (
481 @@ -25,11 +25,11 @@
482  );
483  
484  ALTER TABLE path ALTER COLUMN path SET STATISTICS 1000;
485 -CREATE INDEX path_name_idx on path (path);
486 +CREATE UNIQUE INDEX path_name_idx on path (path);
487  
488  CREATE TABLE file
489  (
490 -    fileid           serial      not null,
491 +    fileid           bigserial   not null,
492      fileindex        integer     not null  default 0,
493      jobid            integer     not null,
494      pathid           integer     not null,
495 @@ -74,6 +74,7 @@
496      volsessiontime    integer    default 0,
497      jobfiles         integer     default 0,
498      jobbytes         bigint      default 0,
499 +    readbytes        bigint      default 0,
500      joberrors        integer     default 0,
501      jobmissingfiles   integer    default 0,
502      poolid           integer     default 0,
503 @@ -87,8 +88,10 @@
504  CREATE INDEX job_name_idx on job (name);
505  
506  -- Create a table like Job for long term statistics 
507 -CREATE TABLE JobHistory (LIKE Job);
508 +CREATE TABLE JobHisto (LIKE Job);
509 +CREATE INDEX jobhisto_idx ON jobhisto ( starttime );
510  
511 +
512  CREATE TABLE Location (
513     LocationId        serial      not null,
514     Location          text        not null,
515 @@ -154,6 +157,7 @@
516               'Error','Busy','Used','Cleaning','Scratch')),
517      enabled          smallint    default 1,
518      recycle          smallint    default 0,
519 +    ActionOnPurge     smallint    default 0,
520      volretention      bigint     default 0,
521      voluseduration    bigint     default 0,
522      maxvoljobs       integer     default 0,
523 @@ -229,6 +233,7 @@
524      maxvolbytes       bigint     default 0,
525      autoprune        smallint    default 0,
526      recycle          smallint    default 0,
527 +    ActionOnPurge     smallint    default 0,
528      pooltype         text                          
529        check (pooltype in ('Backup','Copy','Cloned','Archive','Migration','Scratch')),
530      labeltype        integer     default 0,
531 @@ -300,7 +305,7 @@
532  (
533      baseid           serial                not null,
534      jobid            integer               not null,
535 -    fileid           integer               not null,
536 +    fileid           bigint                not null,
537      fileindex        integer                       ,
538      basejobid        integer                       ,
539      primary key (baseid)
540 @@ -377,7 +382,7 @@
541  INSERT INTO Status (JobStatus,JobStatusLong) VALUES
542     ('i', 'Doing batch insert file records');
543  
544 -INSERT INTO Version (VersionId) VALUES (10);
545 +INSERT INTO Version (VersionId) VALUES (11);
546  
547  -- Make sure we have appropriate permissions
548  
549 Index: src/cats/update_sqlite_tables.in
550 ===================================================================
551 --- src/cats/update_sqlite_tables.in    (revision 8456)
552 +++ src/cats/update_sqlite_tables.in    (working copy)
553 @@ -17,9 +17,11 @@
554  ${bindir}/${sqlite} $* ${db_name}.db <<END-OF-DATA
555  BEGIN TRANSACTION;
556  
557 --- Create a table like Job for long term statistics
558 +CREATE TEMPORARY TABLE job_backup AS SELECT * FROM Job;
559 +DROP TABLE Job;
560  
561 -CREATE TABLE JobHistory (
562 +CREATE TABLE Job
563 +(
564     JobId INTEGER,
565     Job VARCHAR(128) NOT NULL,
566     Name VARCHAR(128) NOT NULL,
567 @@ -36,6 +38,7 @@
568     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
569     JobFiles INTEGER UNSIGNED DEFAULT 0,
570     JobBytes BIGINT UNSIGNED DEFAULT 0,
571 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
572     JobErrors INTEGER UNSIGNED DEFAULT 0,
573     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
574     PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
575 @@ -43,12 +46,182 @@
576     PriorJobId INTEGER UNSIGNED REFERENCES Job DEFAULT 0,
577     PurgedFiles TINYINT DEFAULT 0,
578     HasBase TINYINT DEFAULT 0,
579 -   PRIMARY KEY(JobId) 
580 +   PRIMARY KEY(JobId)
581     );
582 -CREATE INDEX inx61 ON JobHistory (Name);
583 +CREATE INDEX inx6 ON Job (Name);
584  
585 +INSERT INTO Job (JobId, Job, Name, Type, Level, ClientId, JobStatus,
586 +SchedTime, StartTime, EndTime, RealEndTime, JobTDate, VolSessionId,
587 +VolSessionTime, JobFiles, JobBytes, JobErrors, JobMissingFiles,
588 +PoolId, FileSetId, PriorJobId, PurgedFiles, HasBase) SELECT
589 +JobId, Job, Name, Type, Level, ClientId, JobStatus, SchedTime, StartTime,
590 +EndTime, RealEndTime, JobTDate, VolSessionId, VolSessionTime, JobFiles,
591 +JobBytes, JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId,
592 +PurgedFiles, HasBase FROM Job_backup;
593 +
594 +DROP TABLE Job_backup;
595 +
596 +-- ----------------------------------------------------------------
597 +-- New ActionOnPurge field
598 +
599 +CREATE TEMPORARY TABLE pool_backup AS SELECT * FROM Pool;
600 +DROP TABLE Pool;
601 +
602 +CREATE TABLE Pool (
603 +   PoolId INTEGER,
604 +   Name VARCHAR(128) NOT NULL,
605 +   NumVols INTEGER UNSIGNED DEFAULT 0,
606 +   MaxVols INTEGER UNSIGNED DEFAULT 0,
607 +   UseOnce TINYINT DEFAULT 0,
608 +   UseCatalog TINYINT DEFAULT 1,
609 +   AcceptAnyVolume TINYINT DEFAULT 0,
610 +   VolRetention BIGINT UNSIGNED DEFAULT 0,
611 +   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
612 +   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
613 +   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
614 +   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
615 +   AutoPrune TINYINT DEFAULT 0,
616 +   Recycle TINYINT DEFAULT 0,
617 +   ActionOnPurge     TINYINT    DEFAULT 0,
618 +   PoolType VARCHAR(20) NOT NULL,
619 +   LabelType TINYINT DEFAULT 0,
620 +   LabelFormat VARCHAR(128) NOT NULL,
621 +   Enabled TINYINT DEFAULT 1,
622 +   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
623 +   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
624 +   NextPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
625 +   MigrationHighBytes BIGINT UNSIGNED DEFAULT 0,
626 +   MigrationLowBytes BIGINT UNSIGNED DEFAULT 0,
627 +   MigrationTime BIGINT UNSIGNED DEFAULT 0,
628 +   UNIQUE (Name),
629 +   PRIMARY KEY (PoolId)
630 +   );
631 +
632 +INSERT INTO Pool (PoolId, Name, NumVols, MaxVols, UseOnce, UseCatalog,
633 +AcceptAnyVolume, VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles,
634 +MaxVolBytes, AutoPrune, Recycle, PoolType, LabelType,
635 +LabelFormat, Enabled, ScratchPoolId, RecyclePoolId, NextPoolId,
636 +MigrationHighBytes, MigrationLowBytes, MigrationTime) 
637 +SELECT PoolId, Name, NumVols, MaxVols, UseOnce, UseCatalog, AcceptAnyVolume,
638 +VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles, MaxVolBytes, AutoPrune,
639 +Recycle, PoolType, LabelType, LabelFormat, Enabled,
640 +ScratchPoolId, RecyclePoolId, NextPoolId, MigrationHighBytes,
641 +MigrationLowBytes, MigrationTime FROM pool_backup;
642 +
643 +DROP TABLE pool_backup;
644 +
645 +-- ----------------------------------------------------------------
646 +-- New ActionOnPurge field
647 +
648 +CREATE TEMPORARY TABLE media_backup AS SELECT * FROM Media;
649 +DROP TABLE Media;
650 +
651 +CREATE TABLE Media (
652 +   MediaId INTEGER,
653 +   VolumeName VARCHAR(128) NOT NULL,
654 +   Slot INTEGER DEFAULT 0,
655 +   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
656 +   MediaType VARCHAR(128) NOT NULL,
657 +   MediaTypeId INTEGER UNSIGNED REFERENCES MediaType DEFAULT 0,
658 +   LabelType TINYINT DEFAULT 0,
659 +   FirstWritten DATETIME DEFAULT 0,
660 +   LastWritten DATETIME DEFAULT 0,
661 +   LabelDate DATETIME DEFAULT 0,
662 +   VolJobs INTEGER UNSIGNED DEFAULT 0,
663 +   VolFiles INTEGER UNSIGNED DEFAULT 0,
664 +   VolBlocks INTEGER UNSIGNED DEFAULT 0,
665 +   VolMounts INTEGER UNSIGNED DEFAULT 0,
666 +   VolBytes BIGINT UNSIGNED DEFAULT 0,
667 +   VolParts INTEGER UNSIGNED DEFAULT 0,
668 +   VolErrors INTEGER UNSIGNED DEFAULT 0,
669 +   VolWrites INTEGER UNSIGNED DEFAULT 0,
670 +   VolCapacityBytes BIGINT UNSIGNED DEFAULT 0,
671 +   VolStatus VARCHAR(20) NOT NULL,
672 +   Enabled TINYINT DEFAULT 1,
673 +   Recycle TINYINT DEFAULT 0,
674 +   ActionOnPurge     TINYINT    DEFAULT 0,
675 +   VolRetention BIGINT UNSIGNED DEFAULT 0,
676 +   VolUseDuration BIGINT UNSIGNED DEFAULT 0,
677 +   MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
678 +   MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
679 +   MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
680 +   InChanger TINYINT DEFAULT 0,
681 +   StorageId INTEGER UNSIGNED REFERENCES Storage DEFAULT 0,
682 +   DeviceId INTEGER UNSIGNED REFERENCES Device DEFAULT 0,
683 +   MediaAddressing TINYINT DEFAULT 0,
684 +   VolReadTime BIGINT UNSIGNED DEFAULT 0,
685 +   VolWriteTime BIGINT UNSIGNED DEFAULT 0,
686 +   EndFile INTEGER UNSIGNED DEFAULT 0,
687 +   EndBlock INTEGER UNSIGNED DEFAULT 0,
688 +   LocationId INTEGER UNSIGNED REFERENCES Location DEFAULT 0,
689 +   RecycleCount INTEGER UNSIGNED DEFAULT 0,
690 +   InitialWrite DATETIME DEFAULT 0,
691 +   ScratchPoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
692 +   RecyclePoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
693 +   Comment TEXT,
694 +   PRIMARY KEY(MediaId)
695 +   );
696 +
697 +CREATE INDEX inx8 ON Media (PoolId);
698 +
699 +INSERT INTO Media (
700 +   MediaId, VolumeName, Slot, PoolId, MediaType, MediaTypeId,
701 +   LabelType, FirstWritten, LastWritten, LabelDate, VolJobs,
702 +   VolFiles, VolBlocks, VolMounts, VolBytes, VolParts, VolErrors,
703 +   VolWrites, VolCapacityBytes, VolStatus, Enabled, Recycle,
704 +   VolRetention, VolUseDuration, MaxVolJobs,
705 +   MaxVolFiles, MaxVolBytes, InChanger, StorageId, DeviceId,
706 +   MediaAddressing, VolReadTime, VolWriteTime, EndFile, EndBlock,
707 +   LocationId, RecycleCount, InitialWrite, ScratchPoolId,
708 +   RecyclePoolId, Comment)
709 +SELECT MediaId, VolumeName, Slot, PoolId, MediaType, MediaTypeId,
710 +   LabelType, FirstWritten, LastWritten, LabelDate, VolJobs,
711 +   VolFiles, VolBlocks, VolMounts, VolBytes, VolParts, VolErrors,
712 +   VolWrites, VolCapacityBytes, VolStatus, Enabled, Recycle,
713 +   VolRetention, VolUseDuration, MaxVolJobs,
714 +   MaxVolFiles, MaxVolBytes, InChanger, StorageId, DeviceId,
715 +   MediaAddressing, VolReadTime, VolWriteTime, EndFile, EndBlock,
716 +   LocationId, RecycleCount, InitialWrite, ScratchPoolId,
717 +   RecyclePoolId, Comment FROM media_backup;
718 +
719 +DROP TABLE media_backup;
720 +
721 +-- ----------------------------------------------------------------
722 +
723  UPDATE Version SET VersionId=11;
724  
725  COMMIT;
726  
727 +-- If you have already this table, you can remove it with:
728 +-- DROP TABLE JobHistory;
729 +
730 +-- Create a table like Job for long term statistics
731 +CREATE TABLE JobHisto (
732 +   JobId INTEGER,
733 +   Job VARCHAR(128) NOT NULL,
734 +   Name VARCHAR(128) NOT NULL,
735 +   Type CHAR NOT NULL,
736 +   Level CHAR NOT NULL,
737 +   ClientId INTEGER REFERENCES Client DEFAULT 0,
738 +   JobStatus CHAR NOT NULL,
739 +   SchedTime DATETIME NOT NULL,
740 +   StartTime DATETIME DEFAULT 0,
741 +   EndTime DATETIME DEFAULT 0,
742 +   RealEndTime DATETIME DEFAULT 0,
743 +   JobTDate BIGINT UNSIGNED DEFAULT 0,
744 +   VolSessionId INTEGER UNSIGNED DEFAULT 0,
745 +   VolSessionTime INTEGER UNSIGNED DEFAULT 0,
746 +   JobFiles INTEGER UNSIGNED DEFAULT 0,
747 +   JobBytes BIGINT UNSIGNED DEFAULT 0,
748 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
749 +   JobErrors INTEGER UNSIGNED DEFAULT 0,
750 +   JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
751 +   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
752 +   FileSetId INTEGER UNSIGNED REFERENCES FileSet DEFAULT 0,
753 +   PriorJobId INTEGER UNSIGNED REFERENCES Job DEFAULT 0,
754 +   PurgedFiles TINYINT DEFAULT 0,
755 +   HasBase TINYINT DEFAULT 0
756 +   );
757 +CREATE INDEX inx61 ON JobHisto (Name);
758 +
759  END-OF-DATA
760 Index: src/cats/update_mysql_tables.in
761 ===================================================================
762 --- src/cats/update_mysql_tables.in     (revision 8456)
763 +++ src/cats/update_mysql_tables.in     (working copy)
764 @@ -12,16 +12,50 @@
765  if $bindir/mysql $* -f <<END-OF-DATA
766  USE ${db_name};
767  
768 --- Create a table like Job for long term statistics
769 -CREATE TABLE JobHistory (LIKE Job);
770 -
771  -- Fix bad index on Media table
772 -DROP INDEX inx8;
773 +DROP INDEX inx8 ON Media;
774  CREATE UNIQUE INDEX inx8 ON Media (VolumeName(128));
775 +ALTER TABLE File CHANGE FileId FileId BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;
776 +ALTER TABLE BaseFiles CHANGE FileId FileId BIGINT UNSIGNED NOT NULL;
777 +ALTER TABLE Job ADD ReadBytes BIGINT UNSIGNED DEFAULT 0 AFTER JobBytes; 
778 +ALTER TABLE Media ADD ActionOnPurge TINYINT DEFAULT 0 AFTER Recycle;
779 +ALTER TABLE Pool ADD ActionOnPurge TINYINT DEFAULT 0 AFTER Recycle;
780  
781  DELETE FROM Version;
782  INSERT INTO Version (VersionId) VALUES (11);
783  
784 +-- If you have already this table, you can remove it with:
785 +-- DROP TABLE JobHistory;
786 +
787 +-- Create a table like Job for long term statistics
788 +CREATE TABLE JobHisto (
789 +   JobId INTEGER UNSIGNED NOT NULL,
790 +   Job TINYBLOB NOT NULL,
791 +   Name TINYBLOB NOT NULL,
792 +   Type BINARY(1) NOT NULL,
793 +   Level BINARY(1) NOT NULL,
794 +   ClientId INTEGER DEFAULT 0,
795 +   JobStatus BINARY(1) NOT NULL,
796 +   SchedTime DATETIME DEFAULT 0,
797 +   StartTime DATETIME DEFAULT 0,
798 +   EndTime DATETIME DEFAULT 0,
799 +   RealEndTime DATETIME DEFAULT 0,
800 +   JobTDate BIGINT UNSIGNED DEFAULT 0,
801 +   VolSessionId INTEGER UNSIGNED DEFAULT 0,
802 +   VolSessionTime INTEGER UNSIGNED DEFAULT 0,
803 +   JobFiles INTEGER UNSIGNED DEFAULT 0,
804 +   JobBytes BIGINT UNSIGNED DEFAULT 0,
805 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
806 +   JobErrors INTEGER UNSIGNED DEFAULT 0,
807 +   JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
808 +   PoolId INTEGER UNSIGNED DEFAULT 0,
809 +   FileSetId INTEGER UNSIGNED DEFAULT 0,
810 +   PriorJobId INTEGER UNSIGNED DEFAULT 0,
811 +   PurgedFiles TINYINT DEFAULT 0,
812 +   HasBase TINYINT DEFAULT 0,
813 +   INDEX (StartTime)
814 +   );
815 +
816  END-OF-DATA
817  then
818     echo "Update of Bacula MySQL tables succeeded."
819 Index: src/cats/make_sqlite_tables.in
820 ===================================================================
821 --- src/cats/make_sqlite_tables.in      (revision 8456)
822 +++ src/cats/make_sqlite_tables.in      (working copy)
823 @@ -64,6 +64,7 @@
824     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
825     JobFiles INTEGER UNSIGNED DEFAULT 0,
826     JobBytes BIGINT UNSIGNED DEFAULT 0,
827 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
828     JobErrors INTEGER UNSIGNED DEFAULT 0,
829     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
830     PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
831 @@ -76,13 +77,13 @@
832  CREATE INDEX inx6 ON Job (Name);
833  
834  -- Create a table like Job for long term statistics 
835 -CREATE TABLE JobHistory (
836 +CREATE TABLE JobHisto (
837     JobId INTEGER,
838     Job VARCHAR(128) NOT NULL,
839     Name VARCHAR(128) NOT NULL,
840     Type CHAR(1) NOT NULL,
841     Level CHAR(1) NOT NULL,
842 -   ClientId INTEGER REFERENCES Client DEFAULT 0,
843 +   ClientId INTEGER DEFAULT 0,
844     JobStatus CHAR(1) NOT NULL,
845     SchedTime DATETIME NOT NULL,
846     StartTime DATETIME DEFAULT 0,
847 @@ -93,16 +94,16 @@
848     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
849     JobFiles INTEGER UNSIGNED DEFAULT 0,
850     JobBytes BIGINT UNSIGNED DEFAULT 0,
851 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
852     JobErrors INTEGER UNSIGNED DEFAULT 0,
853     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
854 -   PoolId INTEGER UNSIGNED REFERENCES Pool DEFAULT 0,
855 -   FileSetId INTEGER UNSIGNED REFERENCES FileSet DEFAULT 0,
856 -   PriorJobId INTEGER UNSIGNED REFERENCES Job DEFAULT 0,
857 +   PoolId INTEGER UNSIGNED DEFAULT 0,
858 +   FileSetId INTEGER UNSIGNED DEFAULT 0,
859 +   PriorJobId INTEGER UNSIGNED DEFAULT 0,
860     PurgedFiles TINYINT DEFAULT 0,
861 -   HasBase TINYINT DEFAULT 0,
862 -   PRIMARY KEY(JobId) 
863 +   HasBase TINYINT DEFAULT 0
864     );
865 -CREATE INDEX inx61 ON JobHistory (Name);
866 +CREATE INDEX inx61 ON JobHisto (Name);
867  
868  CREATE TABLE Location (
869     LocationId INTEGER,
870 @@ -183,6 +184,7 @@
871     VolStatus VARCHAR(20) NOT NULL,
872     Enabled TINYINT DEFAULT 1,
873     Recycle TINYINT DEFAULT 0,
874 +   ActionOnPurge     TINYINT    DEFAULT 0,
875     VolRetention BIGINT UNSIGNED DEFAULT 0,
876     VolUseDuration BIGINT UNSIGNED DEFAULT 0,
877     MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
878 @@ -256,6 +258,7 @@
879     MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
880     AutoPrune TINYINT DEFAULT 0,
881     Recycle TINYINT DEFAULT 0,
882 +   ActionOnPurge     TINYINT    DEFAULT 0,
883     PoolType VARCHAR(20) NOT NULL,
884     LabelType TINYINT DEFAULT 0,
885     LabelFormat VARCHAR(128) NOT NULL,
886 @@ -383,7 +386,7 @@
887  
888  
889  -- Initialize Version           
890 -INSERT INTO Version (VersionId) VALUES (10);
891 +INSERT INTO Version (VersionId) VALUES (11);
892  
893  
894  PRAGMA default_synchronous = OFF;
895 Index: src/cats/sql_get.c
896 ===================================================================
897 --- src/cats/sql_get.c  (revision 8456)
898 +++ src/cats/sql_get.c  (working copy)
899 @@ -297,13 +297,13 @@
900        Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime,"
901  "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
902  "Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId,"
903 -"SchedTime,RealEndTime "
904 +"SchedTime,RealEndTime,ReadBytes "
905  "FROM Job WHERE Job='%s'", jr->Job);
906      } else {
907        Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime,"
908  "PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
909  "Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId,"
910 -"SchedTime,RealEndTime "
911 +"SchedTime,RealEndTime,ReadBytes "
912  "FROM Job WHERE JobId=%s", 
913            edit_int64(jr->JobId, ed1));
914      }
915 @@ -341,6 +341,7 @@
916     jr->FileSetId = str_to_int64(row[17]);
917     bstrncpy(jr->cSchedTime, row[3]!=NULL?row[18]:"", sizeof(jr->cSchedTime));
918     bstrncpy(jr->cRealEndTime, row[3]!=NULL?row[19]:"", sizeof(jr->cRealEndTime));
919 +   jr->ReadBytes = str_to_int64(row[20]);
920     jr->StartTime = str_to_utime(jr->cStartTime);
921     jr->SchedTime = str_to_utime(jr->cSchedTime);
922     jr->EndTime = str_to_utime(jr->cEndTime);
923 Index: src/cats/sql_cmds.c
924 ===================================================================
925 --- src/cats/sql_cmds.c (revision 8456)
926 +++ src/cats/sql_cmds.c (working copy)
927 @@ -44,6 +44,26 @@
928  #include "bacula.h"
929  #include "cats.h"
930  
931 +
932 +/* For sql_update.c db_update_stats */
933 +const char *fill_jobhisto =
934 +        "INSERT INTO JobHisto (" 
935 +           "JobId, Job, Name, Type, Level, ClientId, JobStatus, "
936 +           "SchedTime, StartTime, EndTime, RealEndTime, JobTDate, "
937 +           "VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes, "
938 +           "JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, "
939 +           "PurgedFiles, HasBase ) "
940 +        "SELECT " 
941 +           "JobId, Job, Name, Type, Level, ClientId, JobStatus, "
942 +           "SchedTime, StartTime, EndTime, RealEndTime, JobTDate, "
943 +           "VolSessionId, VolSessionTime, JobFiles, JobBytes, ReadBytes, "
944 +           "JobErrors, JobMissingFiles, PoolId, FileSetId, PriorJobId, "
945 +           "PurgedFiles, HasBase "
946 +          "FROM Job "
947 +         "WHERE JobStatus IN ('T', 'f', 'A', 'E') "
948 +           "AND JobId NOT IN (SELECT JobId FROM JobHisto) "
949 +           "AND JobTDate < %s ";
950 +
951  /* For ua_update.c */
952  const char *list_pool = "SELECT * FROM Pool WHERE PoolId=%s";
953  
954 Index: src/cats/drop_mysql_tables.in
955 ===================================================================
956 --- src/cats/drop_mysql_tables.in       (revision 8456)
957 +++ src/cats/drop_mysql_tables.in       (working copy)
958 @@ -16,7 +16,7 @@
959  DROP TABLE IF EXISTS File;
960  DROP TABLE IF EXISTS Client;
961  DROP TABLE IF EXISTS Job;
962 -DROP TABLE IF EXISTS JobHistory;
963 +DROP TABLE IF EXISTS JobHisto;
964  DROP TABLE IF EXISTS Media;
965  DROP TABLE IF EXISTS JobMedia;
966  DROP TABLE IF EXISTS Pool;
967 Index: src/cats/sql_cmds.h
968 ===================================================================
969 --- src/cats/sql_cmds.h (revision 8456)
970 +++ src/cats/sql_cmds.h (working copy)
971 @@ -26,7 +26,7 @@
972     Switzerland, email:ftf@fsfeurope.org.
973  */
974  
975 -
976 +extern const char CATS_IMP_EXP *fill_jobhisto;
977  extern const char CATS_IMP_EXP *client_backups;
978  extern const char CATS_IMP_EXP *list_pool;
979  extern const char CATS_IMP_EXP *drop_deltabs[];
980 Index: src/cats/grant_postgresql_privileges.in
981 ===================================================================
982 --- src/cats/grant_postgresql_privileges.in     (revision 8456)
983 +++ src/cats/grant_postgresql_privileges.in     (working copy)
984 @@ -32,7 +32,7 @@
985  grant all on location    to ${db_user};
986  grant all on locationlog  to ${db_user};
987  grant all on log         to ${db_user};
988 -grant all on jobhistory          to ${db_user};
989 +grant all on jobhisto    to ${db_user};
990  
991  -- for sequences on those tables
992  
993 Index: src/cats/make_mysql_tables.in
994 ===================================================================
995 --- src/cats/make_mysql_tables.in       (revision 8456)
996 +++ src/cats/make_mysql_tables.in       (working copy)
997 @@ -29,7 +29,7 @@
998  
999  
1000  CREATE TABLE File (
1001 -   FileId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
1002 +   FileId BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
1003     FileIndex INTEGER UNSIGNED DEFAULT 0,
1004     JobId INTEGER UNSIGNED NOT NULL REFERENCES Job,
1005     PathId INTEGER UNSIGNED NOT NULL REFERENCES Path,
1006 @@ -104,6 +104,7 @@
1007     VolSessionTime INTEGER UNSIGNED DEFAULT 0,
1008     JobFiles INTEGER UNSIGNED DEFAULT 0,
1009     JobBytes BIGINT UNSIGNED DEFAULT 0,
1010 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
1011     JobErrors INTEGER UNSIGNED DEFAULT 0,
1012     JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
1013     PoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool,
1014 @@ -116,7 +117,33 @@
1015     );
1016  
1017  -- Create a table like Job for long term statistics 
1018 -CREATE TABLE JobHistory (LIKE Job);
1019 +CREATE TABLE JobHisto (
1020 +   JobId INTEGER UNSIGNED NOT NULL,
1021 +   Job TINYBLOB NOT NULL,
1022 +   Name TINYBLOB NOT NULL,
1023 +   Type BINARY(1) NOT NULL,
1024 +   Level BINARY(1) NOT NULL,
1025 +   ClientId INTEGER DEFAULT 0,
1026 +   JobStatus BINARY(1) NOT NULL,
1027 +   SchedTime DATETIME DEFAULT 0,
1028 +   StartTime DATETIME DEFAULT 0,
1029 +   EndTime DATETIME DEFAULT 0,
1030 +   RealEndTime DATETIME DEFAULT 0,
1031 +   JobTDate BIGINT UNSIGNED DEFAULT 0,
1032 +   VolSessionId INTEGER UNSIGNED DEFAULT 0,
1033 +   VolSessionTime INTEGER UNSIGNED DEFAULT 0,
1034 +   JobFiles INTEGER UNSIGNED DEFAULT 0,
1035 +   JobBytes BIGINT UNSIGNED DEFAULT 0,
1036 +   ReadBytes BIGINT UNSIGNED DEFAULT 0,
1037 +   JobErrors INTEGER UNSIGNED DEFAULT 0,
1038 +   JobMissingFiles INTEGER UNSIGNED DEFAULT 0,
1039 +   PoolId INTEGER UNSIGNED DEFAULT 0,
1040 +   FileSetId INTEGER UNSIGNED DEFAULT 0,
1041 +   PriorJobId INTEGER UNSIGNED DEFAULT 0,
1042 +   PurgedFiles TINYINT DEFAULT 0,
1043 +   HasBase TINYINT DEFAULT 0,
1044 +   INDEX (StartTime)
1045 +   );
1046  
1047  CREATE TABLE Location (
1048     LocationId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
1049 @@ -190,6 +217,7 @@
1050      'Read-Only', 'Disabled', 'Error', 'Busy', 'Used', 'Cleaning') NOT NULL,
1051     Enabled TINYINT DEFAULT 1,
1052     Recycle TINYINT DEFAULT 0,
1053 +   ActionOnPurge     TINYINT    DEFAULT 0,
1054     VolRetention BIGINT UNSIGNED DEFAULT 0,
1055     VolUseDuration BIGINT UNSIGNED DEFAULT 0,
1056     MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
1057 @@ -229,6 +257,7 @@
1058     MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
1059     AutoPrune TINYINT DEFAULT 0,
1060     Recycle TINYINT DEFAULT 0,
1061 +   ActionOnPurge     TINYINT    DEFAULT 0,
1062     PoolType ENUM('Backup', 'Copy', 'Cloned', 'Archive', 'Migration', 'Scratch') NOT NULL,
1063     LabelType TINYINT DEFAULT 0,
1064     LabelFormat TINYBLOB,
1065 @@ -269,7 +298,7 @@
1066     BaseId INTEGER UNSIGNED AUTO_INCREMENT,
1067     BaseJobId INTEGER UNSIGNED NOT NULL REFERENCES Job,
1068     JobId INTEGER UNSIGNED NOT NULL REFERENCES Job,
1069 -   FileId INTEGER UNSIGNED NOT NULL REFERENCES File,
1070 +   FileId BIGINT UNSIGNED NOT NULL REFERENCES File,
1071     FileIndex INTEGER UNSIGNED,
1072     PRIMARY KEY(BaseId)
1073     );
1074 @@ -333,7 +362,7 @@
1075     );
1076  
1077  -- Initialize Version           
1078 -INSERT INTO Version (VersionId) VALUES (10);
1079 +INSERT INTO Version (VersionId) VALUES (11);
1080  
1081  END-OF-DATA
1082  then
1083 Index: src/bc_types.h
1084 ===================================================================
1085 --- src/bc_types.h      (revision 8456)
1086 +++ src/bc_types.h      (working copy)
1087 @@ -57,7 +57,7 @@
1088   * In principle, the only field that really should need to be
1089   *  64 bits is the FileId_t
1090   */
1091 -typedef uint32_t FileId_t;
1092 +typedef uint64_t FileId_t;
1093  typedef uint32_t DBId_t;              /* general DB id type */
1094  typedef uint32_t JobId_t;
1095