]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
catalog: Add support for Object Management
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Thu, 15 Oct 2020 06:02:31 +0000 (08:02 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:02:57 +0000 (09:02 +0100)
bacula/src/cats/bdb.h
bacula/src/cats/cats.c
bacula/src/cats/cats.h
bacula/src/cats/make_mysql_tables.in
bacula/src/cats/make_postgresql_tables.in
bacula/src/cats/protos.h
bacula/src/cats/sql_create.c
bacula/src/cats/sql_get.c
bacula/src/cats/sql_list.c

index c3193f1d6a42c84b64a9ba62de2f36f83d86778d..c5d1f5d3934341dff56e2debcb2b0205fe37a021 100644 (file)
@@ -269,6 +269,7 @@ public:
    void bdb_list_base_files_for_job(JCR *jcr, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx);
    void bdb_list_restore_objects(JCR *jcr, ROBJECT_DBR *rr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
    void bdb_list_plugin_objects(JCR *jcr, OBJECT_DBR *obj_r, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
+   void bdb_list_plugin_object_types(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
    void bdb_list_snapshot_records(JCR *jcr, SNAPSHOT_DBR *sdbr,
               DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
    void bdb_list_files(JCR *jcr, FILE_DBR *fr, DB_RESULT_HANDLER *sendit, void *ctx);
index a6be9775da5b4767263031214810d6c184360fe9..2ffbda6e2eb3f620268c7d7a4c58f6d95c6b6740 100644 (file)
@@ -149,108 +149,90 @@ void BDB::print_lock_info(FILE *fp)
    } 
 } 
 
-void parse_plugin_object_string(char **obj_str, OBJECT_DBR *obj_r)
+void OBJECT_DBR::parse_plugin_object_string(char **obj_str)
 {
+   /* TODO: Do some sanity checks on the input format */
    char *p = *obj_str;
-
-   obj_r->JobId = str_to_int32(p);
-   skip_nonspaces(&p);                  /* skip JobId */
-   skip_spaces(&p);
-
-   obj_r->Path = p;
+   int fnl, pnl;
+   char* tmp_path = p;
    skip_nonspaces(&p);                  /* skip Path */
    skip_spaces(&p);
-   char *c = strpbrk(obj_r->Path, " ");
+   char *c = strpbrk(tmp_path, " ");
    if (c) {
       *c = '\0';
    }
 
-   obj_r->Filename = p;
-   skip_nonspaces(&p);                  /* skip FileName */
+   if (tmp_path[strlen(tmp_path) - 1] == '/') {
+      pm_strcpy(Path, tmp_path);
+      unbash_spaces(Path);
+   } else {
+      split_path_and_filename(tmp_path, &Path, &pnl, &Filename, &fnl);
+      unbash_spaces(Path);
+      unbash_spaces(Filename);
+   }
+
+   char *tmp = p;
+   skip_nonspaces(&p);                  /* skip PluginName */
    skip_spaces(&p);
-   c = strpbrk(obj_r->Filename, " ");
+   c = strpbrk(tmp, " ");
    if (c) {
       *c = '\0';
    }
+   pm_strcpy(PluginName, tmp);
+   unbash_spaces(PluginName);
 
-   obj_r->PluginName = p;
-   skip_nonspaces(&p);                  /* skip PluginName */
+   tmp = p;
+   skip_nonspaces(&p);                  /* skip ObjectType */
    skip_spaces(&p);
-   c = strpbrk(obj_r->PluginName, " ");
+   c = strpbrk(tmp, " ");
    if (c) {
       *c = '\0';
    }
+   bstrncpy(ObjectCategory, tmp, sizeof(ObjectCategory));
+   unbash_spaces(ObjectCategory);
 
-   char *obj_type = p;
+   tmp = p;
    skip_nonspaces(&p);                  /* skip ObjectType */
    skip_spaces(&p);
-   c = strpbrk(obj_type, " ");
+   c = strpbrk(tmp, " ");
    if (c) {
       *c = '\0';
    }
-   bstrncpy(obj_r->ObjectType, obj_type, sizeof(obj_r->ObjectType));
+   bstrncpy(ObjectType, tmp, sizeof(ObjectType));
+   unbash_spaces(ObjectType);
 
-   obj_r->ObjectName = p;
+   tmp = p;
    skip_nonspaces(&p);                  /* skip ObjectName */
    skip_spaces(&p);
-   c = strpbrk(obj_r->ObjectName, " ");
+   c = strpbrk(tmp, " ");
    if (c) {
       *c = '\0';
    }
+   bstrncpy(ObjectName, tmp, sizeof(ObjectName));
+   unbash_spaces(ObjectName);
 
-   obj_r->ObjectSource = p;
+   tmp = p;
    skip_nonspaces(&p);                  /* skip ObjectSource */
    skip_spaces(&p);
-   c = strpbrk(obj_r->ObjectSource, " ");
+   c = strpbrk(tmp, " ");
    if (c) {
       *c = '\0';
    }
+   bstrncpy(ObjectSource, tmp, sizeof(ObjectSource));
+   unbash_spaces(ObjectSource);
 
-   obj_r->ObjectUUID = p;
+   tmp = p;
    skip_nonspaces(&p);                  /* skip ObjectUuid */
    skip_spaces(&p);
-   c = strpbrk(obj_r->ObjectUUID, " ");
+   c = strpbrk(tmp, " ");
    if (c) {
       *c = '\0';
    }
+   bstrncpy(ObjectUUID, tmp, sizeof(ObjectUUID));
+   unbash_spaces(ObjectUUID);
 
-   obj_r->ObjectSize = str_to_uint64(p);
+   ObjectSize = str_to_uint64(p);
 }
 
 
-void parse_restore_object_string(char **r_obj_str, ROBJECT_DBR *robj_r)
-{
-   char *p = *r_obj_str;
-   int len;
-
-   robj_r->FileIndex = str_to_int32(p);        /* FileIndex */
-   skip_nonspaces(&p);
-   skip_spaces(&p);
-   robj_r->FileType = str_to_int32(p);        /* FileType */
-   skip_nonspaces(&p);
-   skip_spaces(&p);
-   robj_r->object_index = str_to_int32(p);    /* Object Index */
-   skip_nonspaces(&p);
-   skip_spaces(&p);
-   robj_r->object_len = str_to_int32(p);      /* object length possibly compressed */
-   skip_nonspaces(&p);
-   skip_spaces(&p);
-   robj_r->object_full_len = str_to_int32(p); /* uncompressed object length */
-   skip_nonspaces(&p);
-   skip_spaces(&p);
-   robj_r->object_compression = str_to_int32(p); /* compression */
-   skip_nonspaces(&p);
-   skip_spaces(&p);
-
-   robj_r->plugin_name = p;                      /* point to plugin name */
-   len = strlen(robj_r->plugin_name);
-   robj_r->object_name = &robj_r->plugin_name[len+1]; /* point to object name */
-   len = strlen(robj_r->object_name);
-   robj_r->object = &robj_r->object_name[len+1];      /* point to object */
-   robj_r->object[robj_r->object_len] = 0;            /* add zero for those who attempt printing */
-   Dmsg7(100, "oname=%s stream=%d FT=%d FI=%d JobId=%ld, obj_len=%d\nobj=\"%s\"\n",
-      robj_r->object_name, robj_r->Stream, robj_r->FileType, robj_r->FileIndex, robj_r->JobId,
-      robj_r->object_len, robj_r->object);
-}
-
 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ 
index 60d82feeb9a455dc7db98e15d0c67789e56b5688..61881244c385f0ad9217e63f2cafe392b549ae16 100644 (file)
@@ -240,19 +240,47 @@ struct ATTR_DBR {
 
 class OBJECT_DBR {
 public:
-   OBJECT_DBR() { bmemset(this, 0, sizeof(OBJECT_DBR)); };
-   ~OBJECT_DBR() { };
+   OBJECT_DBR() { 
+      Path = get_pool_memory(PM_FNAME);
+      Filename = get_pool_memory(PM_FNAME);
+      PluginName = get_pool_memory(PM_FNAME);
+      reset();
+   };
+   ~OBJECT_DBR() { 
+      free_pool_memory(Path);
+      free_pool_memory(Filename);
+      free_pool_memory(PluginName);
+   };
+   /* reset memory */
+   void reset() {
+      JobId = 0;
+      ObjectId = 0;
+      ObjectSize = 0;
+      *Path = *Filename = *PluginName = 0;
+      *ObjectCategory = *ObjectType = *ObjectName = *ObjectSource = *ObjectUUID = *ClientName = 0;
+      limit = 0;
+      order = 0;
+   };
+   /* Parse OBJECT record from stream */
+   void parse_plugin_object_string(char **obj_str);
 
    DBId_t ObjectId;
    JobId_t  JobId;
-   char *Path;
-   char *Filename;
-   char *PluginName;
+   POOLMEM *Path;
+   POOLMEM *Filename;
+   POOLMEM *PluginName;
+   char ObjectCategory[MAX_NAME_LENGTH];
    char ObjectType[MAX_NAME_LENGTH];
-   char *ObjectName;
-   char *ObjectSource;
-   char *ObjectUUID;
+   char ObjectName[MAX_NAME_LENGTH];
+   char ObjectSource[MAX_NAME_LENGTH];
+   char ObjectUUID[MAX_NAME_LENGTH];
    uint64_t ObjectSize;
+
+   /* Fields not stored in db directly */
+   char ClientName[MAX_NAME_LENGTH];
+
+   int limit;
+   int order;
 };
 
 struct ROBJECT_DBR {
@@ -695,7 +723,6 @@ int DeleteDB(const char *file, int line, JCR *jcr, BDB *db, char *delete_cmd);
 void split_path_and_file(JCR *jcr, BDB *mdb, const char *fname);
 
 /* Helper functions */
-void parse_plugin_object_string(char **obj_str, OBJECT_DBR *obj_r);
 void parse_restore_object_string(char **obj_str, ROBJECT_DBR *r_r);
 
 #endif  /* __CATS_H_ */
index fd7f4f9e634c7e599140505dabeff1cf65cedda0..9daf6a4f265c35e8bc892c6e7bcd2d90d5e479ae 100644 (file)
@@ -64,16 +64,17 @@ CREATE TABLE Object
 (
    ObjectId     BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
 
-   JobId        integer  not null,
-   Path         BLOB NOT NULL,
-   Filename     BLOB NOT NULL,
-   PluginName   TINYBLOB NOT NULL,
-
-   ObjectType   TINYBLOB     NOT NULL,
-   ObjectName   TINYBLOB     NOT NULL,
-   ObjectSource TINYBLOB     NOT NULL,
-   ObjectUUID   TINYBLOB     NOT NULL,
-   ObjectSize   bigint       NOT NULL,
+   JobId           integer  not null,
+   Path            BLOB NOT NULL,
+   Filename        BLOB NOT NULL,
+   PluginName      TINYBLOB NOT NULL,
+
+   ObjectCategory  TINYBLOB NOT NULL,
+   ObjectType      TINYBLOB NOT NULL,
+   ObjectName      TINYBLOB NOT NULL,
+   ObjectSource    TINYBLOB NOT NULL,
+   ObjectUUID      TINYBLOB NOT NULL,
+   ObjectSize      bigint   NOT NULL,
    primary key (ObjectId)
 );
 
index 9c7313dd6eefe6f5af76226aa094ba5504b01ab3..27abc86ebd630a33391764f41899a6ca6f696a81 100644 (file)
@@ -52,11 +52,12 @@ CREATE TABLE Object
    Filename     text     not null,
    PluginName   text     not null,
 
-   ObjectType   text     not null,
-   ObjectName   text     not null,
-   ObjectSource text     not null,
-   ObjectUUID   text     not null,
-   ObjectSize   bigint   not null,
+   ObjectCategory  text     not null,
+   ObjectType      text     not null,
+   ObjectName      text     not null,
+   ObjectSource    text     not null,
+   ObjectUUID      text     not null,
+   ObjectSize      bigint   not null,
    primary key (ObjectId)
 );
 
index f4e9e9b150f23a4d36b8a447c3f9e10c3eb15bef..055b46d5162f2d229f075c9f4fd59a67401b9d28 100644 (file)
@@ -286,6 +286,8 @@ void bdb_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr);
            mdb->bdb_list_events_records(jcr, rec, sendit, ctx, type)
 #define db_list_base_files_for_job(jcr, mdb, jobid, sendit, ctx) \
            mdb->bdb_list_base_files_for_job(jcr, jobid, sendit, ctx)
+#define db_list_plugin_object_types(jcr, mdb, sendit, ctx, type) \
+           mdb->bdb_list_plugin_object_types(jcr, sendit, ctx, type)
 #define db_list_plugin_objects(jcr, mdb, obj_r, sendit, ctx, type) \
            mdb->bdb_list_plugin_objects(jcr, obj_r, sendit, ctx, type)
 #define db_list_restore_objects(jcr, mdb, rr, sendit, ctx, type) \
index b8a1a3bfd74090ac64f3d0eed4a02dd31071ab00..919fd98da5e3bdbab2477d14e7cdc043510ec551 100644 (file)
@@ -1179,10 +1179,11 @@ bool BDB::bdb_create_object_record(JCR *jcr, OBJECT_DBR *obj)
    POOLMEM *esc_path = get_pool_memory(PM_MESSAGE);
    POOLMEM *esc_filename = get_pool_memory(PM_MESSAGE);
    POOLMEM *esc_plugin_name = get_pool_memory(PM_MESSAGE);
-   POOLMEM *esc_obj_type = get_pool_memory(PM_MESSAGE);
-   POOLMEM *esc_obj_name = get_pool_memory(PM_MESSAGE);
-   POOLMEM *esc_obj_source = get_pool_memory(PM_MESSAGE);
-   POOLMEM *esc_obj_uuid = get_pool_memory(PM_MESSAGE);
+   char esc_obj_category[MAX_ESCAPE_NAME_LENGTH];
+   char esc_obj_type[MAX_ESCAPE_NAME_LENGTH];
+   char esc_obj_name[MAX_ESCAPE_NAME_LENGTH];
+   char esc_obj_source[MAX_ESCAPE_NAME_LENGTH];
+   char esc_obj_uuid[MAX_ESCAPE_NAME_LENGTH];
 
    str_len = strlen(obj->Path);
    esc_path = check_pool_memory_size(esc_path, str_len*2+1);
@@ -1196,28 +1197,18 @@ bool BDB::bdb_create_object_record(JCR *jcr, OBJECT_DBR *obj)
    esc_plugin_name = check_pool_memory_size(esc_plugin_name, str_len*2+1);
    bdb_escape_string(jcr, esc_plugin_name, obj->PluginName, str_len);
 
-   str_len = strlen(obj->ObjectType);
-   esc_obj_type = check_pool_memory_size(esc_obj_type, str_len*2+1);
-   bdb_escape_string(jcr, esc_obj_type, obj->ObjectType, str_len);
-
-   str_len = strlen(obj->ObjectName);
-   esc_obj_name = check_pool_memory_size(esc_obj_name, str_len*2+1);
-   bdb_escape_string(jcr, esc_obj_name, obj->ObjectName, str_len);
-
-   str_len = strlen(obj->ObjectSource);
-   esc_obj_source = check_pool_memory_size(esc_obj_source, str_len*2+1);
-   bdb_escape_string(jcr, esc_obj_source, obj->ObjectSource, str_len);
-
-   str_len = strlen(obj->ObjectUUID);
-   esc_obj_uuid= check_pool_memory_size(esc_obj_uuid, str_len*2+1);
-   bdb_escape_string(jcr, esc_obj_uuid, obj->ObjectUUID, str_len);
+   bdb_escape_string(jcr, esc_obj_category, obj->ObjectCategory, strlen(obj->ObjectCategory));
+   bdb_escape_string(jcr, esc_obj_type, obj->ObjectType, strlen(obj->ObjectType));
+   bdb_escape_string(jcr, esc_obj_name, obj->ObjectName, strlen(obj->ObjectName));
+   bdb_escape_string(jcr, esc_obj_source, obj->ObjectSource, strlen(obj->ObjectSource));
+   bdb_escape_string(jcr, esc_obj_uuid, obj->ObjectUUID, strlen(obj->ObjectUUID));
 
    bdb_lock();
    Mmsg(cmd,
-         "INSERT INTO Object (JobId, Path, Filename, PluginName, "
+         "INSERT INTO Object (JobId, Path, Filename, PluginName, ObjectCategory, "
          "ObjectType, ObjectName, ObjectSource, ObjectUUID, ObjectSize) "
-         "VALUES (%u, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %llu)",
-         obj->JobId, esc_path, esc_filename, esc_plugin_name,
+         "VALUES (%lu, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %llu)",
+         obj->JobId, esc_path, esc_filename, esc_plugin_name, esc_obj_category,
          esc_obj_type, esc_obj_name, esc_obj_source, esc_obj_uuid,
          obj->ObjectSize);
 
@@ -1235,11 +1226,6 @@ bool BDB::bdb_create_object_record(JCR *jcr, OBJECT_DBR *obj)
    free_pool_memory(esc_path);
    free_pool_memory(esc_filename);
    free_pool_memory(esc_plugin_name);
-   free_pool_memory(esc_obj_type);
-   free_pool_memory(esc_obj_name);
-   free_pool_memory(esc_obj_source);
-   free_pool_memory(esc_obj_uuid);
-
    return ret;
 }
 
index c052a0f5447dcc2a65672d1f12595ff613e9e36d..498596eb63ef2701a78c451fac775318926665bb 100644 (file)
@@ -744,9 +744,6 @@ void db_free_pluginobject_record(JCR *jcr, OBJECT_DBR *obj_r)
       bfree_and_null(obj_r->Path);
       bfree_and_null(obj_r->Filename);
       bfree_and_null(obj_r->PluginName);
-      bfree_and_null(obj_r->ObjectName);
-      bfree_and_null(obj_r->ObjectSource);
-      bfree_and_null(obj_r->ObjectUUID);
 }
 
 /*
@@ -754,17 +751,103 @@ void db_free_pluginobject_record(JCR *jcr, OBJECT_DBR *obj_r)
  *  */
 bool BDB::bdb_get_plugin_object_record(JCR *jcr, OBJECT_DBR *obj_r)
 {
+   //TODO cleanup it as well so that append_filter is used
    SQL_ROW row;
-   POOLMEM *where_str = get_pool_memory(PM_MESSAGE);
+   POOL_MEM where_str(PM_MESSAGE);
+   POOL_MEM tmp(PM_MESSAGE);
+   POOL_MEM esc(PM_MESSAGE);
    int stat = false;
 
-   Mmsg(where_str, "JobID=%lu AND ObjectID=%lu", obj_r->JobId, obj_r->ObjectId);
+   if (obj_r->JobId > 0) {
+      Mmsg(tmp, "%s JobId=%lu ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->JobId);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   if (obj_r->ObjectId > 0) {
+      Mmsg(tmp, "%s ObjectId=%lu ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->ObjectId);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   //TODO is that surely needed for bdb_escape_string() calls?
+   bdb_lock();
+
+   esc.check_size(strlen(obj_r->Path)*2+1);
+   if (*obj_r->Path) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->Path, strlen(obj_r->Path));
+      Mmsg(tmp, "%s Path='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->Path);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   esc.check_size(strlen(obj_r->Filename)*2+1);
+   if (*obj_r->Filename) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->Filename, strlen(obj_r->Filename));
+      Mmsg(tmp, "%s Filename='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->Filename);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   esc.check_size(strlen(obj_r->PluginName)*2+1);
+   if (*obj_r->PluginName) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->PluginName, strlen(obj_r->PluginName));
+      Mmsg(tmp, "%s PluginName='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->PluginName);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   // Other fields are fixed-size
+   esc.check_size(MAX_ESCAPE_NAME_LENGTH);
+   if (*obj_r->ObjectType) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ObjectType, strlen(obj_r->ObjectType));
+      Mmsg(tmp, "%s ObjectType='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->ObjectType);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   if (*obj_r->ObjectName) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ObjectName, strlen(obj_r->ObjectName));
+      Mmsg(tmp, "%s ObjectName='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->ObjectName);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   if (*obj_r->ObjectSource) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ObjectSource, strlen(obj_r->ObjectSource));
+      Mmsg(tmp, "%s ObjectSource='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->ObjectSource);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   if (*obj_r->ObjectUUID) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ObjectUUID, strlen(obj_r->ObjectUUID));
+      Mmsg(tmp, "%s ObjectUUID='%s' ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->ObjectUUID);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
+   if (obj_r->ObjectSize) {
+      Mmsg(tmp, "%s ObjectSize=%llu ",
+           where_str.c_str()[0] == 0? "WHERE" : "AND",
+           obj_r->ObjectSize);
+      pm_strcat(where_str, tmp.c_str());
+   }
+
    Mmsg(cmd,
          "SELECT ObjectId, JobId, Path, Filename, PluginName, "
                  "ObjectType, ObjectName, ObjectSource, ObjectUUID, ObjectSize "
-         "FROM Object WHERE %s", where_str);
+         "FROM Object %s", where_str.c_str());
 
-   bdb_lock();
    if (QueryDB(jcr, cmd)) {
       if (sql_num_rows() > 1) {
          char ed1[30];
@@ -776,19 +859,17 @@ bool BDB::bdb_get_plugin_object_record(JCR *jcr, OBJECT_DBR *obj_r)
          Mmsg2(errmsg, _("PluginOjbect with JobId=%lu ObjectId=%lu not found.\n"),
                obj_r->JobId, obj_r->ObjectId);
       } else {
-         db_free_pluginobject_record(jcr, obj_r);
-
          obj_r->ObjectId = str_to_uint64(row[0]);
          obj_r->JobId = str_to_uint64(row[1]);
-         obj_r->Path = bstrdup(row[2]);
-         obj_r->Filename = bstrdup(row[3]);
-         obj_r->PluginName = bstrdup(row[4]);
-         bstrncpy(obj_r->ObjectType, row[5], 128);
-         obj_r->ObjectName = row[6];
-         obj_r->ObjectName = bstrdup(row[7]);
-         obj_r->ObjectSource = bstrdup(row[8]);
-         obj_r->ObjectUUID = bstrdup(row[8]);
+         pm_strcpy(obj_r->Path, row[2]);
+         pm_strcpy(obj_r->Filename, row[3]);
+         pm_strcpy(obj_r->PluginName, row[4]);
+         bstrncpy(obj_r->ObjectType, row[5], sizeof(obj_r->ObjectType));
+         bstrncpy(obj_r->ObjectName, row[6], sizeof(obj_r->ObjectName));
+         bstrncpy(obj_r->ObjectSource, row[7], sizeof(obj_r->ObjectSource));
+         bstrncpy(obj_r->ObjectUUID, row[8], sizeof(obj_r->ObjectUUID));
          obj_r->ObjectSize = str_to_uint64(row[9]);
+
          stat = true;
       }
    } else {
@@ -797,8 +878,6 @@ bool BDB::bdb_get_plugin_object_record(JCR *jcr, OBJECT_DBR *obj_r)
 
    bdb_unlock();
 
-bail_out:
-   free_pool_memory(where_str);
    return stat;
 }
 /*
@@ -1611,7 +1690,9 @@ bool BDB::bdb_get_accurate_jobids(JCR *jcr,
 
    /* build a jobid list ie: 1,2,3,4 */
    Mmsg(query, "SELECT JobId FROM btemp3%s ORDER by JobTDate", jobid);
-   bdb_sql_query(query.c_str(), db_list_handler, jobids);
+   if(!bdb_sql_query(query.c_str(), db_list_handler, jobids)) {
+      goto bail_out;
+   }
    Dmsg1(1, "db_get_accurate_jobids=%s\n", jobids->list);
    ret = true;
 
index 2f73a28bf2f78286066403e7c70c46bf20deb487..d5d3f075794a3653556138bdd5feae96f73c895c 100644 (file)
@@ -139,42 +139,91 @@ void BDB::bdb_list_client_records(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx,
 }
 
 
+/*
+ * List plugin objects types
+ */
+void BDB::bdb_list_plugin_object_types(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
+{
+   Mmsg(cmd, "SELECT DISTINCT ObjectType FROM Object");
+   bdb_lock();
+
+
+   if (!QueryDB(jcr, cmd)) {
+      Jmsg(jcr, M_ERROR, 0, _("Query %s failed!\n"), cmd);
+      bdb_unlock();
+      return;
+   }
+
+   list_result(jcr, this, sendit, ctx, type);
+
+   sql_free_result();
+   bdb_unlock();
+}
+
 /*
  * List plugin objects
  */
 void BDB::bdb_list_plugin_objects(JCR *jcr, OBJECT_DBR *obj_r, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
-   char esc[MAX_ESCAPE_NAME_LENGTH];
+   POOL_MEM esc(PM_MESSAGE), tmp(PM_MESSAGE), where(PM_MESSAGE), join(PM_MESSAGE);
 
    bdb_lock();
 
-   if (type == HORZ_LIST) {
-      if (obj_r->ObjectType[0] != 0) {
-         bdb_escape_string(jcr, esc, obj_r->ObjectType, strlen(obj_r->ObjectType));
-         Mmsg(cmd,
-            "SELECT ObjectId, JobId, "
-                    "ObjectType, ObjectName "
-            "FROM Object WHERE ObjectType='%s'",
-            esc);
-      } else {
-         Mmsg(cmd,
-               "SELECT ObjectId, JobId, "
-                       "ObjectType, ObjectName "
-               "FROM Object ORDER BY ObjectId");
-      }
-   } else {
-      if (obj_r->ObjectType[0] != 0) {
-         bdb_escape_string(jcr, esc, obj_r->ObjectType, strlen(obj_r->ObjectType));
+   //TODO add ACL part
+   if (obj_r->ObjectName[0] != 0) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ObjectName, strlen(obj_r->ObjectName));
+      Mmsg(tmp, " Object.ObjectName='%s'", esc.c_str());
+      append_filter(where.addr(), tmp.c_str());
+   }
+
+   if (obj_r->ObjectType[0] != 0) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ObjectType, strlen(obj_r->ObjectType));
+      Mmsg(tmp, " Object.ObjectType='%s'", esc.c_str());
+      append_filter(where.addr(), tmp.c_str());
+   }
+
+   if (obj_r->ObjectId != 0) {
+      Mmsg(tmp, " Object.ObjectId=%d", obj_r->ObjectId);
+      append_filter(where.addr(), tmp.c_str());
+   }
+
+   if (obj_r->JobId != 0) {
+      Mmsg(tmp, " Object.JobId=%d", obj_r->JobId);
+      append_filter(where.addr(), tmp.c_str());
+   }
+
+   if (obj_r->ClientName[0] != 0) {
+      bdb_escape_string(jcr, esc.c_str(), obj_r->ClientName, strlen(obj_r->ClientName));
+      Mmsg(tmp, " Client.Name='%s'", esc.c_str());
+      append_filter(where.addr(), tmp.c_str());
+      Mmsg(join, " INNER JOIN Job On Object.JobId=Job.JobId "   
+                 " INNER JOIN Client ON Job.ClientId=Client.ClientId ");
+   }
+
+
+   Mmsg(tmp, " ORDER BY ObjectId %s ", obj_r->order ? "DESC" : "ASC");
+   pm_strcat(where, tmp.c_str());
+
+   if (obj_r->limit) {
+      Mmsg(tmp, " LIMIT %d ", obj_r->limit);
+      pm_strcat(where, tmp.c_str());
+   }
+
+   switch (type) {
+   case VERT_LIST:
          Mmsg(cmd,
-            "SELECT ObjectId, JobId, Path, Filename, "
-                    "ObjectType, ObjectName, ObjectSource, ObjectUUID, ObjectSize "
-            "FROM Object WHERE ObjectType='%s'", esc);
-      } else {
+            "SELECT Object.ObjectId, Object.JobId, Object.Path, Object.Filename, Object.PluginName, Object.ObjectCategory, "
+                    "Object.ObjectType, Object.ObjectName, Object.ObjectSource, Object.ObjectUUID, Object.ObjectSize "
+            "FROM Object %s %s", join.c_str(), where.c_str());
+         break;
+   case HORZ_LIST:
          Mmsg(cmd,
-            "SELECT ObjectId, JobId, Path, Filename, "
-                    "ObjectType, ObjectName, ObjectSource, ObjectUUID, ObjectSize "
-            "FROM Object ORDER BY ObjectId");
-      }
+            "SELECT Object.ObjectId, Object.JobId, Object.ObjectCategory, "
+                    "Object.ObjectType, Object.ObjectName "
+            "FROM Object %s %s", join.c_str(), where.c_str());
+         break;
+   default:
+         break;
    }
 
    if (!QueryDB(jcr, cmd)) {