Delphi-PRAXiS

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

DelphiBandit 18. Nov 2009 07:30

Re: Portable Firebird Server 2.1.3
 
Eine super Sache :lol: Habe das Ganze mit Multi-App Zugriff innerhalb weniger Sekunden zum laufen gebracht. Einzig die abweichende Port-Angabe erforderte einmal googlen, benutze ich nicht so oft.

Darf man auch bei einer technischen Machbarkeitsstudie Wünsche äußern :roll: Richtig schick wäre es noch, wenn man dcServer.exe mit Parametern versorgen kann. Einige wenige, welche mir auf Anhieb einfallen:

/START Lässt den FB-Server starten, kombinierbar mit Port
/STOP Stoppt den FB-Server
/PORT:3000 optionaler Port
/EXIT Stoppt den FB-Server und beendet dcServer wieder (zweiter Start -> sucht erste Instanz der exe und beendet diese)

Wenn nicht, ist es auch nicht schlimm,
trotzdem ein nützliches und schickes Tool

*** Gut gemacht ***

neo4a 18. Nov 2009 17:33

Re: Portable Firebird Server 2.1.3
 
Zitat:

Zitat von HondaGL1
Eine super Sache :lol: Habe das Ganze mit Multi-App Zugriff innerhalb weniger Sekunden zum laufen gebracht. Einzig die abweichende Port-Angabe erforderte einmal googlen, benutze ich nicht so oft.

Schön, dass Du damit etwas anfangen kannst.

Zitat:

Zitat von HondaGL1
Darf man auch bei einer technischen Machbarkeitsstudie Wünsche äußern :roll: Richtig schick wäre es noch, wenn man dcServer.exe mit Parametern versorgen kann. Einige wenige, welche mir auf Anhieb einfallen:

/START Lässt den FB-Server starten, kombinierbar mit Port
/STOP Stoppt den FB-Server
/PORT:3000 optionaler Port
/EXIT Stoppt den FB-Server und beendet dcServer wieder (zweiter Start -> sucht erste Instanz der exe und beendet diese)

Ja, das ist mit wenig Aufwand realisierbar.

--
Andreas

netdope 19. Nov 2009 09:05

Re: Portable Firebird Server 2.1.3
 
Hi,

leider kann die Datei schon wieder nicht mehr heruntergeladen werden. Könntest Du sie nochmals zur Verfügung stellen?

neo4a 19. Nov 2009 09:31

Re: Portable Firebird Server 2.1.3
 
Glücklicherweise passt das Zip-Archiv gerade noch in das Upload-Limit, so dass es nun als Attachment in Post #1 verfügbar ist.

--
Andreas

netdope 19. Nov 2009 10:10

Re: Portable Firebird Server 2.1.3
 
Super! Danke!

hatte ich übersehen ;)

neo4a 22. Nov 2009 15:58

Re: Portable Firebird Server 2.1.3
 
In Post #1 ist eine neue Version hinterlegt, die nun auch Kommandozeilen auswertet und bei wiederholtem Aufruf an die laufende Instanz durchreicht.

Nächste Versionen sollten verschiedene Datenbank-Versionen unterstützen (als Ressource oder externes Archiv) und Unterstützung für einfache Aufgaben (z.B. Backup, Restore, ReadOnly für CD-Einsatz) bieten.

--
Andreas

DelphiBandit 15. Dez 2009 10:57

Re: Portable Firebird Server 2.1.3
 
vielen Dank für den Einbau der Kommandozeilen-Parameter! Funktioniert nach erstem kurzem Testen einwandfrei und ist eine enorme Erleichterung den portablen FB-Server von außen z.B. mit "geplanten Tasks" für Sicherungszwecke zu steuern.

Gruß
Carsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 Uhr.

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