Суть такова - по 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 появится соответствующая запись ^_^







 ).
).