&mdb->m_lock, mdb->m_lock.w_active, mdb->m_lock.w_wait);
}
}
-
+
+void parse_plugin_object_string(char **obj_str, OBJECT_DBR *obj_r)
+{
+ char *p = *obj_str;
+
+ obj_r->JobId = str_to_int32(p);
+ skip_nonspaces(&p); /* skip JobId */
+ skip_spaces(&p);
+
+ obj_r->Path = p;
+ skip_nonspaces(&p); /* skip Path */
+ skip_spaces(&p);
+ char *c = strpbrk(obj_r->Path, " ");
+ if (c) {
+ *c = '\0';
+ }
+
+ obj_r->Filename = p;
+ skip_nonspaces(&p); /* skip FileName */
+ skip_spaces(&p);
+ c = strpbrk(obj_r->Filename, " ");
+ if (c) {
+ *c = '\0';
+ }
+
+ obj_r->PluginName = p;
+ skip_nonspaces(&p); /* skip PluginName */
+ skip_spaces(&p);
+ c = strpbrk(obj_r->PluginName, " ");
+ if (c) {
+ *c = '\0';
+ }
+
+ char *obj_type = p;
+ skip_nonspaces(&p); /* skip ObjectType */
+ skip_spaces(&p);
+ c = strpbrk(obj_type, " ");
+ if (c) {
+ *c = '\0';
+ }
+ bstrncpy(obj_r->ObjectType, obj_type, sizeof(obj_r->ObjectType));
+
+ obj_r->ObjectName = p;
+ skip_nonspaces(&p); /* skip ObjectName */
+ skip_spaces(&p);
+ c = strpbrk(obj_r->ObjectName, " ");
+ if (c) {
+ *c = '\0';
+ }
+
+ obj_r->ObjectSource = p;
+ skip_nonspaces(&p); /* skip ObjectSource */
+ skip_spaces(&p);
+ c = strpbrk(obj_r->ObjectSource, " ");
+ if (c) {
+ *c = '\0';
+ }
+
+ obj_r->ObjectUUID = p;
+ skip_nonspaces(&p); /* skip ObjectUuid */
+ skip_spaces(&p);
+ c = strpbrk(obj_r->ObjectUUID, " ");
+ if (c) {
+ *c = '\0';
+ }
+
+ obj_r->ObjectSize = str_to_uint64(p);
+}
+
#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */
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);
+
#endif /* __CATS_H_ */
skip_nonspaces(&p); /* skip FileType */
skip_spaces(&p);
- obj_r.JobId = str_to_int32(p);
- skip_nonspaces(&p); /* skip JobId */
- skip_spaces(&p);
-
- obj_r.Path = p;
- skip_nonspaces(&p); /* skip Path */
- skip_spaces(&p);
- char *c = strpbrk(obj_r.Path, " ");
- if (c) {
- *c = '\0';
- }
-
- obj_r.Filename = p;
- skip_nonspaces(&p); /* skip FileName */
- skip_spaces(&p);
- c = strpbrk(obj_r.Filename, " ");
- if (c) {
- *c = '\0';
- }
-
- obj_r.PluginName = p;
- skip_nonspaces(&p); /* skip PluginName */
- skip_spaces(&p);
- c = strpbrk(obj_r.PluginName, " ");
- if (c) {
- *c = '\0';
- }
-
- char *obj_type = p;
- skip_nonspaces(&p); /* skip ObjectType */
- skip_spaces(&p);
- c = strpbrk(obj_type, " ");
- if (c) {
- *c = '\0';
- }
- bstrncpy(obj_r.ObjectType, obj_type, sizeof(obj_r.ObjectType));
-
- obj_r.ObjectName = p;
- skip_nonspaces(&p); /* skip ObjectName */
- skip_spaces(&p);
- c = strpbrk(obj_r.ObjectName, " ");
- if (c) {
- *c = '\0';
- }
-
- obj_r.ObjectSource = p;
- skip_nonspaces(&p); /* skip ObjectSource */
- skip_spaces(&p);
- c = strpbrk(obj_r.ObjectSource, " ");
- if (c) {
- *c = '\0';
- }
-
- obj_r.ObjectUUID = p;
- skip_nonspaces(&p); /* skip ObjectUuid */
- skip_spaces(&p);
- c = strpbrk(obj_r.ObjectUUID, " ");
- if (c) {
- *c = '\0';
- }
-
- obj_r.ObjectSize = str_to_uint64(p);
+ parse_plugin_object_string(&p, &obj_r);
if (!db_create_object_record(jcr, jcr->db, &obj_r)) {
Jmsg1(jcr, M_FATAL, 0, _("Plugin object create error. %s"), db_strerror(jcr->db));
static int num_pools = 0;
static int num_media = 0;
static int num_files = 0;
+static int num_plugin_objects = 0;
static CONFIG *config;
#define CONFIG_FILE "bacula-sd.conf"
do_scan();
if (update_db) {
- printf("Records added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n",
- num_media, num_pools, num_jobs, num_files);
+ printf("Records added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n%7d PluginObjects\n",
+ num_media, num_pools, num_jobs, num_files, num_plugin_objects);
} else {
- printf("Records would have been added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n",
- num_media, num_pools, num_jobs, num_files);
+ printf("Records would have been added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n"
+ "%7d Plugin Objects\n",
+ num_media, num_pools, num_jobs, num_files, num_plugin_objects);
}
bjcr->read_dcr->dev->free_dedup_rehydration_interface(bjcr->read_dcr);
/* Implement putting into catalog */
break;
+ case STREAM_PLUGIN_OBJECT:
+ {
+ OBJECT_DBR obj_r;
+ char *buf = rec->data;
+ num_plugin_objects++;
+
+ skip_nonspaces(&buf); /* Skip FileIndex */
+ skip_spaces(&buf);
+ skip_nonspaces(&buf); /* Skip FileType */
+ skip_spaces(&buf);
+
+ parse_plugin_object_string(&buf, &obj_r);
+
+ // Need to get new jobId if possible
+ mjcr = get_jcr_by_session(rec->VolSessionId, rec->VolSessionTime);
+ if (!mjcr) {
+ Pmsg2(000, _("Could not find SessId=%d SessTime=%d for PluginObject record.\n"),
+ rec->VolSessionId, rec->VolSessionTime);
+ break;
+ }
+
+ obj_r.JobId = mjcr->JobId;
+
+ if (db_get_plugin_object_record(mjcr, db, &obj_r)) {
+ if (verbose) {
+ Pmsg1(0, _("RESTORE_OBJECT: Found Plugin Object \"%s\" in the catalog\n"), obj_r.ObjectName);
+ }
+ } else if (update_db) {
+ /* Send it */
+ Pmsg1(0, _("PLUGIN_OBJECT: Inserting Plugin Object \"%s\" into the catalog\n"), obj_r.ObjectName);
+ if (!db_create_object_record(mjcr, db, &obj_r)) {
+ Jmsg1(mjcr, M_FATAL, 0, _("Plugin object create error. %s"), db_strerror(db));
+ }
+ } else {
+ Pmsg1(0, _("PLUGIN_OBJECT: Found Plugin Object \"%s\" on the volume\n"), obj_r.ObjectName);
+ }
+
+ break;
+ }
+
/* Data stream */
case STREAM_WIN32_DATA:
case STREAM_FILE_DATA: