Bladeren bron

HPCC-8676 Add publishedBy and suspendedBy attributes to Query Entry

When publishing, copying, and suspending a query, keep track of
who performed the action (if a username is available).

Signed-off-by: Anthony Fishbeck <Anthony.Fishbeck@lexisnexis.com>
Anthony Fishbeck 12 jaren geleden
bovenliggende
commit
09ea4f7497

+ 3 - 3
common/roxiemanager/roxiequerymanager.cpp

@@ -139,7 +139,7 @@ private:
             IPropertyTree *pkgInfo = wuProcessor->queryPackageInfo();
             StringBuffer newQueryId;
             const char *qsName = resolveQuerySetName(querySetName);
-            addQueryToQuerySet(wu, qsName, queryName.str(), pkgInfo, activateOption, newQueryId);
+            addQueryToQuerySet(wu, qsName, queryName.str(), pkgInfo, activateOption, newQueryId, NULL);
 
             const char *queryComment = processingInfo.queryComment();
             if (queryComment)
@@ -441,7 +441,7 @@ public:
     {
         try
         {
-            setSuspendQuerySetQuery(resolveQuerySetName(querySetName), id, true);
+            setSuspendQuerySetQuery(resolveQuerySetName(querySetName), id, true, NULL);
             status.s.appendf("successfully suspended query %s", id);
         }
         catch(IException *e)
@@ -461,7 +461,7 @@ public:
     {
         try
         {
-            setSuspendQuerySetQuery(resolveQuerySetName(querySetName), id, false);
+            setSuspendQuerySetQuery(resolveQuerySetName(querySetName), id, false, NULL);
             status.s.appendf("successfully unsuspended query %s", id);
         }
         catch(IException *e)

+ 18 - 7
common/workunit/workunit.cpp

@@ -9033,7 +9033,7 @@ static void clearAliases(IPropertyTree * queryRegistry, const char * id)
     }
 }
 
