jfile.ipp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 JFILE_IPP
  14. #define JFILE_IPP
  15. #include "jfile.hpp"
  16. #include "jmutex.hpp"
  17. #include "jio.ipp"
  18. #include <atomic>
  19. #ifndef _WIN32
  20. #include <sys/types.h>
  21. #include <dirent.h>
  22. #endif
  23. class jlib_decl CFile : implements IFile, public CInterface
  24. {
  25. HANDLE openHandle(IFOmode mode, IFSHmode share, bool async, int stdh=-1);
  26. public:
  27. CFile(const char * _filename);
  28. IMPLEMENT_IINTERFACE
  29. virtual bool exists();
  30. virtual bool getTime(CDateTime * createTime, CDateTime * modifiedTime, CDateTime * accessedTime);
  31. virtual bool setTime(const CDateTime * createTime, const CDateTime * modifiedTime, const CDateTime * accessedTime);
  32. virtual fileBool isDirectory();
  33. virtual fileBool isFile();
  34. virtual fileBool isReadOnly();
  35. virtual IFileIO * open(IFOmode mode, IFEflags extraFlags=IFEnone);
  36. virtual IFileAsyncIO * openAsync(IFOmode mode);
  37. virtual IFileIO * openShared(IFOmode mode,IFSHmode shmode,IFEflags extraFlags=IFEnone);
  38. virtual const char * queryFilename();
  39. virtual bool remove();
  40. virtual void rename(const char *newTail);
  41. virtual void move(const char *newName);
  42. virtual void setReadOnly(bool ro);
  43. virtual void setFilePermissions(unsigned fPerms);
  44. virtual offset_t size();
  45. virtual bool setCompression(bool set);
  46. virtual offset_t compressedSize();
  47. bool fastCopyFile(CFile &target, size32_t buffersize, ICopyFileProgress *progress); // internal use
  48. virtual bool createDirectory();
  49. virtual IDirectoryIterator *directoryFiles(const char *mask=NULL,bool sub=false,bool includedirs=false);
  50. virtual IDirectoryDifferenceIterator *monitorDirectory(
  51. IDirectoryIterator *prev=NULL, // in
  52. const char *mask=NULL,
  53. bool sub=false,
  54. bool includedirs=false,
  55. unsigned checkinterval=60*1000,
  56. unsigned timeout=(unsigned)-1,
  57. Semaphore *abortsem=NULL);
  58. virtual unsigned getCRC();
  59. virtual void setCreateFlags(unsigned short cflags);
  60. virtual void setShareMode(IFSHmode shmode);
  61. virtual bool getInfo(bool &isdir,offset_t &size,CDateTime &modtime);
  62. virtual void copySection(const RemoteFilename &dest, offset_t toOfs, offset_t fromOfs, offset_t size, ICopyFileProgress *progress=NULL, CFflags copyFlags=CFnone);
  63. // if toOfs is (offset_t)-1 then copies entire file
  64. virtual void copyTo(IFile *dest, size32_t buffersize, ICopyFileProgress *progress, bool usetmp, CFflags copyFlags=CFnone);
  65. virtual IMemoryMappedFile *openMemoryMapped(offset_t ofs=0, memsize_t len=(memsize_t)-1, bool write=false);
  66. protected:
  67. StringAttr filename;
  68. unsigned flags;
  69. };
  70. class jlib_decl CFileIO : implements IFileIO, public CInterface
  71. {
  72. public:
  73. CFileIO(HANDLE,IFOmode _openmode,IFSHmode _sharemode,IFEflags _extraFlags);
  74. ~CFileIO();
  75. IMPLEMENT_IINTERFACE
  76. virtual size32_t read(offset_t pos, size32_t len, void * data);
  77. virtual offset_t size();
  78. virtual size32_t write(offset_t pos, size32_t len, const void * data);
  79. virtual void setSize(offset_t size);
  80. virtual offset_t appendFile(IFile *file,offset_t pos,offset_t len);
  81. virtual void flush();
  82. virtual void close();
  83. virtual unsigned __int64 getStatistic(StatisticKind kind);
  84. bool create(const char * filename, bool replace);
  85. bool open(const char * filename);
  86. HANDLE queryHandle() { return file; } // for debugging
  87. protected:
  88. CriticalSection cs;
  89. HANDLE file;
  90. bool throwOnError;
  91. IFSHmode sharemode;
  92. IFOmode openmode;
  93. IFEflags extraFlags;
  94. RelaxedAtomic<cycle_t> ioReadCycles;
  95. RelaxedAtomic<cycle_t> ioWriteCycles;
  96. RelaxedAtomic<__uint64> ioReadBytes;
  97. RelaxedAtomic<__uint64> ioWriteBytes;
  98. RelaxedAtomic<__uint64> ioReads;
  99. RelaxedAtomic<__uint64> ioWrites;
  100. RelaxedAtomic<unsigned> unflushedReadBytes; // more: If this recorded flushedReadBytes it could have a slightly lower overhead
  101. RelaxedAtomic<unsigned> unflushedWriteBytes;
  102. private:
  103. void setPos(offset_t pos);
  104. };
  105. class jlib_decl CFileRangeIO : implements IFileIO, public CInterface
  106. {
  107. public:
  108. CFileRangeIO(IFileIO * _io, offset_t _headerSize, offset_t _maxLength);
  109. IMPLEMENT_IINTERFACE
  110. virtual size32_t read(offset_t pos, size32_t len, void * data);
  111. virtual offset_t size();
  112. virtual size32_t write(offset_t pos, size32_t len, const void * data);
  113. virtual void setSize(offset_t size) { UNIMPLEMENTED; }
  114. virtual offset_t appendFile(IFile *file,offset_t pos,offset_t len) { UNIMPLEMENTED; return 0; }
  115. virtual void flush() { io->flush(); }
  116. virtual void close() { io->close(); }
  117. virtual unsigned __int64 getStatistic(StatisticKind kind) { return io->getStatistic(kind); }
  118. protected:
  119. Linked<IFileIO> io;
  120. offset_t curOffset;
  121. offset_t headerSize;
  122. offset_t maxLength;
  123. };
  124. class jlib_decl CFileAsyncIO : implements IFileAsyncIO, public CInterface
  125. {
  126. public:
  127. CFileAsyncIO(HANDLE,IFSHmode _sharemode);
  128. ~CFileAsyncIO();
  129. IMPLEMENT_IINTERFACE
  130. virtual size32_t read(offset_t pos, size32_t len, void * data);
  131. virtual offset_t size();
  132. virtual size32_t write(offset_t pos, size32_t len, const void * data);
  133. virtual offset_t appendFile(IFile *file,offset_t pos,offset_t len);
  134. virtual void flush();
  135. virtual void close();
  136. virtual unsigned __int64 getStatistic(StatisticKind kind);
  137. virtual void setSize(offset_t size);
  138. virtual IFileAsyncResult *readAsync(offset_t pos, size32_t len, void * data);
  139. virtual IFileAsyncResult *writeAsync(offset_t pos, size32_t len, const void * data);
  140. bool create(const char * filename, bool replace);
  141. bool open(const char * filename);
  142. protected: friend class CFileAsyncResult;
  143. CriticalSection cs;
  144. HANDLE file;
  145. bool throwOnError;
  146. IArrayOf<IFileAsyncResult> results;
  147. IFSHmode sharemode;
  148. };
  149. class CFileIOStream : implements IFileIOStream, public CInterface
  150. {
  151. public:
  152. CFileIOStream(IFileIO * _io);
  153. IMPLEMENT_IINTERFACE
  154. virtual void flush();
  155. virtual size32_t read(size32_t len, void * data);
  156. virtual void seek(offset_t pos, IFSmode origin);
  157. virtual offset_t size();
  158. virtual offset_t tell();
  159. virtual size32_t write(size32_t len, const void * data);
  160. protected:
  161. Linked<IFileIO> io;
  162. offset_t curOffset;
  163. };
  164. class jlib_decl CIOStreamReadWriteSeq : public IWriteSeq, public IReadSeq, public CInterface
  165. {
  166. public:
  167. IMPLEMENT_IINTERFACE;
  168. CIOStreamReadWriteSeq(IFileIOStream * _stream, offset_t _offset, size32_t _size);
  169. virtual void put(const void *src);
  170. virtual void putn(const void *src, unsigned n);
  171. virtual void flush();
  172. virtual size32_t getRecordSize() { return size; }
  173. virtual offset_t getPosition();
  174. virtual bool get(void *dst);
  175. virtual unsigned getn(void *dst, unsigned n);
  176. virtual void reset();
  177. virtual void stop() {} // no action required
  178. private:
  179. offset_t offset;
  180. size32_t size;
  181. Linked<IFileIOStream> stream;
  182. };
  183. class jlib_decl DirectBufferI : implements IFileIO, public CInterface
  184. {
  185. public:
  186. DirectBufferI(unsigned _len, const void * _buffer) { buffLen = _len; buffer = (byte *)_buffer; }
  187. virtual size32_t read(offset_t pos, size32_t len, void * data);
  188. virtual offset_t size() { return buffLen; }
  189. virtual size32_t write(offset_t pos, size32_t len, const void * data);
  190. virtual void setSize(offset_t size) { UNIMPLEMENTED; }
  191. protected:
  192. size32_t buffLen;
  193. byte * buffer;
  194. };
  195. class jlib_decl DirectBufferIO : public DirectBufferI
  196. {
  197. public:
  198. DirectBufferIO(unsigned _len, void * _buffer) : DirectBufferI(_len, _buffer) {}
  199. virtual size32_t write(offset_t pos, size32_t len, const void * data);
  200. };
  201. #endif