]> git.sur5r.net Git - bacula/bacula/commitdiff
SQL updates + Vol read/write times
authorKern Sibbald <kern@sibbald.com>
Sat, 20 Dec 2003 18:40:14 +0000 (18:40 +0000)
committerKern Sibbald <kern@sibbald.com>
Sat, 20 Dec 2003 18:40:14 +0000 (18:40 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@914 91ce42f0-d328-0410-95d8-f526ca767f89

20 files changed:
bacula/Makefile.in
bacula/autoconf/configure.in
bacula/configure
bacula/src/cats/cats.h
bacula/src/cats/make_mysql_tables.in
bacula/src/cats/make_postgresql_tables.in
bacula/src/cats/make_sqlite_tables.in
bacula/src/cats/mysql.c
bacula/src/cats/postgresql.c
bacula/src/cats/protos.h
bacula/src/cats/sql.c
bacula/src/cats/sql_create.c
bacula/src/cats/sql_update.c
bacula/src/cats/sqlite.c
bacula/src/cats/update_mysql_tables.in
bacula/src/cats/update_sqlite_tables.in
bacula/src/dird/catreq.c
bacula/src/stored/askdir.c
bacula/src/stored/dev.h
bacula/src/version.h

index 87e6eb80c245101d485022c706d6507b21bad726..b9e212a1822faf4541c602172b18cc63c090fc36 100755 (executable)
@@ -121,6 +121,7 @@ Makefiles:
        chmod 755 src/cats/make_test_tables src/cats/drop_test_tables
        chmod 755 src/cats/create_mysql_database
        chmod 755 src/cats/create_postgresql_database
        chmod 755 src/cats/make_test_tables src/cats/drop_test_tables
        chmod 755 src/cats/create_mysql_database
        chmod 755 src/cats/create_postgresql_database
+       chmod 755 src/cats/create_bacula_database
        chmod 755 src/cats/make_catalog_backup src/cats/delete_catalog_backup
        chmod 755 src/cats/update_mysql_tables
        chmod 755 src/cats/create_sqlite_database
        chmod 755 src/cats/make_catalog_backup src/cats/delete_catalog_backup
        chmod 755 src/cats/update_mysql_tables
        chmod 755 src/cats/create_sqlite_database
@@ -128,6 +129,7 @@ Makefiles:
        chomd 755 src/cats/update_bacula_tables
        chmod 755 src/cats/create_bdb_database
        chmod 755 src/cats/grant_mysql_privileges
        chomd 755 src/cats/update_bacula_tables
        chmod 755 src/cats/create_bdb_database
        chmod 755 src/cats/grant_mysql_privileges
+       chmod 755 src/cats/grant_sqlite_privileges
        chmod 755 src/cats/grant_postgresql_privileges
        chmod 755 src/cats/grant_bacula_privileges
 
        chmod 755 src/cats/grant_postgresql_privileges
        chmod 755 src/cats/grant_bacula_privileges
 
index f32184caeff4d27b68ae7c877b7987b1879b686a..7cf04e82431cc381efba7b3cd536dcaf1440866d 100644 (file)
@@ -1572,11 +1572,13 @@ AC_OUTPUT([autoconf/Make.common \
           src/cats/drop_sqlite_tables \
           src/cats/update_sqlite_tables \
           src/cats/create_sqlite_database \
           src/cats/drop_sqlite_tables \
           src/cats/update_sqlite_tables \
           src/cats/create_sqlite_database \
+          src/cats/grant_sqlite_privileges \
           src/cats/sqlite \
           src/cats/mysql \
           src/cats/create_bdb_database \
           src/cats/make_bdb_tables \
           src/cats/drop_bdb_tables \
           src/cats/sqlite \
           src/cats/mysql \
           src/cats/create_bdb_database \
           src/cats/make_bdb_tables \
           src/cats/drop_bdb_tables \
+          src/cats/create_bacula_database \
           src/cats/make_bacula_tables \
           src/cats/drop_bacula_tables \
           src/cats/update_bacula_tables \
           src/cats/make_bacula_tables \
           src/cats/drop_bacula_tables \
           src/cats/update_bacula_tables \
@@ -1604,6 +1606,7 @@ chmod 755 src/cats/update_sqlite_tables
 chmod 755 src/cats/make_bacula_tables src/cats/drop_bacula_tables 
 chmod 755 src/cats/update_mysql_tables
 chmod 755 src/cats/update_bacula_tables src/cats/update_mysql_tables
 chmod 755 src/cats/make_bacula_tables src/cats/drop_bacula_tables 
 chmod 755 src/cats/update_mysql_tables
 chmod 755 src/cats/update_bacula_tables src/cats/update_mysql_tables
+chmod 755 src/cats/create_bacula_database
 chmod 755 src/cats/grant_bacula_privileges
 chmod 755 src/cats/create_sqlite_database
 chmod 755 src/cats/sqlite
 chmod 755 src/cats/grant_bacula_privileges
 chmod 755 src/cats/create_sqlite_database
 chmod 755 src/cats/sqlite
index 238b6f728877dddf33f5f3e7becdd47d96a2d35c..c9370b4cc9fa36850f31632af6baa65137c537d1 100755 (executable)
@@ -18032,7 +18032,7 @@ if test "x${subsysdir}" = "x${sbindir}" ; then
    exit 1
 fi
 
    exit 1
 fi
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ac_config_files="$ac_config_files autoconf/Make.common Makefile rescue/Makefile rescue/linux/Makefile rescue/freebsd/Makefile rescue/solaris/Makefile scripts/startmysql scripts/stopmysql scripts/btraceback scripts/startit scripts/stopit scripts/bconsole scripts/gconsole scripts/bacula scripts/fd scripts/Makefile scripts/logrotate scripts/bacula.desktop.gnome1 scripts/bacula.desktop.gnome2 scripts/mtx-changer doc/Makefile src/Makefile src/host.h src/console/Makefile src/console/bconsole.conf src/gnome-console/Makefile src/gnome-console/gnome-console.conf src/gnome2-console/Makefile src/gnome2-console/gnome-console.conf src/tconsole/Makefile src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/filed/win32/Makefile src/cats/Makefile src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/make_postgresql_tables src/cats/drop_postgresql_tables src/cats/create_postgresql_database src/cats/grant_postgresql_privileges src/cats/make_mysql_tables src/cats/drop_mysql_tables src/cats/update_mysql_tables src/cats/create_mysql_database src/cats/grant_mysql_privileges src/cats/make_sqlite_tables src/cats/drop_sqlite_tables src/cats/update_sqlite_tables src/cats/create_sqlite_database src/cats/sqlite src/cats/mysql src/cats/create_bdb_database src/cats/make_bdb_tables src/cats/drop_bdb_tables src/cats/make_bacula_tables src/cats/drop_bacula_tables src/cats/update_bacula_tables src/cats/grant_bacula_privileges src/findlib/Makefile src/tools/Makefile $PFILES"
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ac_config_files="$ac_config_files autoconf/Make.common Makefile rescue/Makefile rescue/linux/Makefile rescue/freebsd/Makefile rescue/solaris/Makefile scripts/startmysql scripts/stopmysql scripts/btraceback scripts/startit scripts/stopit scripts/bconsole scripts/gconsole scripts/bacula scripts/fd scripts/Makefile scripts/logrotate scripts/bacula.desktop.gnome1 scripts/bacula.desktop.gnome2 scripts/mtx-changer doc/Makefile src/Makefile src/host.h src/console/Makefile src/console/bconsole.conf src/gnome-console/Makefile src/gnome-console/gnome-console.conf src/gnome2-console/Makefile src/gnome2-console/gnome-console.conf src/tconsole/Makefile src/dird/Makefile src/dird/bacula-dir.conf src/lib/Makefile src/stored/Makefile src/stored/bacula-sd.conf src/filed/Makefile src/filed/bacula-fd.conf src/filed/win32/Makefile src/cats/Makefile src/cats/make_catalog_backup src/cats/delete_catalog_backup src/cats/make_postgresql_tables src/cats/drop_postgresql_tables src/cats/create_postgresql_database src/cats/grant_postgresql_privileges src/cats/make_mysql_tables src/cats/drop_mysql_tables src/cats/update_mysql_tables src/cats/create_mysql_database src/cats/grant_mysql_privileges src/cats/make_sqlite_tables src/cats/drop_sqlite_tables src/cats/update_sqlite_tables src/cats/create_sqlite_database src/cats/grant_sqlite_privileges src/cats/sqlite src/cats/mysql src/cats/create_bdb_database src/cats/make_bdb_tables src/cats/drop_bdb_tables src/cats/create_bacula_database src/cats/make_bacula_tables src/cats/drop_bacula_tables src/cats/update_bacula_tables src/cats/grant_bacula_privileges src/findlib/Makefile src/tools/Makefile $PFILES"
           ac_config_commands="$ac_config_commands default"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
           ac_config_commands="$ac_config_commands default"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
   "src/cats/drop_sqlite_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_sqlite_tables" ;;
   "src/cats/update_sqlite_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/update_sqlite_tables" ;;
   "src/cats/create_sqlite_database" ) CONFIG_FILES="$CONFIG_FILES src/cats/create_sqlite_database" ;;
   "src/cats/drop_sqlite_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_sqlite_tables" ;;
   "src/cats/update_sqlite_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/update_sqlite_tables" ;;
   "src/cats/create_sqlite_database" ) CONFIG_FILES="$CONFIG_FILES src/cats/create_sqlite_database" ;;
+  "src/cats/grant_sqlite_privileges" ) CONFIG_FILES="$CONFIG_FILES src/cats/grant_sqlite_privileges" ;;
   "src/cats/sqlite" ) CONFIG_FILES="$CONFIG_FILES src/cats/sqlite" ;;
   "src/cats/mysql" ) CONFIG_FILES="$CONFIG_FILES src/cats/mysql" ;;
   "src/cats/create_bdb_database" ) CONFIG_FILES="$CONFIG_FILES src/cats/create_bdb_database" ;;
   "src/cats/make_bdb_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/make_bdb_tables" ;;
   "src/cats/drop_bdb_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_bdb_tables" ;;
   "src/cats/sqlite" ) CONFIG_FILES="$CONFIG_FILES src/cats/sqlite" ;;
   "src/cats/mysql" ) CONFIG_FILES="$CONFIG_FILES src/cats/mysql" ;;
   "src/cats/create_bdb_database" ) CONFIG_FILES="$CONFIG_FILES src/cats/create_bdb_database" ;;
   "src/cats/make_bdb_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/make_bdb_tables" ;;
   "src/cats/drop_bdb_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_bdb_tables" ;;
+  "src/cats/create_bacula_database" ) CONFIG_FILES="$CONFIG_FILES src/cats/create_bacula_database" ;;
   "src/cats/make_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/make_bacula_tables" ;;
   "src/cats/drop_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_bacula_tables" ;;
   "src/cats/update_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/update_bacula_tables" ;;
   "src/cats/make_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/make_bacula_tables" ;;
   "src/cats/drop_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/drop_bacula_tables" ;;
   "src/cats/update_bacula_tables" ) CONFIG_FILES="$CONFIG_FILES src/cats/update_bacula_tables" ;;
@@ -19410,6 +19412,7 @@ chmod 755 src/cats/update_sqlite_tables
 chmod 755 src/cats/make_bacula_tables src/cats/drop_bacula_tables
 chmod 755 src/cats/update_mysql_tables
 chmod 755 src/cats/update_bacula_tables src/cats/update_mysql_tables
 chmod 755 src/cats/make_bacula_tables src/cats/drop_bacula_tables
 chmod 755 src/cats/update_mysql_tables
 chmod 755 src/cats/update_bacula_tables src/cats/update_mysql_tables
+chmod 755 src/cats/create_bacula_database
 chmod 755 src/cats/grant_bacula_privileges
 chmod 755 src/cats/create_sqlite_database
 chmod 755 src/cats/sqlite
 chmod 755 src/cats/grant_bacula_privileges
 chmod 755 src/cats/create_sqlite_database
 chmod 755 src/cats/sqlite
