Skip to content

Commit b066955

Browse files
Copilotmckellyln
authored andcommitted
HPCC-35470 Add --delete-prev option to ecl queries copy-set command
1 parent 1556cda commit b066955

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

ecl/eclcmd/queries/ecl-queries.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,10 @@ class EclCmdQueriesCopyQueryset : public EclCmdCommon
739739
continue;
740740
if (iter.matchFlag(optCloneActiveState, ECLOPT_CLONE_ACTIVE_STATE))
741741
continue;
742+
if (iter.matchFlag(optSuspendPrevious, ECLOPT_SUSPEND_PREVIOUS)||iter.matchFlag(optSuspendPrevious, ECLOPT_SUSPEND_PREVIOUS_S))
743+
continue;
744+
if (iter.matchFlag(optDeletePrevious, ECLOPT_DELETE_PREVIOUS)||iter.matchFlag(optDeletePrevious, ECLOPT_DELETE_PREVIOUS_S))
745+
continue;
742746
if (iter.matchFlag(optDontCopyFiles, ECLOPT_DONT_COPY_FILES))
743747
continue;
744748
if (iter.matchFlag(optAllQueries, ECLOPT_ALL))
@@ -772,6 +776,16 @@ class EclCmdQueriesCopyQueryset : public EclCmdCommon
772776
fputs("source and destination querysets must both be specified.\n", stderr);
773777
return false;
774778
}
779+
if (!optCloneActiveState && (optSuspendPrevious || optDeletePrevious))
780+
{
781+
fputs("Error: --suspend-prev and --delete-prev require --clone-active-state.\n", stderr);
782+
return false;
783+
}
784+
if (optSuspendPrevious && optDeletePrevious)
785+
{
786+
fputs("Error: --suspend-prev and --delete-prev are mutually exclusive options.\n", stderr);
787+
return false;
788+
}
775789
return true;
776790
}
777791

@@ -796,6 +810,14 @@ class EclCmdQueriesCopyQueryset : public EclCmdCommon
796810
req->setDfsServer(optDaliIP.get());
797811
req->setSourceProcess(optSourceProcess);
798812
req->setCloneActiveState(optCloneActiveState);
813+
if (optDeletePrevious)
814+
req->setActivate(CWUQueryActivationMode_ActivateDeletePrevious);
815+
else if (optSuspendPrevious)
816+
req->setActivate(CWUQueryActivationMode_ActivateSuspendPrevious);
817+
else if (optCloneActiveState)
818+
req->setActivate(CWUQueryActivationMode_ActivateSuspendPrevious);
819+
else
820+
req->setActivate(CWUQueryActivationMode_NoActivate);
799821
req->setOverwriteDfs(optOverwrite);
800822
req->setUpdateSuperFiles(optUpdateSuperfiles);
801823
req->setUpdateCloneFrom(optUpdateCloneFrom);
@@ -862,6 +884,8 @@ class EclCmdQueriesCopyQueryset : public EclCmdCommon
862884
" --daliip=<ip> Remote Dali DFS to use for copying file information\n"
863885
" --source-process Process cluster to copy files from\n"
864886
" --clone-active-state Make copied queries active if active on source\n"
887+
" -sp, --suspend-prev Suspend previously active query\n"
888+
" -dp, --delete-prev Delete previously active query\n"
865889
" -O, --overwrite Completely replace existing DFS file information (dangerous)\n"
866890
" --update-super-files Update local DFS super-files if remote DALI has changed\n"
867891
" --update-clone-from Update local clone from location if remote DALI has changed\n"
@@ -887,6 +911,8 @@ class EclCmdQueriesCopyQueryset : public EclCmdCommon
887911
bool optDontCopyFiles;
888912
bool optAllowForeign;
889913
bool optAllQueries;
914+
bool optSuspendPrevious = false;
915+
bool optDeletePrevious = false;
890916
bool optSourceSSL = false; //user explicitly turning on SSL for accessing the remote source location (ssl defaults to use SSL if we are hitting ESP via SSL)
891917
bool optSourceNoSSL = false; //user explicitly turning OFF SSL for accessing the remote source location (ssl defaults to not use SSL if we are not hitting ESP via SSL)
892918
};

esp/scm/ws_workunits.ecm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ EspInclude(ws_workunits_queryset_req_resp);
2525

2626
ESPservice [
2727
auth_feature("DEFERRED"), //This declares that the method logic handles feature level authorization
28-
version("2.03"), default_client_version("2.03"), cache_group("ESPWsWUs"),
28+
version("2.04"), default_client_version("2.04"), cache_group("ESPWsWUs"),
2929
noforms,exceptions_inline("./smc_xslt/exceptions.xslt"),use_method_name] WsWorkunits
3030
{
3131
ESPmethod [cache_seconds(60), resp_xsl_default("/esp/xslt/workunits.xslt")] WUQuery(WUQueryRequest, WUQueryResponse);

esp/scm/ws_workunits_queryset_req_resp.ecm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ ESPrequest [nil_remove] WUCopyQuerySetRequest
523523
[min_ver("1.95")] string DfuPublisherWuid; //Wuid can be preallocated and then passed in here to use. Will be created if empty
524524
[min_ver("1.97")] string RemoteStorage;
525525
[min_ver("2.02")] string KeyCompression;
526+
[min_ver("2.04")] ESPEnum WUQueryActivationMode Activate;
526527
};
527528

