virtual void preStart(size32_t parentExtractSz, const byte *parentExtract) { CMasterActivity::preStart(parentExtractSz, parentExtract); IHThorKeyDiffArg *helper = (IHThorKeyDiffArg *) queryHelper(); if (0==(KDPoverwrite & helper->getFlags())) { if (KDPvaroutputname & helper->getFlags()) return; OwnedRoxieString outputHelperName(helper->getOutputName()); Owned<IDistributedFile> file = queryThorFileManager().lookup(container.queryJob(), outputHelperName, false, true); if (file) throw MakeActivityException(this, TE_OverwriteNotSpecified, "Cannot write %s, file already exists (missing OVERWRITE attribute?)", file->queryLogicalName()); } }
virtual void init() { CMasterActivity::init(); helper = (IHThorKeyPatchArg *)queryHelper(); OwnedRoxieString originalHelperName(helper->getOriginalName()); OwnedRoxieString patchHelperName(helper->getPatchName()); OwnedRoxieString outputHelperName(helper->getOutputName()); StringBuffer expandedFileName; queryThorFileManager().addScope(container.queryJob(), originalHelperName, expandedFileName, false); originalName.set(expandedFileName); queryThorFileManager().addScope(container.queryJob(), patchHelperName, expandedFileName.clear(), false); patchName.set(expandedFileName); queryThorFileManager().addScope(container.queryJob(), outputHelperName, expandedFileName.clear(), false); outputName.set(expandedFileName); originalIndexFile.setown(queryThorFileManager().lookup(container.queryJob(), originalHelperName)); patchFile.setown(queryThorFileManager().lookup(container.queryJob(), patchHelperName)); if (originalIndexFile->numParts() != patchFile->numParts()) throw MakeActivityException(this, TE_KeyPatchIndexSizeMismatch, "Index %s and patch %s differ in width", originalName.get(), patchName.get()); if (originalIndexFile->querySuperFile() || patchFile->querySuperFile()) throw MakeActivityException(this, 0, "Patching super files not supported"); addReadFile(originalIndexFile); addReadFile(patchFile); width = originalIndexFile->numParts(); originalDesc.setown(originalIndexFile->getFileDescriptor()); patchDesc.setown(patchFile->getFileDescriptor()); Owned<IPartDescriptor> tlkDesc = originalDesc->getPart(originalDesc->numParts()-1); const char *kind = tlkDesc->queryProperties().queryProp("@kind"); local = NULL == kind || 0 != stricmp("topLevelKey", kind); if (!local && width > 1) width--; // 1 part == No n distributed / Monolithic key if (width > container.queryJob().querySlaves()) throw MakeActivityException(this, 0, "Unsupported: keypatch(%s, %s) - Cannot patch a key that's wider(%d) than the target cluster size(%d)", originalIndexFile->queryLogicalName(), patchFile->queryLogicalName(), width, container.queryJob().querySlaves()); IArrayOf<IGroup> groups; fillClusterArray(container.queryJob(), outputName, clusters, groups); newIndexDesc.setown(queryThorFileManager().create(container.queryJob(), outputName, clusters, groups, 0 != (KDPoverwrite & helper->getFlags()), 0, !local, width)); if (!local) newIndexDesc->queryPart(newIndexDesc->numParts()-1)->queryProperties().setProp("@kind", "topLevelKey"); }