Browse Source

HPCC-14071 Update based on review

Existing packagemaps will now be converted automatically to the
mulitpart format.

ecl-packagemap-add-part will now create the packagemap if it doesn't
already exist.

Signed-off-by: Anthony Fishbeck <anthony.fishbeck@lexisnexis.com>
Anthony Fishbeck 9 years ago
parent
commit
43a215a029

+ 1 - 1
ecl/ecl-package/ecl-package.cpp

@@ -1104,7 +1104,7 @@ public:
                     "   <filename>                  Name of file containing packagemap part content\n"
                     " Options:\n"
                     "   --part-name                 Name of part being added (defaults to filename)\n"
-                    "   --delete-previous           Replace an existing part with matching name\n"
+                    "   --delete-prev               Replace an existing part with matching name\n"
                     "   --daliip=<ip>               IP of the remote dali to use for logical file lookups\n"
                     "   --global-scope              The specified packagemap is shared across multiple targets\n"
                     "   --source-process=<value>    Process cluster to copy files from\n"

+ 1 - 1
esp/scm/ws_packageprocess.ecm

@@ -242,7 +242,7 @@ ESPrequest AddPartToPackageMapRequest
     string Target;
     string Process;
     string PackageMap;
-    bool GlobalScope(0);
+    bool GlobalScope(false);
     string PartName;
     string Content;
     boolean DeletePrevious;

+ 33 - 5
esp/services/ws_packageprocess/ws_packageprocessService.cpp

@@ -245,6 +245,7 @@ public:
             pmid.append(target).append("::");
         }
         pmid.append(name);
+        pmid.toLowerCase();
     }
     void setProcess(const char *name)
     {
@@ -269,12 +270,28 @@ public:
                 throw MakeStringException(PKG_INVALID_CLUSTER_TYPE, "Process cluster %s not found on %s DALI", srcCluster.str(), daliIP.length() ? daliIP.str() : "local");
         }
     }
+    void convertExisting()
+    {
+        Linked<IPropertyTree> pmPart = pmExisting;
+        const char *s = strstr(pmid.str(), "::");
+        if (s)
+            pmPart->addProp("@id", s+2);
+        packageMaps->removeTree(pmExisting);
+
+        Owned<IPropertyTree> pmTree = createPTree("PackageMap", ipt_ordered);
+        pmTree->setProp("@id", pmid);
+        pmTree->setPropBool("@multipart", true);
+        pmTree->addPropTree("Part", pmPart.getClear());
+        pmExisting = packageMaps->addPropTree("PackageMap", pmTree.getClear());
+    }
     void init()
     {
         VStringBuffer xpath("PackageMap[@id='%s']", pmid.str());
         globalLock.setown(querySDS().connect("/PackageMaps", myProcessSession(), RTM_LOCK_WRITE|RTM_CREATE_QUERY, SDS_LOCK_TIMEOUT));
         packageMaps = globalLock->queryRoot();
         pmExisting = packageMaps->queryPropTree(xpath);
+        if (pmExisting && !pmExisting->getPropBool("@multipart", false))
+            convertExisting();
     }
     void createPart(const char *partname, const char *xml)
     {
@@ -325,9 +342,8 @@ public:
     {
         cloneFileInfoToDali(updateFlags, filesNotFound, pmPart, daliIP, ensureClusterInfo(), srcCluster, prefix, userdesc, checkFlag(PKGADD_ALLOW_FOREIGN));
     }
-    void create(const char *partname, const char *xml, unsigned updateFlags, StringArray &filesNotFound)
+    void doCreate(const char *partname, const char *xml, unsigned updateFlags, StringArray &filesNotFound)
     {
-        init();
         createPart(partname, xml);
 
         if (pmExisting)
@@ -343,6 +359,7 @@ public:
 
         Owned<IPropertyTree> pmTree = createPTree("PackageMap", ipt_ordered);
         pmTree->setProp("@id", pmid);
+        pmTree->setPropBool("@multipart", true);
         pmTree->addPropTree("Part", pmPart.getClear());
         packageMaps->addPropTree("PackageMap", pmTree.getClear());
 
@@ -358,14 +375,22 @@ public:
         }
         makePackageActive(pkgSet, psEntry, target, checkFlag(PKGADD_MAP_ACTIVATE));
     }
-
+    void create(const char *partname, const char *xml, unsigned updateFlags, StringArray &filesNotFound)
+    {
+        init();
+        doCreate(partname, xml, updateFlags, filesNotFound);
+    }
     void addPart(const char *partname, const char *xml, unsigned updateFlags, StringArray &filesNotFound)
     {
         init();
-        createPart(partname, xml);
 
         if (!pmExisting)
-            throw MakeStringException(PKG_NAME_EXISTS, "PackageMap %s not found, create it before adding additional parts/files", pmid.str());
+        {
+            doCreate(partname, xml, updateFlags, filesNotFound);
+            return;
+        }
+
+        createPart(partname, xml);
 
         VStringBuffer xpath("Part[@id='%s']", partname);
         IPropertyTree *existingPart = pmExisting->queryPropTree(xpath);
@@ -658,6 +683,9 @@ void CWsPackageProcessEx::getPkgInfoById(const char *packageMapId, IPropertyTree
     if (!packageMaps)
         throw MakeStringException(PKG_DALI_LOOKUP_ERROR, "Unable to retrieve information about package maps from dali server");
 
+    StringBuffer lcPMID(packageMapId);
+    packageMapId = lcPMID.toLowerCase().str();
+
     StringBuffer xpath;
     xpath.append("PackageMap[@id='").append(packageMapId).append("']");
     IPropertyTree *mapTree = packageMaps->queryPropTree(xpath);