replace(0),
robjsent(false),
estimate(false),
- listing(ListingNone),
+ listing(None),
nodata(false),
nextfile(false),
openerror(false),
if (strcasecmp(parser.argk[i], "listing") == 0){
/* found, so check the value if provided */
if (parser.argv[i]){
- listing = ListingMode;
+ listing = Listing;
DMSG0(ctx, DINFO, "listing procedure param found\n");
}
}
if (strcasecmp(parser.argk[i], "query") == 0){
/* found, so check the value if provided */
if (parser.argv[i]){
- listing = ListingQueryParams;
+ listing = Query;
DMSG0(ctx, DINFO, "query procedure param found\n");
}
}
return send_startjob(ctx, "ListingStart\n");
}
+/*
+ * Send "QueryStart" protocol command.
+ * more info at PLUGIN::send_startjob
+ *
+ * in:
+ * bpContext - for Bacula debug and jobinfo messages
+ * out:
+ * bRC_OK - when send command was successful
+ * bRC_Error - on any error
+ */
+bRC METAPLUGIN::send_startquery(bpContext *ctx)
+{
+ return send_startjob(ctx, "QueryStart\n");
+}
+
/*
* Send "RestoreStart" protocol command.
* more info at METAPLUGIN::send_startjob
}
// check for prohibitted command duplication
- if (type != BACKEND_JOB_INFO_RESTORE && backend.check_command(command))
- {
+ if (type != BACKEND_JOB_INFO_RESTORE && backend.check_command(command)) {
// already exist, report
DMSG1(ctx, DERROR, "Plugin command=%s already defined, cannot proceed.\n", command);
JMSG1(ctx, M_FATAL, "Plugin command already defined: \"%s\" Cannot proceed. You should correct FileSet configuration.\n", command);
}
/* handshake (1) */
DMSG0(ctx, DINFO, "Backend handshake...\n");
- if (!backend.ctx->handshake(ctx, PLUGINNAME, PLUGINAPI))
- {
+ if (!backend.ctx->handshake(ctx, PLUGINNAME, PLUGINAPI)) {
backend.ctx->terminate(ctx);
return bRC_Error;
}
/* Job Info (2) */
DMSG0(ctx, DINFO, "Job Info (2) ...\n");
- if (send_jobinfo(ctx, type) != bRC_OK){
+ if (send_jobinfo(ctx, type) != bRC_OK) {
backend.ctx->terminate(ctx);
return bRC_Error;
}
/* Plugin Params (3) */
DMSG0(ctx, DINFO, "Plugin Params (3) ...\n");
- if (send_parameters(ctx, command) != bRC_OK){
+ if (send_parameters(ctx, command) != bRC_OK) {
backend.ctx->terminate(ctx);
return bRC_Error;
}
- switch (type){
- case BACKEND_JOB_INFO_BACKUP:
- /* Start Backup (4) */
- DMSG0(ctx, DINFO, "Start Backup (4) ...\n");
- if (send_startbackup(ctx) != bRC_OK){
- backend.ctx->terminate(ctx);
- return bRC_Error;
- }
- break;
- case BACKEND_JOB_INFO_ESTIMATE:
- /* Start Estimate or Listing (4) */
- if (listing != ListingNone){
+ switch (type)
+ {
+ case BACKEND_JOB_INFO_BACKUP:
+ /* Start Backup (4) */
+ DMSG0(ctx, DINFO, "Start Backup (4) ...\n");
+ if (send_startbackup(ctx) != bRC_OK){
+ backend.ctx->terminate(ctx);
+ return bRC_Error;
+ }
+ break;
+ case BACKEND_JOB_INFO_ESTIMATE:
+ {
+ /* Start Estimate or Listing/Query (4) */
+ bRC rc = bRC_Error;
+ switch (listing)
+ {
+ case Listing:
DMSG0(ctx, DINFO, "Start Listing (4) ...\n");
- if (send_startlisting(ctx) != bRC_OK){
- backend.ctx->terminate(ctx);
- return bRC_Error;
- }
- } else {
+ rc = send_startlisting(ctx);
+ break;
+ case Query:
+ DMSG0(ctx, DINFO, "Start Query Params (4) ...\n");
+ rc = send_startquery(ctx);
+ break;
+ default:
DMSG0(ctx, DINFO, "Start Estimate (4) ...\n");
- if (send_startestimate(ctx) != bRC_OK){
- backend.ctx->terminate(ctx);
- return bRC_Error;
- }
+ rc = send_startestimate(ctx);
+ break;
}
- break;
- case BACKEND_JOB_INFO_RESTORE:
- /* Start Restore (4) */
- DMSG0(ctx, DINFO, "Start Restore (4) ...\n");
- if (send_startrestore(ctx) != bRC_OK){
+ if (rc != bRC_OK) {
backend.ctx->terminate(ctx);
return bRC_Error;
}
- break;
- default:
+ }
+ // if (listing != ListingNone){
+ // DMSG0(ctx, DINFO, "Start Listing (4) ...\n");
+ // if (send_startlisting(ctx) != bRC_OK){
+ // backend.ctx->terminate(ctx);
+ // return bRC_Error;
+ // }
+ // } else {
+ // DMSG0(ctx, DINFO, "Start Estimate (4) ...\n");
+ // if (send_startestimate(ctx) != bRC_OK){
+ // backend.ctx->terminate(ctx);
+ // return bRC_Error;
+ // }
+ // }
+ break;
+ case BACKEND_JOB_INFO_RESTORE:
+ /* Start Restore (4) */
+ DMSG0(ctx, DINFO, "Start Restore (4) ...\n");
+ if (send_startrestore(ctx) != bRC_OK) {
+ backend.ctx->terminate(ctx);
return bRC_Error;
+ }
+ break;
+ default:
+ return bRC_Error;
}
DMSG0(ctx, DINFO, "Prepare backend done.\n");
return bRC_OK;
DMSG0(ctx, D1, "METAPLUGIN::queryParameter\n");
- if (listing == ListingNone){
- listing = ListingQueryParams;
+ // check if it is our Plugin command
+ if (!isourplugincommand(PLUGINPREFIX, qp->command) != 0){
+ // it is not our plugin prefix
+ return bRC_OK;
+ }
+
+ if (listing == None) {
+ listing = Query;
Mmsg(cmd, "%s query=%s", qp->command, qp->parameter);
if (prepare_backend(ctx, BACKEND_JOB_INFO_ESTIMATE, cmd.c_str()) == bRC_Error){
return bRC_Error;
DMSG0(ctx, D1, "METAPLUGIN::queryParameter: got EOD\n");
backend.ctx->signal_term(ctx);
backend.ctx->terminate(ctx);
+ qp->result = NULL;
ret = bRC_OK;
} else {
/*
{
ASSERT_CTX;
- DMSG2(ctx, D1, "queryParameter: %s:%s\n", qp->command, qp->parameter);
+ DMSG2(ctx, D1, "queryParameter: cmd:%s param:%s\n", qp->command, qp->parameter);
METAPLUGIN *self = pluginclass(ctx);
return self->queryParameter(ctx, qp);
}
signal_eod();
}
-void perform_restore(){
+/*
+ * The query param procedure
+ * return 3 simple parameters
+ */
+void perform_queryparam(char *query)
+{
+ /* Query Loop (5) */
+ snprintf(buf, BIGBUFLEN, "%s=test1\n", query);
+ write_plugin('C', buf);
+ snprintf(buf, BIGBUFLEN, "%s=test2\n", query);
+ write_plugin('C', buf);
+ snprintf(buf, BIGBUFLEN, "%s=test3\n", query);
+ write_plugin('C', buf);
- int len;
- int fsize;
+ /* this is the end of all data */
+ signal_eod();
+}
+
+/*
+ * The main and universal restore procedure
+ */
+void perform_restore()
+{
bool loopgo = true;
bool restore_skip_create = false;
bool restore_with_core = false;
/* check if DATA command, so read the data packets */
if (strcmp(buf, "DATA\n") == 0){
- len = read_plugin(buf);
+ int len = read_plugin(buf);
if (len == 0){
/* empty file to restore */
LOG("#> Empty file.");
LOG("#> file data saved.");
}
loopgo = true;
- fsize = len;
+ int fsize = len;
while (loopgo){
len = read_plugin(buf);
fsize += len;
int len;
char *listing;
+ char *query;
buf = (char*)malloc(BIGBUFLEN);
if (buf == NULL){
if (listing == NULL){
exit(255);
}
+ query = (char*)malloc(BUFLEN);
+ if (query == NULL){
+ exit(255);
+ }
mypid = getpid();
snprintf(buf, 4096, "%s/%s_backend_%d.log", LOGDIR, PLUGINNAME, mypid);
strcpy(listing, buf);
continue;
}
+ if (sscanf(buf, "query=%s\n", buf) == 1){
+ strcpy(query, buf);
+ continue;
+ }
}
write_plugin('I', "TEST3");
if (!regress_error_plugin_params){
if (strcmp(buf, "ListingStart\n") == 0){
perform_listing(listing);
} else
+ if (strcmp(buf, "QueryStart\n") == 0){
+ perform_queryparam(query);
+ } else
if (strcmp(buf, "RestoreStart\n") == 0){
perform_restore();
}