Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HPCC-19225 Return logical file information in packagemap #10935

Merged
merged 1 commit into from Apr 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions esp/scm/ws_dfu.ecm
Expand Up @@ -159,6 +159,7 @@ ESPStruct [nil_remove] DFUFileDetail
[min_ver("1.28")] bool BrowseData(true);
[min_ver("1.37"), json_inline(1)] string jsonInfo;
[min_ver("1.37")] binary binInfo;
[min_ver("1.38")] string PackageID;
};

ESPStruct DFUSpaceItem
Expand Down Expand Up @@ -307,6 +308,8 @@ DFUInfoRequest
string Name;
string Cluster;
bool UpdateDescription(false);
[min_ver("1.38")] string QuerySet;
[min_ver("1.38")] string Query;
[depr_ver("1.38")] string FileName;
string FileDesc;
[min_ver("1.37")] bool IncludeJsonTypeInfo(false);
Expand Down
66 changes: 60 additions & 6 deletions esp/services/ws_dfu/ws_dfuService.cpp
Expand Up @@ -54,6 +54,7 @@
#include "hqlerror.hpp"
#include "hqlexpr.hpp"
#include "eclrtl.hpp"
#include "package.h"

#define Action_Delete "Delete"
#define Action_AddtoSuperfile "Add To Superfile"
Expand Down Expand Up @@ -352,15 +353,15 @@ bool CWsDfuEx::onDFUInfo(IEspContext &context, IEspDFUInfoRequest &req, IEspDFUI
{
double version = context.getClientVersion();
if (version < 1.38)
doGetFileDetails(context, userdesc.get(), req.getFileName(), req.getCluster(), req.getFileDesc(),
doGetFileDetails(context, userdesc.get(), req.getFileName(), req.getCluster(), req.getQuerySet(), req.getQuery(), req.getFileDesc(),
req.getIncludeJsonTypeInfo(), req.getIncludeBinTypeInfo(), resp.updateFileDetail());
else
doGetFileDetails(context, userdesc.get(), req.getName(), req.getCluster(), req.getFileDesc(),
doGetFileDetails(context, userdesc.get(), req.getName(), req.getCluster(), req.getQuerySet(), req.getQuery(), req.getFileDesc(),
req.getIncludeJsonTypeInfo(), req.getIncludeBinTypeInfo(), resp.updateFileDetail());
}
else
{
doGetFileDetails(context, userdesc.get(), req.getName(), req.getCluster(), NULL,
doGetFileDetails(context, userdesc.get(), req.getName(), req.getCluster(), req.getQuerySet(), req.getQuery(), NULL,
req.getIncludeJsonTypeInfo(), req.getIncludeBinTypeInfo(), resp.updateFileDetail());
}
}
Expand Down Expand Up @@ -1924,13 +1925,20 @@ void CWsDfuEx::getFilePartsOnClusters(IEspContext &context, const char* clusterR
}
}

void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor* udesc, const char *name, const char *cluster,
const char *description, bool includeJsonTypeInfo, bool includeBinTypeInfo, IEspDFUFileDetail& FileDetails)
void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor *udesc, const char *name, const char *cluster,
const char *querySet, const char *query, const char *description, bool includeJsonTypeInfo, bool includeBinTypeInfo, IEspDFUFileDetail &FileDetails)
{
if (!name || !*name)
throw MakeStringException(ECLWATCH_MISSING_PARAMS, "File name required");
PROGLOG("doGetFileDetails: %s", name);

double version = context.getClientVersion();
if ((version >= 1.38) && !isEmptyString(querySet) && !isEmptyString(query))
{
if (getQueryFile(name, querySet, query, FileDetails))
return;
}

Owned<IDistributedFile> df = queryDistributedFileDirectory().lookup(name, udesc, false, false, true); // lock super-owners
if(!df)
throw MakeStringException(ECLWATCH_FILE_NOT_EXIST,"Cannot find file %s.",name);
Expand All @@ -1940,7 +1948,6 @@ void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor* udesc, co
if (cluster && *cluster && !FindInStringArray(clusters, cluster))
throw MakeStringException(ECLWATCH_FILE_NOT_EXIST,"Cannot find file %s on %s.", name, cluster);

double version = context.getClientVersion();
offset_t size=queryDistributedFileSystem().getSize(df), recordSize=df->queryAttributes().getPropInt64("@recordSize",0);

CDateTime dt;
Expand Down Expand Up @@ -2332,6 +2339,53 @@ void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor* udesc, co
PROGLOG("doGetFileDetails: %s done", name);
}

bool CWsDfuEx::getQueryFile(const char *logicalName, const char *querySet, const char *queryID, IEspDFUFileDetail &fileDetails)
{
Owned<IConstWUClusterInfo> info = getTargetClusterInfo(querySet);
if (!info || (info->getPlatform()!=RoxieCluster))
return false;

SCMStringBuffer process;
info->getRoxieProcess(process);
if (!process.length())
return false;

Owned<IHpccPackageSet> ps = createPackageSet(process.str());
if (!ps)
return false;

const IHpccPackageMap *pm = ps->queryActiveMap(querySet);
if (!pm)
return false;

const IHpccPackage *pkg = pm->matchPackage(queryID);
if (!pkg)
return false;

const char *pkgid = pkg->locateSuperFile(logicalName);
if (!pkgid)
return false;

fileDetails.setName(logicalName);
fileDetails.setIsSuperfile(true);
fileDetails.setPackageID(pkgid);
StringArray subFiles;

Owned<ISimpleSuperFileEnquiry> ssfe = pkg->resolveSuperFile(logicalName);
if (ssfe && ssfe->numSubFiles()>0)
{
unsigned count = ssfe->numSubFiles();
while (count--)
{
StringBuffer subfile;
ssfe->getSubFileName(count, subfile);
subFiles.append(subfile.str());
}
if (!subFiles.empty())
fileDetails.setSubfiles(subFiles);
}
return true;
}

void CWsDfuEx::getLogicalFileAndDirectory(IEspContext &context, IUserDescriptor* udesc, const char *dirname,
bool includeSuperOwner, IArrayOf<IEspDFULogicalFile>& logicalFiles, int& numFiles, int& numDirs)
Expand Down
3 changes: 2 additions & 1 deletion esp/services/ws_dfu/ws_dfuService.hpp
Expand Up @@ -159,7 +159,7 @@ class CWsDfuEx : public CWsDfu
bool includeSuperOwner, IArrayOf<IEspDFULogicalFile>& LogicalFiles, int& numFiles, int& numDirs);
bool doLogicalFileSearch(IEspContext &context, IUserDescriptor* udesc, IEspDFUQueryRequest & req, IEspDFUQueryResponse & resp);
void doGetFileDetails(IEspContext &context, IUserDescriptor* udesc, const char *name,const char *cluster,
const char *description, bool includeJsonTypeInfo, bool includeBinTypeInfo, IEspDFUFileDetail& FileDetails);
const char *querySet, const char *query, const char *description, bool includeJsonTypeInfo, bool includeBinTypeInfo, IEspDFUFileDetail& FileDetails);
bool createSpaceItemsByDate(IArrayOf<IEspSpaceItem>& SpaceItems, StringBuffer interval, unsigned& yearFrom,
unsigned& monthFrom, unsigned& dayFrom, unsigned& yearTo, unsigned& monthTo, unsigned& dayTo);
bool setSpaceItemByScope(IArrayOf<IEspSpaceItem>& SpaceItems64, const char*scopeName, const char*logicalName, __int64 size);
Expand Down Expand Up @@ -202,6 +202,7 @@ class CWsDfuEx : public CWsDfu
const char* beforeSubFile, bool existingSuperfile, bool autocreatesuper, bool deleteFile, bool removeSuperfile = true);
void getFilePartsOnClusters(IEspContext &context, const char* clusterReq, StringArray& clusters, IDistributedFile* df, IEspDFUFileDetail& FileDetails,
offset_t& mn, offset_t& mx, offset_t& sum, offset_t& count);
bool getQueryFile(const char *logicalName, const char *querySet, const char *queryID, IEspDFUFileDetail &fileDetails);
private:
bool m_disableUppercaseTranslation;
StringBuffer m_clusterName;
Expand Down