166 lines
5.4 KiB
ObjectPascal
166 lines
5.4 KiB
ObjectPascal
unit DynSQLService_Impl;
|
|
|
|
{----------------------------------------------------------------------------}
|
|
{ This unit was automatically generated by the RemObjects SDK after reading }
|
|
{ the RODL file associated with this project . }
|
|
{ }
|
|
{ This is where you are supposed to code the implementation of your objects. }
|
|
{----------------------------------------------------------------------------}
|
|
|
|
interface
|
|
|
|
uses
|
|
{vcl:} Classes, SysUtils,
|
|
{RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
|
|
{Ancestor Implementation:} DataAbstractService_Impl,
|
|
{Used RODLs:} DataAbstract4_Intf, uDAInterfaces,
|
|
{Generated:} DynSQLLibrary_Intf, uDAClasses, uDADelta,
|
|
uDABin2DataStreamer, uDADataStreamer, uDAScriptingProvider,
|
|
uDABusinessProcessor;
|
|
|
|
type
|
|
{ TDynSQLService }
|
|
TDynSQLService = class(TDataAbstractService, IDynSQLService)
|
|
DataStreamer: TDABin2DataStreamer;
|
|
BusinessProcessor: TDABusinessProcessor;
|
|
Schema: TDASchema;
|
|
procedure BusinessProcessorGenerateSQL(Sender: TDABusinessProcessor;
|
|
ChangeType: TDAChangeType; const ReferencedStatement: TDAStatement;
|
|
const aDelta: IDADelta; var SQL: String);
|
|
procedure BusinessProcessorProcessError(Sender: TDABusinessProcessor;
|
|
aChangeType: TDAChangeType; aChange: TDADeltaChange;
|
|
const aCommand: IDASQLCommand; var CanRemoveFromDelta: Boolean;
|
|
Error: Exception);
|
|
procedure BusinessProcessorAfterProcessChange(
|
|
Sender: TDABusinessProcessor; aChange: TDADeltaChange;
|
|
Processed: Boolean; var CanRemoveFromDelta: Boolean);
|
|
private
|
|
procedure Log(aStr: string);
|
|
function _GetConnection: IDAConnection;
|
|
protected
|
|
function MyUpdateData(const aTableName: String; const Delta: Binary): Binary;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
uses
|
|
{Generated:} DynSQLLibrary_Invk, DynSQLServerMain, Dialogs, TypInfo;
|
|
|
|
procedure Create_DynSQLService(out anInstance: IUnknown);
|
|
begin
|
|
anInstance := TDynSQLService.Create(nil);
|
|
end;
|
|
|
|
{ TDynSQLService }
|
|
|
|
function TDynSQLService._GetConnection: IDAConnection;
|
|
begin
|
|
Result := DynSQLServerMainForm.DAConnectionManager.NewConnection('ADO');
|
|
end;
|
|
|
|
procedure TDynSQLService.Log(aStr: string);
|
|
begin
|
|
DynSQLServerMainForm.Log(aStr);
|
|
end;
|
|
|
|
function TDynSQLService.MyUpdateData(const aTableName: String; const Delta: Binary): Binary;
|
|
var
|
|
conn: IDAConnection;
|
|
realdelta: IDADelta;
|
|
i: integer;
|
|
sql: string;
|
|
fOldDeltaname: string;
|
|
begin
|
|
Log('');
|
|
Log('');
|
|
// Opens a connection
|
|
conn := _GetConnection;
|
|
|
|
// Creates a delta object
|
|
realdelta := NewDelta('tempDelta');
|
|
|
|
// Converts the binary stream we just received.
|
|
DataStreamer.Initialize(Delta, aiReadFromBeginning);
|
|
try
|
|
fOldDeltaname:=DataStreamer.DeltaNames[0];
|
|
DataStreamer.ReadDelta(DataStreamer.DeltaNames[0], realdelta);
|
|
finally
|
|
DataStreamer.Finalize;
|
|
end;
|
|
|
|
if (aTableName = '') or (realdelta.Count=0) then begin
|
|
// Builds a fake SQL string for updating and displays it
|
|
sql := 'Updating query "' + DataStreamer.DeltaNames[0] + '", fields ';
|
|
|
|
for i := 0 to (realdelta.LoggedFieldCount - 1) do
|
|
sql := sql + realdelta.LoggedFieldNames[i] + '(' + GetEnumName(TypeInfo(TDADataType), Ord(realdelta.LoggedFieldTypes[i])) + '), ';
|
|
|
|
sql := Copy(sql, 1, Length(sql) - 2);
|
|
|
|
Log(sql);
|
|
end
|
|
else begin
|
|
realDelta.LogicalName:= aTableName;
|
|
// setup of ReferencedDataset used in BP.ProcessDelta
|
|
with Schema.Datasets.DatasetByName(BusinessProcessor.ReferencedDataset),Statements[0] do begin
|
|
TargetTable:=aTableName;
|
|
ColumnMappings.Clear;
|
|
Fields.Clear;
|
|
for i:=0 to realdelta.LoggedFieldCount-1 do begin
|
|
Fields.Add(realdelta.LoggedFieldNames[i],realdelta.LoggedFieldTypes[i]);
|
|
with ColumnMappings.Add do begin
|
|
DatasetField:= realdelta.LoggedFieldNames[i];
|
|
TableField:= realdelta.LoggedFieldNames[i];
|
|
SQLOrigin:= realdelta.LoggedFieldNames[i];
|
|
end;
|
|
end;
|
|
end;
|
|
BusinessProcessor.ProcessDelta(conn,realdelta);
|
|
end;
|
|
|
|
Result:=Binary.Create;
|
|
realdelta.LogicalName:=fOldDeltaname;
|
|
DataStreamer.Initialize(Result, aiWrite);
|
|
try
|
|
DataStreamer.WriteDelta(realdelta);
|
|
finally
|
|
DataStreamer.Finalize;
|
|
end;
|
|
end;
|
|
|
|
procedure TDynSQLService.BusinessProcessorGenerateSQL(
|
|
Sender: TDABusinessProcessor; ChangeType: TDAChangeType;
|
|
const ReferencedStatement: TDAStatement; const aDelta: IDADelta;
|
|
var SQL: String);
|
|
begin
|
|
Log('Generated SQL: '+SQL);
|
|
end;
|
|
|
|
procedure TDynSQLService.BusinessProcessorProcessError(
|
|
Sender: TDABusinessProcessor; aChangeType: TDAChangeType;
|
|
aChange: TDADeltaChange; const aCommand: IDASQLCommand;
|
|
var CanRemoveFromDelta: Boolean; Error: Exception);
|
|
begin
|
|
Log('Error during processing change (RecID=' + IntToStr(aChange.RecID)+')');
|
|
Log(Error.Message);
|
|
end;
|
|
|
|
procedure TDynSQLService.BusinessProcessorAfterProcessChange(
|
|
Sender: TDABusinessProcessor; aChange: TDADeltaChange;
|
|
Processed: Boolean; var CanRemoveFromDelta: Boolean);
|
|
begin
|
|
if Processed then
|
|
Log('Change (RecID=' + IntToStr(aChange.RecID) +') is processed')
|
|
else
|
|
Log('Change (RecID=' + IntToStr(aChange.RecID) +') isn''t processed');
|
|
end;
|
|
|
|
initialization
|
|
TROClassFactory.Create('DynSQLService', Create_DynSQLService, TDynSQLService_Invoker);
|
|
|
|
finalization
|
|
|
|
end.
|
|
|