n Txn;};
hbTxn (const bexcp & excp, hbEnv & env1, ullong flags = 0, hbTxn * parent1 = 0);// молодші 32 біта це// звичайно. Берклі. прапори 33 біт відповідає за негайний старт транзакції одразу ж після створення
hbTxn (const bexcp & excp, hbTxn * parent1, ullong flags = 0);
// --- "--- p> ~ hbTxn ();
bool HaveParentTxn () {return parent! = 0;}
void Start (const bexcp & excp, ulong flags = 0);
void Commit (const bexcp & excp, ulong flags = 0);
void RollBack (const bexcp & excp);
// void RollBack ();
};
Його особливістю є те, що створений об'єкт транзакції не можна копіювати або створювати копіюванням. А також такий об'єкт повинен створюватися автоматично, тобто як стекова мінлива:
try
{
hbTxn tx (excp, parent_tx);
// операції з базою
tx.Commit ();
}
catch (...) {}
Як бачимо, перше - не треба піклуватися про видалення об'єкта транзакції (при будь-якій ситуації), друге - у разі виключення Rollback () викличеться автоматично в деструкції цього об'єкта.
Транслятор
Як вже говорилося, завдання транслятора полягає в тому, щоб створити за бажанням користувача максимально зручну оболонку для бібліотеки відповідно до його визначеннями основних елементів бази.
Файл граматики наведено нижче:
%%
# ---------------------------------------------- ---------
# ------ COMMENTS -------------------------------------- p> # ---------------------------------------------- ---------
# id ідентифікатор
# string строковий літерал або ідентифікатор
# num Чілова літерал
# float літерал числа з плаваючою точкою
# char символьний літерал
# rawcode :: = будь-яка последователность коду між '{*' і '*}'
file: 'End' {tblproc :: Finish ();}
| filetext 'End' {tblproc :: Finish ();}
;
filetext: item
| item filetext
;
item: optionblock
| idxblock
| structblock
| enumblock
| codeblock
| tableblock
;
literal: string {[$ _ [1], 0]}
| num {[$ _ [1], 1]}
| float {[$ _ [1], 2]}
| char {[$ _ [1], 3]}
;
# ---------------------------------------------- -----------
optionblock: 'option' '{' Oplist '}' ';'
{Tblproc :: OptBlockPrint ('', $ _ [3]);}
| 'option' opitem ';'
{Tblproc :: OptBlockPrint ('', [$ _ [2]]);}
| 'option' id '{' oplist '}' ';'
{Tblproc :: OptBlockPrint ($ _ [2], $ _ [4]);}
| 'option' id opitem ';'
{Tblproc :: OptBlockPrint ($ _ [2], [$ _ [3]]);}
;
oplist:
opitem ';' {[$ _ [1]]}
| opitem ';' Oplist {push @ {$ _ [3]}, $ _ [1]; $ _ [3]}
;
opitem: id '=' literal
{[$ _ [1], @ {$ _ [3]} [0], 0, @ {$ _ [3]} [1]]}
| id '=' id {[$ _ [1], $ _ [3], 1,'']}
;
# ---------------------------------------------- -----------
idxblock: 'idx' id idxitem ';'
{Tblproc :: IdxBlockPrint ($ _ [2], [$ _ [3]]);}
| 'idx' id '{' Idxitemlist '}' ';'
{Tblproc :: IdxBlockPrint ($ _ [2], $ _ [4]);}
;
idxitemlist: idxitem ';' {[$ _ [1]]}
| idxitem ';' Idxitemlist {unshift @ {$ _ [3]}, $ _ [1]; $ _ [3]}
;
idxitem: idxmod1 id '(' flist1 ')'
{[0, $ _ [1], $ _ [2], $ _ [4],'']}
| idxmod1 id '(' flist1 ')' '{*' rawcode '*}'
{[0, $ _ [1], $ _ [2], $ _ [4], $ _ [7]]}
| idxmod2 id '(' flist2 ')' {[1, $ _ [1], $ _ [2], $ _ [4],'']}
| idxmod2 id '(' flist2 ')' '{*' rawcode '*}'
{[1, $ _ [1], $ _ [2], $ _ [4], $ _ [7]]}
;
idxmod1: '.!'
| ':!'
| '%!'
;
idxmod2: '.'
| ':'
| '%'
;
flist1: id {[[$ _ [1],'']]}
| id ',' flist1 {unshift
@ {$ _ [3]}, [$ _ [1],'']; $ _ [3]}
;
flist2: idxmod3 id {[[$ _ [2], $ _ [1]]]}
| idxmod3 id ',' flist2 {unshift
@ {$ _ [4]}, [$ _ [2], $ _ [1]]; $ _ [4]}
;
idxmod3: '+'
| '-'
| '^'
;
# ---------------------------------------------- -----------
codeblock: code 'decl'...