]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
catalog: Add initial Object Management code
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Wed, 9 Sep 2020 15:13:13 +0000 (17:13 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:02:56 +0000 (09:02 +0100)
bacula/src/cats/bdb.h
bacula/src/cats/cats.h
bacula/src/cats/protos.h
bacula/src/cats/sql_create.c
bacula/src/cats/sql_get.c
bacula/src/cats/sql_list.c
bacula/src/filetypes.h

index 1ae1e9c5225b57e788aa9fb15909fb6c6d6e0afb..a9d55295c3eb250f712f2739e440af8ec67d1bc1 100644 (file)
@@ -203,6 +203,7 @@ public:
    bool bdb_create_mediatype_record(JCR *jcr, MEDIATYPE_DBR *mr);
    bool bdb_create_attributes_record(JCR *jcr, ATTR_DBR *ar);
    bool bdb_create_restore_object_record(JCR *jcr, ROBJECT_DBR *ar);
+   bool bdb_create_object_record(JCR *jcr, OBJECT_DBR *obj_r);
    bool bdb_create_base_file_attributes_record(JCR *jcr, ATTR_DBR *ar);
    bool bdb_commit_base_file_attributes_record(JCR *jcr);
    bool bdb_create_base_file_list(JCR *jcr, char *jobids);
@@ -244,6 +245,7 @@ public:
    bool bdb_get_accurate_jobids(JCR *jcr, JOB_DBR *jr, db_list_ctx *jobids);
    bool bdb_get_used_base_jobids(JCR *jcr, POOLMEM *jobids, db_list_ctx *result);
    bool bdb_get_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr);
+   bool bdb_get_plugin_object_record(JCR *jcr, OBJECT_DBR *obj_r);
    int  bdb_get_num_restoreobject_records(JCR *jcr, ROBJECT_DBR *rr);
    bool bdb_get_job_statistics(JCR *jcr, JOB_DBR *jr);
    bool bdb_get_client_pool(JCR *jcr, alist *results);
@@ -263,6 +265,7 @@ public:
    void bdb_list_events_records(JCR *jcr, EVENTS_DBR *rec, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
    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_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 60e15bc47ccf943424d98950e092e371ca3b9ce8..1b60b6acf880a47d52c9effe28f5e980fc2341e3 100644 (file)
@@ -238,6 +238,23 @@ struct ATTR_DBR {
    int DigestType;
 };
 
+class OBJECT_DBR {
+public:
+   OBJECT_DBR() { bmemset(this, 0, sizeof(OBJECT_DBR)); };
+   ~OBJECT_DBR() { };
+
+   DBId_t ObjectId;
+   JobId_t  JobId;
+   char *Path;
+   char *Filename;
+   char *PluginName;
+   char *ObjectType;
+   char *ObjectName;
+   char *ObjectSource;
+   char *ObjectUUID;
+   uint64_t ObjectSize;
+};
+
 struct ROBJECT_DBR {
    char *object_name;
    char *object;
index fb6a40582fcfa8cc2fdc1d86cc08965191bf0072..b54b583dc065de755d23161e3a29a84983b2a9c6 100644 (file)
@@ -146,6 +146,8 @@ void bdb_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr);
            mdb->bdb_create_attributes_record(jcr, ar)
 #define db_create_restore_object_record(jcr, mdb, ar) \
            mdb->bdb_create_restore_object_record(jcr, ar)
+#define db_create_object_record(jcr, mdb, obj_r) \
+           mdb->bdb_create_object_record(jcr, obj_r)
 #define db_create_base_file_attributes_record(jcr, mdb, ar) \
            mdb->bdb_create_base_file_attributes_record(jcr, ar)
 #define db_commit_base_file_attributes_record(jcr, mdb) \
@@ -240,6 +242,8 @@ void bdb_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr);
            mdb->bdb_get_used_base_jobids(jcr, jobids, result)
 #define db_get_restoreobject_record(jcr, mdb, rr) \
            mdb->bdb_get_restoreobject_record(jcr, rr)
+#define db_get_plugin_object_record(jcr, mdb, obj_r) \
+           mdb->bdb_get_plugin_object_record(jcr, obj_r)
 #define db_get_num_restoreobject_records(jcr, mdb, rr) \
            mdb->bdb_get_num_restoreobject_records(jcr, rr)
 #define db_get_type_index(mdb) \
@@ -277,6 +281,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_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) \
            mdb->bdb_list_restore_objects(jcr, rr, sendit, ctx, type)
 #define db_list_snapshot_records(jcr, mdb, snapdbr, sendit, ua, llist) \
