00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __ZTS_DB__
00026 #define __ZTS_DB__
00027 #include "zconfig.h"
00028
00029 #include "ZFile.h"
00030 #include "ZTS.h"
00031 #include "ZTupleIndex.h"
00032
00033 #include <string>
00034 #include <vector>
00035
00036 #include <db.h>
00037
00038
00039 #pragma mark -
00040 #pragma mark * ZTS_DB
00041
00042 class ZTS_DB : public ZTS
00043 {
00044 public:
00045 ZTS_DB(const ZFileSpec& iFileSpec);
00046 ZTS_DB(const ZFileSpec& iFileSpec, const std::vector<std::vector<std::string> >& iIndexSpecs);
00047 virtual ~ZTS_DB();
00048
00049
00050 virtual void AllocateIDs(size_t iCount, uint64& oBaseID, size_t& oCount);
00051 virtual void SetTuples(size_t iCount, const uint64* iIDs, const ZTuple* iTuples);
00052 virtual void GetTuples(size_t iCount, const uint64* iIDs, ZTuple* oTuples);
00053 virtual void Search(
00054 const ZTBSpec& iSpec, const std::set<uint64>& iSkipIDs, std::set<uint64>& ioIDs);
00055 virtual ZMutexBase& GetReadLock();
00056 virtual ZMutexBase& GetWriteLock();
00057
00058
00059 void Flush();
00060
00061
00062 void SetNextUnusedID(uint64 iID) { fNextUnusedID = iID; }
00063
00064 private:
00065 class Index;
00066 friend class Index;
00067
00068 bool pGetTuple(uint64 iID, ZTuple& oTuple);
00069 void pFlush();
00070
00071 static int sBTree_Compare(const DBT* iLeft, const DBT* iRight);
00072 static size_t sBTree_Prefix(const DBT* iLeft, const DBT* iRight);
00073
00074 ZMutex fMutex;
00075 ZMutex fMutex_ID;
00076 uint64 fNextUnusedID;
00077 ZFileSpec fFileSpec;
00078 bool fChanged;
00079 DB* fDB;
00080 vector<ZTupleIndex*> fIndices;
00081 };
00082
00083 #endif // __ZTS_DB__