index 7178c7621b73a4a1645a9bd464e1a6701e47344a..d25520787b03699dbf2097902332ac33e4d6b130 100644 (file)
@@ -62,8 +62,8 @@ struct sqlite {
 
 typedef struct s_sql_field {
    char *name;                        /* name of column */
 
 typedef struct s_sql_field {
    char *name;                        /* name of column */
-   uint32_t length;                   /* length */
-   uint32_t max_length;               /* max length */
+   int length;                        /* length */
+   int max_length;                    /* max length */
    uint32_t type;                     /* type */
    uint32_t flags;                    /* flags */
 } SQL_FIELD;
    uint32_t type;                     /* type */
    uint32_t flags;                    /* flags */
 } SQL_FIELD;
@@ -129,15 +129,18 @@ typedef struct s_db {
 #define sql_insert_id(x,y)    sqlite_last_insert_rowid((x)->db)
 #define sql_field_seek(x, y)  my_sqlite_field_seek((x), (y))
 #define sql_fetch_field(x)    my_sqlite_fetch_field(x)
 #define sql_insert_id(x,y)    sqlite_last_insert_rowid((x)->db)
 #define sql_field_seek(x, y)  my_sqlite_field_seek((x), (y))
 #define sql_fetch_field(x)    my_sqlite_fetch_field(x)
-#define sql_num_fields(x)     (unsigned)((x)->ncolumn)
+#define sql_num_fields(x)     ((x)->ncolumn)
 #define SQL_ROW               char**   
 
 
 
 /* In cats/sqlite.c */
 #define SQL_ROW               char**   
 
 
 
 /* In cats/sqlite.c */
-extern int     my_sqlite_query(B_DB *mdb, char *cmd);
-extern SQL_ROW my_sqlite_fetch_row(B_DB *mdb);
-extern void my_sqlite_free_table(B_DB *mdb);
+void       my_sqlite_free_table(B_DB *mdb);
+SQL_ROW    my_sqlite_fetch_row(B_DB *mdb);
+int        my_sqlite_query(B_DB *mdb, char *cmd);
+void       my_sqlite_field_seek(B_DB *mdb, int field);
+SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb);
+
 
 #else
 
 
 #else
 
@@ -199,7 +202,7 @@ typedef struct s_db {
 #define sql_insert_id(x,y)    mysql_insert_id((x)->db)
 #define sql_field_seek(x, y)  mysql_field_seek((x)->result, (y))
 #define sql_fetch_field(x)    mysql_fetch_field((x)->result)
 #define sql_insert_id(x,y)    mysql_insert_id((x)->db)
 #define sql_field_seek(x, y)  mysql_field_seek((x)->result, (y))
 #define sql_fetch_field(x)    mysql_fetch_field((x)->result)
-#define sql_num_fields(x)     mysql_num_fields((x)->result)
+#define sql_num_fields(x)     (int)mysql_num_fields((x)->result)
 #define SQL_ROW               MYSQL_ROW
 #define SQL_FIELD             MYSQL_FIELD
 
 #define SQL_ROW               MYSQL_ROW
 #define SQL_FIELD             MYSQL_FIELD
 
@@ -217,10 +220,10 @@ typedef struct s_db {
 
 typedef char **POSTGRESQL_ROW;
 typedef struct pg_field {
 
 typedef char **POSTGRESQL_ROW;
 typedef struct pg_field {
-       char         *name;
-       unsigned int  max_length;
-       unsigned int  type;        // 1 = number
-       unsigned int  flags;       // 1 == not null
+        char         *name;
+        int           max_length;
+        unsigned int  type;        // 1 = number
+        unsigned int  flags;       // 1 == not null
 } POSTGRESQL_FIELD;
 
 
 } POSTGRESQL_FIELD;
 
 
@@ -229,11 +232,11 @@ typedef struct pg_field {
  * used inside sql.c and associated database interface
  * subroutines.
  *
  * used inside sql.c and associated database interface
  * subroutines.
  *
- *                    P O S T G R E S Q L
+ *                     P O S T G R E S Q L
  */
 typedef struct s_db {
  */
 typedef struct s_db {
-   BQUEUE bq;                        /* queue control */
-   brwlock_t lock;                   /* transaction lock */
+   BQUEUE bq;                         /* queue control */
+   brwlock_t lock;                    /* transaction lock */
    PGconn *db;
    PGresult *result;
    int status;
    PGconn *db;
    PGresult *result;
    int status;
@@ -247,32 +250,31 @@ typedef struct s_db {
    char *db_name;
    char *db_user;
    char *db_password;
    char *db_name;
    char *db_user;
    char *db_password;
-   char *db_address;             /* host address */
-   char *db_socket;                  /* socket for local access */
-   int db_port;                      /* port of host address */
-   int have_insert_id;           /* do have insert_id() */
+   char *db_address;              /* host address */
+   char *db_socket;                   /* socket for local access */
+   int db_port;                       /* port of host address */
+   int have_insert_id;            /* do have insert_id() */
    int connected;
    int connected;
-   POOLMEM *errmsg;                  /* nicely edited error message */
-   POOLMEM *cmd;                     /* SQL command string */
+   POOLMEM *errmsg;                   /* nicely edited error message */
+   POOLMEM *cmd;                      /* SQL command string */
    POOLMEM *cached_path;
    POOLMEM *cached_path;
-   int cached_path_len;          /* length of cached path */
+   int cached_path_len;           /* length of cached path */
    uint32_t cached_path_id;
    uint32_t cached_path_id;
-   int changes;                      /* changes made to db */
-   POOLMEM *fname;                   /* Filename only */
-   POOLMEM *path;                    /* Path only */
-   POOLMEM *esc_name;            /* Escaped file/path name */
-   int fnl;                              /* file name length */
-   int pnl;                              /* path name length */
+   int changes;                       /* changes made to db */
+   POOLMEM *fname;                    /* Filename only */
+   POOLMEM *path;                     /* Path only */
+   POOLMEM *esc_name;             /* Escaped file/path name */
+   int fnl;                               /* file name length */
+   int pnl;                               /* path name length */
 } B_DB;
 
 } B_DB;
 
-POSTGRESQL_ROW     my_postgresql_fetch_row  (B_DB *mdb);
-POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb);
-
-void my_postgresql_data_seek  (B_DB *mdb, int row);
-void my_postgresql_field_seek (B_DB *mdb, int row);
-int  my_postgresql_query      (B_DB *mdb, char *query);
-void my_postgresql_free_result(B_DB *mdb);
-int  my_postgresql_currval    (B_DB *mdb, char *table_name);
+void               my_postgresql_free_result(B_DB *mdb);
+POSTGRESQL_ROW     my_postgresql_fetch_row(B_DB *mdb);
+int                my_postgresql_query      (B_DB *mdb, char *query);
+void               my_postgresql_data_seek  (B_DB *mdb, int row);
+int                my_postgresql_currval    (B_DB *mdb, char *table_name);
+void               my_postgresql_field_seek (B_DB *mdb, int row);
+POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb) 
 
 
 /* "Generic" names for easier conversion */
 
 
 /* "Generic" names for easier conversion */
@@ -288,7 +290,7 @@ int  my_postgresql_currval    (B_DB *mdb, char *table_name);
 #define sql_insert_id(x,y)    my_postgresql_currval((x), (y))
 #define sql_field_seek(x, y)  my_postgresql_field_seek((x), (y))
 #define sql_fetch_field(x)    my_postgresql_fetch_field(x)
 #define sql_insert_id(x,y)    my_postgresql_currval((x), (y))
 #define sql_field_seek(x, y)  my_postgresql_field_seek((x), (y))
 #define sql_fetch_field(x)    my_postgresql_fetch_field(x)
-#define sql_num_fields(x)     (unsigned) (x)->num_fields
+#define sql_num_fields(x)     ((x)->num_fields)
 #define SQL_ROW               POSTGRESQL_ROW
 #define SQL_FIELD             POSTGRESQL_FIELD
 
 #define SQL_ROW               POSTGRESQL_ROW
 #define SQL_FIELD             POSTGRESQL_FIELD
 
@@ -360,7 +362,9 @@ typedef struct s_db {
 
 extern uint32_t bacula_db_version;
 
 
 extern uint32_t bacula_db_version;
 
-/* ***FIXME*** FileId_t should be uint64_t */
+/* ***FIXME*** FileId_t should *really* be uint64_t
+ *  but at the current time, this breaks MySQL.
+ */
 typedef uint32_t FileId_t;
 typedef uint32_t DBId_t;              /* general DB id type */
 typedef uint32_t JobId_t;
 typedef uint32_t FileId_t;
 typedef uint32_t DBId_t;              /* general DB id type */
 typedef uint32_t JobId_t;
@@ -515,13 +519,14 @@ struct MEDIA_DBR {
    uint64_t VolBytes;                 /* Number of bytes written */
    uint64_t MaxVolBytes;              /* Max bytes to write to Volume */
    uint64_t VolCapacityBytes;         /* capacity estimate */
    uint64_t VolBytes;                 /* Number of bytes written */
    uint64_t MaxVolBytes;              /* Max bytes to write to Volume */
    uint64_t VolCapacityBytes;         /* capacity estimate */
+   uint64_t VolReadTime;              /* time spent reading volume */
+   uint64_t VolWriteTime;             /* time spent writing volume */
    utime_t  VolRetention;             /* Volume retention in seconds */
    utime_t  VolUseDuration;           /* time in secs volume can be used */
    uint32_t MaxVolJobs;               /* Max Jobs on Volume */
    uint32_t MaxVolFiles;              /* Max files on Volume */
    int32_t  Recycle;                  /* recycle yes/no */
    int32_t  Slot;                     /* slot in changer */
    utime_t  VolRetention;             /* Volume retention in seconds */
    utime_t  VolUseDuration;           /* time in secs volume can be used */
    uint32_t MaxVolJobs;               /* Max Jobs on Volume */
    uint32_t MaxVolFiles;              /* Max files on Volume */
    int32_t  Recycle;                  /* recycle yes/no */
    int32_t  Slot;                     /* slot in changer */
-   int32_t  Drive;                    /* drive in changer */
    int32_t  InChanger;                /* Volume currently in changer */
    char VolStatus[20];                /* Volume status */
    /* Extra stuff not in DB */
    int32_t  InChanger;                /* Volume currently in changer */
    char VolStatus[20];                /* Volume status */
    /* Extra stuff not in DB */
@@ -569,7 +574,19 @@ struct FILESET_DBR {
 };
 
 
 };
 
 
+
 #include "protos.h"
 #include "jcr.h"
 #include "protos.h"
 #include "jcr.h"
+
+/*
+ * Some functions exported by sql.c for use withing the 
+ *   cats directory.
+ */
+void list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type);
+void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx);
+int get_sql_record_max(JCR *jcr, B_DB *mdb);
+int check_tables_version(JCR *jcr, B_DB *mdb);
+void _db_unlock(char *file, int line, B_DB *mdb);
+void _db_lock(char *file, int line, B_DB *mdb);
  
 #endif /* __SQL_H_ */
  
 #endif /* __SQL_H_ */
index 6db5652082bbef79beb0e76cdf461e7d00095a03..509dc097e324bb353e8165f23c331bb1b78b6f68 100644 (file)
@@ -114,9 +114,10 @@ CREATE TABLE Media (
    MaxVolJobs INTEGER UNSIGNED NOT NULL DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED NOT NULL DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED NOT NULL DEFAULT 0,
    MaxVolJobs INTEGER UNSIGNED NOT NULL DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED NOT NULL DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED NOT NULL DEFAULT 0,
-   Drive INTEGER NOT NULL DEFAULT 0,
    InChanger TINYINT NOT NULL DEFAULT 0,
    MediaAddressing TINYINT NOT NULL DEFAULT 0,
    InChanger TINYINT NOT NULL DEFAULT 0,
    MediaAddressing TINYINT NOT NULL DEFAULT 0,
+   VolReadTime BIGINT UNSIGNED NOT NULL DEAULT 0,
+   VolWriteTime BIGINT UNSIGNED NOT NULL DEFAULT 0,
    PRIMARY KEY(MediaId),
    INDEX (PoolId)
    );
    PRIMARY KEY(MediaId),
    INDEX (PoolId)
    );
index 337a74ff4e2286f046874811e98a51f4eaa91c9b..12faa4a8cbad6b22b84f5e11e18c53e2bf5e3e0c 100644 (file)
@@ -9,25 +9,25 @@ if $bindir/psql $* -f - <<END-OF-DATA
 
 create table version
 (
 
 create table version
 (
-    versionid         integer               not null
+    versionid        integer               not null
 );
 
 INSERT INTO Version (VersionId) VALUES (7);
 
 create table counters
 (
 );
 
 INSERT INTO Version (VersionId) VALUES (7);
 
 create table counters
 (
-    counter           text                  not null,
-    minvalue          integer                       ,
-    maxvalue          integer                       ,
-    currentvalue      integer                       ,
-    wrapcounter       text                  not null,
+    counter          text                  not null,
+    minvalue         integer                       ,
+    maxvalue         integer                       ,
+    currentvalue      integer                      ,
+    wrapcounter       text                 not null,
     primary key (counter)
 );
 
 create table filename
 (
     primary key (counter)
 );
 
 create table filename
 (
-    filenameid        serial                not null,
-    name              text                  not null,
+    filenameid       serial                not null,
+    name             text                  not null,
     primary key (filenameid)
 );
 
     primary key (filenameid)
 );
 
@@ -35,8 +35,8 @@ create index filename_name_idx on filename (name);
 
 create table path
 (
 
 create table path
 (
-    pathid            serial                not null,
-    path              text                  not null,
+    pathid           serial                not null,
+    path             text                  not null,
     primary key (pathid)
 );
 
     primary key (pathid)
 );
 
@@ -44,10 +44,10 @@ create index path_name_idx on path (path);
 
 create table fileset
 (
 
 create table fileset
 (
-    filesetid         serial                not null,
-    fileset           text                  not null,
-    md5               text                  not null,
-    createtime        timestamp without time zone not null,
+    filesetid        serial                not null,
+    fileset          text                  not null,
+    md5              text                  not null,
+    createtime       timestamp without time zone not null,
     primary key (filesetid)
 );
 
     primary key (filesetid)
 );
 
@@ -55,34 +55,34 @@ create index fileset_name_idx on fileset (fileset);
 
 create table pool
 (
 
 create table pool
 (
-    poolid            serial                not null,
-    name              text                  not null,
-    numvols           integer               not null
-        default 0,
-    maxvols           integer               not null
-        default 0,
-    useonce           smallint              not null,
-    usecatalog        smallint              not null,
-    acceptanyvolume   smallint                      
-        default 0,
-    volretention      bigint                not null,
-    voluseduration    bigint                not null,
-    maxvoljobs        integer               not null
-        default 0,
-    maxvolfiles       integer               not null
-        default 0,
-    maxvolbytes       bigint                not null,
-    autoprune         smallint              not null
-        default 0,
-    recycle           smallint                      
-        default 0,
-    pooltype          text                          
-        check (pooltype is null or (pooltype in ('Backup','Copy','Cloned','Archive','Migration'))),
-    labelformat       text                  not null,
-    enabled           smallint              not null
-        default 1,
-    scratchpoolid     integer                       ,
-    recyclepoolid     integer                       ,
+    poolid           serial                not null,
+    name             text                  not null,
+    numvols          integer               not null
+       default 0,
+    maxvols          integer               not null
+       default 0,
+    useonce          smallint              not null,
+    usecatalog       smallint              not null,
+    acceptanyvolume   smallint                     
+       default 0,
+    volretention      bigint               not null,
+    voluseduration    bigint               not null,
+    maxvoljobs       integer               not null
+       default 0,
+    maxvolfiles       integer              not null
+       default 0,
+    maxvolbytes       bigint               not null,
+    autoprune        smallint              not null
+       default 0,
+    recycle          smallint                      
+       default 0,
+    pooltype         text                          
+       check (pooltype is null or (pooltype in ('Backup','Copy','Cloned','Archive','Migration'))),
+    labelformat       text                 not null,
+    enabled          smallint              not null
+       default 1,
+    scratchpoolid     integer                      ,
+    recyclepoolid     integer                      ,
     primary key (poolid)
 );
 
     primary key (poolid)
 );
 
@@ -90,13 +90,13 @@ create index pool_name_idx on pool (name);
 
 create table client
 (
 
 create table client
 (
-    clientid          serial                not null,
-    name              text                  not null,
-    uname             text                  not null,
-    autoprune         smallint                      
-        default 0,
-    fileretention     bigint                not null,
-    jobretention      bigint                not null,
+    clientid         serial                not null,
+    name             text                  not null,
+    uname            text                  not null,
+    autoprune        smallint                      
+       default 0,
+    fileretention     bigint               not null,
+    jobretention      bigint               not null,
     primary key (clientid)
 );
 
     primary key (clientid)
 );
 
@@ -104,54 +104,56 @@ create unique index client_name_idx on client (name);
 
 create table media
 (
 
 create table media
 (
-    mediaid           serial                not null,
-    volumename        text                  not null,
-    slot              integer               not null
-        default 0,
-    poolid            integer               not null,
-    mediatype         text                  not null,
+    mediaid          serial                not null,
+    volumename       text                  not null,
+    slot             integer               not null
+       default 0,
+    poolid           integer               not null,
+    mediatype        text                  not null,
     firstwritten      timestamp without time zone not null
     firstwritten      timestamp without time zone not null
-        default current_timestamp,
+       default current_timestamp,
     lastwritten       timestamp without time zone not null
     lastwritten       timestamp without time zone not null
-        default current_timestamp,
-    labeldate         timestamp without time zone not null
+       default current_timestamp,
+    labeldate        timestamp without time zone not null
        default current_timestamp,
        default current_timestamp,
-    voljobs           integer               not null
-        default 0,
-    volfiles          integer               not null
-        default 0,
-    volblocks         integer               not null
-        default 0,
-    volmounts         integer               not null
-        default 0,
-    volbytes          bigint                not null
-        default 0,
-    volerrors         integer               not null
-        default 0,
-    volwrites         integer               not null
-        default 0,
-    volcapacitybytes  bigint                not null,
-    volstatus         text                  not null
-        check (volstatus in ('Full','Archive','Append','Recycle','Purged','Read-Only','Disabled','Error','Busy',
-            'Used','Cleaning')),
-    recycle           smallint              not null
-        default 0,
-    volretention      bigint                not null
-        default 0,
-    voluseduration    bigint                not null
-        default 0,
-    maxvoljobs        integer               not null
-        default 0,
-    maxvolfiles       integer               not null
-        default 0,
-    maxvolbytes       bigint                not null
-        default 0,
-    drive             integer               not null
-        default 0,
-    inchanger         smallint              not null
-        default 0,
-    mediaaddressing   smallint              not null
-        default 0,
+    voljobs          integer               not null
+       default 0,
+    volfiles         integer               not null
+       default 0,
+    volblocks        integer               not null
+       default 0,
+    volmounts        integer               not null
+       default 0,
+    volbytes         bigint                not null
+       default 0,
+    volerrors        integer               not null
+       default 0,
+    volwrites        integer               not null
+       default 0,
+    volcapacitybytes  bigint               not null,
+    volstatus        text                  not null
+       check (volstatus in ('Full','Archive','Append','Recycle','Purged','Read-Only','Disabled','Error','Busy',
+           'Used','Cleaning')),
+    recycle          smallint              not null
+       default 0,
+    volretention      bigint               not null
+       default 0,
+    voluseduration    bigint               not null
+       default 0,
+    maxvoljobs       integer               not null
+       default 0,
+    maxvolfiles       integer              not null
+       default 0,
+    maxvolbytes       bigint               not null
+       default 0,
+    inchanger        smallint              not null
+       default 0,
+    mediaaddressing   smallint             not null
+       default 0,
+    volreadtime       bigint               not null
+       default 0,
+    volwritetime      bigint               not null
+       default 0,
     primary key (mediaid)
 );
 
     primary key (mediaid)
 );
 
@@ -159,35 +161,35 @@ create unique index media_volumename_id on media (volumename);
 
 create table job
 (
 
 create table job
 (
-    jobid             serial                not null,
-    job               text                  not null,
-    name              text                  not null,
-    type              char(1)               not null,
-    level             char(1)               not null,
-    clientid          integer                       ,
-    jobstatus         char(1)               not null,
-    schedtime         timestamp without time zone not null,
-    starttime         timestamp without time zone         ,
-    endtime           timestamp without time zone         ,
-    jobtdate          bigint                not null,
-    volsessionid      integer               not null
-        default 0,
-    volsessiontime    integer               not null
-        default 0,
-    jobfiles          integer               not null
+    jobid            serial                not null,
+    job              text                  not null,
+    name             text                  not null,
+    type             char(1)               not null,
+    level            char(1)               not null,
+    clientid         integer                       ,
+    jobstatus        char(1)               not null,
+    schedtime        timestamp without time zone not null,
+    starttime        timestamp without time zone         ,
+    endtime          timestamp without time zone         ,
+    jobtdate         bigint                not null,
+    volsessionid      integer              not null
+       default 0,
+    volsessiontime    integer              not null
+       default 0,
+    jobfiles         integer               not null
        default 0,
        default 0,
-    jobbytes          bigint                not null
-        default 0,
-    joberrors         integer               not null
-        default 0,
-    jobmissingfiles   integer               not null
-        default 0,
-    poolid            integer                       ,
-    filesetid         integer                       ,
-    purgedfiles       smallint              not null
-        default 0,
-    hasbase           smallint              not null
-        default 0,
+    jobbytes         bigint                not null
+       default 0,
+    joberrors        integer               not null
+       default 0,
+    jobmissingfiles   integer              not null
+       default 0,
+    poolid           integer                       ,
+    filesetid        integer                       ,
+    purgedfiles       smallint             not null
+       default 0,
+    hasbase          smallint              not null
+       default 0,
     primary key (jobid)
 );
 
     primary key (jobid)
 );
 
@@ -195,38 +197,38 @@ create index job_name_idx on job (name);
 
 create table file
 (
 
 create table file
 (
-    fileid            serial                not null,
-    fileindex         integer               not null
-        default 0,
-    jobid             integer               not null,
-    pathid            integer               not null,
-    filenameid        bigint                not null,
-    markid            integer               not null
-        default 0,
-    lstat             text                  not null,
-    md5               text                  not null,
+    fileid           serial                not null,
+    fileindex        integer               not null
+       default 0,
+    jobid            integer               not null,
+    pathid           integer               not null,
+    filenameid       bigint                not null,
+    markid           integer               not null
+       default 0,
+    lstat            text                  not null,
+    md5              text                  not null,
     primary key (fileid)
 );
 
 create table jobmedia
 (
     primary key (fileid)
 );
 
 create table jobmedia
 (
-    jobmediaid        serial                not null,
-    jobid             integer               not null,
-    mediaid           integer               not null,
-    firstindex        integer               not null
-        default 0,
-    lastindex         integer               not null
-        default 0,
-    startfile         integer               not null
-        default 0,
-    endfile           integer               not null
-        default 0,
-    startblock        integer               not null
-        default 0,
-    endblock          integer               not null
-        default 0,
-    volindex          integer               not null
-        default 0,
+    jobmediaid       serial                not null,
+    jobid            integer               not null,
+    mediaid          integer               not null,
+    firstindex       integer               not null
+       default 0,
+    lastindex        integer               not null
+       default 0,
+    startfile        integer               not null
+       default 0,
+    endfile          integer               not null
+       default 0,
+    startblock       integer               not null
+       default 0,
+    endblock         integer               not null
+       default 0,
+    volindex         integer               not null
+       default 0,
     primary key (jobmediaid)
 );
 
     primary key (jobmediaid)
 );
 
@@ -234,20 +236,20 @@ create index job_media_job_id_media_id_idx on jobmedia (jobid, mediaid);
 
 create table basefiles
 (
 
 create table basefiles
 (
-    baseid            serial                not null,
-    jobid             integer               not null,
-    fileid            integer               not null,
-    fileindex         integer                       ,
-    basejobid         integer                       ,
+    baseid           serial                not null,
+    jobid            integer               not null,
+    fileid           integer               not null,
+    fileindex        integer                       ,
+    basejobid        integer                       ,
     primary key (baseid)
 );
 
 create table unsavedfiles
 (
     primary key (baseid)
 );
 
 create table unsavedfiles
 (
-    UnsavedId         integer               not null,
-    jobid             integer               not null,
-    pathid            integer               not null,
-    filenameid        integer               not null,
+    UnsavedId        integer               not null,
+    jobid            integer               not null,
+    pathid           integer               not null,
+    filenameid       integer               not null,
     primary key (UnsavedId)
 );
 
     primary key (UnsavedId)
 );
 
index 8650a7e442efbfc3422181292b48246975ed6001..93279ef901d72e94d1e9696a4da09a941512c61d 100644 (file)
@@ -115,9 +115,10 @@ CREATE TABLE Media (
    MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
-   Drive INTEGER DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    MediaAddressing TINYINT DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    MediaAddressing TINYINT DEFAULT 0,
+   VolReadTime BIGINT UNSIGNED DEFAULT 0,
+   VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    PRIMARY KEY(MediaId)
    );
 
    PRIMARY KEY(MediaId)
    );
 
