changes for open source mmdb build
[csql.git] / include / TableImpl.h
blob7a758fcc6e6df4fc7082f1accd84b9870cc7646f
1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 ***************************************************************************/
16 #ifndef TABLE_IMPL_H
17 #define TABLE_IMPL_H
18 #include<os.h>
19 #include<DataType.h>
20 #include<Transaction.h>
21 #include<Database.h>
22 #include<Index.h>
23 #include<CatalogTables.h>
24 #include<Info.h>
25 #include<Debug.h>
26 #include<DatabaseManagerImpl.h>
27 #include<Predicate.h>
28 #include<AggTableImpl.h>//for AggType
29 #ifndef SCANTYPE
30 enum ScanType
32 fullTableScan = 0,
33 hashIndexScan,
34 treeIndexScan,
35 unknownScan
37 #define SCANTYPE
38 #endif
40 static char ScanTypeNames[][10] =
42 "TableScan", "HashScan", "TreeScan", "Invalid"
45 class Predicate;
47 class TupleIterator
49 Predicate *pred_;
50 ScanType scanType_;
51 ChunkIterator *cIter;
52 BucketIter *bIter;
53 TreeIter *tIter;
54 IndexInfo *info;
55 char *keyBuffer;
56 char *keyPtr;
57 ComparisionOp op;
58 void *chunkPtr_;
59 int procSlot;
60 bool isBetween;
61 bool isPointLook;
62 bool shouldNullCheck;
63 bool isClosed;
64 TupleIterator() { }
65 public:
66 TupleIterator(Predicate *p, ScanType t, IndexInfo *i, void *cptr, int pslot,bool between , bool isPtLook,bool nullflag)
67 { bIter = new BucketIter();
68 cIter = new ChunkIterator();;
69 tIter = new TreeIter();
70 keyBuffer = NULL;
71 pred_ = p ; scanType_ = t; info = i; chunkPtr_ = cptr;
72 isClosed =true;
73 procSlot =pslot; isBetween=between; isPointLook=isPtLook; shouldNullCheck=nullflag;
75 DbRetVal setPlan();
77 ~TupleIterator()
79 if (bIter) { delete bIter; bIter = NULL; }
80 if (cIter) { delete cIter; cIter = NULL; }
81 if (tIter) { delete tIter; tIter = NULL; }
82 if (keyBuffer) { ::free(keyBuffer); keyBuffer = NULL; }
84 bool isIterClosed() { return isClosed; }
85 bool isBetInvolved(){ return isBetween;}
86 void setBetInvolved(bool between){ isBetween=between;}
87 bool isPointLookInvolved(){return isPointLook;}
88 DbRetVal open();
89 void* next();
90 void* prev();//used only for tree iter during deleteTuple
91 void reset();
92 DbRetVal close();
94 class TableImpl:public Table
96 private:
97 LockManager *lMgr_;
98 Transaction **trans;
99 //This is pointer to the pointer stored in the
100 //Transaction manager.
101 //If the transaction commits/aborts this pointer changes
102 //and this will get that newly allocated transaction
104 char tblName_[IDENTIFIER_LENGTH];
105 int tblID_;
106 size_t length_; //length of the tuple
107 int numFlds_;
108 void* chunkPtr_;
109 void *curTuple_; //holds the current tuple ptr. moved during fetch() calls
111 Predicate *pred_;
112 List predList;
113 ScanType scanType_;
114 //ChunkIterator *iter;
115 //BucketIter *bIter;
117 TupleIterator *iter;
119 bool loadFlag;
120 char aliasName[IDENTIFIER_LENGTH];
122 public:
123 FieldList fldList_;
124 List bindList_;
125 void **bindListArray_;
126 int numBindFlds_;
127 int numIndexes_;
128 int numFkRelation_;
129 char** indexPtr_; // array of index ptrs to the catalog table for the indexes of this table.
130 IndexInfo **idxInfo;
131 int useIndex_;//offet in the above array indexPtr_ for scan
132 bool isPlanCreated;
133 bool isPointLook;
134 bool isBetween;
135 Database *db_;
136 Database *sysDB_;
137 void *ptrToAuto;
138 //Either one of the below is populated based on the no of fields and
139 //is used for tuple insertions
140 bool isIntUsedForNULL;
141 int iNullInfo;
142 char *cNullInfo;
143 int iNotNullInfo;
144 char *cNotNullInfo;
145 //Table *fkTbl;
146 List tblList;
147 List tblFkList;
148 bool isFkTbl;
149 bool isPkTbl;
150 bool shouldNullSearch;
151 private:
153 //copy Values from binded buffer to tuple pointed by arg
154 DbRetVal copyValuesFromBindBuffer(void *tuple, bool isInsert=true);
155 DbRetVal copyValuesToBindBuffer(void *tuple);
156 void setNullBit(int fldpos);
157 void clearNullBit(int fldpos);
158 DbRetVal insertIndexNode(Transaction *trans, void *indexPtr, IndexInfo *info, void *tuple);
159 DbRetVal updateIndexNode(Transaction *trans, void *indexPtr, IndexInfo *info, void *tuple);
160 DbRetVal deleteIndexNode(Transaction *trans, void *indexPtr, IndexInfo *info, void *tuple);
161 bool isFKTable(){return isFkTbl;};
162 DbRetVal createPlan();
163 Chunk* getSystemTableChunk(CatalogTableID id)
165 return sysDB_->getSystemDatabaseChunk(id);
167 DbRetVal trySharedLock(void *curTuple, Transaction **trans);
168 DbRetVal tryExclusiveLock(void *curTuple, Transaction **trans);
171 public:
172 TableImpl() { db_ = NULL; chunkPtr_ = NULL; iter = NULL;
173 idxInfo = NULL; indexPtr_ = NULL; scanType_ = unknownScan;
174 pred_ = NULL; useIndex_ = -1; numFlds_ = 0; bindListArray_ = NULL;
175 iNullInfo = 0; cNullInfo = NULL; isIntUsedForNULL = true;
176 iNotNullInfo = 0; cNotNullInfo = NULL; curTuple_ = NULL;
177 isPlanCreated = false; loadFlag = false;isFkTbl=false;isPkTbl=false;numFkRelation_=0; shouldNullSearch = false;}
178 ~TableImpl();
180 void setDB(Database *db) { db_ = db; }
181 Database* getDB() { return db_;}
182 void setSystemDB(Database *db) { sysDB_ = db; }
183 void setLockManager(LockManager *lmgr) { lMgr_ = lmgr; }
184 void setTrans(Transaction **t) { trans = t; }
185 inline void setCurTuple(void *tuple){ curTuple_=tuple; }
186 DataType getFieldType(const char *name)
187 { return fldList_.getFieldType(name); }
188 int getFieldOffset(const char *name)
189 { return fldList_.getFieldOffset(name); }
190 size_t getFieldLength(const char *name)
191 { return fldList_.getFieldLength(name); }
192 int getNumFields() { return numFlds_; }
193 void fillFieldInfo(int pos, void* val)
194 { return fldList_.fillFieldInfo(pos,val); }
196 DbRetVal getFieldInfo(const char *fieldName, FieldInfo *&info)
198 char tblName[IDENTIFIER_LENGTH];
199 char fldName[IDENTIFIER_LENGTH];
200 getTableNameAlone((char*)fieldName, tblName);
201 getFieldNameAlone((char*)fieldName, fldName);
202 if (0 == strcmp(tblName, "") || 0 ==strcmp(tblName, getName()) ||
203 0 == strcmp(tblName, getAliasName()))
204 return fldList_.getFieldInfo(fldName, info);
205 else
206 return ErrNotExists;
209 List getFieldNameList();
211 // search predicate
212 void setCondition(Condition *p);
213 //{ isPlanCreated = false; if (p) pred_ = p->getPredicate(); else pred_ = NULL;}
215 //binding
216 DbRetVal bindFld(const char *name, void *val);
217 void *getBindFldAddr(const char *name);
218 int getFldPos(char *name);
219 DbRetVal markFldNull(const char *name);
220 DbRetVal markFldNull(int colpos);
221 bool isFldNull(const char *name);
222 bool isFldNull(int colpos);
224 void clearFldNull(const char *name);
225 void clearFldNull(int colpos);
226 void resetNullinfo();
227 DbRetVal insertTuple();
228 DbRetVal updateTuple();
230 DbRetVal deleteTuple();
231 int deleteWhere();
232 int truncate();
234 DbRetVal execute();
235 bool isPkTableHasRecord(char *name,TableImpl *fkTbl,bool isInsert);
236 bool isFkTableHasRecord(char *name,TableImpl *fkTbl);
237 void* fetch();
238 void* fetch(DbRetVal &rv);
239 void* fetchNoBind();
240 void* fetchNoBind(DbRetVal &rv);
241 DbRetVal fetchAgg(const char *fldName, AggType aType, void *buf, bool &noRec);
243 DbRetVal close();
244 DbRetVal closeScan();
247 long spaceUsed();
248 long numTuples();
249 int pagesUsed();
250 void printInfo();
251 void printPlan(int space);
253 DbRetVal lock(bool shared);
254 DbRetVal unlock();
256 DbRetVal setUndoLogging(bool flag) { loadFlag = flag; return OK;}
258 void printSQLIndexString(FILE *fp, int fd);
259 void printSQLForeignString();
260 DbRetVal optimize();
261 bool isTableInvolved(char *tblName);
262 bool pushPredicate(Predicate *pred);
263 void setPredicate(Predicate *pred);
264 ScanType getScanType() { return scanType_; }
265 bool hasIndex(char *fldName);
266 IndexType getIndexType(char *fldName, int* pos);
267 void addPredicate(char *fName, ComparisionOp op, void *buf);
268 DbRetVal compact();
269 DbRetVal compactIndexNode( void *indexPtr);
270 char* getName() { return tblName_; }
271 char* getAliasName() { return aliasName; }
272 void setAliasName(char *name);
273 void setTableInfo(char *name, int tblid, size_t length,
274 int numFld, int numIdx, void *chunk);
275 void setLoading(bool flag) { loadFlag = flag; }
276 friend class DatabaseManagerImpl;
280 #endif