Суть такова - по json описанию классовой модели генерируется набор исходников для "транзакционной" модели работы с объектами. Подробнее - здесь.
На конкретном примере:
{
"kind": 0,
"version": 0,
"peas": [{
"id": 100,
"caption": "PeaValue",
"pluralCaption": "PeaValues",
"sqlCaption": "PEA_VALUE",
"kind": "plain",
"properties": [{
"caption": "Caption",
"sqlCaption": "CAPTION",
"kind": "string"
}, {
"caption": "IntValue",
"sqlCaption": "INT_VALUE",
"kind": "integer"
}, {
"caption": "Caption",
"pluralCaption": "Captions",
"sqlCaption": "CAPTIONS",
"kind": "strings"
}, {
"caption": "MyIntValue",
"pluralCaption": "MyIntValues",
"sqlCaption": "MY_INT_VALUES",
"kind": "integers"
}]
}, {
"id": 105,
"caption": "PeaValueHolder",
"pluralCaption": "PeaValueHolder",
"sqlCaption": "PEA_VALUE_HOLDER",
"kind": "holder",
"pea": "PeaValue",
"properties": [{
"caption": "SomeCaption",
"sqlCaption": "SOME_CAPTION",
"kind": "string"
},{
"caption": "SomeInt",
"sqlCaption": "SOME_INT",
"kind": "integer"
}]
}, {
"id": 110,
"caption": "PeaContainer",
"pluralCaption": "PeaContainers",
"sqlCaption": "PEA_CONTAINER",
"kind": "plain",
"properties": [{
"caption": "Caption",
"sqlCaption": "CAPTION",
"kind": "string"
}, {
"caption": "Link",
"sqlCaption": "LINK",
"kind": "pea",
"pea": "PeaValue"
},{
"caption": "HugePeaValue",
"pluralCaption": "HugePeaValues",
"sqlCaption": "HUGE_PEA_VALUES",
"kind": "holders",
"pea": "PeaValueHolder"
}, {
"caption": "PeaValueFirst",
"pluralCaption": "PeaValuesFirst",
"sqlCaption": "PEA_VALUE_FIRST",
"kind": "peas",
"pea": "PeaValue"
}, {
"caption": "PeaValueLast",
"pluralCaption": "PeaValuesLast",
"sqlCaption": "PEA_VALUE_LAST",
"kind": "peas",
"pea": "PeaValue"
}]
}]
}это то самое json описание. После применения кодогенератора появятся три исходника
BPeaContainerUnit
BPeaValueHolderUnit
BPeaValueUnit
И SQL скрипт (объединил в один файл)
И теперь то, ради чего все затевалось:
- Код: Выделить всё
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}cthreads,{$ENDIF}
BQueryUnit, BPeaValueUnit
{ you can add units after this };
Var
aManager, aOtherManager: BPeaValuesManagerClass;
aPeaValue, aBuffer: BPeaValueClass;
begin
// Вызывается лишь единожды при старте программы - регистрирует базу
DBManager.AddDatabase(DB_FB, 'localhost', 'dummy', 'SYSDBA', 'masterkey');
DBManager.Connect;
aManager := BPeaValuesManagerClass.Build;
aOtherManager := BPeaValuesManagerClass.Build;
Try
aPeaValue := aManager.AddObject;
aPeaValue.Initialize('Text', 100);
aBuffer := aOtherManager.GetObject(aPeaValue.ID);
If aBuffer = nil Then
WriteLn('Второй менеджер ничего не знает об первом объекте');
aManager.Commit;
aBuffer := aOtherManager.GetObject(aPeaValue.ID);
If aBuffer = nil Then
WriteLn('Теперь уже знает')
Else
WriteLn(aBuffer.Caption);
Finally
aManager.Burn;
aOtherManager.Burn;
End;
end.
В таблице PEAVALUE появится соответствующая запись ^_^