528529
ESPresponse [exceptions_inline] WUCopyQuerySetResponse

esp/services/ws_workunits/ws_workunitsQuerySets.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,12 +3056,18 @@ class QueryCloner
30563056
queryDirectory.set(dir);
30573057
}
30583058

3059+
void setActivationMode(int mode)
3060+
{
3061+
activationMode = mode;
3062+
}
3063+
30593064
void addToBePublished(const char *wuid, const char *name, bool makeActive, const char *userid, IPropertyTree *query)
30603065
{
30613066
IPropertyTree *entry = toBePublished->addPropTree("Publish");
30623067
entry->setProp("@wuid", wuid);
30633068
entry->setProp("@name", name);
30643069
entry->setPropBool("@makeActive", makeActive);
3070+
entry->setPropInt("@activationMode", makeActive ? activationMode : DO_NOT_ACTIVATE);
30653071
entry->setProp("@userid", userid);
30663072
entry->addPropTree("Info", createPTreeFromIPT(query));
30673073

@@ -3082,7 +3088,12 @@ class QueryCloner
30823088
IPropertyTree &entry = entries->query();
30833089
StringBuffer newQueryId;
30843090
Owned<IWorkUnit> workunit = factory->updateWorkUnit(entry.queryProp("@wuid"));
3085-
addQueryToQuerySet(workunit, destQuerySet, entry.queryProp("@name"), entry.getPropBool("@makeActive") ? ACTIVATE_SUSPEND_PREVIOUS : DO_NOT_ACTIVATE, newQueryId, entry.queryProp("@userid"));
3091+
int queryActivationMode = DO_NOT_ACTIVATE;
3092+
if (entry.hasProp("@activationMode"))
3093+
queryActivationMode = entry.getPropInt("@activationMode");
3094+
else if (entry.getPropBool("@makeActive"))
3095+
queryActivationMode = ACTIVATE_SUSPEND_PREVIOUS;
3096+
addQueryToQuerySet(workunit, destQuerySet, entry.queryProp("@name"), queryActivationMode, newQueryId, entry.queryProp("@userid"));
30863097
copiedQueryIds.append(newQueryId);
30873098
IPropertyTree *info = entry.queryPropTree("Info");
30883099
if (info)
@@ -3131,7 +3142,7 @@ class QueryCloner
31313142
{
31323143
existingQueryIds.append(existingQueryId.str());
31333144
if (makeActive)
3134-
activateQuery(destQuerySet, ACTIVATE_SUSPEND_PREVIOUS, queryName, existingQueryId.str(), context->queryUserId());
3145+
activateQuery(destQuerySet, activationMode, queryName, existingQueryId.str(), context->queryUserId());
31353146
return;
31363147
}
31373148
addToBePublished(wuid, queryName, makeActive, context->queryUserId(), query);
@@ -3158,7 +3169,7 @@ class QueryCloner
31583169
{
31593170
existingQueryIds.append(existingQueryId.str());
31603171
if (makeActive)
3161-
activateQuery(destQuerySet, ACTIVATE_SUSPEND_PREVIOUS, queryName, existingQueryId.str(), context->queryUserId());
3172+
activateQuery(destQuerySet, activationMode, queryName, existingQueryId.str(), context->queryUserId());
31623173
return;
31633174
}
31643175
StringBuffer newQueryId;
@@ -3321,6 +3332,7 @@ class QueryCloner
33213332
bool cloneFilesEnabled = false;
33223333
bool useSSL = false;
33233334
unsigned updateFlags = 0;
3335+
int activationMode = ACTIVATE_SUSPEND_PREVIOUS;
33243336
StringArray locations;
33253337

33263338
public:
@@ -3353,6 +3365,20 @@ bool CWsWorkunitsEx::onWUCopyQuerySet(IEspContext &context, IEspWUCopyQuerySetRe
33533365
QueryCloner cloner(&context, srcAddress, srcTarget, target, req.getSourceSSL());
33543366
cloner.setQueryDirectory(queryDirectory);
33553367

3368+
int queryActivationMode = ACTIVATE_SUSPEND_PREVIOUS;
3369+
if (req.getActivate_isNull())
3370+
{
3371+
// For backward compatibility: if Activate is not set, use CloneActiveState behavior
3372+
// CloneActiveState true means activate with suspend-previous (default behavior)
3373+
queryActivationMode = req.getCloneActiveState() ? ACTIVATE_SUSPEND_PREVIOUS : DO_NOT_ACTIVATE;
3374+
}
3375+
else
3376+
{
3377+
// Use the new Activate enum if provided
3378+
queryActivationMode = req.getActivate();
3379+
}
3380+
cloner.setActivationMode(queryActivationMode);
3381+
33563382
SCMStringBuffer process;
33573383
StringBuffer publisherWuid(req.getDfuPublisherWuid());
33583384
if (req.getCopyFiles())

0 commit comments

Comments
 (0)