Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Portable Firebird Server 2.1.3 (https://www.delphipraxis.net/140732-portable-firebird-server-2-1-3-a.html)

neo4a 24. Sep 2009 21:43


Portable Firebird Server 2.1.3
 
Liste der Anhänge anzeigen (Anzahl: 2)
Mehr als technische Übung zur Überprüfung der Machbarkeit habe ich eine kompakte, multiuser-fähige und portable Version des Firebird-Server zusammengestellt:

- Single Exe (knapp 4MB inkl. aller Tools wie gback, gfix etc.)
- Simple GUI
- Läuft ohne Installation auch im Non-Admin-Mode
- Multi-Instanzfähig durch freie Wahl des Ports
- Embedded, aber Multiuser-fähig
- Automtische Bereitstellung einer internen Alias.conf durch das Scannen aller fdb-Dateien im Applikationverzeichnis (und darunter)
- Standard-Anmeldung (SYSDBA/masterkey)

Prinzipiell funktioniert das mit jeder Firebird-Version. Denkbar ist auch eine Multiserverversion der unterschiedlichen Versionen.

Es gibt auch zur Laufzeit nur 1 Datei. Keine Unterverzeichnisse oder temporäres Entpacken o.ä. (also nicht wie bei Xenocode oder Thinapp.). Die einzige Spur eines laufenden FB-Servers ist die unvermeidliche *.lck-Datei, die im Programmverzeichnis angelegt wird. Leider bin ich bislang an der Virtualisierung dieser letzten Datei gescheitert. Ist der FB-Server gestartet, so erkennt man im Taskmanager 2 Instanzen einer dcServer.exe: 1. GUI, 2. FB-Server.


--
Andreas

omata 26. Sep 2009 00:08

Re: Portable Firebird Server 2.1.3
 
Wirklich sehr interessant, schade dass du nicht zeigst, wie man den Server selber in seine Anwendung integrieren kann.

RWarnecke 26. Sep 2009 07:06

Re: Portable Firebird Server 2.1.3
 
Hallo Andreas,

das hört sich sehr interessant an. Meine Fragen sind :

:arrow: Wie kann ich das für eigene Anwendungen nutzen :?:
:arrow: Muss ich trotzdem etwas von Firebird installieren :?:
:arrow: Mit welchen Komponenten kann ich auf die Datenbank des Portable Firebird Servers zugreifen :?:

Edit :
Aber macht das ganze nicht eigentlich schon der Firebird Embedded Server ?

mkinzler 26. Sep 2009 07:52

Re: Portable Firebird Server 2.1.3
 
Für den embedded gelten aber Einschränkungen
Da diese Version einen normalen Server startet sollte jede Komponente funktionieren.

neo4a 26. Sep 2009 08:58

Re: Portable Firebird Server 2.1.3
 
Zitat:

Zitat von omata
Wirklich sehr interessant, schade dass du nicht zeigst, wie man den Server selber in seine Anwendung integrieren kann.

Das ist der nächste Schritt, bei dem die Lösung Teil eines Exe-Plugin-Systems wird. Hier werden einzelne Programme dann mit dem Server arbeiten, die alle unter einer (insbesondere portablen) Oberfläche arbeiten. Deshalb kommt für mich auch nicht die embedded Variante in Frage.


Zitat:

Zitat von RWarnecke
:arrow: Wie kann ich das für eigene Anwendungen nutzen :?:
:arrow: Muss ich trotzdem etwas von Firebird installieren :?:
:arrow: Mit welchen Komponenten kann ich auf die Datenbank des Portable Firebird Servers zugreifen :?:

Du brauchst halt nur noch die Datenbank und (m)eine Exe, startest diese und hast über einen voll funktionsfähigen FB-Server Zugriff auf die DB (multi-threaded und multi-user). Keine zusätzliche Datei ist dafür nötig ... aber möglich: jede einzelne Datei einer FB-Installation wird bei Vorhandensein genutzt. So kann man auch seine eigene security2.fdb, aliases.conf etc. mit ausliefern.

Als Komponenten würde ich mir UniDAC oder AnyDAC ansehen. Je nach Delphi-Version gibt es auch noch IBX, IBO, ZEOS, FUIB etc. Ab Delphi 2010 geht es auch nativ. Ich werde mich nun mit UniDAC unter D2009/2010 beschäftigen (und damit IBO seit 1997 das erste Mal untreu).

Den embedded FB-Server nutze ich schon sehr lange. Dort hat mich immer die vorgegebene Verzeichnis-Struktur gestört, die portable Anwendungen behindern. Nun kann ich den Server innerhalb meines Programmes ausliefern. Die Demo ist ja nur ... eine Demo ;). Schön ist auch, dass das Ganze in eingeschränkter Umgebung funktioniert: Lediglich eine Firewall meckert und schon läuft's, auch unabhängig von anderen bereits installierten Instanzen.