index 719aab5cd8db50da25287b4ff8fc3d15c673d2ac..f38aac6705a8452d8e460bafb91ad273f95dede2 100644 (file)
@@ -339,118 +339,4 @@ int db_sql_query(B_DB *mdb, char *query, DB_RESULT_HANDLER *result_handler, void
 
 }
 
 
 }
 
-
-static void
-list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx)
-{
-   SQL_FIELD  *field;
-   unsigned int i, j;
-
-   sql_field_seek(mdb, 0);
-   send(ctx, "+");
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      for (j = 0; j < field->max_length + 2; j++)
-              send(ctx, "-");
-      send(ctx, "+");
-   }
-   send(ctx, "\n");
-}
-
-/*
- * If full_list is set, we list vertically, otherwise, we 
- * list on one line horizontally.      
- */
-void
-list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type)
-{
-   SQL_FIELD *field;
-   SQL_ROW row;
-   unsigned int i, col_len, max_len = 0;
-   char buf[2000], ewc[30];
-
-   if (mdb->result == NULL) {
-      send(ctx, _("No results to list.\n"));
-      return;
-   }
-   /* determine column display widths */
-   sql_field_seek(mdb, 0);
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      col_len = strlen(field->name);
-      if (type == VERT_LIST) {
-        if (col_len > max_len) {
-           max_len = col_len;
-        }
-      } else {
-        if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */
-           field->max_length += (field->max_length - 1) / 3;
-        }
-        if (col_len < field->max_length) {
-           col_len = field->max_length;
-        }
-        if (col_len < 4 && !IS_NOT_NULL(field->flags)) {
-            col_len = 4;                 /* 4 = length of the word "NULL" */
-        }
-        field->max_length = col_len;    /* reset column info */
-      }
-   }
-
-   if (type == VERT_LIST) {
-      goto vertical_list;
-   }
-
-   list_dashes(mdb, send, ctx);
-   send(ctx, "|");
-   sql_field_seek(mdb, 0);
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name);
-      send(ctx, buf);
-   }
-   send(ctx, "\n");
-   list_dashes(mdb, send, ctx);
-
-   while ((row = sql_fetch_row(mdb)) != NULL) {
-      sql_field_seek(mdb, 0);
-      send(ctx, "|");
-      for (i = 0; i < sql_num_fields(mdb); i++) {
-        field = sql_fetch_field(mdb);
-        if (row[i] == NULL) {
-            bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL");
-        } else if (IS_NUM(field->type)) {
-            bsnprintf(buf, sizeof(buf), " %*s |", (int)field->max_length,       
-              add_commas(row[i], ewc));
-        } else {
-            bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, row[i]);
-        }
-        send(ctx, buf);
-      }
-      send(ctx, "\n");
-   }
-   list_dashes(mdb, send, ctx);
-   return;
-
-vertical_list:
-   
-   while ((row = sql_fetch_row(mdb)) != NULL) {
-      sql_field_seek(mdb, 0);
-      for (i = 0; i < sql_num_fields(mdb); i++) {
-        field = sql_fetch_field(mdb);
-        if (row[i] == NULL) {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
-        } else if (IS_NUM(field->type)) {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, 
-              add_commas(row[i], ewc));
-        } else {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]);
-        }
-        send(ctx, buf);
-      }
-      send(ctx, "\n");
-   }
-   return;
-}
-
-
 #endif /* HAVE_MYSQL */
 #endif /* HAVE_MYSQL */
