00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 BEGIN_GIGABASE_NAMESPACE
00012
00013 class dbPageLruList {
00014 public:
00015 int4 next;
00016 int4 prev;
00017 };
00018
00019 class dbPageEvent : public dbEvent {
00020 public:
00021 union {
00022 int count;
00023 int next;
00024 };
00025
00026 void reset() {
00027 count = 0;
00028 dbEvent::reset();
00029 }
00030 };
00031
00032 class dbPageHeader : public dbPageLruList {
00033 public:
00034 int4 collisionChain;
00035 nat4 accessCount;
00036 offs_t offs;
00037 int4 writeQueueIndex;
00038 nat2 wob;
00039 nat1 state;
00040 enum PageState {
00041 psDirty = 0x01,
00042 psRaw = 0x02,
00043 psWait = 0x04
00044 };
00045 };
00046
00047 class GIGABASE_DLL_ENTRY dbPagePool {
00048 friend class dbGetTie;
00049 friend class dbPutTie;
00050 protected:
00051 dbPageHeader* pages;
00052 int* hashTable;
00053 int freePages;
00054 int nPages;
00055
00056 int nWobs;
00057 int freeWobs;
00058 dbPageEvent* wobs;
00059
00060 dbMutex mutex;
00061 dbFile* file;
00062 dbDatabase* db;
00063 size_t hashBits;
00064 size_t poolSize;
00065 byte* buffer;
00066 size_t bufferSize;
00067 offs_t fileSize;
00068
00069 int flushing;
00070
00071 enum {
00072 initialWobArraySize = 8,
00073 minPoolSize = 256,
00074 minHashSize = 16*1024,
00075 maxUnusedMemory = 64*1024*1024
00076 };
00077
00078 size_t nDirtyPages;
00079 dbPageHeader** dirtyPages;
00080
00081 byte* find(offs_t addr, int state);
00082
00083 public:
00084 byte* get(offs_t addr) {
00085 return find(addr, 0);
00086 }
00087 byte* put(offs_t addr) {
00088 return find(addr, dbPageHeader::psDirty);
00089 }
00090 void copy(offs_t dst, offs_t src, offs_t size);
00091 void unfix(void* ptr);
00092 void unfixLIFO(void* ptr);
00093 void fix(void* ptr);
00094 void modify(void* ptr);
00095 bool open(dbFile* file, offs_t fileSize);
00096 void close();
00097 void flush();
00098 void clear(offs_t fileSize);
00099 void setPoolSize(size_t newSize) {
00100 poolSize = newSize;
00101 }
00102
00103 bool destructed() { return pages == NULL; }
00104
00105 dbPagePool(dbDatabase* dbs, size_t size) : db(dbs), poolSize(size) {}
00106 };
00107
00108 class GIGABASE_DLL_ENTRY dbGetTie {
00109 friend class dbDatabase;
00110 friend class dbAnyCursor;
00111 dbPagePool* pool;
00112 byte* obj;
00113 byte* page;
00114
00115 void set(dbPagePool& pool, offs_t pos);
00116 void set(dbPagePool& pool, offs_t pos, size_t size);
00117 void fetch(dbPagePool& pool, offs_t pos);
00118 void reset();
00119 public:
00120 byte* get() { return obj; }
00121
00122 dbGetTie() {
00123 obj = NULL;
00124 }
00125 ~dbGetTie() {
00126 reset();
00127 }
00128 };
00129
00130 class GIGABASE_DLL_ENTRY dbPutTie {
00131 friend class dbDatabase;
00132 friend class dbBtree;
00133 friend class dbRtree;
00134
00135 dbPagePool* pool;
00136 byte* obj;
00137 byte* page;
00138 size_t size;
00139 offs_t pos;
00140 oid_t oid;
00141 bool updateCursors;
00142
00143 void set(dbPagePool& pool, oid_t oid, offs_t pos, size_t size);
00144 void reset();
00145 void unset() {
00146 if (obj != NULL) {
00147 if (page == NULL) {
00148 dbFree(obj);
00149 }
00150 obj = NULL;
00151 }
00152 }
00153 public:
00154 byte* get() { return obj; }
00155
00156 dbPutTie(bool updateCursors = false) {
00157 this->updateCursors = updateCursors;
00158 obj = NULL;
00159 oid = 0;
00160 }
00161 ~dbPutTie() {
00162 reset();
00163 }
00164 };
00165
00166
00167 END_GIGABASE_NAMESPACE
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186