типами даних.
База даних або об'єкт оточення
Цей об'єкт фактично являє собою абстракцію бази даних: є контейнером для індексованих таблиць, відповідає за їх відкриття, доступ, а також проводить над ними службові операції експорту тощо На діаграмі це виглядає так:
В
Опис класу наведено нижче:
class hbEnv
{
DbEnv * env;
bool is_native_log;
Log * LogObj;
//! Шлях до файлів
char * path;
//! Кількість баз - ламає вектором писати - тоді довше Компільо
int sz;
//! Інішіалайзери (у кількості рівній sz)
hbInit * Dbinits;
hbInit * Idxinits;
int idxsz;
char * schemaid;// вже перевіряється, при відкритті зі словника чит. оригин. і порівнюється
В
//! Мутекс для транзакцій
pthread_mutex_t mx;
В
uint dltype;
//! in secs interval for checkpoints and logarchs
ulong dldelay, bdbchkpoint, bdblogrem;
В
static void * thf_deadrs (void *);
static void * thf_chkpnt (void *);
static void * thf_logarc (void *);
pthread_t pth_deadrs, pth_chkpnt, pth_logarc;
В
ushort stflags;
ushort stflags;
В
bool IsOpenflag;
ushort state;
TDictionary dict;
// Char * ConfFile;// ім'я конф. файлу може перевизначити в нащадках/але навіщо
В
FILE * OpenOutputStream (const char * fn, const char * mode);
void CloseOutputStream (FILE * f);
// видаляє всі __ db.00x файли т.к там зберігається хеш, через якого може невірно спрацювати перевірка індексів
protected:
//! Самі тейбл, індексів тут немає, вони в самих тейбл
hbPTable ** dbs;
В
void SetSchemaid (const char * File) {If (schemaid) free (schemaid); schemaid = strdup (File);}
В
// тейбл будуть створюватися в конструкторі нащадка, і вноситися в dbs
int Close (int);
virtual void UsrClose ();
public:
Log * GetLog () {Return LogObj;}
operator DbEnv * () {return env;};
DbEnv * operator -> () {Return env;}
// DbEnv & GetDbEnv () {return env;}
const char * GetSchemaId () const {return schemaid;}
const char * GetUuid (const bexcp &, hbTxn * tx);
const char * GetPath () const {return path;}
bool IsOpen () {return state;}
hbEnv (const char * P, envInit & e, ushort flt = LL_DEBUG, Log * LogObj1 = 0);
virtual ~ hbEnv ();
// st_flags приміщ. в DbEnv :: set_flags (DB_TXN_NOSYNC)
// op_flags приміщ. в Db :: open (DB_PRIVATE/DB_THREAD - by default)
// якщо режим CDS то ці прапори ігноруються за винятком op_flags = DB_PRIVATE!!
void OpenTDSMode (const bexcp & excp, u_int32_t st_flags = 0, u_int32_t op_flags = (DB_THREAD | DB_RECOVER))// DB_THREAD | DB_RECOVER_FATAL
{DBOpen (excp, OPEN_TDS, true, st_flags, op_flags);}
void OpenCDSMode (const bexcp & excp, bool opentables = true, u_int32_t op_flags = 0/* тільки для DB_PRIVATE * /)
{DBOpen (excp, OPEN_CDS, opentables, 0, op_flags);}
void Close (const bexcp & excp);
void Close ();
// повна ініціалізація & створення бази з нуля (попереднє видалення БД)
void Init (const bexcp & excp, u_int32_t op_flags = DB_THREAD);
// Перевірка індексів і якщо треба їх коригування база повинна бути в offline
void CheckForIdx (const bexcp & excp, uint bulk_ret_buffer_size = (5 * 1024 * 1024), bool fix = false);
void CheckForRef (const bexcp & excp, uint bulk_ret_buffer_size = (5 * 1024 * 1024));
//! експорт бази даних
void ExportDB (const bexcp & excp, const char * fn, uint bulk_ret_buffer_size = (5 * 1024 * 1024));
//! імпорт бази даних
void ImportDB (const bexcp & excp, const char * fn);
void printf (ushort level, const char * fmt, ...);// обгортка під Log :: printf
};
Цей клас інкапсулює роботу зі словником, де може зберігатися інформація, корисна для програміста.
Транзакції
Клас транзакцій має наступний вигляд:
class hbTxn {
hbEnv & Env;
bexcp excp1;
hbTxn * parent;
DbTxn * Txn;
void SetFlags () {}
hbTxn (const hbTxn & Txn1): Env (Txn1.Env) {}// copy constr
hbTxn & operator = (const hbTxn &) {return * this;}//: =
public:
operator DbTxn * () {retur...