index 375be429fc1c52fe7f2030c5c20b49f1c44c22e3..7d08fc5ddd8ee7fcacf9f69c4dd7bc75a828a4db 100644 (file)
@@ -39,7 +39,7 @@
 
 #ifdef HAVE_POSTGRESQL
 
 
 #ifdef HAVE_POSTGRESQL
 
-#include "postgres_ext.h"      /* needed for NAMEDATALEN */
+#include "postgres_ext.h"       /* needed for NAMEDATALEN */
 
 /* -----------------------------------------------------------------------
  *
 
 /* -----------------------------------------------------------------------
  *
@@ -93,14 +93,14 @@ db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password,
    }
    mdb->db_port        = db_port;
    mdb->have_insert_id = TRUE;
    }
    mdb->db_port        = db_port;
    mdb->have_insert_id = TRUE;
-   mdb->errmsg         = get_pool_memory(PM_EMSG); /* get error message buffer */
+   mdb->errmsg        = get_pool_memory(PM_EMSG); /* get error message buffer */
    *mdb->errmsg        = 0;
    *mdb->errmsg        = 0;
-   mdb->cmd            = get_pool_memory(PM_EMSG);    /* get command buffer */
+   mdb->cmd           = get_pool_memory(PM_EMSG);    /* get command buffer */
    mdb->cached_path    = get_pool_memory(PM_FNAME);
    mdb->cached_path_id = 0;
    mdb->ref_count      = 1;
    mdb->cached_path    = get_pool_memory(PM_FNAME);
    mdb->cached_path_id = 0;
    mdb->ref_count      = 1;
-   mdb->fname          = get_pool_memory(PM_FNAME);
-   mdb->path           = get_pool_memory(PM_FNAME);
+   mdb->fname         = get_pool_memory(PM_FNAME);
+   mdb->path          = get_pool_memory(PM_FNAME);
    mdb->esc_name       = get_pool_memory(PM_FNAME);
    qinsert(&db_list, &mdb->bq);           /* put db in list */
    V(mutex);
    mdb->esc_name       = get_pool_memory(PM_FNAME);
    qinsert(&db_list, &mdb->bq);           /* put db in list */
    V(mutex);
@@ -134,8 +134,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
    mdb->db = PQsetdbLogin(
        mdb->db_address,              /* default = localhost */
        (char *) mdb->db_port,    /* default port */
    mdb->db = PQsetdbLogin(
        mdb->db_address,              /* default = localhost */
        (char *) mdb->db_port,    /* default port */
-       NULL,                     /* pg options */
-       NULL,                     /* tty, ignored */
+       NULL,                     /* pg options */
+       NULL,                     /* tty, ignored */
        mdb->db_name,                 /* database name */
        mdb->db_user,                 /* login name */
        mdb->db_password);            /* password */
        mdb->db_name,                 /* database name */
        mdb->db_user,                 /* login name */
        mdb->db_password);            /* password */
@@ -145,8 +145,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
    mdb->db = PQsetdbLogin(
        mdb->db_address,              /* default = localhost */
        (char *) mdb->db_port,    /* default port */
    mdb->db = PQsetdbLogin(
        mdb->db_address,              /* default = localhost */
        (char *) mdb->db_port,    /* default port */
-       NULL,                     /* pg options */
-       NULL,                     /* tty, ignored */
+       NULL,                     /* pg options */
+       NULL,                     /* tty, ignored */
        mdb->db_name,                 /* database name */
        mdb->db_user,                 /* login name */
        mdb->db_password);            /* password */
        mdb->db_name,                 /* database name */
        mdb->db_user,                 /* login name */
        mdb->db_password);            /* password */
@@ -160,7 +160,7 @@ db_open_database(JCR *jcr, B_DB *mdb)
       Mmsg2(&mdb->errmsg, _("Unable to connect to PostgreSQL server.\n"
             "Database=%s User=%s\n"
             "It is probably not running or your password is incorrect.\n"),
       Mmsg2(&mdb->errmsg, _("Unable to connect to PostgreSQL server.\n"
             "Database=%s User=%s\n"
             "It is probably not running or your password is incorrect.\n"),
-            mdb->db_name, mdb->db_user);
+           mdb->db_name, mdb->db_user);
       V(mutex);
       return 0;
    }
       V(mutex);
       return 0;
    }
@@ -184,7 +184,7 @@ db_close_database(JCR *jcr, B_DB *mdb)
    if (mdb->ref_count == 0) {
       qdchain(&mdb->bq);
       if (mdb->connected && mdb->db) {
    if (mdb->ref_count == 0) {
       qdchain(&mdb->bq);
       if (mdb->connected && mdb->db) {
-         sql_close(mdb);
+        sql_close(mdb);
       }
       rwl_destroy(&mdb->lock);      
       free_pool_memory(mdb->errmsg);
       }
       rwl_destroy(&mdb->lock);      
       free_pool_memory(mdb->errmsg);
@@ -194,19 +194,19 @@ db_close_database(JCR *jcr, B_DB *mdb)
       free_pool_memory(mdb->path);
       free_pool_memory(mdb->esc_name);
       if (mdb->db_name) {
       free_pool_memory(mdb->path);
       free_pool_memory(mdb->esc_name);
       if (mdb->db_name) {
-         free(mdb->db_name);
+        free(mdb->db_name);
       }
       if (mdb->db_user) {
       }
       if (mdb->db_user) {
-         free(mdb->db_user);
+        free(mdb->db_user);
       }
       if (mdb->db_password) {
       }
       if (mdb->db_password) {
-         free(mdb->db_password);
+        free(mdb->db_password);
       }
       if (mdb->db_address) {
       }
       if (mdb->db_address) {
-         free(mdb->db_address);
+        free(mdb->db_address);
       }
       if (mdb->db_socket) {
       }
       if (mdb->db_socket) {
-         free(mdb->db_socket);
+        free(mdb->db_socket);
       }
       free(mdb);
    }
       }
       free(mdb);
    }
@@ -262,17 +262,17 @@ int db_sql_query(B_DB *mdb, char *query, DB_RESULT_HANDLER *result_handler, void
    if (result_handler != NULL) {
       Dmsg0(50, "db_sql_query invoking handler\n");
       if ((mdb->result = sql_store_result(mdb)) != NULL) {
    if (result_handler != NULL) {
       Dmsg0(50, "db_sql_query invoking handler\n");
       if ((mdb->result = sql_store_result(mdb)) != NULL) {
-         int num_fields = sql_num_fields(mdb);
+        int num_fields = sql_num_fields(mdb);
 
          Dmsg0(50, "db_sql_query sql_store_result suceeded\n");
 
          Dmsg0(50, "db_sql_query sql_store_result suceeded\n");
-         while ((row = sql_fetch_row(mdb)) != NULL) {
+        while ((row = sql_fetch_row(mdb)) != NULL) {
 
             Dmsg0(50, "db_sql_query sql_fetch_row worked\n");
 
             Dmsg0(50, "db_sql_query sql_fetch_row worked\n");
-            if (result_handler(ctx, num_fields, row))
-                  break;
-         }
+           if (result_handler(ctx, num_fields, row))
+                  break;
+        }
 
 
-         sql_free_result(mdb);
+        sql_free_result(mdb);
       }
    }
    db_unlock(mdb);
       }
    }
    db_unlock(mdb);
@@ -283,139 +283,20 @@ int db_sql_query(B_DB *mdb, char *query, DB_RESULT_HANDLER *result_handler, void
 }
 
 
 }
 
 
-static void
-list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx)
-{
-   SQL_FIELD  *field;
-   unsigned int i, j;
-
-   sql_field_seek(mdb, 0);
-   send(ctx, "+");
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      for (j = 0; j < field->max_length + 2; j++)
-              send(ctx, "-");
-      send(ctx, "+");
-   }
-   send(ctx, "\n");
-}
 
 
-/*
- * If full_list is set, we list vertically, otherwise, we 
- * list on one line horizontally.      
- */
-void
-list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type)
+POSTGRESQL_ROW my_postgresql_fetch_row(B_DB *mdb) 
 {
 {
-   SQL_FIELD *field;
-   SQL_ROW row;
-   unsigned int i, col_len, max_len = 0;
-   char buf[2000], ewc[30];
-
-   Dmsg0(50, "list_result starts\n");
-   if (mdb->result == NULL) {
-      send(ctx, _("No results to list.\n"));
-      return;
-   }
-
-   Dmsg1(50, "list_result starts looking at %d fields\n", sql_num_fields(mdb));
-   /* determine column display widths */
-   sql_field_seek(mdb, 0);
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      Dmsg1(50, "list_result processing field %d\n", i);
-      field   = sql_fetch_field(mdb);
-      col_len = strlen(field->name);
-      if (type == VERT_LIST) {
-         if (col_len > max_len) {
-            max_len = col_len;
-         }
-      } else {
-         if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */
-            field->max_length += (field->max_length - 1) / 3;
-         }
-         if (col_len < field->max_length) {
-            col_len = field->max_length;
-         }
-         if (col_len < 4 && !IS_NOT_NULL(field->flags)) {
-            col_len = 4;                 /* 4 = length of the word "NULL" */
-         }
-         field->max_length = col_len;   /* reset column info */
-      }
-   }
-
-   Dmsg0(50, "list_result finished first loop\n");
-   if (type == VERT_LIST) {
-      goto vertical_list;
-   }
-
-   Dmsg1(50, "list_result starts second loop looking at %d fields\n", sql_num_fields(mdb));
-   list_dashes(mdb, send, ctx);
-   send(ctx, "|");
-   sql_field_seek(mdb, 0);
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      Dmsg1(50, "list_result looking at field %d\n", i);
-      field = sql_fetch_field(mdb);
-      bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name);
-      send(ctx, buf);
-   }
-   send(ctx, "\n");
-   list_dashes(mdb, send, ctx);
-
-   Dmsg1(50, "list_result starts third loop looking at %d fields\n", sql_num_fields(mdb));
-   while ((row = sql_fetch_row(mdb)) != NULL) {
-      sql_field_seek(mdb, 0);
-      send(ctx, "|");
-      for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      if (row[i] == NULL) {
-         bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL");
-      } else if (IS_NUM(field->type)) {
-         bsnprintf(buf, sizeof(buf), " %*s |", (int)field->max_length,       
-            add_commas(row[i], ewc));
-         } else {
-             bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, row[i]);
-         }
-         send(ctx, buf);
-      }
-      send(ctx, "\n");
-   }
-   list_dashes(mdb, send, ctx);
-   return;
-
-vertical_list:
-   
-   Dmsg1(50, "list_result starts vertical list at %d fields\n", sql_num_fields(mdb));
-   while ((row = sql_fetch_row(mdb)) != NULL) {
-      sql_field_seek(mdb, 0);
-      for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      if (row[i] == NULL) {
-         bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
-      } else if (IS_NUM(field->type)) {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, 
-               add_commas(row[i], ewc));
-         } else {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]);
-         }
-         send(ctx, buf);
-      }
-      send(ctx, "\n");
-   }
-   return;
-}
-
-POSTGRESQL_ROW my_postgresql_fetch_row(B_DB *mdb) {
-       int            j;
+       int            j;
        POSTGRESQL_ROW row = NULL; // by default, return NULL
 
        POSTGRESQL_ROW row = NULL; // by default, return NULL
 
-       Dmsg0(50, "my_postgresql_fetch_row start\n");
+        Dmsg0(50, "my_postgresql_fetch_row start\n");
 
        if (mdb->row_number == -1 || mdb->row == NULL) {
 
 
        if (mdb->row_number == -1 || mdb->row == NULL) {
 
-               Dmsg1(50, "we have need space of %d bytes\n", sizeof(char *) * mdb->num_fields);
+                Dmsg1(50, "we have need space of %d bytes\n", sizeof(char *) * mdb->num_fields);
 
                if (mdb->row != NULL) {
 
                if (mdb->row != NULL) {
-                       Dmsg0(50, "my_postgresql_fetch_row freeing space\n");
+                        Dmsg0(50, "my_postgresql_fetch_row freeing space\n");
                        free(mdb->row);
                        mdb->row = NULL;
                }
                        free(mdb->row);
                        mdb->row = NULL;
                }
@@ -428,26 +309,27 @@ POSTGRESQL_ROW my_postgresql_fetch_row(B_DB *mdb) {
 
        // if still within the result set
        if (mdb->row_number < mdb->num_rows) {
 
        // if still within the result set
        if (mdb->row_number < mdb->num_rows) {
-               Dmsg2(50, "my_postgresql_fetch_row row number '%d' is acceptable (0..%d)\n", mdb->row_number, mdb->num_rows);
+                Dmsg2(50, "my_postgresql_fetch_row row number '%d' is acceptable (0..%d)\n", mdb->row_number, mdb->num_rows);
                // get each value from this row
                for (j = 0; j < mdb->num_fields; j++) {
                        mdb->row[j] = PQgetvalue(mdb->result, mdb->row_number, j);
                // get each value from this row
                for (j = 0; j < mdb->num_fields; j++) {
                        mdb->row[j] = PQgetvalue(mdb->result, mdb->row_number, j);
-                       Dmsg2(50, "my_postgresql_fetch_row field '%d' has value '%s'\n", j, mdb->row[j]);
+                        Dmsg2(50, "my_postgresql_fetch_row field '%d' has value '%s'\n", j, mdb->row[j]);
                }
                // increment the row number for the next call
                mdb->row_number++;
 
                row = mdb->row;
        } else {
                }
                // increment the row number for the next call
                mdb->row_number++;
 
                row = mdb->row;
        } else {
-               Dmsg2(50, "my_postgresql_fetch_row row number '%d' is NOT acceptable (0..%d)\n", mdb->row_number, mdb->num_rows);
+                Dmsg2(50, "my_postgresql_fetch_row row number '%d' is NOT acceptable (0..%d)\n", mdb->row_number, mdb->num_rows);
        }
 
        }
 
-       Dmsg1(50, "my_postgresql_fetch_row finishes returning %x\n", row);
+        Dmsg1(50, "my_postgresql_fetch_row finishes returning %x\n", row);
 
        return row;
 }
 
 
        return row;
 }
 
-POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb) {
+POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb) 
+{
        mdb->field.name       = PQfname    (mdb->result, mdb->field_number);
 
        // I am not sure this returns the max width of the result set
        mdb->field.name       = PQfname    (mdb->result, mdb->field_number);
 
        // I am not sure this returns the max width of the result set
@@ -457,12 +339,12 @@ POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb) {
        mdb->field.type       = PQftype    (mdb->result, mdb->field_number);
 
 //     if (mdb->num_rows > 0) {
        mdb->field.type       = PQftype    (mdb->result, mdb->field_number);
 
 //     if (mdb->num_rows > 0) {
-//             Dmsg1(50, "asking for information on field '%d' type='%d' and IsNull=%d\n",
-//             mdb->field.flags  = PQgetisnull(mdb->result, mdb->row_number, mdb->field_number);
-//     }
+//              Dmsg1(50, "asking for information on field '%d' type='%d' and IsNull=%d\n",
+//             mdb->field.flags  = PQgetisnull(mdb->result, mdb->row_number, mdb->field_number);
+//     }
        mdb->field.flags = 0;
 
        mdb->field.flags = 0;
 
-       Dmsg4(50, "my_postgresql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", 
+        Dmsg4(50, "my_postgresql_fetch_field finds field '%s' has length='%d' type='%d' and IsNull=%d\n", 
                mdb->field.name, mdb->field.max_length, mdb->field.type, mdb->field.flags);
 
        // increment this for the next time around
                mdb->field.name, mdb->field.max_length, mdb->field.type, mdb->field.flags);
 
        // increment this for the next time around
@@ -471,49 +353,52 @@ POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb) {
        return &mdb->field;
 }
 
        return &mdb->field;
 }
 
