Dynalib Utils
PageFile.h
Go to the documentation of this file.
1 //
2 // Created by Ken Kopelson on 4/03/18.
3 //
4 
5 #ifndef PAGEFILE_H
6 #define PAGEFILE_H
7 
8 #include <cstdio>
9 #include "String.h"
10 #include "DynaBuffer.h"
11 #include "ICacheConst.h"
12 
13 using namespace std;
14 
15 #define VERSION_MAJ 1
16 #define VERSION_MIN 0
17 
18 #pragma pack(push, 1)
19 struct FileHeader {
20  int16_t versionMaj;
21  int16_t versionMin;
23  uint32_t userHeaderSize;
24  uint32_t pageSize;
28 };
29 
30 struct PageHeader {
33 };
34 #pragma pack(pop)
35 
36 class PageFile {
37  FILE* _file = nullptr;
38  FileHeader _header;
39  DynaBuffer _userHeaderBuf;
40  PageHeader _pageHeader;
41  PageHeader* _pageHeaderRef = nullptr;
42  bool _isNewFile = false;
43 
44 public:
45  explicit PageFile(const String& fileName);
46  explicit PageFile(const String& fileName, uint userHeaderSize, uint pageSize);
47  virtual ~PageFile();
48 
49  static bool exists(const String& fileName);
50  static bool canAccess(const String& fileName);
51  static bool deleteFile(const String& fileName);
52  static bool renameFile(const String& oldName, const String& newName);
53 
54  bool isOpen();
55  bool isNewFile();
56  bool open(const String& fileName, const char* mode);
57  void close();
58  short getVersionMaj() { return _header.versionMaj; }
59  short getVersionMin() { return _header.versionMin; }
60  uint getUserHeaderSize() { return _header.userHeaderSize; }
61  index_t getPageSize() { return _header.pageSize; }
63 
64  void resizeFile(index_t pageCount);
65 
66  FileHeader& getHeader();
67  DynaBuffer* getNewPageBuffer();
68  DynaBuffer* getPageBufferCopy(DynaBuffer* buffer);
69 
70  index_t getUserHeaderOffset() { return sizeof(FileHeader); }
71  index_t getPageHeaderOffset(index_t pageIndex);
72 
73  void rewind();
74  bool readFileHeader();
75  bool writeFileHeader();
76  index_t seekToUserHeader();
77  bool readUserHeader(bool doSeek = true);
78  bool writeUserHeader(bool doSeek = true);
79  index_t seekToPageHeader(index_t pageIndex, int adjust);
80  bool readPageHeader(index_t pageIndex);
81  bool writePageHeader(index_t pageIndex);
82 
83  uint8_t* getUserHeaderPointer();
84  void deletePage(index_t pageIndex, DynaBuffer* buffer);
85  void deletePage(index_t pageIndex);
86  void _clearPage(index_t pageIndex, DynaBuffer* buffer);
87  void clearPage(index_t pageIndex, DynaBuffer* buffer);
88  void clearPages(index_t frPageIndex, index_t toPageIndex);
89  bool readPage(index_t pageIndex, DynaBuffer* buffer);
90  bool readNextPage(DynaBuffer* buffer);
91  void writePage(index_t pageIndex, DynaBuffer* buffer, int bufOffset, size_t length);
92  void writePage(index_t pageIndex, DynaBuffer* buffer);
93  void flushPage(index_t pageIndex, DynaBuffer* buffer);
94  void flushNextPage(DynaBuffer* buffer);
95  index_t getPageCount();
96  index_t getValidPageCount();
97  index_t getFreePage(DynaBuffer* buffer);
98 };
99 
100 
101 #endif //DATAFILE_H
index_t getDeletedPageCount()
Definition: PageFile.h:62
Definition: String.h:60
uint32_t pageSize
Definition: PageFile.h:24
index_t getUserHeaderOffset()
Definition: PageFile.h:70
int64_t index_t
Definition: ICacheConst.h:19
index_t lastDeleted
Definition: PageFile.h:27
bool usesLongIndices
Definition: PageFile.h:22
index_t firstDeleted
Definition: PageFile.h:26
bool deletedFlag
Definition: PageFile.h:31
int16_t versionMin
Definition: PageFile.h:21
short getVersionMaj()
Definition: PageFile.h:58
uint32_t userHeaderSize
Definition: PageFile.h:23
index_t deletedCount
Definition: PageFile.h:25
index_t nextDeleted
Definition: PageFile.h:32
Definition: PageFile.h:30
uint getUserHeaderSize()
Definition: PageFile.h:60
index_t getPageSize()
Definition: PageFile.h:61
Definition: PageFile.h:19
Definition: PageFile.h:36
Definition: DynaBuffer.h:20
short getVersionMin()
Definition: PageFile.h:59
int16_t versionMaj
Definition: PageFile.h:20