Zitat:

Zitat von mkinzler
Für den embedded gelten aber Einschränkungen
Da diese Version einen normalen Server startet sollte jede Komponente funktionieren.

Yeaph, obwohl die 2.5er zumindest bereits Multithreading bringen soll.

--
Andreas

HeinePotsdam 16. Nov 2009 07:06

Re: Portable Firebird Server 2.1.3
 
Klingt ja sehr interessant - aber leider kann ich das Demo nicht laden,
da das Download-Anzahl-Limit erreicht ist.

Kannst du es mir trotzdem senden?

Mfg Olaf

netdope 16. Nov 2009 14:55

Re: Portable Firebird Server 2.1.3
 
Für mich klingt das auch interesant!
Würde mich sehr interessieren wie du das gelöst hast.

neo4a 16. Nov 2009 18:54

Re: Portable Firebird Server 2.1.3
 
Ich habe das Demo-Projekt noch einmal aktiviert (Download).

Hier noch ein paar Infos zur Vorgehensweise und zu verwendeten Tools:

Ein Standard-Firebird-Verzeichnis hat knapp 9MB. Das habe ich in eine Ressourcen-Datei gepackt. Mit BoxedApp kann ich die Ressourcen zur Laufzeit auspacken. Das sieht etwa so aus:

Delphi-Quellcode:
procedure TForm1.StartClick(Sender: TObject);
var s:string;path:string;
begin
  path:=ExtractFilepath(Application.ExeName)+'';
  if not FileExists(path+'\bin\fbclient.dll') then
    CreateVirtualFile(path+'\bin\fbclient.dll','RES__BIN_FBCLIENT_DLL');
  if not FileExists(path+'\bin\fbrmclib.dll') then
    CreateVirtualFile(path+'\bin\fbrmclib.dll','RES__BIN_FBRMCLIB_DLL');
  if not FileExists(path+'\bin\fbserver.exe') then
    CreateVirtualFile(path+'\bin\fbserver.exe','RES__BIN_FBSERVER_EXE');
  if not FileExists(path+'\bin\gbak.exe') then
    CreateVirtualFile(path+'\bin\gbak.exe','RES__BIN_GBAK_EXE');
  if not FileExists(path+'\bin\gfix.exe') then
    CreateVirtualFile(path+'\bin\gfix.exe','RES__BIN_GFIX_EXE');
  if not FileExists(path+'\bin\gsec.exe') then
    CreateVirtualFile(path+'\bin\gsec.exe','RES__BIN_GSEC_EXE');
  if not FileExists(path+'\bin\gstat.exe') then
    CreateVirtualFile(path+'\bin\gstat.exe','RES__BIN_GSTAT_EXE');
  if not FileExists(path+'\bin\ib_util.dll') then
    CreateVirtualFile(path+'\bin\ib_util.dll','RES__BIN_IB_UTIL_DLL');
  if not FileExists(path+'\bin\icudt30.dll') then
    CreateVirtualFile(path+'\bin\icudt30.dll','RES__BIN_ICUDT30_DLL');
  if not FileExists(path+'\bin\icuin30.dll') then
    CreateVirtualFile(path+'\bin\icuin30.dll','RES__BIN_ICUIN30_DLL');
  if not FileExists(path+'\bin\icuuc30.dll') then
    CreateVirtualFile(path+'\bin\icuuc30.dll','RES__BIN_ICUUC30_DLL');
  if not FileExists(path+'\bin\Microsoft.VC80.CRT.manifest') then
    CreateVirtualFile(path+'\bin\Microsoft.VC80.CRT.manifest','RES__BIN_MICROSOFT_VC80_CRT_MANIFEST');
  if not FileExists(path+'\bin\msvcp80.dll') then
    CreateVirtualFile(path+'\bin\msvcp80.dll','RES__BIN_MSVCP80_DLL');
  if not FileExists(path+'\bin\msvcr80.dll') then
    CreateVirtualFile(path+'\bin\msvcr80.dll','RES__BIN_MSVCR80_DLL');
  if not FileExists(path+'\bin\nbackup.exe') then
    CreateVirtualFile(path+'\bin\nbackup.exe','RES__BIN_NBACKUP_EXE');
  if not FileExists(path+'\firebird.conf') then
    CreateVirtualFile(path+'\firebird.conf','RES__FIREBIRD_CONF');
  if not FileExists(path+'\firebird.log') then
    CreateVirtualFile(path+'\firebird.log','RES__FIREBIRD_LOG');
  if not FileExists(path+'\firebird.msg') then
    CreateVirtualFile(path+'\firebird.msg','RES__FIREBIRD_MSG');
  if not FileExists(path+'\intl\fbintl.conf') then
    CreateVirtualFile(path+'\intl\fbintl.conf','RES__INTL_FBINTL_CONF');
  if not FileExists(path+'\intl\fbintl.dll') then
    CreateVirtualFile(path+'\intl\fbintl.dll','RES__INTL_FBINTL_DLL');
  if not FileExists(path+'\security2.fdb') then
    CreateVirtualFile(path+'\security2.fdb','RES__SECURITY2_FDB');
  if not FileExists(path+'\udf\fbudf.dll') then
    CreateVirtualFile(path+'\udf\fbudf.dll','RES__UDF_FBUDF_DLL');
  if not FileExists(path+'\udf\ib_udf.dll') then
    CreateVirtualFile(path+'\udf\ib_udf.dll','RES__UDF_IB_UDF_DLL');
  if not FileExists(path+'\aliases.conf') then begin
    CreateVirtualFile(path+'\aliases.conf',''); //Leere Datei
    CreateAliases(path+'\aliases.conf');        //Sammle die Datenbanken im Unterverzeichnis
  end;
  AliasListBox.Items.LoadFromFile(path+'\aliases.conf');
  if AliasListBox.Items.Count>0 then begin
    AliasListBox.ItemIndex:=0;
    SetCS;
  end;
  fbserverhandle:=0;
  s:=path+'\bin\fbserver.exe';
  caption:=s;
  if FileExists(s) then begin
    Caption:=Format(Application.Title+' (gestartet auf %s)',[JvComputerInfoEx1.Identification.IPAddress]);
    fbserverhandle:=ExecAndWait(s,Format(' -a -n -p %d',[PortEdit.Value])); //Starte den Child-Prozess
  end;