-IPropertyTree * addNamedQuery(IPropertyTree * queryRegistry, const char * name, const char * wuid, const char * dll, bool library)
+IPropertyTree * addNamedQuery(IPropertyTree * queryRegistry, const char * name, const char * wuid, const char * dll, bool library, const char *userid)
 {
     StringBuffer lcName(name);
     lcName.toLowerCase();
@@ -9063,6 +9063,8 @@ IPropertyTree * addNamedQuery(IPropertyTree * queryRegistry, const char * name,
     newEntry->setPropInt("@seq", seq);
     if (library)
         newEntry->setPropBool("@isLibrary", true);
+    if (userid && *userid)
+        newEntry->setProp("@publishedBy", userid);
     return queryRegistry->addPropTree("Query", newEntry);
 }
 
@@ -9163,7 +9165,7 @@ extern WORKUNIT_API IPropertyTree * resolveQueryAlias(const char *queryset, cons
     return resolveQueryAlias(queryRegistry, alias);
 }
 
-void setQuerySuspendedState(IPropertyTree * queryRegistry, const char *id, bool suspend)
+void setQuerySuspendedState(IPropertyTree * queryRegistry, const char *id, bool suspend, const char *userid)
 {
     StringBuffer lcId(id);
     lcId.toLowerCase();
@@ -9173,10 +9175,19 @@ void setQuerySuspendedState(IPropertyTree * queryRegistry, const char *id, bool
     IPropertyTree *tree = queryRegistry->queryPropTree(xpath);
     if (tree)
     {
+        if (tree->getPropBool("@suspended", false) == suspend)
+            return;
         if (suspend)
+        {
             tree->addPropBool("@suspended", true);
+            if (userid && *userid)
+                tree->addProp("@suspendedBy", userid);
+        }
         else
+        {
             tree->removeProp("@suspended");
+            tree->removeProp("@suspendedBy");
+        }
     }
     else
         throw MakeStringException((suspend)? QUERRREG_SUSPEND : QUERRREG_UNSUSPEND, "Modifying query suspended state failed.  Could not find query %s", id);
@@ -9303,7 +9314,7 @@ extern WORKUNIT_API IPropertyTree * getPackageSetRegistry(const char * wsEclId,
     return conn->getRoot();
 }
 
-void addQueryToQuerySet(IWorkUnit *workunit, const char *querySetName, const char *queryName, IPropertyTree *packageInfo, WUQueryActivationOptions activateOption, StringBuffer &newQueryId)
+void addQueryToQuerySet(IWorkUnit *workunit, const char *querySetName, const char *queryName, IPropertyTree *packageInfo, WUQueryActivationOptions activateOption, StringBuffer &newQueryId, const char *userid)
 {
     StringBuffer cleanQueryName;
     appendUtf8XmlName(cleanQueryName, strlen(queryName), queryName);
@@ -9337,7 +9348,7 @@ void addQueryToQuerySet(IWorkUnit *workunit, const char *querySetName, const cha
         }
     }
 
-    IPropertyTree *newEntry = addNamedQuery(queryRegistry, cleanQueryName, wuid.str(), dllName.str(), isLibrary(workunit));
+    IPropertyTree *newEntry = addNamedQuery(queryRegistry, cleanQueryName, wuid.str(), dllName.str(), isLibrary(workunit), userid);
     newQueryId.append(newEntry->queryProp("@id"));
     workunit->setIsQueryService(true); //will check querysets before delete
     workunit->commit();
@@ -9350,7 +9361,7 @@ void addQueryToQuerySet(IWorkUnit *workunit, const char *querySetName, const cha
         if (aliasTree)
         {
             if (activateOption == ACTIVATE_SUSPEND_PREVIOUS)
-                setQuerySuspendedState(queryRegistry, cleanQueryName, true);
+                setQuerySuspendedState(queryRegistry, cleanQueryName, true, userid);
             else 
                 removeNamedQuery(queryRegistry, aliasTree->queryProp("@id"));
         }
@@ -9374,10 +9385,10 @@ void addQuerySetAlias(const char *querySetName, const char *alias, const char *i
     setQueryAlias(queryRegistry, alias, id);
 }
 
-void setSuspendQuerySetQuery(const char *querySetName, const char *id, bool suspend)
+void setSuspendQuerySetQuery(const char *querySetName, const char *id, bool suspend, const char *userid)
 {
     Owned<IPropertyTree> queryRegistry = getQueryRegistry(querySetName, true);
-    setQuerySuspendedState(queryRegistry, id, suspend);
+    setQuerySuspendedState(queryRegistry, id, suspend, userid);
 }
 
 void deleteQuerySetQuery(const char *querySetName, const char *id)

+ 4 - 4
common/workunit/workunit.hpp

@@ -1211,7 +1211,7 @@ enum WUQueryActivationOptions
 };
 
 
-extern WORKUNIT_API IPropertyTree * addNamedQuery(IPropertyTree * queryRegistry, const char * name, const char * wuid, const char * dll, bool library);       // result not linked
+extern WORKUNIT_API IPropertyTree * addNamedQuery(IPropertyTree * queryRegistry, const char * name, const char * wuid, const char * dll, bool library, const char *userid);       // result not linked
 extern WORKUNIT_API void removeNamedQuery(IPropertyTree * queryRegistry, const char * id);
 extern WORKUNIT_API void removeWuidFromNamedQueries(IPropertyTree * queryRegistry, const char * wuid);
 extern WORKUNIT_API void removeDllFromNamedQueries(IPropertyTree * queryRegistry, const char * dll);
@@ -1227,16 +1227,16 @@ extern WORKUNIT_API IPropertyTree * getQueryRegistryRoot();
 
 extern WORKUNIT_API void setQueryCommentForNamedQuery(IPropertyTree * queryRegistry, const char *id, const char *queryComment);
 
-extern WORKUNIT_API void setQuerySuspendedState(IPropertyTree * queryRegistry, const char * name, bool suspend);
+extern WORKUNIT_API void setQuerySuspendedState(IPropertyTree * queryRegistry, const char * name, bool suspend, const char *userid);
 
 extern WORKUNIT_API IPropertyTree * addNamedPackageSet(IPropertyTree * packageRegistry, const char * name, IPropertyTree *packageInfo, bool overWrite);     // result not linked
 extern WORKUNIT_API void removeNamedPackage(IPropertyTree * packageRegistry, const char * id);
 extern WORKUNIT_API IPropertyTree * getPackageSetRegistry(const char * wsEclId, bool readonly);
 
-extern WORKUNIT_API void addQueryToQuerySet(IWorkUnit *workunit, const char *querySetName, const char *queryName, IPropertyTree *packageInfo, WUQueryActivationOptions activateOption, StringBuffer &newQueryId);
+extern WORKUNIT_API void addQueryToQuerySet(IWorkUnit *workunit, const char *querySetName, const char *queryName, IPropertyTree *packageInfo, WUQueryActivationOptions activateOption, StringBuffer &newQueryId, const char *userid);
 extern WORKUNIT_API bool removeQuerySetAlias(const char *querySetName, const char *alias);
 extern WORKUNIT_API void addQuerySetAlias(const char *querySetName, const char *alias, const char *id);
-extern WORKUNIT_API void setSuspendQuerySetQuery(const char *querySetName, const char *id, bool suspend);
+extern WORKUNIT_API void setSuspendQuerySetQuery(const char *querySetName, const char *id, bool suspend, const char *userid);
 extern WORKUNIT_API void deleteQuerySetQuery(const char *querySetName, const char *id);
 extern WORKUNIT_API const char *queryIdFromQuerySetWuid(const char *querySetName, const char *wuid, IStringVal &id);
 extern WORKUNIT_API void removeQuerySetAliasesFromNamedQuery(const char *querySetName, const char * id);

+ 5 - 5
esp/services/ws_workunits/ws_workunitsQuerySets.cpp

@@ -530,7 +530,7 @@ bool CWsWorkunitsEx::onWUPublishWorkunit(IEspContext &context, IEspWUPublishWork
 
     StringBuffer queryId;
     WUQueryActivationOptions activate = (WUQueryActivationOptions)req.getActivate();
-    addQueryToQuerySet(wu, target.str(), queryName.str(), NULL, activate, queryId);
+    addQueryToQuerySet(wu, target.str(), queryName.str(), NULL, activate, queryId, context.queryUserId());
     if (req.getMemoryLimit() || !req.getTimeLimit_isNull() || !req.getWarnTimeLimit_isNull() || req.getPriority() || req.getComment())
     {
         Owned<IPropertyTree> queryTree = getQueryById(target.str(), queryId, false);
@@ -1065,13 +1065,13 @@ bool CWsWorkunitsEx::onWUQuerysetQueryAction(IEspContext &context, IEspWUQuerySe
             switch (req.getAction())
             {
                 case CQuerySetQueryActionTypes_ToggleSuspend:
-                    setQuerySuspendedState(queryset, id, !queryIds->getPropBool(id));
+                    setQuerySuspendedState(queryset, id, !queryIds->getPropBool(id), context.queryUserId());
                     break;
                 case CQuerySetQueryActionTypes_Suspend:
-                    setQuerySuspendedState(queryset, id, true);
+                    setQuerySuspendedState(queryset, id, true, context.queryUserId());
                     break;
                 case CQuerySetQueryActionTypes_Unsuspend:
-                    setQuerySuspendedState(queryset, id, false);
+                    setQuerySuspendedState(queryset, id, false, NULL);
                     break;
                 case CQuerySetQueryActionTypes_Activate:
                 {
@@ -1236,7 +1236,7 @@ bool CWsWorkunitsEx::onWUQuerysetCopyQuery(IEspContext &context, IEspWUQuerySetC
 
     StringBuffer targetQueryId;
     WUQueryActivationOptions activate = (WUQueryActivationOptions)req.getActivate();
-    addQueryToQuerySet(wu, target, queryName.str(), NULL, activate, targetQueryId);
+    addQueryToQuerySet(wu, target, queryName.str(), NULL, activate, targetQueryId, context.queryUserId());
     if (req.getMemoryLimit() || !req.getTimeLimit_isNull() || ! req.getWarnTimeLimit_isNull() || req.getPriority())
     {
         Owned<IPropertyTree> queryTree = getQueryById(target, targetQueryId, false);