unit uDataModuleServer; interface uses SysUtils, Classes, uDAEngine, uDAClasses, uDADriverManager, uROClient, uROBinMessage, uROServer, uROIndyTCPServer, uROIndyHTTPServer, uROSessions, uDADataTable, uDABINAdapter, IBSQLMonitor, JvComponent, JvAppStorage, JvAppRegistryStorage, uDAInterfaces, JvComponentBase, uROEventRepository, SyncObjs, JvLogFile, uDAIBXDriver, uDAADODriver, DB, IBCustomDataSet, IBQuery, ADODB; const SERVER_PORT = '8099'; // Puerto por defecto DBSERVER_PORT = '3050'; // Puerto de la BD por defecto SESION_LOGININFO = 'LoginInfo'; type TdmServer = class(TDataModule) HTTPServer: TROIndyHTTPServer; BINMessage: TROBinMessage; DriverManager: TDADriverManager; JvAppRegistryStorage: TJvAppRegistryStorage; SessionManager: TROInMemorySessionManager; JvLogFile1: TJvLogFile; DAIBXDriver: TDAIBXDriver; DAADODriver: TDAADODriver; ADOQuery1: TADOQuery; ADOConnection1: TADOConnection; ConnectionManager: TDAConnectionManager; procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); procedure HTTPServerBeforeServerActivate(Sender: TObject); procedure DriverManagerTraceEvent(Sender: TObject; const Text: string; Tag: Integer); procedure SessionManagerSessionDeleted(const aSessionID: TGUID; IsExpired: Boolean); procedure ConnectionManagerConnectionAcquired(Sender: TDAConnectionManager; const Connection: IDAConnection); procedure ConnectionManagerConnectionTimedOut(Sender: TDAConnectionManager); procedure ConnectionManagerConnectionCreated(Sender: TDAConnectionManager; const Connection: IDAConnection); private FEscribirLog : TCriticalSection; FConnectionName : string; function GetConnectionString: string; procedure IniciarLog; procedure DetenerLog; public FDBServer : string; FDBPort : string; FDBPath : string; FDBUser : string; FDBPass : string; FOSCServer : string; FInicioWindows : Boolean; FServerPort : string; procedure LeerConfiguracion; procedure SalvarConfiguracion; procedure RefrescarConexion; procedure EscribirLog(const AMensaje : String); function DarNuevaConexion : IDaConnection; property ConnectionName : string read FConnectionName write FConnectionName; end; function DarRutaInformes : String; function Encrypt (const Source : string) : String; function Decrypt (const Source : string) : String; function GetNextAutoinc(AConnection : IDAConnection; const GeneratorName: string): integer; procedure CheckConnection(AConnection: IDAConnection); var dmServer: TdmServer; implementation {$R *.dfm} uses DateUtils, JclFileUtils, ActiveX, Forms, Registry, Windows, Dialogs, uSesionesUtils, uServerAppUtils; procedure CheckConnection(AConnection: IDAConnection); var AIBXQuery : TIBQuery; AADOQuery : TADOQuery; begin if ((AConnection as IDAConnectionObjectAccess ).ConnectionObject is TIBXConnection) then begin try AIBXQuery := TIBQuery.Create(NIL); try AIBXQuery.SQL.Add('select distinct 1 from RDB$TRANSACTIONS'); AIBXQuery.Database := ((AConnection as IDAConnectionObjectAccess ).ConnectionObject as TIBXConnection).Database; AIBXQuery.Open; finally FreeANDNIL(AIBXQuery); end; except on E:Exception do begin AConnection.Close; AConnection.Open; end; end; end; if ((AConnection as IDAConnectionObjectAccess ).ConnectionObject is TADOConnection) then begin try AADOQuery := TADOQuery.Create(NIL); try AADOQuery.SQL.Add('select count(*) From master.dbo.sysdatabases'); AADOQuery.Connection := ((AConnection as IDAConnectionObjectAccess ).ConnectionObject as TADOConnection); AADOQuery.Open; finally FreeANDNIL(AADOQuery); end; except on E:Exception do begin AConnection.Close; AConnection.Open; end; end; end; end; function DarRutaInformes : String; begin Result := ExtractFilePath(Application.ExeName) + 'Informes' + PathDelim; end; function GetNextAutoinc(AConnection : IDAConnection; const GeneratorName: string): integer; var ds: IDADataset; begin ds := AConnection.NewDataset(Format('SELECT Gen_id(%s,1) FROM RDB$Database', [GeneratorName])); ds.Open; result := ds.Fields[0].Value; ds.Close; end; procedure WriteAutoRun(Name, Value : String); var reg: TRegistry; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; reg.LazyWrite := False; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False); reg.WriteString(Name, Value); reg.CloseKey; finally reg.free; end; end; procedure DeleteAutoRun(Name : String); var reg: TRegistry; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; reg.LazyWrite := False; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False); if reg.ValueExists(Name) then reg.DeleteValue(Name); reg.CloseKey; finally reg.free; end; end; function Encrypt (const Source : string) : String; var i:integer; begin Randseed := 28; Result := ''; for i:=1 to length(Source) do Result := Result + chr(ord(Source[i]) + Random(10) + 1); end; function Decrypt (const Source : string) : String; var i : integer; begin Randseed:= 28; Result := ''; for i := 1 to length(Source) do Result := Result + chr(ord(Source[i]) - Random(10) - 1); end; procedure TdmServer.ConnectionManagerConnectionAcquired( Sender: TDAConnectionManager; const Connection: IDAConnection); begin EscribirLog('Conexión adquirida: ' + Connection.Name + #13#10 + #13#10); end; procedure TdmServer.ConnectionManagerConnectionCreated( Sender: TDAConnectionManager; const Connection: IDAConnection); begin EscribirLog('Conexión creada: ' + Connection.Name + #13#10 + #13#10); end; procedure TdmServer.ConnectionManagerConnectionTimedOut( Sender: TDAConnectionManager); begin EscribirLog('Error de timeout en conexión' + #13#10 + #13#10); end; function TdmServer.DarNuevaConexion: IDAConnection; begin with ConnectionManager do Result := NewConnection(GetDefaultConnectionName, True); end; procedure TdmServer.IniciarLog; begin FEscribirLog := TCriticalSection.Create; JvLogFile1.Active := False; JvLogFile1.FileName := ExtractFilePath(Application.ExeName) + StringReplace(DateToStr(now),'/','-',[rfReplaceAll]) + 'ServerLog.txt'; JvLogFile1.AutoSave := True; JvLogFile1.Active := True; JvLogFile1.Clear; end; procedure TdmServer.DataModuleCreate(Sender: TObject); begin LeerConfiguracion; RefrescarConexion; IniciarLog; end; function TdmServer.GetConnectionString: string; begin Result := 'IBX?Server=' + FDBServer + '/' + FDBPort + ';Database=' + FDBPath + ';UserID=' + FDBUser + ';Password=' + Decrypt(FDBPass) + ';Dialect=3;Charset=ISO8859_1;'; end; procedure TdmServer.LeerConfiguracion; begin with JvAppRegistryStorage do begin FDBServer := ReadString('ServerDB', 'localhost'); FDBPort := ReadString('PortDB', DBSERVER_PORT); FDBPath := ReadString('PathDB'); FDBUser := ReadString('UserDB', ''); FDBPass := ReadString('PassDB', ''); FOSCServer := ReadString('ServerOSC'); FServerPort := ReadString('ServerPort', SERVER_PORT); FInicioWindows := ReadBoolean('InicioWindows', False); end; end; procedure TdmServer.SalvarConfiguracion; begin with JvAppRegistryStorage do begin BeginUpdate; try WriteString('ServerDB', FDBServer); WriteString('PortDB', FDBPort); WriteString('PathDB', FDBPath); WriteString('UserDB', FDBUser); WriteString('PassDB', FDBPass); WriteString('ServerPort', FServerPort); WriteString('ServerOSC', FOSCServer); WriteBoolean('InicioWindows', FInicioWindows); if FInicioWindows then WriteAutoRun('AdminPV_Server', Application.ExeName) else DeleteAutoRun('AdminPV_Server'); finally EndUpdate end; end; end; procedure TdmServer.SessionManagerSessionDeleted(const aSessionID: TGUID; IsExpired: Boolean); var aSession : TROSession; begin aSession := SessionManager.FindSession(aSessionID); if Assigned(aSession) then SesionesHelper.DeleteSessionObject(aSession, SESION_LOGININFO); end; procedure TdmServer.DataModuleDestroy(Sender: TObject); begin HTTPServer.Active := False; SessionManager.ClearSessions(False); ConnectionManager.ClearPool; DetenerLog; end; procedure TdmServer.DetenerLog; begin FEscribirLog.Free; end; procedure TdmServer.DriverManagerTraceEvent(Sender: TObject; const Text: string; Tag: Integer); begin EscribirLog(Text + #13#10 + #13#10); end; procedure TdmServer.EscribirLog(const AMensaje: String); begin FEscribirLog.Acquire; try JvLogFile1.Add(AMensaje); finally FEscribirLog.Release; end; end; procedure TdmServer.RefrescarConexion; begin HTTPServer.Active := False; ConnectionManager.Connections.GetDefaultConnection.ConnectionString := ''; ConnectionName := ConnectionManager.GetDefaultConnectionName; ConnectionManager.Connections.GetDefaultConnection.ConnectionString := GetConnectionString; with ConnectionManager.Connections.ConnectionByName('MySQL') do ConnectionString := 'ADO?AuxDriver=MSDASQL.1;Server=' + FOSCServer + ';useUnicode=True;characterEncoding=latin1_spanish_ci;'; ShowBalloonHint('Conectado a ' + ConnectionName, biInfo); CoInitialize(nil); HTTPServer.Active := TRUE; end; procedure TdmServer.HTTPServerBeforeServerActivate(Sender: TObject); begin HTTPServer.Port := StrToInt(FServerPort); end; end.