Рефераты. Реализация высокоуровнего интерфейса вокруг базы данных Berclee DB

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();

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 Key,class Val> 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)

{

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)

{

MTRY

hbRec<Key> k(*key);

hbRec<Val> v;

int z = tGet(tx,&k,&v,flags);

*val= *(v.getPnt());

return z;

CATCH_hbExcp

}

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)

{

MTRY

if(GetType() != DB_QUEUE) return 0;

hbRec<uint> k;

hbRec<Val> v(*val);

hbBasetbl::Put(tx,&k,&v,DB_APPEND);

return (uint&)*(k.getPnt());

CATCH_hbExcp

}

uint Append(const bexcp& excp, hbTxn *tx,const Val &val)

{

return Append(excp,tx,(Val*)&val);

}

};

Этот параметризированный класс на самом деле только переопределил сигнатуры методов более удобными и работающими с пользовательскими типами данных.

База данных или объект окружения

Этот объект фактически представляет собой абстракцию базы данных: является контейнером для индексируемых таблиц, отвечает за их открытие, доступ, а также проводит над ними служебные операции экспорта и т.п. На диаграмме это выглядит так:

57

Описание класса приведено ниже:

class hbEnv

{

DbEnv *env;

bool is_native_log;

Log* LogObj;

//! Путь к файлам

char* path;

//! Количество баз - ломает вектором писать - тогда дольше компилится

int sz;

//! Инишиалайзеры (в количестве равном sz)

hbInit *dbinits;

hbInit *idxinits;

int idxsz;

char* schemaid; // уже проверяется, при открытии из словаря чит. оригин. и сравнивается

Страницы: 1, 2, 3, 4, 5, 6, 7



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.