From: Michal Rakowski Date: Thu, 15 Oct 2020 06:02:31 +0000 (+0200) Subject: catalog: Add support for Object Management X-Git-Tag: Release-11.3.2~999 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5aec4429d09a7b4f39619dacdbff7b0545a8f253;p=thirdparty%2Fbacula.git catalog: Add support for Object Management --- diff --git a/bacula/src/cats/bdb.h b/bacula/src/cats/bdb.h index c3193f1d6..c5d1f5d39 100644 --- a/bacula/src/cats/bdb.h +++ b/bacula/src/cats/bdb.h @@ -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); diff --git a/bacula/src/cats/cats.c b/bacula/src/cats/cats.c index a6be9775d..2ffbda6e2 100644 --- a/bacula/src/cats/cats.c +++ b/bacula/src/cats/cats.c @@ -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 */ diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 60d82feeb..61881244c 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -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_ */ diff --git a/bacula/src/cats/make_mysql_tables.in b/bacula/src/cats/make_mysql_tables.in index fd7f4f9e6..9daf6a4f2 100644 --- a/bacula/src/cats/make_mysql_tables.in +++ b/bacula/src/cats/make_mysql_tables.in @@ -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) ); diff --git a/bacula/src/cats/make_postgresql_tables.in b/bacula/src/cats/make_postgresql_tables.in index 9c7313dd6..27abc86eb 100644 --- a/bacula/src/cats/make_postgresql_tables.in +++ b/bacula/src/cats/make_postgresql_tables.in @@ -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) ); diff --git a/bacula/src/cats/protos.h b/bacula/src/cats/protos.h index f4e9e9b15..055b46d51 100644 --- a/bacula/src/cats/protos.h +++ b/bacula/src/cats/protos.h @@ -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) \ diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index b8a1a3bfd..919fd98da 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -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; } diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index c052a0f54..498596eb6 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -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; diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index 2f73a28bf..d5d3f0757 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -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)) {