-void my_postgresql_data_seek(B_DB *mdb, int row) {
+void my_postgresql_data_seek(B_DB *mdb, int row) 
+{
        // set the row number to be returned on the next call
        // to my_postgresql_fetch_row
        mdb->row_number = row;
 }
 
        // set the row number to be returned on the next call
        // to my_postgresql_fetch_row
        mdb->row_number = row;
 }
 
-void my_postgresql_field_seek(B_DB *mdb, int field) {
+void my_postgresql_field_seek(B_DB *mdb, int field)
+ {
        mdb->field_number = field;
 }
 
 int my_postgresql_query(B_DB *mdb, char *query) {
        mdb->field_number = field;
 }
 
 int my_postgresql_query(B_DB *mdb, char *query) {
-       Dmsg0(50, "my_postgresql_query started\n");
+        Dmsg0(50, "my_postgresql_query started\n");
        // We are starting a new query.  reset everything.
        // We are starting a new query.  reset everything.
-       mdb->num_rows     = -1;
+       mdb->num_rows     = -1;
        mdb->row_number   = -1;
        mdb->field_number = -1;
 
 
        mdb->row_number   = -1;
        mdb->field_number = -1;
 
 
-       Dmsg1(50, "my_postgresql_query starts with '%s'\n", query);
+        Dmsg1(50, "my_postgresql_query starts with '%s'\n", query);
        mdb->result = PQexec(mdb->db, query);
        mdb->status = PQresultStatus(mdb->result);
        if (mdb->status == PGRES_TUPLES_OK || mdb->status == PGRES_COMMAND_OK) {
        mdb->result = PQexec(mdb->db, query);
        mdb->status = PQresultStatus(mdb->result);
        if (mdb->status == PGRES_TUPLES_OK || mdb->status == PGRES_COMMAND_OK) {
-               Dmsg1(50, "we have a result\n", query);
+                Dmsg1(50, "we have a result\n", query);
 
                // how many fields in the set?
 
                // how many fields in the set?
-               mdb->num_fields = (unsigned int) PQnfields(mdb->result);
-               Dmsg1(50, "we have %d fields\n", mdb->num_fields);
+               mdb->num_fields = (int) PQnfields(mdb->result);
+                Dmsg1(50, "we have %d fields\n", mdb->num_fields);
 
 
-               mdb->num_rows   = PQntuples(mdb->result);
-               Dmsg1(50, "we have %d rows\n", mdb->num_rows);
+               mdb->num_rows   = PQntuples(mdb->result);
+                Dmsg1(50, "we have %d rows\n", mdb->num_rows);
 
                mdb->status = 0;
        } else {
 
                mdb->status = 0;
        } else {
-               Dmsg1(50, "we failed\n", query);
+                Dmsg1(50, "we failed\n", query);
                mdb->status = 1;
        }
 
                mdb->status = 1;
        }
 
-       Dmsg0(50, "my_postgresql_query finishing\n");
+        Dmsg0(50, "my_postgresql_query finishing\n");
 
        return mdb->status;
 }
 
 
        return mdb->status;
 }
 
-void my_postgresql_free_result (B_DB *mdb) {
+void my_postgresql_free_result (B_DB *mdb) 
+{
        if (mdb->result) {
                PQclear(mdb->result);
        }
        if (mdb->result) {
                PQclear(mdb->result);
        }
@@ -524,7 +409,8 @@ void my_postgresql_free_result (B_DB *mdb) {
        }
 }
 
        }
 }
 
-int my_postgresql_currval(B_DB *mdb, char *table_name) {
+int my_postgresql_currval(B_DB *mdb, char *table_name) 
+{
        // Obtain the current value of the sequence that
        // provides the serial value for primary key of the table.
 
        // Obtain the current value of the sequence that
        // provides the serial value for primary key of the table.
 
@@ -541,36 +427,36 @@ int my_postgresql_currval(B_DB *mdb, char *table_name) {
 
        // everything else can use the PostgreSQL formula.
 
 
        // everything else can use the PostgreSQL formula.
 
-       char      sequence[NAMEDATALEN-1];
-       char      query   [NAMEDATALEN+50];
+       char      sequence[NAMEDATALEN-1];
+       char      query   [NAMEDATALEN+50];
 //     POOLMEM  *query;
        PGresult *result;
 //     POOLMEM  *query;
        PGresult *result;
-       int       id = 0;
+       int       id = 0;
 
 
-       if (strcasecmp(table_name, "basefiles") == 0) {
-               bstrncpy(sequence, "basefiles_baseid", sizeof(sequence));
+        if (strcasecmp(table_name, "basefiles") == 0) {
+                bstrncpy(sequence, "basefiles_baseid", sizeof(sequence));
        } else {
                bstrncpy(sequence, table_name, sizeof(sequence));
        } else {
                bstrncpy(sequence, table_name, sizeof(sequence));
-               bstrncat(sequence, "_",        sizeof(sequence));
+                bstrncat(sequence, "_",        sizeof(sequence));
                bstrncat(sequence, table_name, sizeof(sequence));
                bstrncat(sequence, table_name, sizeof(sequence));
-               bstrncat(sequence, "id",       sizeof(sequence));
+                bstrncat(sequence, "id",       sizeof(sequence));
        }
 
        }
 
-       bstrncat(sequence, "_seq", sizeof(sequence));
-       bsnprintf(query, sizeof(query), "SELECT currval('%s')", sequence);
+        bstrncat(sequence, "_seq", sizeof(sequence));
+        bsnprintf(query, sizeof(query), "SELECT currval('%s')", sequence);
 
 
-//     Mmsg(&query, "SELECT currval('%s')", sequence);
-       Dmsg1(50, "my_postgresql_currval invoked with '%s'\n", query);
+//      Mmsg(&query, "SELECT currval('%s')", sequence);
+        Dmsg1(50, "my_postgresql_currval invoked with '%s'\n", query);
        result = PQexec(mdb->db, query);
 
        result = PQexec(mdb->db, query);
 
-       Dmsg0(50, "exec done");
+        Dmsg0(50, "exec done");
 
        if (PQresultStatus(result) == PGRES_TUPLES_OK) {
 
        if (PQresultStatus(result) == PGRES_TUPLES_OK) {
-               Dmsg0(50, "getting value");
+                Dmsg0(50, "getting value");
                id = atoi(PQgetvalue(result, 0, 0));
                id = atoi(PQgetvalue(result, 0, 0));
-               Dmsg2(50, "got value '%s' which became %d\n", PQgetvalue(result, 0, 0), id);
+                Dmsg2(50, "got value '%s' which became %d\n", PQgetvalue(result, 0, 0), id);
        } else {
        } else {
-               Mmsg1(&mdb->errmsg, _("error fetching currval: %s\n"), PQerrorMessage(mdb->db));
+                Mmsg1(&mdb->errmsg, _("error fetching currval: %s\n"), PQerrorMessage(mdb->db));
        }
 
 //     free_pool_memory(query);
        }
 
 //     free_pool_memory(query);
index b19cc606bd49a7a090a5c391bd2f4e55ab43066a..9570c06f164e9aa27b856429ce27df8bc0198ce4 100644 (file)
@@ -1,4 +1,7 @@
 /*
 /*
+ *
+ *  Database routines that are exported by the cats library for
+ *    use elsewhere in Bacula (mainly the Director).
  *
  *    Version $Id$
  */
  *
  *    Version $Id$
  */
 /* sql.c */
 B_DB *db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password, 
                        char *db_address, int db_port, char *db_socket);
 /* sql.c */
 B_DB *db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password, 
                        char *db_address, int db_port, char *db_socket);
-int db_open_database(JCR *jcr, B_DB *db);
+int  db_open_database(JCR *jcr, B_DB *db);
 void db_close_database(JCR *jcr, B_DB *db);
 void db_escape_string(char *snew, char *old, int len);
 char *db_strerror(B_DB *mdb);
 void db_close_database(JCR *jcr, B_DB *db);
 void db_escape_string(char *snew, char *old, int len);
 char *db_strerror(B_DB *mdb);
-int get_sql_record_max(JCR *jcr, B_DB *mdb);
-int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index);
-int db_sql_query(B_DB *mdb, char *cmd, DB_RESULT_HANDLER *result_handler, void *ctx);
-int check_tables_version(JCR *jcr, B_DB *mdb);
-void _db_unlock(char *file, int line, B_DB *mdb);
-void _db_lock(char *file, int line, B_DB *mdb);
+int  db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index);
+int  db_sql_query(B_DB *mdb, char *cmd, DB_RESULT_HANDLER *result_handler, void *ctx);
 void db_start_transaction(JCR *jcr, B_DB *mdb);
 void db_end_transaction(JCR *jcr, B_DB *mdb);
 
 void db_start_transaction(JCR *jcr, B_DB *mdb);
 void db_end_transaction(JCR *jcr, B_DB *mdb);
 
+
 /* create.c */
 int db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
 int db_create_job_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
 /* create.c */
 int db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
 int db_create_job_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
index 16aebd1702582882d9d041459d329f9859c5d91a..c71f92c27f27659a74fdca0f50b17feb2565a1e0 100644 (file)
@@ -80,7 +80,7 @@ int check_tables_version(JCR *jcr, B_DB *mdb)
    db_sql_query(mdb, query, int_handler, (void *)&bacula_db_version);
    if (bacula_db_version != BDB_VERSION) {
       Mmsg(&mdb->errmsg, "Version error for database \"%s\". Wanted %d, got %d\n",
    db_sql_query(mdb, query, int_handler, (void *)&bacula_db_version);
    if (bacula_db_version != BDB_VERSION) {
       Mmsg(&mdb->errmsg, "Version error for database \"%s\". Wanted %d, got %d\n",
-          mdb->db_name, BDB_VERSION, bacula_db_version);
+         mdb->db_name, BDB_VERSION, bacula_db_version);
       Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
       return 0;
    }
       Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
       return 0;
    }
