IdxToMain (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 ();
В
protected:
int sz;
IdxItem * idx;
RefItems ref;
В
virtual void UsrOpen (hbTxn * tx, FileConf & conf, bool openidx, hbInitRt * irt = 0, u_int32_t flags = 0);
virtual void UsrClose ();
В
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;
public:
//! конструктор приймає масив ініціалізаторів (в тч індексів)
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 hbTable: public hbPTable
{
public:
//! конструктор приймає масив ініціалізаторів (в тч індексів)
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)
{p> Get (excp, tx, (Key *) & key, val, flags);
} br/>
int Pget (const bexcp & excp, hbTxn * tx, int n, hbObj * fkey, Key * pkey, Val * Val, u_int32_t flags = 0)
{p> MTRY
hbRec k;
hbRec v;
int z = Pget (tx, n, fkey, & k, & v, flags);
* Pkey = * (k.getPnt ());
* Val = * (v.getPnt ());
return z;
CATCH_hbExcp
} p> int Del (const bexcp & excp, hbTxn * tx, const Key & key, u_int32_t flags = 0)
{
Del (excp, tx, (Key *) & key, flags);
} p> int tGet (const bexcp & excp, hbTxn * tx, Key * key, Val * val, u_int32_t flags = 0)
{p> MTRY
hbRec k (* key);
hbRec v;
int z = tGet (tx, & k, & v, flags);
* Val = * (v.getPnt ());
return z;
CATCH_hbExcp
} p> int Put (const bexcp & excp, hbTxn * tx, const Key & key, const Val & val, u_int32_t flags = 0)
{p> Put (excp, tx, (Key *) & key, (Val *) & val, flags);
} p> uint Append (const bexcp & excp, hbTxn * tx, Val * val)
{p> MTRY
if (GetType () ! = DB_QUEUE) return 0;
hbRec k;
hbRec v (* val);
hbBasetbl :: Put (tx, & k, & v, DB_APPEND);
return (uint &) * (k.getPnt ());
CATCH_hbExcp
} p> uint Append (const bexcp & excp, hbTxn * tx, const Val & val)
{p> return Append (excp, tx, (Val *) & val);
} p>};
Цей параметризованих клас насправді тільки перевизначив сигнатури методів більш зручними і працюючими з користувача...