ソースを参照

Fix don't delete published workunits

Signed-off-by: Anthony Fishbeck <Anthony.Fishbeck@lexisnexis.com>
Anthony Fishbeck 13 年 前
コミット
322c9bd434

+ 12 - 13
common/workunit/workunit.cpp

@@ -2624,17 +2624,18 @@ void CLocalWorkUnit::cleanupAndDelete(bool deldll,bool deleteOwned)
         throw MakeStringException(WUERR_WorkunitActive, "%s: Workunit is active",p->queryName());
         break;
     }
-    try
+    if (getIsQueryService())
     {
-        //Move any service aliases
-        if (getIsQueryService())
+        Owned<IPropertyTree> registry = getQueryRegistryRoot();
+        if (registry)
         {
-            Owned<IPropertyTree> registry = getQueryRegistry(p->queryProp("@clusterName"), false);
-            if (registry)
-                removeWuidFromNamedQueries(registry, p->queryName());
+            VStringBuffer xpath("QuerySet/Query[@wuid='%s']", p->queryName());
+            if (registry->hasProp(xpath.str()))
+                throw MakeStringException(WUERR_WorkunitPublished, "%s: Workunit is published",p->queryName());
         }
-
-
+    }
+    try
+    {
         if (deldll && !p->getPropBool("@isClone", false))
         {
             Owned<IConstWUQuery> q = getQuery();
@@ -9026,7 +9027,7 @@ extern WORKUNIT_API IPropertyTree * getPackageSetRegistry(const char * wsEclId,
     return conn->getRoot();
 }
 
-void addQueryToQuerySet(IConstWorkUnit *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)
 {
     StringBuffer cleanQueryName;
     appendUtf8XmlName(cleanQueryName, strlen(queryName), queryName);
@@ -9060,12 +9061,10 @@ void addQueryToQuerySet(IConstWorkUnit *workunit, const char *querySetName, cons
         }
     }
 
-
     IPropertyTree *newEntry = addNamedQuery(queryRegistry, cleanQueryName, wuid.str(), dllName.str());
     newQueryId.append(newEntry->queryProp("@id"));
-
-    //A single workunit could be published as multiple queries
-    //workunit->setDebugValue("queryId", newQueryId.str(), true);
+    workunit->setIsQueryService(true); //will check querysets before delete
+    workunit->commit();
 
     if (activateOption == ACTIVATE_SUSPEND_PREVIOUS|| activateOption == ACTIVATE_DELETE_PREVIOUS)
     {

+ 1 - 1
common/workunit/workunit.hpp

@@ -1217,7 +1217,7 @@ extern WORKUNIT_API IPropertyTree * addNamedPackageSet(IPropertyTree * packageRe
 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(IConstWorkUnit *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);
 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);

+ 1 - 0
common/workunit/wuerror.hpp

@@ -48,5 +48,6 @@
 #define WUERR_PackageAlreadyExists              5022
 #define WUERR_MismatchClusterType               5023
 #define WUERR_InvalidDll                        5024
+#define WUERR_WorkunitPublished                 5005
 
 #endif

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

@@ -889,12 +889,14 @@ bool CWsWorkunitsEx::onWUQuerysetCopyQuery(IEspContext &context, IEspWUQuerySetC
     }
 
     Owned<IWorkUnitFactory> factory = getWorkUnitFactory(context.querySecManager(), context.queryUser());
-    Owned<IConstWorkUnit> cw = factory->openWorkUnit(wuid.str(), false);
-    if (!cw)
+    WorkunitUpdate wu(factory->updateWorkUnit(wuid.str()));
+    if (!wu)
         throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT, "Error opening wuid %s for query %s", wuid.str(), source);
 
     StringBuffer targetQueryId;
-    addQueryToQuerySet(cw, target, targetName.str(), NULL, (WUQueryActivationOptions)req.getActivate(), targetQueryId);
+    addQueryToQuerySet(wu, target, targetName.str(), NULL, (WUQueryActivationOptions)req.getActivate(), targetQueryId);
+    wu.clear();
+
     resp.setQueryId(targetQueryId.str());
 
     StringArray querysetClusters;