@@ -219,11 +219,19 @@ int get_sql_record_max(JCR *jcr, B_DB *mdb)
    return stat;
 }
 
    return stat;
 }
 
+/*
+ * Return pre-edited error message
+ */
 char *db_strerror(B_DB *mdb)
 {
    return mdb->errmsg;
 }
 
 char *db_strerror(B_DB *mdb)
 {
    return mdb->errmsg;
 }
 
+/*
+ * Lock database, this can be called multiple times by the same
+ *   thread without blocking, but must be unlocked the number of
+ *   times it was locked.
+ */
 void _db_lock(char *file, int line, B_DB *mdb)
 {
    int errstat;
 void _db_lock(char *file, int line, B_DB *mdb)
 {
    int errstat;
@@ -233,6 +241,11 @@ void _db_lock(char *file, int line, B_DB *mdb)
    }
 }    
 
    }
 }    
 
+/*
+ * Unlock the database. This can be called multiple times by the
+ *   same thread up to the number of times that thread called
+ *   db_lock()/
+ */
 void _db_unlock(char *file, int line, B_DB *mdb)
 {
    int errstat;
 void _db_unlock(char *file, int line, B_DB *mdb)
 {
    int errstat;
@@ -337,4 +350,130 @@ void split_path_and_filename(JCR *jcr, B_DB *mdb, char *fname)
    Dmsg2(100, "sllit path=%s file=%s\n", mdb->path, mdb->fname);
 }
 
    Dmsg2(100, "sllit path=%s file=%s\n", mdb->path, mdb->fname);
 }
 
+/*
+ * List dashs as part of header for listing SQL results in a table
+ */
+void
+list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx)
+{
+   SQL_FIELD  *field;
+   int i, j;
+
+   sql_field_seek(mdb, 0);
+   send(ctx, "+");
+   for (i = 0; i < sql_num_fields(mdb); i++) {
+      field = sql_fetch_field(mdb);
+      for (j = 0; j < field->max_length + 2; j++) {
+         send(ctx, "-");
+      }
+      send(ctx, "+");
+   }
+   send(ctx, "\n");
+}
+
+/*
+ * If full_list is set, we list vertically, otherwise, we 
+ * list on one line horizontally.      
+ */
+void
+list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type)
+{
+   SQL_FIELD *field;
+   SQL_ROW row;
+   int i, col_len, max_len = 0;
+   char buf[2000], ewc[30];
+
+   Dmsg0(50, "list_result starts\n");
+   if (mdb->result == NULL || sql_num_rows(mdb) == 0) {
+      send(ctx, _("No results to list.\n"));
+      return;
+   }
+
+   Dmsg1(50, "list_result starts looking at %d fields\n", sql_num_fields(mdb));
+   /* determine column display widths */
+   sql_field_seek(mdb, 0);
+   for (i = 0; i < sql_num_fields(mdb); i++) {
+      Dmsg1(50, "list_result processing field %d\n", i);
+      field = sql_fetch_field(mdb);
+      col_len = strlen(field->name);
+      if (type == VERT_LIST) {
+        if (col_len > max_len) {
+           max_len = col_len;
+        }
+      } else {
+        if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */
+           field->max_length += (field->max_length - 1) / 3;
+        }
+        if (col_len < field->max_length) {
+           col_len = field->max_length;
+        }
+        if (col_len < 4 && !IS_NOT_NULL(field->flags)) {
+            col_len = 4;                 /* 4 = length of the word "NULL" */
+        }
+        field->max_length = col_len;    /* reset column info */
+      }
+   }
+
+   Dmsg0(50, "list_result finished first loop\n");
+   if (type == VERT_LIST) {
+      goto vertical_list;
+   }
+
+   Dmsg1(50, "list_result starts second loop looking at %d fields\n", sql_num_fields(mdb));
+   list_dashes(mdb, send, ctx);
+   send(ctx, "|");
+   sql_field_seek(mdb, 0);
+   for (i = 0; i < sql_num_fields(mdb); i++) {
+      Dmsg1(50, "list_result looking at field %d\n", i);
+      field = sql_fetch_field(mdb);
+      bsnprintf(buf, sizeof(buf), " %-*s |", field->max_length, field->name);
+      send(ctx, buf);
+   }
+   send(ctx, "\n");
+   list_dashes(mdb, send, ctx);
+
+   Dmsg1(50, "list_result starts third loop looking at %d fields\n", sql_num_fields(mdb));
+   while ((row = sql_fetch_row(mdb)) != NULL) {
+      sql_field_seek(mdb, 0);
+      send(ctx, "|");
+      for (i = 0; i < sql_num_fields(mdb); i++) {
+        field = sql_fetch_field(mdb);
+        if (row[i] == NULL) {
+            bsnprintf(buf, sizeof(buf), " %-*s |", field->max_length, "NULL");
+        } else if (IS_NUM(field->type)) {
+            bsnprintf(buf, sizeof(buf), " %*s |", field->max_length,       
+                     add_commas(row[i], ewc));
+        } else {
+            bsnprintf(buf, sizeof(buf), " %-*s |", field->max_length, row[i]);
+        }
+        send(ctx, buf);
+      }
+      send(ctx, "\n");
+   }
+   list_dashes(mdb, send, ctx);
+   return;
+
+vertical_list:
+   
+   Dmsg1(50, "list_result starts vertical list at %d fields\n", sql_num_fields(mdb));
+   while ((row = sql_fetch_row(mdb)) != NULL) {
+      sql_field_seek(mdb, 0);
+      for (i = 0; i < sql_num_fields(mdb); i++) {
+        field = sql_fetch_field(mdb);
+        if (row[i] == NULL) {
+            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
+        } else if (IS_NUM(field->type)) {
+            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, 
+               add_commas(row[i], ewc));
+        } else {
+            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]);
+        }
+        send(ctx, buf);
+      }
+      send(ctx, "\n");
+   }
+   return;
+}
+
+
 #endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */
 #endif /* HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL */
index 52b9c6b6ff1a6a28dc84ecf79b25998697cd5c55..d595a189094bb20a02b006e2dcf5bd42b6eec742 100644 (file)
@@ -231,7 +231,7 @@ int
 db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 {
    int stat;
 db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
 {
    int stat;
-   char ed1[30], ed2[30], ed3[30], ed4[30], ed5[30];
+   char ed1[30], ed2[30], ed3[30], ed4[30], ed5[30], ed6[50], ed7[50];
    struct tm tm;
 
    db_lock(mdb);
    struct tm tm;
 
    db_lock(mdb);
@@ -259,8 +259,8 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
    Mmsg(&mdb->cmd, 
 "INSERT INTO Media (VolumeName,MediaType,PoolId,MaxVolBytes,VolCapacityBytes," 
 "Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
    Mmsg(&mdb->cmd, 
 "INSERT INTO Media (VolumeName,MediaType,PoolId,MaxVolBytes,VolCapacityBytes," 
 "Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
-"VolStatus,Slot,VolBytes,Drive,InChanger) "
-"VALUES ('%s','%s',%u,%s,%s,%d,%s,%s,%u,%u,'%s',%d,%s,%d,%d)", 
+"VolStatus,Slot,VolBytes,InChanger,VolReadTime,VolWriteTime) "
+"VALUES ('%s','%s',%u,%s,%s,%d,%s,%s,%u,%u,'%s',%d,%s,%d,%s,%s)", 
                  mr->VolumeName,
                  mr->MediaType, mr->PoolId, 
                  edit_uint64(mr->MaxVolBytes,ed1),
                  mr->VolumeName,
                  mr->MediaType, mr->PoolId, 
                  edit_uint64(mr->MaxVolBytes,ed1),
@@ -273,8 +273,10 @@ db_create_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
                  mr->VolStatus,
                  mr->Slot,
                  edit_uint64(mr->VolBytes, ed5),
                  mr->VolStatus,
                  mr->Slot,
                  edit_uint64(mr->VolBytes, ed5),
-                 mr->Drive,
-                 mr->InChanger);
+                 mr->InChanger,
+                 edit_uint64(mr->VolReadTime, ed6),
+                 edit_uint64(mr->VolWriteTime, ed7));
+
 
    Dmsg1(500, "Create Volume: %s\n", mdb->cmd);
    if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
 
    Dmsg1(500, "Create Volume: %s\n", mdb->cmd);
    if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
index 4f00fd88ec032b419d0adbee2bc95bfb2a84d3ca..c48e0940bd9dec04888fdb69c1b07ddccc46a646 100644 (file)
@@ -119,7 +119,7 @@ db_update_job_start_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
  *
  */
 void edit_num_or_null(char *s, size_t n, uint32_t id) {
  *
  */
 void edit_num_or_null(char *s, size_t n, uint32_t id) {
-       bsnprintf(s, n, id ? "%u" : "NULL", id);
+        bsnprintf(s, n, id ? "%u" : "NULL", id);
 }
 
 
 }
 
 
@@ -138,13 +138,13 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
    int stat;
    char ed1[30], ed2[30];
    btime_t JobTDate;
    int stat;
    char ed1[30], ed2[30];
    btime_t JobTDate;
-   char PoolId    [50];
+   char PoolId   [50];
    char FileSetId [50];
    char ClientId  [50];
 
 
    /* some values are set to zero, which translates to NULL in SQL */
    char FileSetId [50];
    char ClientId  [50];
 
 
    /* some values are set to zero, which translates to NULL in SQL */
-   edit_num_or_null(PoolId,    sizeof(PoolId),    jr->PoolId);
+   edit_num_or_null(PoolId,    sizeof(PoolId),   jr->PoolId);
    edit_num_or_null(FileSetId, sizeof(FileSetId), jr->FileSetId);
    edit_num_or_null(ClientId,  sizeof(ClientId),  jr->ClientId);
        
    edit_num_or_null(FileSetId, sizeof(FileSetId), jr->FileSetId);
    edit_num_or_null(ClientId,  sizeof(ClientId),  jr->ClientId);
        
@@ -260,7 +260,7 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
    time_t ttime;
    struct tm tm;
    int stat;
    time_t ttime;
    struct tm tm;
    int stat;
-   char ed1[30], ed2[30];
+   char ed1[30], ed2[30], ed3[30], ed4[30];
        
 
    Dmsg1(100, "update_media: FirstWritten=%d\n", mr->FirstWritten);
        
 
    Dmsg1(100, "update_media: FirstWritten=%d\n", mr->FirstWritten);
@@ -299,11 +299,16 @@ db_update_media_record(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr)
    Mmsg(&mdb->cmd, "UPDATE Media SET VolJobs=%u,"
         "VolFiles=%u,VolBlocks=%u,VolBytes=%s,VolMounts=%u,VolErrors=%u,"
         "VolWrites=%u,MaxVolBytes=%s,LastWritten='%s',VolStatus='%s',"
    Mmsg(&mdb->cmd, "UPDATE Media SET VolJobs=%u,"
         "VolFiles=%u,VolBlocks=%u,VolBytes=%s,VolMounts=%u,VolErrors=%u,"
         "VolWrites=%u,MaxVolBytes=%s,LastWritten='%s',VolStatus='%s',"
-        "Slot=%d,Drive=%d,InChanger=%d WHERE VolumeName='%s'",
+        "Slot=%d,InChanger=%d,VolReadTime=%s,VolWriteTime=%s "
+        " WHERE VolumeName='%s'",
         mr->VolJobs, mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1),
         mr->VolMounts, mr->VolErrors, mr->VolWrites, 
         edit_uint64(mr->MaxVolBytes, ed2), dt, 
         mr->VolJobs, mr->VolFiles, mr->VolBlocks, edit_uint64(mr->VolBytes, ed1),
         mr->VolMounts, mr->VolErrors, mr->VolWrites, 
         edit_uint64(mr->MaxVolBytes, ed2), dt, 
-        mr->VolStatus, mr->Slot, mr->Drive, mr->InChanger, mr->VolumeName);
+        mr->VolStatus, mr->Slot, mr->InChanger, 
+        edit_uint64(mr->VolReadTime, ed3),
+        edit_uint64(mr->VolWriteTime, ed4),
+        mr->VolumeName);
+
 
    Dmsg1(400, "%s\n", mdb->cmd);
 
 
    Dmsg1(400, "%s\n", mdb->cmd);
 
index 754ae338558272ff08dc96c64f264bac6d8e43e9..92e7338ba2b4e140d294aa1ea7d9ecbaecb5cd66 100644 (file)
@@ -329,7 +329,7 @@ SQL_ROW my_sqlite_fetch_row(B_DB *mdb)
 
 void my_sqlite_free_table(B_DB *mdb)
 {
 
 void my_sqlite_free_table(B_DB *mdb)
 {
-   unsigned int i;
+   int i;
 
    if (mdb->fields_defined) {
       for (i=0; i < sql_num_fields(mdb); i++) {
 
    if (mdb->fields_defined) {
       for (i=0; i < sql_num_fields(mdb); i++) {
@@ -344,7 +344,7 @@ void my_sqlite_free_table(B_DB *mdb)
 
 void my_sqlite_field_seek(B_DB *mdb, int field)
 {
 
 void my_sqlite_field_seek(B_DB *mdb, int field)
 {
-   unsigned int i, j;
+   int i, j;
    if (mdb->result == NULL) {
       return;
    }
    if (mdb->result == NULL) {
       return;
    }
@@ -356,8 +356,8 @@ void my_sqlite_field_seek(B_DB *mdb, int field)
         mdb->fields[i]->name = mdb->result[i];
         mdb->fields[i]->length = strlen(mdb->fields[i]->name);
         mdb->fields[i]->max_length = mdb->fields[i]->length;
         mdb->fields[i]->name = mdb->result[i];
         mdb->fields[i]->length = strlen(mdb->fields[i]->name);
         mdb->fields[i]->max_length = mdb->fields[i]->length;
-        for (j=1; j <= (unsigned)mdb->nrow; j++) {
-           uint32_t len;
+        for (j=1; j <= mdb->nrow; j++) {
+           int len;
            if (mdb->result[i + mdb->ncolumn *j]) {
               len = (uint32_t)strlen(mdb->result[i + mdb->ncolumn * j]);
            } else {
            if (mdb->result[i + mdb->ncolumn *j]) {
               len = (uint32_t)strlen(mdb->result[i + mdb->ncolumn * j]);
            } else {
@@ -372,8 +372,8 @@ void my_sqlite_field_seek(B_DB *mdb, int field)
       }
       mdb->fields_defined = TRUE;
    }
       }
       mdb->fields_defined = TRUE;
    }
-   if (field > (int)sql_num_fields(mdb)) {
-      field = (int)sql_num_fields(mdb);
+   if (field > sql_num_fields(mdb)) {
+      field = sql_num_fields(mdb);
     }
     mdb->field = field;
 
     }
     mdb->field = field;
 
@@ -384,117 +384,6 @@ SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb)
    return mdb->fields[mdb->field++];
 }
 
    return mdb->fields[mdb->field++];
 }
 
-static void
-list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx)
-{
-   SQL_FIELD *field;
-   unsigned int i, j;
-
-   sql_field_seek(mdb, 0);
-   send(ctx, "+");
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      for (j = 0; j < field->max_length + 2; j++)
-              send(ctx, "-");
-      send(ctx, "+");
-   }
-   send(ctx, "\n");
-}
-
-/*
- * If full_list is set, we list vertically, otherwise, we 
- * list on one line horizontally.      
- */
-void
-list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type)
-{
-   SQL_FIELD *field;
-   SQL_ROW row;
-   unsigned int i, col_len, max_len = 0;
-   char buf[2000], ewc[30];
-
-   if (mdb->result == NULL || mdb->nrow == 0) {
-      send(ctx, _("No results to list.\n"));
-      return;
-   }
-   /* determine column display widths */
-   sql_field_seek(mdb, 0);
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      col_len = strlen(field->name);
-      if (type == VERT_LIST) {
-        if (col_len > max_len) {
-           max_len = col_len;
-        }
-      } else {
-        if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */
-           field->max_length += (field->max_length - 1) / 3;
-        }
-        if (col_len < field->max_length) {
-           col_len = field->max_length;
-        }
-        if (col_len < 4 && !IS_NOT_NULL(field->flags)) {
-            col_len = 4;                 /* 4 = length of the word "NULL" */
-        }
-        field->max_length = col_len;    /* reset column info */
-      }
-   }
-
-   if (type == VERT_LIST) {
-      goto vertical_list;
-   }
-
-   list_dashes(mdb, send, ctx);
-   send(ctx, "|");
-   sql_field_seek(mdb, 0);
-   for (i = 0; i < sql_num_fields(mdb); i++) {
-      field = sql_fetch_field(mdb);
-      bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name);
-      send(ctx, buf);
-   }
-   send(ctx, "\n");
-   list_dashes(mdb, send, ctx);
-
-   while ((row = sql_fetch_row(mdb)) != NULL) {
-      sql_field_seek(mdb, 0);
-      send(ctx, "|");
-      for (i = 0; i < sql_num_fields(mdb); i++) {
-        field = sql_fetch_field(mdb);
-        if (row[i] == NULL) {
-            bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL");
-        } else if (IS_NUM(field->type)) {
-            bsnprintf(buf, sizeof(buf), " %*s |", (int)field->max_length,       
-              add_commas(row[i], ewc));
-        } else {
-            bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, row[i]);
-        }
-        send(ctx, buf);
-      }
-      send(ctx, "\n");
-   }
-   list_dashes(mdb, send, ctx);
-   return;
-
-vertical_list:
-   
-   while ((row = sql_fetch_row(mdb)) != NULL) {
-      sql_field_seek(mdb, 0);
-      for (i = 0; i < sql_num_fields(mdb); i++) {
-        field = sql_fetch_field(mdb);
-        if (row[i] == NULL) {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
-        } else if (IS_NUM(field->type)) {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, 
-              add_commas(row[i], ewc));
-        } else {
-            bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]);
-        }
-        send(ctx, buf);
-      }
-      send(ctx, "\n");
-   }
-   return;
-}
 
 
 #endif /* HAVE_SQLITE */
 
 
 #endif /* HAVE_SQLITE */
