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.