index 02c7e8a83b9745b149f4cb5274881217021d0c2a..4169ee1675b5e58964aab6575613df83df2469a2 100644 (file)
@@ -1167,6 +1167,82 @@ bail_out:
    return ret;
 }
 
+/**
+ * Create Plugin Object record in BDB
+ *
+ */
+bool BDB::bdb_create_object_record(JCR *jcr, OBJECT_DBR *obj)
+{
+   bool ret = false;
+   int str_len;
+
+   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);
+
+   str_len = strlen(obj->Path);
+   esc_path = check_pool_memory_size(esc_path, str_len*2+1);
+   bdb_escape_string(jcr, esc_path, obj->Path, str_len);
+
+   str_len = strlen(obj->Filename);
+   esc_filename = check_pool_memory_size(esc_filename, str_len*2+1);
+   bdb_escape_string(jcr, esc_filename, obj->Filename, str_len);
+
+   str_len = strlen(obj->PluginName);
+   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_lock();
+   Mmsg(cmd,
+         "INSERT INTO Object (JobId, Path, Filename, PluginName, "
+         "ObjectType, ObjectName, ObjectSource, ObjectUUID, ObjectSize) "
+         "VALUES (%u, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %llu)",
+         obj->JobId, esc_path, esc_filename, esc_plugin_name,
+         esc_obj_type, esc_obj_name, esc_obj_source, esc_obj_uuid,
+         obj->ObjectSize);
+
+   obj->ObjectId = sql_insert_autokey_record(cmd, NT_("Object"));
+   if (obj->ObjectId == 0) {
+      Mmsg2(&errmsg, _("Create database Plugin Object record %s failed. ERR=%s"),
+         cmd, sql_strerror());
+      Jmsg(jcr, M_FATAL, 0, "%s", errmsg);
+      ret = false;
+   } else {
+      ret = true;
+   }
+   bdb_unlock();
+
+   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;
+}
+
 /**
  * Create Restore Object record in BDB
  *
index 22eaeb7e42d9ea9784864cda76c4505dd3ed058f..6ad3bc5f20266da5ee0b0163f3e1978bcf2b6281 100644 (file)
@@ -739,6 +739,34 @@ void db_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr)
    rr->object = rr->plugin_name = rr->object_name = NULL;
 }
 
+/*
+ *  TODO Update doc
+ *  */
+bool BDB::bdb_get_plugin_object_record(JCR *jcr, OBJECT_DBR *obj_r)
+{
+   SQL_ROW row;
+   int stat = false;
+
+   /*TODO Probably only specified
+         ObjectId/JobId records should be retrieved hennce Mmsg without additional args for now
+   */
+   Mmsg(cmd,
+         "SELECT JobId, Path, Filename, PluginName, "
+                 "ObjectType, ObjectName, ObjectSource, ObjectUUID, ObjectSize "
+         "FROM Object");
+
+   bdb_lock();
+   if (QueryDB(jcr, cmd)) {
+         //TODO fill that part
+         stat = true;
+   } else {
+      //err
+      Jmsg(jcr, M_ERROR, 0, _("Query %s failed!\n"), cmd);
+   }
+
+   bdb_unlock();
+   return stat;
+}
 /*
  * Get RestoreObject  Record
  * If the RestoreObjectId is non-zero, we get its record
index 494d31889a2e799b4dc50afea2bc6d0fcc8eb0e7..899fcfe63db9c5e37df7de29a8fb61a4bf676fa3 100644 (file)
@@ -138,6 +138,33 @@ void BDB::bdb_list_client_records(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx,
    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)
+{
+
+   //TODO Fixup fields displayed
+   Mmsg(cmd,
+         "SELECT ObjectId, JobId, "
+                 "ObjectType, ObjectName "
+         "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 restore objects
  *
index 7b766c43362378d35dc0d585188d7b832d3f34ff..c1bc1d9fd3c7b3c44c49b65e47566a0c41cb9009 100644 (file)
@@ -70,6 +70,7 @@
 #define FT_JUNCTION  26               /* Win32 Junction point or Symlink to a dir */
 #define FT_PLUGIN_CONFIG 27           /* Object for Plugin configuration */
 #define FT_PLUGIN_CONFIG_FILLED 28    /* Object for Plugin configuration filled by Director */
+#define FT_PLUGIN_OBJECT 29           /* Opaque Plugin Object used for Object Management*/
 
 /* Definitions for upper part of type word (see above). */
 #define AR_DATA_STREAM (1<<16)        /* Data stream id present */