end;

procedure TForm1.StopClick(Sender: TObject);
begin
  if fbserverhandle>0 then begin
    Caption:=Format(Application.Title+' (gestoppt auf %s)',[JvComputerInfoEx1.Identification.IPAddress]);
    TerminateProcess(fbserverhandle, 1);
    CloseHandle(fbserverhandle);
    fbserverhandle:=0;
  end;

end;

initialization

   BoxedAppSDK_Init;

finalization
   BoxedAppSDK_Exit;
Die resultierende Exe hat ca. 11-12 MB, die dann mittels PECompact auf ca. 3MB eingedampft werden kann. Aus Sicht meines Programmes habe ich den FB-Server "voll im Griff" und kann ihn nach Belieben starten/stoppen, Datenbanken sichern, die Konfiguration on the fly anpassen etc. Bestehende Konfiguration sind dabei kein Problem und alles ist ohne Installation voll portabel.

--
Andreas

mschaefer 17. Nov 2009 21:04

Re: Portable Firebird Server 2.1.3
 
Den Downloadlink im 1.Beitrag hat es erlegt... // Martin

neo4a 18. Nov 2009 06:59

Re: Portable Firebird Server 2.1.3
 
Zitat:

Zitat von mschaefer
Den Downloadlink im 1.Beitrag hat es erlegt... // Martin

Ich habe den Link in Post #1 mit dem aus #8 aktualisiert.

--
Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz