]> git.sur5r.net Git - bacula/bacula/commitdiff
- fixed the database/table scripts - db_user was missing - updated database schema...
authorStefan Reddig <Stefan.Reddig@ingres.com>
Fri, 29 Jan 2010 14:32:19 +0000 (15:32 +0100)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 2 Aug 2010 14:49:24 +0000 (16:49 +0200)
bacula/src/cats/cats.h
bacula/src/cats/create_bacula_database.in
bacula/src/cats/create_ingres_database.in
bacula/src/cats/dbi.c
bacula/src/cats/drop_ingres_database.in
bacula/src/cats/drop_ingres_tables.in
bacula/src/cats/make_ingres_tables.in
bacula/src/cats/sql.c
bacula/src/cats/sql_cmds.c
bacula/src/cats/sql_cmds.h
bacula/src/cats/sql_create.c

index 7712c5c6223e72a1982785cdee4822a54761011b..f9e84bdea60c0957119976021cbd0be56e62655e 100644 (file)
@@ -640,6 +640,7 @@ extern const char* my_ingres_batch_fill_path_query;
 
 #define SQL_ROW               INGRES_ROW
 #define SQL_FIELD             INGRES_FIELD
+#define SQL_MATCH             "~"
 
 #else
 
@@ -742,12 +743,12 @@ typedef int (*custom_function_insert_t)(void*, const char*, int);
 typedef char* (*custom_function_error_t)(void*);
 typedef int (*custom_function_end_t)(void*, const char*);
 
-extern const char* my_dbi_batch_lock_path_query[4];
-extern const char* my_dbi_batch_lock_filename_query[4];
-extern const char* my_dbi_batch_unlock_tables_query[4];
-extern const char* my_dbi_batch_fill_filename_query[4];
-extern const char* my_dbi_batch_fill_path_query[4];
-extern const char* my_dbi_match[4];
+extern const char* my_dbi_batch_lock_path_query[5];
+extern const char* my_dbi_batch_lock_filename_query[5];
+extern const char* my_dbi_batch_unlock_tables_query[5];
+extern const char* my_dbi_batch_fill_filename_query[5];
+extern const char* my_dbi_batch_fill_path_query[5];
+extern const char* my_dbi_match[5];
 
 /* "Generic" names for easier conversion */
 #define sql_store_result(x)   (x)->result
index 16008698ba5353a96f8d7ecc7bbadbd77f0dc0cc..d28508d12135a19636186925ff5a882bf7a12aea 100644 (file)
@@ -11,7 +11,7 @@ else
     echo "Creating MySQL database"
     @scriptdir@/create_mysql_database $*
   elif test xingres = x@DB_TYPE@ ; then
-    echo "Creating Ingres database"
+    echo "Creating Ingres database with $*"
     @scriptdir@/create_ingres_database $*
   else
     echo "Creating PostgreSQL database"
index a287352f8634fdb186623a05d51ddfbec6bac986..8694391bd54486f111466d601bd9629b3071ebdd 100755 (executable)
@@ -5,6 +5,7 @@
 
 bindir=@SQL_BINDIR@
 db_name=@db_name@
+db_user=@db_user@
 
 # use SQL_ASCII to be able to put any filename into
 #  the database even those created with unusual character sets
@@ -20,7 +21,7 @@ ENCODING="ENCODING 'SQL_ASCII'"
 #
 #ENCODING="ENCODING 'UTF8'"
      
-if createdb $* ${db_name}
+if createdb $* -u${db_user} ${db_name}
 then
    echo "Creation of ${db_name} database succeeded."
 else
index e532f4a5c40e9f68a317b7dfbfc410f08ddaccde..0b1472b48bc5d2d8bba2a22824911ad31216c13f 100644 (file)
@@ -1255,7 +1255,7 @@ int my_dbi_sql_insert_id(B_DB *mdb, char *table_name)
 }
 
 #ifdef HAVE_BATCH_FILE_INSERT
-const char *my_dbi_batch_lock_path_query[4] = {
+const char *my_dbi_batch_lock_path_query[5] = {
    /* Mysql */
    "LOCK TABLES Path write, batch write, Path as p write",
    /* Postgresql */
@@ -1263,9 +1263,12 @@ const char *my_dbi_batch_lock_path_query[4] = {
    /* SQLite */
    "BEGIN",
    /* SQLite3 */
-   "BEGIN"};
+   "BEGIN",
+   /* Ingres (TODO) */
+   "BEGIN"
+};
 
-const char *my_dbi_batch_lock_filename_query[4] = {
+const char *my_dbi_batch_lock_filename_query[5] = {
    /* Mysql */
    "LOCK TABLES Filename write, batch write, Filename as f write",
    /* Postgresql */
@@ -1273,9 +1276,12 @@ const char *my_dbi_batch_lock_filename_query[4] = {
    /* SQLite */
    "BEGIN",
    /* SQLite3 */
-   "BEGIN"};
+   "BEGIN",
+   /* Ingres (TODO) */
+   "BEGIN"
+};
 
-const char *my_dbi_batch_unlock_tables_query[4] = {
+const char *my_dbi_batch_unlock_tables_query[5] = {
    /* Mysql */
    "UNLOCK TABLES",
    /* Postgresql */
@@ -1283,9 +1289,12 @@ const char *my_dbi_batch_unlock_tables_query[4] = {
    /* SQLite */
    "COMMIT",
    /* SQLite3 */
-   "COMMIT"};
+   "COMMIT",
+   /* Ingres */
+   "COMMIT"
+};
 
-const char *my_dbi_batch_fill_path_query[4] = {
+const char *my_dbi_batch_fill_path_query[5] = {
    /* Mysql */
    "INSERT INTO Path (Path) "
    "SELECT a.Path FROM "
@@ -1303,9 +1312,15 @@ const char *my_dbi_batch_fill_path_query[4] = {
    /* SQLite3 */
    "INSERT INTO Path (Path)"
    " SELECT DISTINCT Path FROM batch"
-   " EXCEPT SELECT Path FROM Path"};
+   " EXCEPT SELECT Path FROM Path",
+   /* Ingres (TODO) */
+   "INSERT INTO Path (Path) "
+   "SELECT a.Path FROM "
+   "(SELECT DISTINCT Path FROM batch) AS a "
+   "WHERE NOT EXISTS (SELECT Path FROM Path WHERE Path = a.Path) "
+};
 
-const char *my_dbi_batch_fill_filename_query[4] = {
+const char *my_dbi_batch_fill_filename_query[5] = {
    /* Mysql */
    "INSERT INTO Filename (Name) "
    "SELECT a.Name FROM "
@@ -1324,7 +1339,14 @@ const char *my_dbi_batch_fill_filename_query[4] = {
    /* SQLite3 */
    "INSERT INTO Filename (Name)"
    " SELECT DISTINCT Name FROM batch "
-   " EXCEPT SELECT Name FROM Filename"};
+   " EXCEPT SELECT Name FROM Filename",
+   /* Ingres (TODO) */
+   "INSERT INTO Filename (Name) "
+   "SELECT a.Name FROM "
+   "(SELECT DISTINCT Name FROM batch) as a "
+   "WHERE NOT EXISTS "
+   "(SELECT Name FROM Filename WHERE Name = a.Name)"
+};
 
 #endif /* HAVE_BATCH_FILE_INSERT */
 
index 23c75fe287995334af042d1fbe5be4cd92d5aca7..c4d6e017f58f48fcafd3d29f98834c916bef0865 100755 (executable)
@@ -5,8 +5,9 @@
 
 bindir=@SQL_BINDIR@
 db_name=@db_name@
+db_user=@db_user@
 
-if destroydb ${db_name}
+if destroydb -u${db_user} ${db_name}
 then
    echo "Drop of ${db_name} database succeeded."
 else
index ad7f23caa88299d8f6f9980321d82182c9acab2f..5b20c501082894f30cadd7c89420a4485115ca8e 100755 (executable)
@@ -4,6 +4,7 @@
 
 bindir=@SQL_BINDIR@
 db_name=@db_name@
+db_user=@db_user@
 
 sql -u${db_user} ${db_name} $* <<END-OF-DATA
 drop table unsavedfiles;
index 04a6ec22e0eb558dfd0ed4ce36a07eea119f5ee0..8f480a6cbb2fc4454eafc8140cb28d352292077d 100755 (executable)
@@ -1,11 +1,15 @@
 #!/bin/sh
 #
-# shell script to create Bacula PostgreSQL tables
+# shell script to create Bacula Ingres tables
 #
 bindir=@SQL_BINDIR@
-db_name=${db_name:-@db_name@}
+PATH="$bindir:$PATH"
+#db_name=${db_name:-@db_name@}
+#db_user=${db_user:-@db_user@}
+db_name=@db_name@
+db_user=@db_user@
 
-sql $* ${db_name} <<END-OF-DATA
+sql $* -u${db_user} ${db_name} <<END-OF-DATA
 
 SET AUTOCOMMIT ON\g
 
@@ -17,7 +21,7 @@ CREATE TABLE filename
     primary key (filenameid)
 );
 
-ALTER TABLE filename ALTER COLUMN name SET STATISTICS 1000;
+-- ALTER TABLE filename ALTER COLUMN name SET STATISTICS 1000;
 CREATE UNIQUE INDEX filename_name_idx on filename (name);
 
 CREATE SEQUENCE path_seq;
@@ -28,7 +32,7 @@ CREATE TABLE path
     primary key (pathid)
 );
 
-ALTER TABLE path ALTER COLUMN path SET STATISTICS 1000;
+-- ALTER TABLE path ALTER COLUMN path SET STATISTICS 1000;
 CREATE UNIQUE INDEX path_name_idx on path (path);
 
 CREATE SEQUENCE file_seq;
@@ -45,8 +49,12 @@ CREATE TABLE file
     primary key (fileid)
 );
 
-CREATE INDEX file_jobid_idx on file (jobid);
-CREATE INDEX file_fp_idx on file (filenameid, pathid);
+CREATE INDEX file_jpfid_idx on file (jobid, pathid, filenameid);
+
+-- If you need performances, you can remove this index
+-- the database engine is able to use the composite index
+-- to find all records with a given JobId
+CREATE INDEX file_jobid_idx on file(jobid);
 
 --
 -- Add this if you have a good number of job
@@ -59,43 +67,77 @@ CREATE INDEX file_fp_idx on file (filenameid, pathid);
 --
 -- CREATE INDEX file_pathid_idx on file(pathid);
 -- CREATE INDEX file_filenameid_idx on file(filenameid);
--- CREATE INDEX file_jpfid_idx on file (jobid, pathid, filenameid);
 
-CREATE SEQUENCE job_seq;
-CREATE TABLE job
+CREATE SEQUENCE Job_seq;
+CREATE TABLE Job
 (
-    jobid            integer     not null default job_seq.nextval,
-    job              text        not null,
-    name             text        not null,
-    type             char(1)     not null,
-    level            char(1)     not null,
-    clientid         integer     default 0,
-    jobstatus        char(1)     not null,
-    schedtime        timestamp   without time zone,
-    starttime        timestamp   without time zone,
-    endtime          timestamp   without time zone,
-    realendtime       timestamp   without time zone,
-    jobtdate         bigint      default 0,
-    volsessionid      integer    default 0,
-    volsessiontime    integer    default 0,
-    jobfiles         integer     default 0,
-    jobbytes         bigint      default 0,
-    readbytes        bigint      default 0,
-    joberrors        integer     default 0,
-    jobmissingfiles   integer    default 0,
-    poolid           integer     default 0,
-    filesetid        integer     default 0,
-    purgedfiles       smallint   default 0,
-    hasbase          smallint    default 0,
-    priorjobid       integer     default 0,
+    JobId             integer     not null default Job_seq.nextval,
+    Job               text        not null,
+    Name              text        not null,
+    Type              char(1)     not null,
+    Level             char(1)     not null,
+    ClientId          integer     default 0,
+    JobStatus         char(1)     not null,
+    SchedTime         timestamp   without time zone,
+    StartTime         timestamp   without time zone,
+    EndTime           timestamp   without time zone,
+    RealEndTime       timestamp   without time zone,
+    JobTDate          bigint      default 0,
+    VolSessionId      integer     default 0,
+    volSessionTime    integer     default 0,
+    JobFiles          integer     default 0,
+    JobBytes          bigint      default 0,
+    ReadBytes         bigint      default 0,
+    JobErrors         integer     default 0,
+    JobMissingFiles   integer     default 0,
+    PoolId            integer     default 0,
+    FilesetId         integer     default 0,
+    PriorJobid        integer     default 0,
+    PurgedFiles       smallint    default 0,
+    HasBase           smallint    default 0,
+    HasCache          smallint    default 0,
+    Reviewed          smallint    default 0,
+    Comment           text,
     primary key (jobid)
 );
 
 CREATE INDEX job_name_idx on job (name);
 
 -- Create a table like Job for long term statistics 
-CREATE TABLE JobHisto (LIKE Job);
-CREATE INDEX jobhisto_idx ON jobhisto ( starttime );
+CREATE SEQUENCE JobHisto_seq;
+CREATE TABLE JobHisto
+(
+    JobId             integer     not null default JobHisto_seq.nextval,
+    Job               text        not null,
+    Name              text        not null,
+    Type              char(1)     not null,
+    Level             char(1)     not null,
+    ClientId          integer     default 0,
+    JobStatus         char(1)     not null,
+    SchedTime         timestamp   without time zone,
+    StartTime         timestamp   without time zone,
+    EndTime           timestamp   without time zone,
+    RealEndTime       timestamp   without time zone,
+    JobTDate          bigint      default 0,
+    VolSessionId      integer     default 0,
+    volSessionTime    integer     default 0,
+    JobFiles          integer     default 0,
+    JobBytes          bigint      default 0,
+    ReadBytes         bigint      default 0,
+    JobErrors         integer     default 0,
+    JobMissingFiles   integer     default 0,
+    PoolId            integer     default 0,
+    FilesetId         integer     default 0,
+    PriorJobid        integer     default 0,
+    PurgedFiles       smallint    default 0,
+    HasBase           smallint    default 0,
+    HasCache          smallint    default 0,
+    Reviewed          smallint    default 0,
+    Comment           text,
+    primary key (jobid)
+);
+
+CREATE INDEX jobhisto_idx on JobHisto ( StartTime );
 
 
 CREATE SEQUENCE Location_seq;
@@ -107,7 +149,6 @@ CREATE TABLE Location (
    primary key (LocationId)
 );
 
-
 CREATE SEQUENCE fileset_seq;
 CREATE TABLE fileset
 (
@@ -123,7 +164,7 @@ CREATE INDEX fileset_name_idx on fileset (fileset);
 CREATE SEQUENCE jobmedia_seq;
 CREATE TABLE jobmedia
 (
-    jobmediaid       integer     not null default jobmedia_seq.nestval,
+    jobmediaid       integer     not null default jobmedia_seq.nextval,
     jobid            integer     not null,
     mediaid          integer     not null,
     firstindex       integer     default 0,
@@ -133,7 +174,6 @@ CREATE TABLE jobmedia
     startblock       bigint      default 0,
     endblock         bigint      default 0,
     volindex         integer     default 0,
-    copy             integer     default 0,
     primary key (jobmediaid)
 );
 
@@ -192,26 +232,25 @@ CREATE TABLE media
 
 create unique index media_volumename_id on media (volumename);
 
 CREATE SEQUENCE MediaType_seq;
 CREATE TABLE MediaType (
-   MediaTypeId INTEGER DEFAULT MediaType_seq.NEXTVAL,
+   MediaTypeId INTEGER NOT NULL DEFAULT MediaType_seq.nextval,
    MediaType TEXT NOT NULL,
-   ReadOnly INTEGER DEFAULT 0,
+   ReadOnly INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY(MediaTypeId)
    );
 
 CREATE SEQUENCE Storage_seq;
 CREATE TABLE Storage (
-   StorageId INTEGER DEFAULT Storage_seq.NEXTVAL,
+   StorageId INTEGER NOT NULL DEFAULT Storage_seq.nextval,
    Name TEXT NOT NULL,
-   AutoChanger INTEGER DEFAULT 0,
+   AutoChanger INTEGER NOT NULL DEFAULT 0,
    PRIMARY KEY(StorageId)
    );
 
 CREATE SEQUENCE Device_seq;
 CREATE TABLE Device (
-   DeviceId INTEGER DEFAULT Device_seq.NEXTVAL,
+   DeviceId INTEGER NOT NULL DEFAULT Device_seq.nextval,
    Name TEXT NOT NULL,
    MediaTypeId INTEGER NOT NULL,
    StorageId INTEGER NOT NULL,
@@ -291,7 +330,7 @@ create index log_name_idx on Log (JobId);
 
 CREATE SEQUENCE LocationLog_seq;
 CREATE TABLE LocationLog (
-   LocLogId INTEGER NOT NULL DEFAULT LocationLog_seq.NEXTVAL,
+   LocLogId INTEGER NOT NULL DEFAULT LocationLog_seq.nextval,
    Date timestamp   without time zone,
    Comment TEXT NOT NULL,
    MediaId INTEGER DEFAULT 0,
@@ -317,7 +356,6 @@ CREATE TABLE counters
 );
 
 
-
 CREATE SEQUENCE basefiles_seq;
 CREATE TABLE basefiles
 (
@@ -329,6 +367,8 @@ CREATE TABLE basefiles
     primary key (baseid)
 );
 
+CREATE INDEX basefiles_jobid_idx ON BaseFiles ( JobId );
+
 CREATE TABLE unsavedfiles
 (
     UnsavedId        integer               not null,
@@ -346,6 +386,27 @@ CREATE TABLE CDImages
 );
 
 
+CREATE TABLE PathHierarchy
+(
+     PathId integer NOT NULL,
+     PPathId integer NOT NULL,
+     CONSTRAINT pathhierarchy_pkey PRIMARY KEY (PathId)
+);
+
+CREATE INDEX pathhierarchy_ppathid 
+          ON PathHierarchy (PPathId);
+
+CREATE TABLE PathVisibility
+(
+      PathId integer NOT NULL,
+      JobId integer NOT NULL,
+      Size int8 DEFAULT 0,
+      Files int4 DEFAULT 0,
+      CONSTRAINT pathvisibility_pkey PRIMARY KEY (JobId, PathId)
+);
+CREATE INDEX pathvisibility_jobid
+             ON PathVisibility (JobId);
+
 CREATE TABLE version
 (
     versionid        integer               not null
@@ -353,52 +414,55 @@ CREATE TABLE version
 
 CREATE TABLE Status (
    JobStatus CHAR(1) NOT NULL,
-   JobStatusLong TEXT, 
+   JobStatusLong TEXT,
+   Severity int,
    PRIMARY KEY (JobStatus)
    );
 
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('C', 'Created, not yet running');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('R', 'Running');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('B', 'Blocked');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('T', 'Completed successfully');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('E', 'Terminated with errors');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('e', 'Non-fatal error');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('f', 'Fatal error');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('D', 'Verify found differences');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('A', 'Canceled by user');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('F', 'Waiting for Client');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('S', 'Waiting for Storage daemon');
+\g
+
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('C', 'Created, not yet running',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('R', 'Running',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('B', 'Blocked',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('T', 'Completed successfully', 10);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('E', 'Terminated with errors', 25);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('e', 'Non-fatal error',20);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('f', 'Fatal error',100);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('D', 'Verify found differences',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('A', 'Canceled by user',90);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('F', 'Waiting for Client',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('S', 'Waiting for Storage daemon',15);
 INSERT INTO Status (JobStatus,JobStatusLong) VALUES
    ('m', 'Waiting for new media');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('M', 'Waiting for media mount');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('s', 'Waiting for storage resource');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('j', 'Waiting for job resource');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('c', 'Waiting for client resource');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('d', 'Waiting on maximum jobs');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('t', 'Waiting on start time');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('p', 'Waiting on higher priority jobs');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('a', 'SD despooling attributes');
-INSERT INTO Status (JobStatus,JobStatusLong) VALUES
-   ('i', 'Doing batch insert file records');
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('M', 'Waiting for media mount',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('s', 'Waiting for storage resource',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('j', 'Waiting for job resource',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('c', 'Waiting for client resource',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('d', 'Waiting on maximum jobs',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('t', 'Waiting on start time',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('p', 'Waiting on higher priority jobs',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('a', 'SD despooling attributes',15);
+INSERT INTO Status (JobStatus,JobStatusLong,Severity) VALUES
+   ('i', 'Doing batch insert file records',15);
 
 INSERT INTO Version (VersionId) VALUES (11);
 
index 4327955ce77bad370b02e210f2259c994e50d3f3..c54454b3c0ad6a6b7f67a1ddbf7bcd48901caca9 100644 (file)
@@ -77,6 +77,8 @@ B_DB *db_init(JCR *jcr, const char *db_driver, const char *db_name, const char *
       db_type = SQL_TYPE_SQLITE;
    } else if (strcasecmp(p, "sqlite3") == 0) {
       db_type = SQL_TYPE_SQLITE3;
+   } else if (strcasecmp(p, "ingres") == 0) {
+      db_type = SQL_TYPE_INGRES;
    } else {
       Jmsg1(jcr, M_ABORT, 0, _("Unknown database type: %s\n"), p);
    }
index 85ab546a1e68e038e4af202ce3846915a5221962..e3b4802bced7046b60be14e31db605e3b0efe444 100644 (file)
@@ -460,7 +460,7 @@ const char *uar_jobid_fileindex_from_table =
  * With PostgreSQL, we can use DISTINCT ON(), but with Mysql or Sqlite,
  * we need an extra join using JobTDate. 
  */
-const char *select_recent_version_with_basejob[4] = {
+const char *select_recent_version_with_basejob[5] = {
  /* MySQL */
 "SELECT FileId, Job.JobId AS JobId, FileIndex, File.PathId AS PathId, "
        "File.FilenameId AS FilenameId, LStat, MD5 "
@@ -548,11 +548,26 @@ const char *select_recent_version_with_basejob[4] = {
   "AND T1.JobTDate = Job.JobTDate "
   "AND Job.JobId = File.JobId "
   "AND T1.PathId = File.PathId "
-  "AND T1.FilenameId = File.FilenameId"
+  "AND T1.FilenameId = File.FilenameId",
+
+  /* Ingres (works?) */    /* The DISTINCT ON () permits to avoid extra join */
+ "SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
+         "FileIndex, PathId, FilenameId, LStat, MD5 "
+   "FROM "
+       "(SELECT FileId, JobId, PathId, FilenameId, FileIndex, LStat, MD5 "
+          "FROM File WHERE JobId IN (%s) "
+         "UNION ALL "
+        "SELECT File.FileId, File.JobId, PathId, FilenameId, "
+               "File.FileIndex, LStat, MD5 "
+          "FROM BaseFiles JOIN File USING (FileId) "
+         "WHERE BaseFiles.JobId IN (%s) "
+        ") AS T JOIN Job USING (JobId) "
+   "ORDER BY FilenameId, PathId, StartTime DESC "
+
 };
 
 /* Get the list of the last recent version with a given BaseJob jobid list */
-const char *select_recent_version[4] = {
+const char *select_recent_version[5] = {
    /* MySQL */
    "SELECT j1.JobId AS JobId, f1.FileId AS FileId, f1.FileIndex AS FileIndex, "
           "f1.PathId AS PathId, f1.FilenameId AS FilenameId, "
@@ -606,13 +621,21 @@ const char *select_recent_version[4] = {
       "AND j1.JobId IN (%s) "
       "AND t1.FilenameId = f1.FilenameId "
       "AND t1.PathId = f1.PathId "
-      "AND j1.JobId = f1.JobId"
+      "AND j1.JobId = f1.JobId",
+
+   /* Ingres */
+   "SELECT DISTINCT ON (FilenameId, PathId) StartTime, JobId, FileId, "
+          "FileIndex, PathId, FilenameId, LStat, MD5 "
+     "FROM File JOIN Job USING (JobId) "
+    "WHERE JobId IN (%s) "
+    "ORDER BY FilenameId, PathId, StartTime DESC "
+
 };
 
 /* ====== ua_prune.c */
 
 /* List of SQL commands to create temp table and indicies  */
-const char *create_deltabs[4] = {
+const char *create_deltabs[5] = {
    /* MySQL */
    "CREATE TEMPORARY TABLE DelCandidates ("
    "JobId INTEGER UNSIGNED NOT NULL, "
@@ -640,12 +663,20 @@ const char *create_deltabs[4] = {
    "PurgedFiles TINYINT, "
    "FileSetId INTEGER UNSIGNED, "
    "JobFiles INTEGER UNSIGNED, "
-   "JobStatus CHAR)"};
+   "JobStatus CHAR)",
+   /* Ingres */
+   "DECLARE GLOBAL TEMPORARY TABLE DelCandidates (" 
+   "JobId INTEGER NOT NULL, "
+   "PurgedFiles SMALLINT, "
+   "FileSetId INTEGER, "
+   "JobFiles INTEGER, "
+   "JobStatus char(1))"
+};
 
 /* ======= ua_restore.c */
 
 /* List Jobs where a particular file is saved */
-const char *uar_file[4] = {
+const char *uar_file[5] = {
    /* Mysql */
    "SELECT Job.JobId as JobId,"
    "CONCAT(Path.Path,Filename.Name) as Name, "
@@ -681,9 +712,19 @@ const char *uar_file[4] = {
    "AND Client.ClientId=Job.ClientId "
    "AND Job.JobId=File.JobId AND File.FileIndex > 0 "
    "AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
-   "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20"};
+   "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20",
+   /* Ingres */
+   "SELECT Job.JobId as JobId,"
+   "Path.Path||Filename.Name as Name, "
+   "StartTime,Type as JobType,JobStatus,JobFiles,JobBytes "
+   "FROM Client,Job,File,Filename,Path WHERE Client.Name='%s' "
+   "AND Client.ClientId=Job.ClientId "
+   "AND Job.JobId=File.JobId AND File.FileIndex > 0 "
+   "AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId "
+   "AND Filename.Name='%s' ORDER BY StartTime DESC LIMIT 20"
+   };
 
-const char *uar_create_temp[4] = {
+const char *uar_create_temp[5] = {
    /* Mysql */
    "CREATE TEMPORARY TABLE temp ("
    "JobId INTEGER UNSIGNED NOT NULL,"
@@ -735,9 +776,23 @@ const char *uar_create_temp[4] = {
    "VolumeName TEXT,"
    "StartFile INTEGER UNSIGNED,"
    "VolSessionId INTEGER UNSIGNED,"
-   "VolSessionTime INTEGER UNSIGNED)"};
+   "VolSessionTime INTEGER UNSIGNED)",
+   /* Ingres */
+   "DECLARE GLOBAL TEMPORARY TABLE temp ("
+   "JobId INTEGER NOT NULL,"
+   "JobTDate BIGINT,"
+   "ClientId INTEGER,"
+   "Level CHAR,"
+   "JobFiles INTEGER,"
+   "JobBytes BIGINT,"
+   "StartTime TEXT,"
+   "VolumeName TEXT,"
+   "StartFile INTEGER,"
+   "VolSessionId INTEGER,"
+   "VolSessionTime INTEGER)"
+   };
 
-const char *uar_create_temp1[4] = {
+const char *uar_create_temp1[5] = {
    /* Mysql */
    "CREATE TEMPORARY TABLE temp1 ("
    "JobId INTEGER UNSIGNED NOT NULL,"
@@ -753,7 +808,12 @@ const char *uar_create_temp1[4] = {
    /* SQLite3 */
    "CREATE TEMPORARY TABLE temp1 ("
    "JobId INTEGER UNSIGNED NOT NULL,"
-   "JobTDate BIGINT UNSIGNED)"};
+   "JobTDate BIGINT UNSIGNED)",
+   /* Ingres */
+   "DECLARE GLOBAL TEMPORARY TABLE temp1 ("
+   "JobId INTEGER NOT NULL,"
+   "JobTDate BIGINT)"
+   };
 
 /* Query to get all files in a directory -- no recursing   
  *  Note, for PostgreSQL since it respects the "Single Value
@@ -762,7 +822,7 @@ const char *uar_create_temp1[4] = {
  *  for each time it was backed up.
  */
 
-const char *uar_jobid_fileindex_from_dir[4] = {
+const char *uar_jobid_fileindex_from_dir[5] = {
    /* Mysql */
    "SELECT Job.JobId,File.FileIndex FROM Job,File,Path,Filename,Client "
    "WHERE Job.JobId IN (%s) "
@@ -801,9 +861,19 @@ const char *uar_jobid_fileindex_from_dir[4] = {
    "AND Job.ClientId=Client.ClientId "
    "AND Path.PathId=File.Pathid "
    "AND Filename.FilenameId=File.FilenameId "
-   "GROUP BY File.FileIndex "};
+   "GROUP BY File.FileIndex ",
+   /* Ingres */
+   "SELECT Job.JobId,File.FileIndex FROM Job,File,Path,Filename,Client "
+   "WHERE Job.JobId IN (%s) "
+   "AND Job.JobId=File.JobId "
+   "AND Path.Path='%s' "
+   "AND Client.Name='%s' "
+   "AND Job.ClientId=Client.ClientId "
+   "AND Path.PathId=File.Pathid "
+   "AND Filename.FilenameId=File.FilenameId"
+   };
 
-const char *sql_get_max_connections[4] = {
+const char *sql_get_max_connections[5] = {
    /* Mysql */
    "SHOW VARIABLES LIKE 'max_connections'",
    /* Postgresql */
@@ -811,11 +881,13 @@ const char *sql_get_max_connections[4] = {
    /* SQLite */
    "SELECT 0",
    /* SQLite3 */
+   "SELECT 0",
+   /* Ingres (TODO) */
    "SELECT 0"
 };
 
 /* Row number of the max_connections setting */
-const uint32_t sql_get_max_connections_index[4] = {
+const uint32_t sql_get_max_connections_index[5] = {
     /* Mysql */
    1,
    /* Postgresql */
@@ -823,5 +895,7 @@ const uint32_t sql_get_max_connections_index[4] = {
    /* SQLite */
    0,
    /* SQLite3 */
+   0,
+   /* Ingres (TODO) */
    0
 };
index 10cf606f2815564417a31e72fd8db6f8ac11f209..d17fdbd4539605d90a4cd1f31e747486b2d64764 100644 (file)
@@ -73,13 +73,13 @@ extern const char CATS_IMP_EXP *uar_jobids_fileindex;
 extern const char CATS_IMP_EXP *uar_jobid_fileindex_from_table;
 extern const char CATS_IMP_EXP *uar_sel_jobid_temp;
 
-extern const char CATS_IMP_EXP *select_recent_version[4];
-extern const char CATS_IMP_EXP *select_recent_version_with_basejob[4];
-extern const char CATS_IMP_EXP *create_deltabs[4];
+extern const char CATS_IMP_EXP *select_recent_version[5];
+extern const char CATS_IMP_EXP *select_recent_version_with_basejob[5];
+extern const char CATS_IMP_EXP *create_deltabs[5];
 
-extern const char CATS_IMP_EXP *uar_file[4];
-extern const char CATS_IMP_EXP *uar_create_temp[4];
-extern const char CATS_IMP_EXP *uar_create_temp1[4];
-extern const char CATS_IMP_EXP *uar_jobid_fileindex_from_dir[4];
-extern const char CATS_IMP_EXP *sql_get_max_connections[4];
-extern const uint32_t CATS_IMP_EXP sql_get_max_connections_index[4];
+extern const char CATS_IMP_EXP *uar_file[5];
+extern const char CATS_IMP_EXP *uar_create_temp[5];
+extern const char CATS_IMP_EXP *uar_create_temp1[5];
+extern const char CATS_IMP_EXP *uar_jobid_fileindex_from_dir[5];
+extern const char CATS_IMP_EXP *sql_get_max_connections[5];
+extern const uint32_t CATS_IMP_EXP sql_get_max_connections_index[5];
index c7c7e71070b1bca87417b63579c825874ed805d2..a635861e413cc2126bd9d9ce8430f6b6310ac983 100644 (file)
@@ -225,6 +225,7 @@ db_create_pool_record(JCR *jcr, B_DB *mdb, POOL_DBR *pr)
       stat = true;
    }
    db_unlock(mdb);
+   Dmsg0(500, "Create Pool: done\n");
    return stat;
 }
 
@@ -1097,7 +1098,7 @@ bool db_write_batch_file_records(JCR *jcr)
 
 
 /* List of SQL commands to create temp table and indicies  */
-const char *create_temp_basefile[4] = {
+const char *create_temp_basefile[5] = {
    /* MySQL */
    "CREATE TEMPORARY TABLE basefile%lld ("
 //   "CREATE TABLE basefile%lld ("
@@ -1118,7 +1119,12 @@ const char *create_temp_basefile[4] = {
    /* SQLite3 */
    "CREATE TEMPORARY TABLE basefile%lld (" 
    "Path TEXT,"
-   "Name TEXT)"
+   "Name TEXT)",
+
+   /* Ingres */
+   "DECLARE GLOBAL TEMPORARY TABLE basefile%lld (" 
+   "Path TEXT NOT NULL,"
+   "Name TEXT NOT NULL)"
 };
 
 /*