index f2934a36d04ac9b95de903cad9b540a91f8cbba6..7767308c52464b72489849bc3fe31c0cb9e2e0f7 100755 (executable)
@@ -11,9 +11,10 @@ bindir=@SQL_BINDIR@
 if $bindir/mysql $* -f <<END-OF-DATA
 USE bacula;
 
 if $bindir/mysql $* -f <<END-OF-DATA
 USE bacula;
 
-ALTER TABLE Media ADD COLUMN Drive INTEGER NOT NULL DEFAULT 0;
 ALTER TABLE Media ADD COLUMN InChanger TINYINT NOT NULL DEFAULT 0;
 ALTER TABLE Media ADD COLUMN MediaAddressing TINYINT NOT NULL DEFAULT 0;
 ALTER TABLE Media ADD COLUMN InChanger TINYINT NOT NULL DEFAULT 0;
 ALTER TABLE Media ADD COLUMN MediaAddressing TINYINT NOT NULL DEFAULT 0;
+ALTER TABLE Media ADD COLUMN VolReadTime BIGINT UNSIGNED NOT NULL DEFAULT 0;
+ALTER TABLE Media ADD COLUMN VolWriteTime BIGINT UNSIGNED NOT NULL DEFAULT 0;
 
 ALTER TABLE Pool ADD COLUMN Enabled TINYINT DEFAULT 1;
 ALTER TABLE Pool ADD COLUMN ScratchPoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool;
 
 ALTER TABLE Pool ADD COLUMN Enabled TINYINT DEFAULT 1;
 ALTER TABLE Pool ADD COLUMN ScratchPoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool;
index 66ab352392a7a4a03991aa6f761d02c2f15df906..c841a38a9be7549ed70f1aa9f004c7ed25fcc9f0 100755 (executable)
@@ -37,9 +37,10 @@ CREATE TEMPORARY TABLE Media_backup (
    MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
-   Drive INTEGER DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    MediaAddressing TINYINT DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    MediaAddressing TINYINT DEFAULT 0,
+   VolReadTime BIGINT UNSIGNED DEFAULT 0,
+   VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    PRIMARY KEY(MediaId)
    );
 
    PRIMARY KEY(MediaId)
    );
 
@@ -50,7 +51,7 @@ INSERT INTO Media_backup SELECT
    VolMounts, VolBytes, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
    VolMounts, VolBytes, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
-   MaxVolFiles, MaxVolBytes, 0, 0, 0
+   MaxVolFiles, MaxVolBytes, 0, 0, 0, 0
    FROM Media;
 
 
    FROM Media;
 
 
@@ -80,9 +81,10 @@ CREATE TABLE Media (
    MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
    MaxVolJobs INTEGER UNSIGNED DEFAULT 0,
    MaxVolFiles INTEGER UNSIGNED DEFAULT 0,
    MaxVolBytes BIGINT UNSIGNED DEFAULT 0,
-   Drive INTEGER DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    MediaAddressing TINYINT DEFAULT 0,
    InChanger TINYINT DEFAULT 0,
    MediaAddressing TINYINT DEFAULT 0,
+   VolReadTime BIGINT UNSIGNED DEFAULT 0,
+   VolWriteTime BIGINT UNSIGNED DEFAULT 0,
    PRIMARY KEY(MediaId)
    );
 
    PRIMARY KEY(MediaId)
    );
 
@@ -93,8 +95,9 @@ INSERT INTO Media (
    VolMounts, VolBytes, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
    VolMounts, VolBytes, VolErrors, VolWrites,
    VolCapacityBytes, VolStatus, Recycle,
    VolRetention, VolUseDuration, MaxVolJobs,
-   MaxVolFiles, MaxVolBytes, Drive, 
-   InChanger, MediaAddressing)
+   MaxVolFiles, MaxVolBytes,
+   InChanger, MediaAddressing,
+   VolReadTime, VolWriteTime,
    SELECT * FROM Media_backup;
 
 DROP TABLE Media_backup;
    SELECT * FROM Media_backup;
 
 DROP TABLE Media_backup;
index 85f57264ae73db0a73c9766fcf8a919401f2333d..e4cd3476e83674b0e6719e71dafdd513c3ff2c75 100644 (file)
@@ -47,7 +47,7 @@ static char Get_Vol_Info[] = "CatReq Job=%127s GetVolInfo VolName=%127s write=%d
 static char Update_media[] = "CatReq Job=%127s UpdateMedia VolName=%s\
  VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%" lld " VolMounts=%u\
  VolErrors=%u VolWrites=%u MaxVolBytes=%" lld " EndTime=%d VolStatus=%10s\
 static char Update_media[] = "CatReq Job=%127s UpdateMedia VolName=%s\
  VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%" lld " VolMounts=%u\
  VolErrors=%u VolWrites=%u MaxVolBytes=%" lld " EndTime=%d VolStatus=%10s\
- Slot=%d relabel=%d Drive=%d InChanger=%d\n";
+ Slot=%d relabel=%d InChanger=%d VolReadTime=%" lld " VolWriteTime=%" lld "\n";
 
 static char Create_job_media[] = "CatReq Job=%127s CreateJobMedia \
  FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u \
 
 static char Create_job_media[] = "CatReq Job=%127s CreateJobMedia \
  FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u \
@@ -58,7 +58,8 @@ static char Create_job_media[] = "CatReq Job=%127s CreateJobMedia \
 static char OK_media[] = "1000 OK VolName=%s VolJobs=%u VolFiles=%u"
    " VolBlocks=%u VolBytes=%s VolMounts=%u VolErrors=%u VolWrites=%u"
    " MaxVolBytes=%s VolCapacityBytes=%s VolStatus=%s Slot=%d"
 static char OK_media[] = "1000 OK VolName=%s VolJobs=%u VolFiles=%u"
    " VolBlocks=%u VolBytes=%s VolMounts=%u VolErrors=%u VolWrites=%u"
    " MaxVolBytes=%s VolCapacityBytes=%s VolStatus=%s Slot=%d"
-   " MaxVolJobs=%u MaxVolFiles=%u Drive=%d InChanger=%d\n";
+   " MaxVolJobs=%u MaxVolFiles=%u InChanger=%d VolReadTime=%s"
+   " VolWriteTime=%s\n";
 
 static char OK_create[] = "1000 OK CreateJobMedia\n";
 
 
 static char OK_create[] = "1000 OK CreateJobMedia\n";
 
@@ -66,7 +67,7 @@ static char OK_create[] = "1000 OK CreateJobMedia\n";
 static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr) 
 {
    int stat;
 static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr) 
 {
    int stat;
-   char ed1[50], ed2[50], ed3[50];
+   char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50];
 
    jcr->MediaId = mr->MediaId;
    pm_strcpy(&jcr->VolumeName, mr->VolumeName);
 
    jcr->MediaId = mr->MediaId;
    pm_strcpy(&jcr->VolumeName, mr->VolumeName);
@@ -77,9 +78,11 @@ static int send_volume_info_to_storage_daemon(JCR *jcr, BSOCK *sd, MEDIA_DBR *mr
       edit_uint64(mr->MaxVolBytes, ed2), 
       edit_uint64(mr->VolCapacityBytes, ed3),
       mr->VolStatus, mr->Slot, mr->MaxVolJobs, mr->MaxVolFiles,
       edit_uint64(mr->MaxVolBytes, ed2), 
       edit_uint64(mr->VolCapacityBytes, ed3),
       mr->VolStatus, mr->Slot, mr->MaxVolJobs, mr->MaxVolFiles,
-      mr->Drive, mr->InChanger);
+      mr->InChanger,
+      edit_uint64(mr->VolReadTime, ed4),
+      edit_uint64(mr->VolWriteTime, ed5));
    unbash_spaces(mr->VolumeName);
    unbash_spaces(mr->VolumeName);
