From: Michal Rakowski Date: Wed, 9 Sep 2020 15:13:13 +0000 (+0200) Subject: catalog: Add initial Object Management code X-Git-Tag: Release-11.3.2~1029 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b1598889ae1f3055da2c739e1c0b3d39a33c678;p=thirdparty%2Fbacula.git catalog: Add initial Object Management code --- diff --git a/bacula/src/cats/bdb.h b/bacula/src/cats/bdb.h index 1ae1e9c52..a9d55295c 100644 --- a/bacula/src/cats/bdb.h +++ b/bacula/src/cats/bdb.h @@ -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); diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 60e15bc47..1b60b6acf 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -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; diff --git a/bacula/src/cats/protos.h b/bacula/src/cats/protos.h index fb6a40582..b54b583dc 100644 --- a/bacula/src/cats/protos.h +++ b/bacula/src/cats/protos.h @@ -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) \ diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index 02c7e8a83..4169ee167 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -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 * diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 22eaeb7e4..6ad3bc5f2 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -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 diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index 494d31889..899fcfe63 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -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 * diff --git a/bacula/src/filetypes.h b/bacula/src/filetypes.h index 7b766c433..c1bc1d9fd 100644 --- a/bacula/src/filetypes.h +++ b/bacula/src/filetypes.h @@ -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 */