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 fetch(dbPagePool& pool, offs_t pos);
00117 void reset();
00118 public:
00119 byte* get() { return obj; }
00120
00121 dbGetTie() {
00122 obj = NULL;
00123 }
00124 ~dbGetTie() {
00125 reset();
00126 }
00127 };
00128
00129 class GIGABASE_DLL_ENTRY dbPutTie {
00130 friend class dbDatabase;
00131 friend class dbBtree;
00132 friend class dbRtree;
00133
00134 dbPagePool* pool;
00135 byte* obj;
00136 byte* page;
00137 size_t size;
00138 offs_t pos;
00139 oid_t oid;
00140
00141 void set(dbPagePool& pool, oid_t oid, offs_t pos, size_t size);
00142 void reset();
00143 void unset() {
00144 if (obj != NULL) {
00145 if (page == NULL) {
00146 dbFree(obj);
00147 }
00148 obj = NULL;
00149 }
00150 }
00151 public:
00152 byte* get() { return obj; }
00153
00154 dbPutTie() {
00155 obj = NULL;
00156 oid = 0;
00157 }
00158 ~dbPutTie() {
00159 reset();
00160 }
00161 };
00162
00163
00164 END_GIGABASE_NAMESPACE
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183