-   Dmsg2(100, "Vol Info for %s: %s", jcr->Job, sd->msg);
+   Dmsg2(200, "Vol Info for %s: %s", jcr->Job, sd->msg);
    return stat;
 }
 
    return stat;
 }
 
@@ -179,7 +182,8 @@ void catalog_request(JCR *jcr, BSOCK *bs, char *msg)
    } else if (sscanf(bs->msg, Update_media, &Job, &sdmr.VolumeName, &sdmr.VolJobs,
       &sdmr.VolFiles, &sdmr.VolBlocks, &sdmr.VolBytes, &sdmr.VolMounts, &sdmr.VolErrors,
       &sdmr.VolWrites, &sdmr.MaxVolBytes, &sdmr.LastWritten, &sdmr.VolStatus, 
    } else if (sscanf(bs->msg, Update_media, &Job, &sdmr.VolumeName, &sdmr.VolJobs,
       &sdmr.VolFiles, &sdmr.VolBlocks, &sdmr.VolBytes, &sdmr.VolMounts, &sdmr.VolErrors,
       &sdmr.VolWrites, &sdmr.MaxVolBytes, &sdmr.LastWritten, &sdmr.VolStatus, 
-      &sdmr.Slot, &label, &sdmr.Drive, &sdmr.InChanger) == 16) {
+      &sdmr.Slot, &label, &sdmr.InChanger, &sdmr.VolReadTime, 
+      &sdmr.VolWriteTime) == 17) {
 
       db_lock(jcr->db);
       Dmsg3(100, "Update media %s oldStat=%s newStat=%s\n", sdmr.VolumeName,
 
       db_lock(jcr->db);
       Dmsg3(100, "Update media %s oldStat=%s newStat=%s\n", sdmr.VolumeName,
@@ -204,17 +208,18 @@ void catalog_request(JCR *jcr, BSOCK *bs, char *msg)
       }
       Dmsg2(100, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs);
       /* Copy updated values to original media record */
       }
       Dmsg2(100, "Update media: BefVolJobs=%u After=%u\n", mr.VolJobs, sdmr.VolJobs);
       /* Copy updated values to original media record */
-      mr.VolJobs     = sdmr.VolJobs;
-      mr.VolFiles    = sdmr.VolFiles;
-      mr.VolBlocks   = sdmr.VolBlocks;
-      mr.VolBytes    = sdmr.VolBytes;
-      mr.VolMounts   = sdmr.VolMounts;
-      mr.VolErrors   = sdmr.VolErrors;
-      mr.VolWrites   = sdmr.VolWrites;
-      mr.LastWritten = sdmr.LastWritten;
-      mr.Slot       = sdmr.Slot;
-      mr.Drive      = sdmr.Drive;
-      mr.InChanger   = sdmr.InChanger;
+      mr.VolJobs      = sdmr.VolJobs;
+      mr.VolFiles     = sdmr.VolFiles;
+      mr.VolBlocks    = sdmr.VolBlocks;
+      mr.VolBytes     = sdmr.VolBytes;
+      mr.VolMounts    = sdmr.VolMounts;
+      mr.VolErrors    = sdmr.VolErrors;
+      mr.VolWrites    = sdmr.VolWrites;
+      mr.LastWritten  = sdmr.LastWritten;
+      mr.Slot        = sdmr.Slot;
+      mr.InChanger    = sdmr.InChanger;
+      mr.VolReadTime  = sdmr.VolReadTime;
+      mr.VolWriteTime = sdmr.VolWriteTime;
       bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus));
 
       Dmsg2(100, "db_update_media_record. Stat=%s Vol=%s\n", mr.VolStatus, mr.VolumeName);
       bstrncpy(mr.VolStatus, sdmr.VolStatus, sizeof(mr.VolStatus));
 
       Dmsg2(100, "db_update_media_record. Stat=%s Vol=%s\n", mr.VolStatus, mr.VolumeName);
index 1307a097512e5e2b381a742e3e7a3a79ce60868d..027b3f75aa6b6629d521e4560af94df718f1b1ef 100644 (file)
@@ -35,7 +35,7 @@ static char Get_Vol_Info[] = "CatReq Job=%s GetVolInfo VolName=%s write=%d\n";
 static char Update_media[] = "CatReq Job=%s UpdateMedia VolName=%s"
    " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%s VolMounts=%u"
    " VolErrors=%u VolWrites=%u MaxVolBytes=%s EndTime=%d VolStatus=%s"
 static char Update_media[] = "CatReq Job=%s UpdateMedia VolName=%s"
    " VolJobs=%u VolFiles=%u VolBlocks=%u VolBytes=%s VolMounts=%u"
    " VolErrors=%u VolWrites=%u MaxVolBytes=%s EndTime=%d VolStatus=%s"
-   " Slot=%d relabel=%d Drive=%d InChanger=%d\n";
+   " Slot=%d relabel=%d InChanger=%d VolReadTime=%s VolWriteTime=%s\n";
 static char Create_job_media[] = "CatReq Job=%s CreateJobMedia" 
    " FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u" 
    " StartBlock=%u EndBlock=%u\n";
 static char Create_job_media[] = "CatReq Job=%s CreateJobMedia" 
    " FirstIndex=%u LastIndex=%u StartFile=%u EndFile=%u" 
    " StartBlock=%u EndBlock=%u\n";
@@ -47,7 +47,9 @@ static char Job_status[]     = "3012 Job %s jobstatus %d\n";
 static char OK_media[] = "1000 OK VolName=%127s VolJobs=%u VolFiles=%u"
    " VolBlocks=%u VolBytes=%" lld " VolMounts=%u VolErrors=%u VolWrites=%u"
    " MaxVolBytes=%" lld " VolCapacityBytes=%" lld " VolStatus=%20s"
 static char OK_media[] = "1000 OK VolName=%127s VolJobs=%u VolFiles=%u"
    " VolBlocks=%u VolBytes=%" lld " VolMounts=%u VolErrors=%u VolWrites=%u"
    " MaxVolBytes=%" lld " VolCapacityBytes=%" lld " VolStatus=%20s"
-   " Slot=%d MaxVolJobs=%u MaxVolFiles=%u Drive=%d InChanger=%d";
+   " Slot=%d MaxVolJobs=%u MaxVolFiles=%u InChanger=%d"
+   " VolReadTime=%" lld " VolWriteTime=%" lld;
+
 
 static char OK_create[] = "1000 OK CreateJobMedia\n";
 
 
 static char OK_create[] = "1000 OK CreateJobMedia\n";
 
@@ -75,6 +77,7 @@ static int do_get_volume_info(JCR *jcr)
 {
     BSOCK *dir = jcr->dir_bsock;
     VOLUME_CAT_INFO vol;
 {
     BSOCK *dir = jcr->dir_bsock;
     VOLUME_CAT_INFO vol;
+    int n;
 
     jcr->VolumeName[0] = 0;          /* No volume */
     if (bnet_recv(dir) <= 0) {
 
     jcr->VolumeName[0] = 0;          /* No volume */
     if (bnet_recv(dir) <= 0) {
@@ -83,16 +86,17 @@ static int do_get_volume_info(JCR *jcr)
        return 0;
     }
     memset(&vol, 0, sizeof(vol));
        return 0;
     }
     memset(&vol, 0, sizeof(vol));
-    if (sscanf(dir->msg, OK_media, vol.VolCatName, 
+    Dmsg1(200, "Get vol info=%s\n", dir->msg);
+    n = sscanf(dir->msg, OK_media, vol.VolCatName, 
               &vol.VolCatJobs, &vol.VolCatFiles,
               &vol.VolCatBlocks, &vol.VolCatBytes,
               &vol.VolCatMounts, &vol.VolCatErrors,
               &vol.VolCatWrites, &vol.VolCatMaxBytes,
               &vol.VolCatCapacityBytes, vol.VolCatStatus,
               &vol.Slot, &vol.VolCatMaxJobs, &vol.VolCatMaxFiles,
               &vol.VolCatJobs, &vol.VolCatFiles,
               &vol.VolCatBlocks, &vol.VolCatBytes,
               &vol.VolCatMounts, &vol.VolCatErrors,
               &vol.VolCatWrites, &vol.VolCatMaxBytes,
               &vol.VolCatCapacityBytes, vol.VolCatStatus,
               &vol.Slot, &vol.VolCatMaxJobs, &vol.VolCatMaxFiles,
-              &vol.Drive, &vol.InChanger) != 16) {
-
-       Dmsg1(200, "Bad response from Dir: %s\n", dir->msg);
+              &vol.InChanger, &vol.VolReadTime, &vol.VolWriteTime);
+    if (n != 17) {
+       Dmsg2(100, "Bad response from Dir fields=%d: %s\n", n, dir->msg);
        Mmsg(&jcr->errmsg, _("Error getting Volume info: %s\n"), dir->msg);
        return 0;
     }
        Mmsg(&jcr->errmsg, _("Error getting Volume info: %s\n"), dir->msg);
        return 0;
     }
@@ -156,7 +160,7 @@ int dir_update_volume_info(JCR *jcr, DEVICE *dev, int label)
 {
    BSOCK *dir = jcr->dir_bsock;
    time_t EndTime = time(NULL);
 {
    BSOCK *dir = jcr->dir_bsock;
    time_t EndTime = time(NULL);
-   char ed1[50], ed2[50];
+   char ed1[50], ed2[50], ed3[50], ed4[50];
    VOLUME_CAT_INFO *vol = &dev->VolCatInfo;
 
    if (vol->VolCatName[0] == 0) {
    VOLUME_CAT_INFO *vol = &dev->VolCatInfo;
 
    if (vol->VolCatName[0] == 0) {
@@ -184,8 +188,11 @@ int dir_update_volume_info(JCR *jcr, DEVICE *dev, int label)
       vol->VolCatBlocks, edit_uint64(vol->VolCatBytes, ed1),
       vol->VolCatMounts, vol->VolCatErrors,
       vol->VolCatWrites, edit_uint64(vol->VolCatMaxBytes, ed2), 
       vol->VolCatBlocks, edit_uint64(vol->VolCatBytes, ed1),
       vol->VolCatMounts, vol->VolCatErrors,
       vol->VolCatWrites, edit_uint64(vol->VolCatMaxBytes, ed2), 
-      EndTime, vol->VolCatStatus, vol->Slot, label, vol->Drive, 
-      vol->InChanger);
+      EndTime, vol->VolCatStatus, vol->Slot, label,
+      vol->InChanger,
+      edit_uint64(vol->VolReadTime, ed3), 
+      edit_uint64(vol->VolWriteTime, ed4) );
+
    Dmsg1(120, "update_volume_info(): %s", dir->msg);
    unbash_spaces(vol->VolCatName);
 
    Dmsg1(120, "update_volume_info(): %s", dir->msg);
    unbash_spaces(vol->VolCatName);
 
index 3f27bd8170bd8fe7311d349cae8984a4d810be7e..32d717f0ae0aec5bb2017716e801ae182f50b397 100644 (file)
@@ -127,12 +127,13 @@ struct VOLUME_CAT_INFO {
    uint64_t VolCatRBytes;             /* Number of bytes read */
    uint32_t VolCatRecycles;           /* Number of recycles this volume */
    int32_t  Slot;                     /* Slot in changer */
    uint64_t VolCatRBytes;             /* Number of bytes read */
    uint32_t VolCatRecycles;           /* Number of recycles this volume */
    int32_t  Slot;                     /* Slot in changer */
-   int32_t  Drive;                    /* Changer drive */
    bool     InChanger;                /* Set if vol in current magazine */
    uint32_t VolCatMaxJobs;            /* Maximum Jobs to write to volume */
    uint32_t VolCatMaxFiles;           /* Maximum files to write to volume */
    uint64_t VolCatMaxBytes;           /* Max bytes to write to volume */
    uint64_t VolCatCapacityBytes;      /* capacity estimate */
    bool     InChanger;                /* Set if vol in current magazine */
    uint32_t VolCatMaxJobs;            /* Maximum Jobs to write to volume */
    uint32_t VolCatMaxFiles;           /* Maximum files to write to volume */
    uint64_t VolCatMaxBytes;           /* Max bytes to write to volume */
    uint64_t VolCatCapacityBytes;      /* capacity estimate */
+   uint64_t VolReadTime;              /* time spent reading */
+   uint64_t VolWriteTime;             /* time spent writing this Volume */
    char VolCatStatus[20];             /* Volume status */
    char VolCatName[MAX_NAME_LENGTH];  /* Desired volume to mount */
 };                
    char VolCatStatus[20];             /* Volume status */
    char VolCatName[MAX_NAME_LENGTH];  /* Desired volume to mount */
 };                
index 3f0b5ba51087b2a1033cb8a192c6e3d352817e9a..b821f338d5d0b1a776f64310f0839ca7b7cbebe6 100644 (file)
@@ -2,8 +2,8 @@
 #undef  VERSION
 #define VERSION "1.33"
 #define VSTRING "1"
 #undef  VERSION
 #define VERSION "1.33"
 #define VSTRING "1"
-#define BDATE   "18 Dec 2003"
-#define LSMDATE "18Dec03"
+#define BDATE   "20 Dec 2003"
+#define LSMDATE "20Dec03"
 
 /* Debug flags */
 #undef  DEBUG
 
 /* Debug flags */
 #undef  DEBUG