class hbBasetbl
{
// íóæåí äëÿ òîãî ÷òîáû set_flags âûçûâàëàñü ðîâíî îäèí ðàç
uint Set_flg_Counter;
ushort state;
// ôëàã, ïîêàçûâàþù. îòêðûòà ëè ñàìà òàáëèöà, íåîáõîäèì äëÿ ýêñòð. çàêðûòèÿ â ñëó÷àå íåêîðåêòíîãî
// îòêðûòèÿ
bool tableopen;
hbInit ini;
protected:
uint recsize;
uint keysize; //òîëüêî äëÿ DB_HASH
Db *table;
virtual void UsrOpen(hbTxn *tx,FileConf& conf,bool openidx,hbInitRt* irt = 0,u_int32_t op_flags = 0);
virtual void UsrClose();
void SetRecSize(uint recsize1){recsize = recsize1;}
void SetKeySize(uint keysize1){keysize = keysize1;}
uint GetType() {return ini.type;}
bool IsDup() return (ini.st_flags & DB_DUP
public:
hbEnv& env;
operator Db*(){return table;}
Db* operator ->(){return table;}
const char* GetDbName(){return ini.dbname;}
hbBasetbl(hbEnv& e,hbInit&);
virtual ~hbBasetbl(){ if(state) Close();}
void Open(hbTxn *tx,FileConf& conf,bool openidx,hbInitRt* irt = 0,u_int32_t op_flags = 0);
void Close();
virtual void Create(hbTxn *tx,FileConf& conf,hbInitRt* irt = 0,u_int32_t op_flags = 0);
virtual int Get(hbTxn *tx,hbObj *key,hbObj *val,u_int32_t flags=0); // â ñòèëå Ñ (áåç èñêëþ÷åíèé)
virtual int Pget(hbTxn *tx,hbObj *fkey,hbObj *pkey, // â ñòèëå Ñ (áåç èñêëþ÷åíèé)
hbObj *val, u_int32_t flags=0);
virtual int Del(hbTxn *tx,hbObj *key,u_int32_t flags=0); // â ñòèëå Ñ (áåç èñêëþ÷åíèé)
virtual int tGet(hbTxn *tx,hbObj *key,hbObj *val,u_int32_t flags=0); // â ñòèëå Ñ++
virtual int tPget(hbTxn *tx,hbObj *fkey,hbObj *pkey, hbObj *val, u_int32_t flags=0); // â ñòèëå Ñ++
virtual int tDel(hbTxn *tx,hbObj *key,u_int32_t flags=0); // â ñòèëå Ñ++
virtual int Put(hbTxn *tx,hbObj *key,hbObj *val,u_int32_t flags=0);
bool IsOpen(){return state;}
};
Äëÿ óñêîðåíèÿ äîñòóïà ïî êàêîìó-òî êðèòåðèþ ê äàííûì â òàáëèöàõ ââîäÿòñÿ èíäåêñíûå òàáëèöû. Èìè ìîãóò áûòü ëþáûå èç ïåðå÷èñëåííûõ, êîíå÷íî â ñîîòâåòñòâèè ñ èõ îñîáåííîñòÿìè. Êëàññ hbBasetbl ÿâëÿåòñÿ ñ îäíîé ñòîðîíû áàçîâûì êëàññîì, ñîäåðæàùèì âñþ ðóòèííóþ ðàáîòó ñ ôëàãàìè è îñíîâíûìè îïåðàöèÿìè ñ òàáëèöåé, à ñ äðóãîé ñòîðîíû -ôèíàëüíûì êëàññîì äëÿ èíäåêñíîé òàáëèöû.
Ýòîò êëàññ ÿâëÿåòñÿ áàçîâûì, è ñîâñåì íåóäîáåí äëÿ ðàáîòû, åñëè ýòà òàáëèöà ÿâëÿåòñÿ èíäåêñèðîâàííîé (òî åñòü èìååò èíäåêñû – äðóãèå èíäåêñíûå òàáëèöû). Íåîáõîäèì åùå îäèí êëàññ, êîòîðûé áóäåò îáîáùåíèåì ïîíÿòèÿ èíäåêñèðóåìîé òàáëèöû è ÿâëÿòüñÿ êîíòåéíåðîì äëÿ òàêèõ èíäåêñíûõ òàáëèö. Ýòîò êëàññ ïðåäñòàâëåí íèæå.
class hbPTable:public hbBasetbl{
void ErrorClose();
void eee();
void FixIdx(uint bulk_ret_buffer_size,int i,FileConf& conf);
void FixIdxForQueue(uint bulk_ret_buffer_size,int i,FileConf& conf);
void FixIdxForHash(uint bulk_ret_buffer_size,int i,FileConf& conf);
void CheckMainToIdx(uint bulk_ret_buffer_size,bool fix,FileConf& conf);
void CheckMainToIdxForQueue(uint bulk_ret_buffer_size,bool fix,FileConf& conf);
void CheckMainToIdxForHash(uint bulk_ret_buffer_size,bool fix,FileConf& conf);
void CheckIdxToMain(uint bulk_ret_buffer_size,bool fix,FileConf& conf);
void CheckIdxToMainForQueue(uint bulk_ret_buffer_size,bool fix,FileConf& conf);
void CheckIdxToMainForHash(uint bulk_ret_buffer_size,bool fix,FileConf& conf);
inline void ExportForQueue(uint bulk_ret_buffer_size,FILE* f, hbTxn* tx);
inline void ExportForHash(uint bulk_ret_buffer_size,FILE* f, hbTxn* tx);
inline void Import3(Dbt* key,Dbt* data);
inline void Import2(char* buf);
inline void Import1(FILE* f,char*& buf1,uint&);
inline void CheckForRefForQueue(uint bulk_ret_buffer_size);
inline void CheckForRefForHash(uint bulk_ret_buffer_size);
inline uint GetMaxRefRecBuf();
int sz;
IdxItem *idx;
RefItems ref;
virtual void UsrOpen(hbTxn *tx,FileConf& conf,bool openidx,hbInitRt* irt = 0,u_int32_t flags = 0);
inline virtual void ExportDBTemplate(FILE*,const char*,const char*) = 0;
inline virtual void ImportDBTemplate( char* buf1,
uint buf1len,
char* buf2,
uint buf2len,
hbObj*& Key,
hbObj*& Val) = 0;
//! êîíñòðóêòîð ïðèíèìàåò ìàññèâ èíèöèàëèçàòîðîâ (â ò÷ èíäåêñîâ)
hbPTable(hbEnv& env,hbInit& ini1);
virtual ~hbPTable();
// ïðîâåðêà èíäåêñíîé öåëîñòíîñòè
void CheckIdx(uint bulk_ret_buffer_size,bool fix);
// ïðîâåðêà ññûëî÷íîé öåëîñòíîñòè
void CheckForRef(uint bulk_ret_buffer_size);
void Export(uint bulk_ret_buffer_size,FILE* f, hbTxn* tx);
void Import(FILE* f,char*& buf,uint&);
virtual int Pget(hbTxn *tx,int n,hbObj *fkey, hbObj* pkey, hbObj *val, u_int32_t flags=0)
{return idx[n].table.Pget(tx,fkey,pkey,val,flags);}
hbBasetbl& GetIdx(int n)
{return idx[n].table;}
inline uint GetIdxCount() {return sz;}
inline uint GetRecSize() {return recsize;}
Êàê âèäèì, ýòîò êëàññ ðàñøèðÿåò ñòàðûé èíòåðôåéñ ïóòåì ââåäåíèÿ óòèëèòàðíûõ ìåòîäîâ ýêñïîðòà, èìïîðòà, ðàçëè÷íîãî ðîäà ïðîâåðîê è îïåðàöèÿìè ñ èíäåêñíûìè òàáëèöàìè. Îäíàêî ýòîò êëàññ òàêæå íå óäîáåí â ðàáîòå, òàê êàê íå çíàåò íè÷åãî î òèïàõ ñòðóêòóð è åå õàðàêòåðèñòèêàõ. Ââåäåíèå ýòèõ òèïîâ êàê ïàðàìåòðîâ øàáëîíà ïîçâîëèëî áû î÷åíü óïðîñòèòü ðàáîòó ñ èíòåðôåéñîì èíäåêñèðóåìîé òàáëèöû (íî íå ðàñøèðèòü!). Ðåçóëüòàò ïðèâåäåí íèæå:
template<class Key,class Val> class hbTable:public hbPTable
hbTable(hbEnv& e,hbInit& ini1):hbPTable(e,ini1) {SetRecSize(sizeof(Val));SetKeySize(sizeof(Key));}
//SetRecSize use by QUEUE only
virtual ~hbTable() {}
// áîëåå ïðîäâèíóòûå ôóíêöèè
int Get(const bexcp& excp, hbTxn *tx,const Key &key,Val *val, u_int32_t flags=0)
Get(excp,tx,(Key*)&key,val,flags);
}
int Pget(const bexcp& excp, hbTxn *tx,int n,hbObj *fkey,Key *pkey, Val *val,u_int32_t flags=0)
MTRY
hbRec<Key> k;
hbRec<Val> v;
int z=Pget(tx,n,fkey,&k,&v,flags);
*pkey= *(k.getPnt());
*val= *(v.getPnt());
return z;
CATCH_hbExcp
int Del(const bexcp& excp, hbTxn *tx, const Key &key,u_int32_t flags=0)
Del(excp,tx,(Key*)&key,flags);
int tGet(const bexcp& excp, hbTxn *tx, Key *key,Val *val, u_int32_t flags=0)
hbRec<Key> k(*key);
int z = tGet(tx,&k,&v,flags);
int Put(const bexcp& excp, hbTxn *tx,const Key &key, const Val &val, u_int32_t flags=0)
Put(excp,tx,(Key*)&key,(Val*)&val,flags);
uint Append(const bexcp& excp, hbTxn *tx, Val *val)
if(GetType() != DB_QUEUE) return 0;
hbRec<uint> k;
hbRec<Val> v(*val);
Ñòðàíèöû: 1, 2, 3, 4, 5, 6, 7