';
ref.reftables [0]. reftable = & menv.tsupplier;
}
void qthing :: GetRef_thing (uint num, char * key, char * val, db_recno_t * & refs, uint & ref_count)
{
thingKey * key1 = (ThingKey *) key;
thingVal * val1 = (ThingVal *) val;
if (num == 0)
{
refs = & Val1-> tsupplier; ref_count = 1;
}
}
void thingKey :: Export (FILE * f)
{
fprintf (f, "% d", key);
}
void thingKey :: Import (char * buf, uint len)
{
int j, num, i = 0;
char temp;
{j = i; for (; i
temp = buf [i]; buf [i] = ' 0'; sscanf (buf + j, "% d", & key);
buf [i] = temp;
i + +;
}
thingKey :: thingKey (const db_recno_t & key_temp)
{
memset (this, 0, sizeof (* this));
key = key_temp;
}
void thingVal :: Export (FILE * f)
{
fprintf (f, "% d", tsupplier);
fprintf (f, ",");
fprintf (f, "{");
CharArrInToStr (f, name, 12);
fprintf (f, "}");
fprintf (f, ",");
fprintf (f, "{");
CharArrInToStr (f, desc, 40);
fprintf (f, "}");
}
void thingVal :: Import (char * buf, uint len)
{
int j, num, i = 0;
char temp;
{j = i; for (; i
temp = buf [i]; buf [i] = ' 0'; sscanf (buf + j, "% d", & tsupplier);
buf [i] = temp;
if (tsupplier == 0) throw hbExcp (3, LL_CRITICAL, 0, "Помилка імпорту: + покажчик на таблицю = 0. "); p> i + +;
if (buf [i + +]! = '{')
throw hbExcp (3, LL_CRITICAL, 0, "Помилка імпорту: не можу розпарсити рядок.");
j = i;
for (; i
{
if (buf [i] == '}' && Buf [i-1]! = '') p> break;
}
StrToCharArr (buf + j, i-j, name, 12);
i + = 2;
if (buf [i + +]! = '{')
throw hbExcp (3, LL_CRITICAL, 0, "Помилка імпорту: не можу розпарсити рядок.");
j = i;
for (; i
{
if (buf [i] == '}' && Buf [i-1]! = '') p> break;
}
StrToCharArr (buf + j, i-j, desc, 40);
i + = 2;
}
thingVal :: thingVal (const db_recno_t & tsupplier_temp, char * name_temp, char * desc_temp)
{
memset (this, 0, sizeof (* this));
tsupplier = tsupplier_temp;
strncpy (name, name_temp, sizeof (name));
strncpy (desc, desc_temp, sizeof (desc));
}
ithing_name :: ithing_name (char * name_temp)
{
memcpy (name, name_temp, sizeof (name));
}
int qthing :: idx_name (Db * Db, const Dbt * pk, const Dbt * pv, Dbt * fv)
{
thingVal * v = (ThingVal *) (pv-> get_data ());
fv-> set_data (v-> name);
fv-> set_size (sizeof (ithing_name));
return 0;
}
// --------------------------------------------- ---------------------------------
mainEnv :: mainEnv (const char * path, ushort flt, Log * LogObj1): hbEnv (path, mainEnvInit, flt, LogObj1),
tsupplier (* (new qsupplier (* this))),
tthing (* (new qthing (* this)))
{
dbs [dbnsupplier] = &tsupplier; tsupplier.RefInit ();
dbs [dbnthing] = &tthing; tthing.RefInit ();
}
Файл приклад описаний так
int main (void)
{
mainEnv env ("./DataBase /");
// створюємо базу, тобто формуємо необхідні файли для всіх таблиць
env.Init (bexcp (16, "main", "example.cc", 3, LL_DEBUG)); p> env.Close (bexcp (16, "main", "example.cc", 3, LL_DEBUG)); p>// перевіряємо на індексну цілісність
env.CheckForIdx (bexcp (16, "main", "example.cc", 3, LL_DEBUG));
// перевіряємо на посилальну цілісність
env.CheckForRef (bexcp (16, "main", "example.cc", 3, LL_DEBUG));
env.OpenTDSMode ();// відкриваємо її в нормальному транзакційному режимі
try
{
hbTxn tx (env);
tx.Start ();
supplierKey key = {1};
supplierVal val = {"Boris", "Boss"};
env.tsupplier.Put (& tx, & key, & val);
thingKey key = {1};
thingVal val = {1, "Computer", "best"};
env.tthing.Put (& tx, & key, & val);
tx.commit ();
}
catch (hbExcp & excp)
{
cout <
}
env.Close ();
return 0;
}
7.Заключеніе
На сьогоднішній день навігаційно-мережеві бази знову набули свою актуальність. Це обумовлюється, головним чином, їх дуже високою швидкістю роботи, навіть, незважаючи на...