thorcommon.hpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef THORCOMMON_HPP
  14. #define THORCOMMON_HPP
  15. #include "jiface.hpp"
  16. #include "jcrc.hpp"
  17. #include "jsort.hpp"
  18. #include "eclhelper.hpp"
  19. #include "thorhelper.hpp"
  20. #include "thorxmlwrite.hpp"
  21. #define DALI_RESULT_OUTPUTMAX 2000 // MB
  22. class THORHELPER_API CSizingSerializer : implements IRowSerializerTarget
  23. {
  24. size32_t totalsize;
  25. public:
  26. inline CSizingSerializer() { reset(); }
  27. inline void reset() { totalsize = 0; }
  28. inline size32_t size() { return totalsize; }
  29. void put(size32_t len, const void * ptr);
  30. size32_t beginNested();
  31. void endNested(size32_t position);
  32. };
  33. class THORHELPER_API CMemoryRowSerializer: implements IRowSerializerTarget
  34. {
  35. MemoryBuffer & buffer;
  36. unsigned nesting;
  37. public:
  38. inline CMemoryRowSerializer(MemoryBuffer & _buffer)
  39. : buffer(_buffer)
  40. {
  41. nesting = 0;
  42. }
  43. void put(size32_t len, const void * ptr);
  44. size32_t beginNested();
  45. void endNested(size32_t sizePos);
  46. };
  47. // useful package
  48. interface IRowInterfaces: extends IInterface
  49. {
  50. virtual IEngineRowAllocator * queryRowAllocator()=0;
  51. virtual IOutputRowSerializer * queryRowSerializer()=0;
  52. virtual IOutputRowDeserializer * queryRowDeserializer()=0;
  53. virtual IOutputMetaData *queryRowMetaData()=0;
  54. virtual unsigned queryActivityId()=0;
  55. virtual ICodeContext *queryCodeContext()=0;
  56. };
  57. extern THORHELPER_API void useMemoryMappedRead(bool on);
  58. extern THORHELPER_API IRowInterfaces *createRowInterfaces(IOutputMetaData *meta, unsigned actid, ICodeContext *context);
  59. enum RowReaderWriterFlags
  60. {
  61. rw_grouped = 0x1,
  62. rw_crc = 0x2,
  63. rw_extend = 0x4,
  64. rw_compress = 0x8,
  65. rw_compressblkcrc = 0x10, // block compression, this sets/checks crc's at block level
  66. rw_fastlz = 0x20, // if rw_compress
  67. rw_autoflush = 0x40,
  68. rw_buffered = 0x80
  69. };
  70. #define DEFAULT_RWFLAGS (rw_buffered|rw_autoflush|rw_compressblkcrc)
  71. inline bool TestRwFlag(unsigned flags, RowReaderWriterFlags flag) { return 0 != (flags & flag); }
  72. interface IExtRowStream: extends IRowStream
  73. {
  74. virtual offset_t getOffset() = 0;
  75. virtual void stop(CRC32 *crcout=NULL) = 0;
  76. virtual const void *prefetchRow(size32_t *sz=NULL) = 0;
  77. virtual void prefetchDone() = 0;
  78. virtual void reinit(offset_t offset,offset_t len,unsigned __int64 maxrows) = 0;
  79. };
  80. interface IExtRowWriter: extends IRowWriter
  81. {
  82. virtual offset_t getPosition() = 0;
  83. virtual void flush(CRC32 *crcout=NULL) = 0;
  84. };
  85. interface IExpander;
  86. extern THORHELPER_API IExtRowStream *createRowStream(IFile *file, IRowInterfaces *rowif, unsigned flags=DEFAULT_RWFLAGS, IExpander *eexp=NULL);
  87. extern THORHELPER_API IExtRowStream *createRowStreamEx(IFile *file, IRowInterfaces *rowif, offset_t offset=0, offset_t len=(offset_t)-1, unsigned __int64 maxrows=(unsigned __int64)-1, unsigned flags=DEFAULT_RWFLAGS, IExpander *eexp=NULL);
  88. interface ICompressor;
  89. extern THORHELPER_API IExtRowWriter *createRowWriter(IFile *file, IRowInterfaces *rowIf, unsigned flags=DEFAULT_RWFLAGS, ICompressor *compressor=NULL);
  90. extern THORHELPER_API IExtRowWriter *createRowWriter(IFileIO *fileIO, IRowInterfaces *rowIf, unsigned flags=DEFAULT_RWFLAGS);
  91. extern THORHELPER_API IExtRowWriter *createRowWriter(IFileIOStream *strm, IRowInterfaces *rowIf, unsigned flags=DEFAULT_RWFLAGS); // strm should be unbuffered
  92. interface THORHELPER_API IDiskMerger : extends IInterface
  93. {
  94. virtual void put(const void **rows, unsigned numrows) = 0;
  95. virtual void putIndirect(const void ***rowptrs, unsigned numrows) = 0; // like put only with an additional dereference, i.e. row i is *(rowptrs[i])
  96. virtual void put(ISortedRowProvider * rows) = 0;
  97. virtual IRowStream *merge(ICompare *icompare,bool partdedup=false) = 0;
  98. virtual count_t mergeTo(IRowWriter *dest,ICompare *icompare,bool partdedup=false) = 0; // alternative to merge
  99. virtual IRowWriter *createWriteBlock() = 0;
  100. };
  101. extern THORHELPER_API IDiskMerger *createDiskMerger(IRowInterfaces *rowInterfaces, IRowLinkCounter *linker, const char *tempnamebase);
  102. extern THORHELPER_API void testDiskSort();
  103. #define TIME_ACTIVITIES
  104. interface IActivityTimer : extends IInterface
  105. {
  106. virtual unsigned __int64 getCyclesAdjustment() const = 0;
  107. };
  108. #ifdef TIME_ACTIVITIES
  109. #include "jdebug.hpp"
  110. class ActivityTimer
  111. {
  112. unsigned __int64 startCycles;
  113. unsigned __int64 &accumulator;
  114. protected:
  115. const bool &enabled;
  116. IActivityTimer *iActivityTimer;
  117. public:
  118. inline ActivityTimer(unsigned __int64 &_accumulator, const bool &_enabled, IActivityTimer *_iActivityTimer) : accumulator(_accumulator), enabled(_enabled), iActivityTimer(_iActivityTimer)
  119. {
  120. if (enabled)
  121. {
  122. startCycles = get_cycles_now();
  123. if (iActivityTimer)
  124. startCycles -= iActivityTimer->getCyclesAdjustment();
  125. }
  126. }
  127. inline ~ActivityTimer()
  128. {
  129. if (enabled)
  130. {
  131. unsigned __int64 elapsedCycles = get_cycles_now() - startCycles;
  132. if (iActivityTimer)
  133. elapsedCycles -= iActivityTimer->getCyclesAdjustment();
  134. accumulator += elapsedCycles;
  135. }
  136. }
  137. };
  138. #else
  139. struct ActivityTimer
  140. {
  141. inline ActivityTimer(unsigned __int64 &_accumulator, const bool &_enabled, IActivityTimer *_iActivityTimer) { }
  142. };
  143. #endif
  144. class THORHELPER_API IndirectCodeContext : implements ICodeContext
  145. {
  146. public:
  147. IndirectCodeContext(ICodeContext * _ctx = NULL) : ctx(_ctx) {}
  148. void set(ICodeContext * _ctx) { ctx = _ctx; }
  149. virtual const char *loadResource(unsigned id)
  150. {
  151. return ctx->loadResource(id);
  152. }
  153. virtual void setResultBool(const char *name, unsigned sequence, bool value)
  154. {
  155. ctx->setResultBool(name, sequence, value);
  156. }
  157. virtual void setResultData(const char *name, unsigned sequence, int len, const void * data)
  158. {
  159. ctx->setResultData(name, sequence, len, data);
  160. }
  161. virtual void setResultDecimal(const char * stepname, unsigned sequence, int len, int precision, bool isSigned, const void *val)
  162. {
  163. ctx->setResultDecimal(stepname, sequence, len, precision, isSigned, val);
  164. }
  165. virtual void setResultInt(const char *name, unsigned sequence, __int64 value)
  166. {
  167. ctx->setResultInt(name, sequence, value);
  168. }
  169. virtual void setResultRaw(const char *name, unsigned sequence, int len, const void * data)
  170. {
  171. ctx->setResultRaw(name, sequence, len, data);
  172. }
  173. virtual void setResultReal(const char * stepname, unsigned sequence, double value)
  174. {
  175. ctx->setResultReal(stepname, sequence, value);
  176. }
  177. virtual void setResultSet(const char *name, unsigned sequence, bool isAll, size32_t len, const void * data, ISetToXmlTransformer * transformer)
  178. {
  179. ctx->setResultSet(name, sequence, isAll, len, data, transformer);
  180. }
  181. virtual void setResultString(const char *name, unsigned sequence, int len, const char * str)
  182. {
  183. ctx->setResultString(name, sequence, len, str);
  184. }
  185. virtual void setResultUInt(const char *name, unsigned sequence, unsigned __int64 value)
  186. {
  187. ctx->setResultUInt(name, sequence, value);
  188. }
  189. virtual void setResultUnicode(const char *name, unsigned sequence, int len, UChar const * str)
  190. {
  191. ctx->setResultUnicode(name, sequence, len, str);
  192. }
  193. virtual void setResultVarString(const char * name, unsigned sequence, const char * value)
  194. {
  195. ctx->setResultVarString(name, sequence, value);
  196. }
  197. virtual void setResultVarUnicode(const char * name, unsigned sequence, UChar const * value)
  198. {
  199. ctx->setResultVarUnicode(name, sequence, value);
  200. }
  201. virtual bool getResultBool(const char * name, unsigned sequence)
  202. {
  203. return ctx->getResultBool(name, sequence);
  204. }
  205. virtual void getResultData(unsigned & tlen, void * & tgt, const char * name, unsigned sequence)
  206. {
  207. ctx->getResultData(tlen, tgt, name, sequence);
  208. }
  209. virtual void getResultDecimal(unsigned tlen, int precision, bool isSigned, void * tgt, const char * stepname, unsigned sequence)
  210. {
  211. ctx->getResultDecimal(tlen, precision, isSigned, tgt, stepname, sequence);
  212. }
  213. virtual void getResultRaw(unsigned & tlen, void * & tgt, const char * name, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer)
  214. {
  215. ctx->getResultRaw(tlen, tgt, name, sequence, xmlTransformer, csvTransformer);
  216. }
  217. virtual void getResultSet(bool & isAll, size32_t & tlen, void * & tgt, const char * name, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer)
  218. {
  219. ctx->getResultSet(isAll, tlen, tgt, name, sequence, xmlTransformer, csvTransformer);
  220. }
  221. virtual __int64 getResultInt(const char * name, unsigned sequence)
  222. {
  223. return ctx->getResultInt(name, sequence);
  224. }
  225. virtual double getResultReal(const char * name, unsigned sequence)
  226. {
  227. return ctx->getResultReal(name, sequence);
  228. }
  229. virtual void getResultString(unsigned & tlen, char * & tgt, const char * name, unsigned sequence)
  230. {
  231. ctx->getResultString(tlen, tgt, name, sequence);
  232. }
  233. virtual void getResultStringF(unsigned tlen, char * tgt, const char * name, unsigned sequence)
  234. {
  235. ctx->getResultStringF(tlen, tgt, name, sequence);
  236. }
  237. virtual void getResultUnicode(unsigned & tlen, UChar * & tgt, const char * name, unsigned sequence)
  238. {
  239. ctx->getResultUnicode(tlen, tgt, name, sequence);
  240. }
  241. virtual char *getResultVarString(const char * name, unsigned sequence)
  242. {
  243. return ctx->getResultVarString(name, sequence);
  244. }
  245. virtual UChar *getResultVarUnicode(const char * name, unsigned sequence)
  246. {
  247. return ctx->getResultVarUnicode(name, sequence);
  248. }
  249. virtual unsigned getResultHash(const char * name, unsigned sequence)
  250. {
  251. return ctx->getResultHash(name, sequence);
  252. }
  253. virtual char *getWuid()
  254. {
  255. return ctx->getWuid();
  256. }
  257. virtual void getExternalResultRaw(unsigned & tlen, void * & tgt, const char * wuid, const char * stepname, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer)
  258. {
  259. ctx->getExternalResultRaw(tlen, tgt, wuid, stepname, sequence, xmlTransformer, csvTransformer);
  260. }
  261. virtual void executeGraph(const char * graphName, bool realThor, size32_t parentExtractSize, const void * parentExtract)
  262. {
  263. ctx->executeGraph(graphName, realThor, parentExtractSize, parentExtract);
  264. }
  265. virtual char * getExpandLogicalName(const char * logicalName)
  266. {
  267. return ctx->getExpandLogicalName(logicalName);
  268. }
  269. virtual void addWuException(const char * text, unsigned code, unsigned severity)
  270. {
  271. ctx->addWuException(text, code, severity);
  272. }
  273. virtual void addWuAssertFailure(unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, bool isAbort)
  274. {
  275. ctx->addWuAssertFailure(code, text, filename, lineno, column, isAbort);
  276. }
  277. virtual IUserDescriptor *queryUserDescriptor()
  278. {
  279. return ctx->queryUserDescriptor();
  280. }
  281. virtual IThorChildGraph * resolveChildQuery(__int64 activityId, IHThorArg * colocal)
  282. {
  283. return ctx->resolveChildQuery(activityId, colocal);
  284. }
  285. virtual unsigned __int64 getDatasetHash(const char * name, unsigned __int64 hash)
  286. {
  287. return ctx->getDatasetHash(name, hash);
  288. }
  289. virtual unsigned getNodes()
  290. {
  291. return ctx->getNodes();
  292. }
  293. virtual unsigned getNodeNum()
  294. {
  295. return ctx->getNodeNum();
  296. }
  297. virtual char *getFilePart(const char *logicalPart, bool create)
  298. {
  299. return ctx->getFilePart(logicalPart, create);
  300. }
  301. virtual unsigned __int64 getFileOffset(const char *logicalPart)
  302. {
  303. return ctx->getFileOffset(logicalPart);
  304. }
  305. virtual IDistributedFileTransaction *querySuperFileTransaction()
  306. {
  307. return ctx->querySuperFileTransaction();
  308. }
  309. virtual char *getEnv(const char *name, const char *defaultValue) const
  310. {
  311. return ctx->getEnv(name, defaultValue);
  312. }
  313. virtual char *getJobName()
  314. {
  315. return ctx->getJobName();
  316. }
  317. virtual char *getJobOwner()
  318. {
  319. return ctx->getJobOwner();
  320. }
  321. virtual char *getClusterName()
  322. {
  323. return ctx->getClusterName();
  324. }
  325. virtual char *getGroupName()
  326. {
  327. return ctx->getGroupName();
  328. }
  329. virtual char * queryIndexMetaData(char const * lfn, char const * xpath)
  330. {
  331. return ctx->queryIndexMetaData(lfn, xpath);
  332. }
  333. virtual unsigned getPriority() const
  334. {
  335. return ctx->getPriority();
  336. }
  337. virtual char *getPlatform()
  338. {
  339. return ctx->getPlatform();
  340. }
  341. virtual char *getOS()
  342. {
  343. return ctx->getOS();
  344. }
  345. virtual IEclGraphResults * resolveLocalQuery(__int64 activityId)
  346. {
  347. return ctx->resolveLocalQuery(activityId);
  348. }
  349. virtual char *getEnv(const char *name, const char *defaultValue)
  350. {
  351. return ctx->getEnv(name, defaultValue);
  352. }
  353. virtual unsigned logString(const char *text) const
  354. {
  355. return ctx->logString(text);
  356. }
  357. virtual const IContextLogger &queryContextLogger() const
  358. {
  359. return ctx->queryContextLogger();
  360. }
  361. virtual IDebuggableContext *queryDebugContext() const
  362. {
  363. return ctx->queryDebugContext();
  364. }
  365. virtual IEngineRowAllocator * getRowAllocator(IOutputMetaData * meta, unsigned activityId) const
  366. {
  367. return ctx->getRowAllocator(meta, activityId);
  368. }
  369. virtual const char *cloneVString(const char *str) const
  370. {
  371. return ctx->cloneVString(str);
  372. }
  373. virtual const char *cloneVString(size32_t len, const char *str) const
  374. {
  375. return ctx->cloneVString(len, str);
  376. }
  377. virtual void getResultRowset(size32_t & tcount, byte * * & tgt, const char * name, unsigned sequence, IEngineRowAllocator * _rowAllocator, bool isGrouped, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer)
  378. {
  379. ctx->getResultRowset(tcount, tgt, name, sequence, _rowAllocator, isGrouped, xmlTransformer, csvTransformer);
  380. }
  381. virtual void getResultDictionary(size32_t & tcount, byte * * & tgt, IEngineRowAllocator * _rowAllocator, const char * name, unsigned sequence, IXmlToRowTransformer * xmlTransformer, ICsvToRowTransformer * csvTransformer, IHThorHashLookupInfo * hasher)
  382. {
  383. ctx->getResultDictionary(tcount, tgt, _rowAllocator, name, sequence, xmlTransformer, csvTransformer, hasher);
  384. }
  385. virtual void getRowXML(size32_t & lenResult, char * & result, IOutputMetaData & info, const void * row, unsigned flags)
  386. {
  387. convertRowToXML(lenResult, result, info, row, flags);
  388. }
  389. virtual const void * fromXml(IEngineRowAllocator * _rowAllocator, size32_t len, const char * utf8, IXmlToRowTransformer * xmlTransformer, bool stripWhitespace)
  390. {
  391. return ctx->fromXml(_rowAllocator, len, utf8, xmlTransformer, stripWhitespace);
  392. }
  393. virtual IEngineContext *queryEngineContext()
  394. {
  395. return ctx->queryEngineContext();
  396. }
  397. virtual char *getDaliServers()
  398. {
  399. return ctx->getDaliServers();
  400. }
  401. protected:
  402. ICodeContext * ctx;
  403. };
  404. extern THORHELPER_API bool isActivitySink(ThorActivityKind kind);
  405. extern THORHELPER_API bool isActivitySource(ThorActivityKind kind);
  406. extern THORHELPER_API const char * getActivityText(ThorActivityKind kind);
  407. #endif // THORHELPER_HPP