1 #ifndef _CEGOFILEHANDLER_H_INCLUDED_
2 #define _CEGOFILEHANDLER_H_INCLUDED_
3 ///////////////////////////////////////////////////////////////////////////////
4 //
5 // CegoFileHandler.h
6 // -----------------
7 // Cego file handler class definition
8 //
9 // Design and Implementation by Bjoern Lemke
10 //
11 // (C)opyright 2000-2019 Bjoern Lemke
12 //
13 // INTERFACE MODULE
14 //
15 // Class: CegoFileHandler
16 //
17 // Description: The filehandler class provides access to all datafiles. Datafiles consists
18 //              of a defined number of pages managed by the this class.
19 //              At the header of a datafile, a bitmap is stored for used page information
20 //
21 // Status: CLEAN
22 //
23 ///////////////////////////////////////////////////////////////////////////////
24 
25 #ifndef _REENTRANT
26 #define _REENTRANT    /* basic 3-lines for threads */
27 #endif
28 
29 // LFC INCLUDES
30 #include <lfcbase/Chain.h>
31 #include <lfcbase/File.h>
32 #include <lfcbase/Logger.h>
33 
34 // CEGO INCLUDES
35 #include "CegoLockHandler.h"
36 #include "CegoDefs.h"
37 #include "CegoModule.h"
38 
39 class CegoFileHandler : public CegoModule {
40 
41 public:
42 
43     enum FileType { DATAFILE, SYSTEMFILE, TEMP };
44 
45     CegoFileHandler(const Chain& logFile, const Chain& progName);
46     ~CegoFileHandler();
47 
48     void setReadOnly(bool isReadOnly);
49 
50     void setBackup(int fileId, bool m);
51 
52     bool needPageBackup(PageIdType pageId);
53     bool isPageMarked(PageIdType pageId, int fileId);
54 
55     // obsolete
56     // void cleanDataFile(int fileId, CegoLockHandler* pLockHandle);
57 
58     void initDataFile(int tabSetId, const Chain& path, int fileId, int numPages, PageIdType pageOffset, FileType ft);
59     void regDataFile(int tabSetId, const Chain& path, int fileId, CegoLockHandler* pLockHandle);
60 
61     void resetDataFile(int fileId);
62 
63     void writePage(PageIdType pageId, unsigned fixStat, char* pageData, CegoLockHandler* pLockHandle);
64     void readPage(PageIdType pageId, int& tabSetId, unsigned& fixStat, char* pageData, CegoLockHandler* pLockHandle);
65 
66     void claimPage(PageIdType pageId, CegoLockHandler* pLockHandle);
67     void allocatePage(int tabSetId, FileType ft, PageIdType& pageId, CegoLockHandler* pLockHandle, unsigned* &fbm, int& fbmSize, bool doAppend = false);
68     void releasePage(PageIdType pageId, CegoLockHandler* pLockHandle, unsigned* &fbm, int& fbmSize);
69 
70     void releaseFiles(int tabSetId);
71 
72     int getNumPages(int fileId);
73     int getNumUsedPages(int fileId, CegoLockHandler* pLockHandle);
74 
75     PageIdType getPageOffset(int fileId);
76 
77     bool isClaimed(PageIdType pageId, CegoLockHandler *pLockHandle);
78 
79     void writeFBM(int fileId, unsigned *fbm, CegoLockHandler *pLockHandle);
80 
81     int getFileIdForPageId(PageIdType pageId);
82 
83     void commitPageEntry(PageIdType pageId);
84     int cleanPages(CegoLockHandler *pLockHandle);
85 
86 protected:
87 
88     int _pageSize;
89 
90 private:
91 
92     int getFBMSize(int fileId);
93     void readFBM(int fileId, unsigned *fbm, CegoLockHandler *pLockHandle);
94 
95     void markPage(PageIdType pageId);
96 
97     File* getHandle(int fileId);
98 
99     void printBitMap(unsigned bm);
100     int mapDiff(unsigned bm1, unsigned bm2);
101 
102     bool _isReg[FILMNG_MAXDATAFILE];
103     int _tabSetId[FILMNG_MAXDATAFILE];
104     int _fileType[FILMNG_MAXDATAFILE];
105     int _numPages[FILMNG_MAXDATAFILE];
106     PageIdType _pageOffset[FILMNG_MAXDATAFILE];
107 
108     File* _fhList[FILMNG_MAXDATAFILE];
109 
110     Chain _path[FILMNG_MAXDATAFILE];
111 
112     unsigned* _buMask[FILMNG_MAXDATAFILE];
113 
114     unsigned* _commitMask[FILMNG_MAXDATAFILE];
115 
116     bool _fbmMask[FILMNG_MAXDATAFILE];
117 
118     PageIdType _appendPos[FILMNG_MAXDATAFILE];
119     int _appendFid;
120 
121     bool _isReadOnly;
122 
123     unsigned long _modId;
124 };
125 
126 #endif
127