Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLite statisch gelinkt und DB in Resource (https://www.delphipraxis.net/204147-sqlite-statisch-gelinkt-und-db-resource.html)

Codehunter 29. Apr 2020 10:21

Datenbank: SQlite • Version: 3.31 • Zugriff über: FireDAC

SQLite statisch gelinkt und DB in Resource
 
Hallo!

Frage 1: Laut Dokwiki unterstützt FireDAC für SQLite statisches Linken. Da ich bisher mit SQLite nichts zu tun hatte: Wie genau erstellt man ein Programm, dass keine externe SQLite-DLL benötigt?

Frage 2: Ist es möglich, eine SQLite-DB in eine Resource zu kompilieren und direkt von dort zu laden?

Ziel des ganzen soll eine monolithische EXE sein, die alles mitbringt und als portables Programm verwendet werden kann. Zusätzliche Dateien sind ausdrücklich nicht gewollt. Die SQLite-DB soll als eine In-Memory-Readonly-DB verwendet werden. Notfalls würde ich die SQLite-DB aus der Resource in eine temporäre Datei extrahieren und von dort von FireDAC laden. Besser würde mir jedoch gefallen, wenn sie direkt aus der Resource geladen würde.

Grüße
Cody

Delphi.Narium 29. Apr 2020 10:42

AW: SQLite statisch gelinkt und DB in Resource
 
Beschreib bitte mal kurz die Struktur der Datenbank.

Mehrere Tabellen oder eher sowas wie eine "aufgeblasene" INI?

Wird SQL zwingend benötigt?

Oder würde so 'ne Art TTable-Nachfolger (ggfls. auch mehrere) ausreichen (also die Benutzung von sowas wie tabelle.Filter, tabelle.Locate)?

Eventuell wäre dann dashier eine Alternative: KbmMemTable

Die Tabelle kann man auch aus einem Stream laden, den müsste man wiederum aus 'ner Resource laden können. Es werden dazu keine weiteren DLL's o. ä. benötigt, da die ganze Funktionalität in Delphi geschrieben ist und damit mit einkompiliert wird.

Codehunter 29. Apr 2020 11:17

AW: SQLite statisch gelinkt und DB in Resource
 
Eine ganze Reihe von Tabellen mit Fremdschlüsseln. Also SQL mit JOINs ist da schon sehr hilfreich ^^

himitsu 29. Apr 2020 12:31

AW: SQLite statisch gelinkt und DB in Resource
 
Meint die Hilfe jetzt statisches Linken der DLL (hier brauchst dennoch die DLL und wenn sie fehlt, dann startet das Programm nicht mehr)
oder den Code ala DCU/LIB/OBJ-File in die EXE linken? (Code einer OBJ vom Linker in die EXE eingebaut)


Bei Letzterem brauchst die vorkompilierten OBJ-Files für deine Datenbank, welche du in deine EXE einbingen kannst.
Den kompletten Code der Datenbank, nicht nur eine Zugriffskomponente, wenn du wirklich Embedded arbeiten willst.

http://docwiki.embarcadero.com/RADSt..._file_(Delphi)
Als Beispiele siehe ZLib, RegEx, PNG oder Jpeg im Delphi-Quellcode, wo auch Fremdcode (C++) gelinkt wird.

mytbo 29. Apr 2020 12:45

AW: SQLite statisch gelinkt und DB in Resource
 
Mit mORMot kannst du das umsetzen. Wenn du den ORM Teil verwendest, kannst du auch mit FireDAC auf die DB zugreifen. Die direkte interne Anbindung an SQLite in mORMot ist aber der bessere Weg.

Links:
- https://synopse.info/forum/
- https://synopse.info/fossil/wiki?name=Downloads

Bis bald...
Thomas

Codehunter 29. Apr 2020 12:48

AW: SQLite statisch gelinkt und DB in Resource
 
Ich habe ein bisschen gesucht und unter C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\win32\release\ eine sqlite3_x86.obj gefunden. Da SQLite keine Client-Server-DB ist, gehe ich mal davon aus, dass diese Datei das komplette DBMS enthält. Und die sollte nach meinem Verständnis vom Linker mit in die EXE gelinkt werden, sodass eben keine externe DLL notwendig ist.

EDIT: Ich frage deshalb so umständlich, weil das statische Linken zwar im Dokwiki erwähnt, jedoch nicht näher ausgeführt wird.

himitsu 29. Apr 2020 13:20

AW: SQLite statisch gelinkt und DB in Resource
 
Schau mal, ob du eine pas/dcu findest, in der "sqlite3_x86.obj" drin zu finden ist,

dann würde es reichen diese Unit einzubinden.

Codehunter 29. Apr 2020 13:38

AW: SQLite statisch gelinkt und DB in Resource
 
Mit Total Commander alles abgegrast, nach "*.*" gesucht, leider kein einziger Treffer für "sqlite3_x86.obj" :cry:

EDIT:
Zitat:

Zitat von Dokwiki
Sie müssen die FireDAC.inc-Datei ändern, um den Link-Modus auszuwählen:

Definieren Sie FireDAC_SQLITE_STATIC für das statische Linken.
Heben Sie die Definition von FireDAC_SQLITE_STATIC für das dynamische Linken auf.

Hinweis: Die FireDAC.inc-Datei befindet sich in C:\Program Files (x86)\Embarcadero\Studio\19.0\source\data\firedac.

Sagt die Hilfe. Nur dummerweise gibts in dem Ordner keine .inc-Datei.

Delphi.Narium 29. Apr 2020 14:11

AW: SQLite statisch gelinkt und DB in Resource
 
FireDAC.inc

https://stackoverflow.com/questions/...te-and-firedac

https://stackoverflow.com/questions/...firedac-sqlite

Wenn ich das richtig gesehen habe, sind die FireDAC-Sourcen in der Professional nicht dabei, Du benötigst diese aber, um nach dem Ändern der FireDAC.inc diese neu kompilieren zu können, damit Änderungen in der FireDAC.inc wirksam werden.

Codehunter 29. Apr 2020 14:20

AW: SQLite statisch gelinkt und DB in Resource
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1463130)
Wenn ich das richtig gesehen habe, sind die FireDAC-Sourcen in der Professional nicht dabei, Du benötigst diese aber, um nach dem Ändern der FireDAC.inc diese neu kompilieren zu können, damit Änderungen in der FireDAC.inc wirksam werden.

Ist ja wieder putzig. Danke dir für die wichtige Information! Emba hält es anscheinend nicht für wichtig, nicht mal einen Hinweis geben sie :evil:

Wenn ich das in der von dir verlinkten INC richtig sehe, ist das statische Linken per Default auf Win32 und Win64 aktiv?

Delphi.Narium 29. Apr 2020 14:33

AW: SQLite statisch gelinkt und DB in Resource
 
Jo, sieht so aus.
Delphi-Quellcode:
/* Bisserl umformatiert, ums lesbarer zu machen */
{------------------------------------------------------------------------------}
{ SQLite driver                                                               }
{------------------------------------------------------------------------------}
{$IF DEFINED(MSWINDOWS) or DEFINED(MACOS)
  and not DEFINED(IOS) or DEFINED(IOS)
  and (DEFINED(CPUARM) or DEFINED(CPUARM64)) or DEFINED(ANDROID)}
  {$DEFINE FireDAC_SQLITE_STATIC}        // Use SQLite3 static linking library
  {$IF DEFINED(MACOS)
    and not DEFINED(IOS) or DEFINED(IOS)
    and (DEFINED(CPUARM) or DEFINED(CPUARM64)) or DEFINED(ANDROID)}
    {$DEFINE FireDAC_SQLITE_EXTERNAL}    // Link SQLite3 library using "external" keyword
  {$ENDIF}
{$ENDIF}
Die Frage ist nur:

Ist FireDAC in der Professional auch mit dieser FireDAC.inc kompiliert?

Das müsstest Du mal ausprobieren.

Programm mit Zugriff auf SQLite erstellen und beim Probieren sicherstellen, da (außer der Datenbankdatei) nix von SQLite für das Programm irgendwie erreichbar ist. Weder im EXE-Verzeichnis noch irgendwo im Pfad noch sonstwie.

Wenn's dann geht sollte es passen, andernfalls "Pech gehabt"?

Codehunter 29. Apr 2020 15:05

AW: SQLite statisch gelinkt und DB in Resource
 
Genau so sehe ich das auch. Ich kann ja auch mit dem Process Monitor nachschauen, welche DLLs geladen werden.

Ist eben das erste Mal dass ich mit SQLite zu tun habe. Schaut aus wie eine typische Emba-Lösung: So kompliziert wie möglich und so viel dokumentiert wie nötig.

Notfalls müsste ich auf UniDAC ausweichen, was aber von der Performance her weit unter FireDAC liegt und in meinem Fall kommen eine Menge Random-Read-Zugriffe zusammen.

Uwe Raabe 29. Apr 2020 16:50

AW: SQLite statisch gelinkt und DB in Resource
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1463134)
Ist FireDAC in der Professional auch mit dieser FireDAC.inc kompiliert?

Offenbar ist es das. Sogar in der Enterprise und Architect. Zumindest wenn man den Debug-DCUs traut.

himitsu 29. Apr 2020 16:58

AW: SQLite statisch gelinkt und DB in Resource
 
Dass die INC verwendet wird, war schon fast klar ... sonst würde es ja nichts helfen dort was umzuschreiben, wenn es dann nicht benutzt würde. :angle:

Zitat:

Zitat von Codehunter (Beitrag 1463140)
Schaut aus wie eine typische Emba-Lösung: ...
Notfalls müsste ich auf UniDAC ausweichen,

Nee nee, du mußt doch nur die Enterprise oder besser noch eine Architect kaufen. :zwinker:

Delphi.Narium 29. Apr 2020 17:06

AW: SQLite statisch gelinkt und DB in Resource
 
Zitat:

Zitat von himitsu (Beitrag 1463157)
Dass die INC verwendet wird, war schon fast klar ... sonst würde es ja nichts helfen dort was umzuschreiben, wenn es dann nicht benutzt würde. :angle:

Das eine FireDAC.inc verwendet wird, ist schon klar.

Aber es muss nicht diese von GitHub sein ;-)

himitsu 29. Apr 2020 17:12

AW: SQLite statisch gelinkt und DB in Resource
 
achsooooooo :oops:

Codehunter 29. Apr 2020 18:49

AW: SQLite statisch gelinkt und DB in Resource
 
Ich glaube, ich habe das von der falschen Seite her betrachtet. Aus Sicht von Emba macht das natürlich am meisten Sinn, statisches Linken als Default einzustellen wenn man den FireDAC-Code nicht mitliefert (bei den kleineren Editions). So wird ein zusätzlicher Anreiz geschaffen, neuere Delphis bzw. Subscription zu kaufen. Immerhin ist das FireDAC-SQLite modifiziert um z.B. Unicode, Verschlüsselung etc. zu unterstützen. Neuere Features seitens SQLite fehlen dann aber und können nicht so einfach durch Austausch der DLL nachgerüstet werden. Ob die Macher von SQLite das im Sinn hatten, als sie das DBMS unter eine PD-Lizenz gestellt haben? :roll:

Uwe Raabe 29. Apr 2020 22:43

AW: SQLite statisch gelinkt und DB in Resource
 
Zitat:

Zitat von Codehunter (Beitrag 1463166)
Aus Sicht von Emba macht das natürlich am meisten Sinn, statisches Linken als Default einzustellen wenn man den FireDAC-Code nicht mitliefert (bei den kleineren Editions).

Zumindest hat man es offenbar konsistent gemacht und hat in alle SKUs statisches Linken als Default. Dynamisches Linken geht dann erst ab Enterprise oder über eine direkte Anfrage bei Embarcadero nach den dafür benötigten Source-Dateien.

Zitat:

Zitat von Codehunter (Beitrag 1463166)
Immerhin ist das FireDAC-SQLite modifiziert um z.B. Unicode, Verschlüsselung etc. zu unterstützen. Neuere Features seitens SQLite fehlen dann aber und können nicht so einfach durch Austausch der DLL nachgerüstet werden.

In der neueren DLL wären dann ja auch nicht die Änderungen von Embarcadero drin. Die gäbe es auch nur mit einem Delphi-Update.

Codehunter 30. Apr 2020 11:57

AW: SQLite statisch gelinkt und DB in Resource
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1463178)
In der neueren DLL wären dann ja auch nicht die Änderungen von Embarcadero drin. Die gäbe es auch nur mit einem Delphi-Update.

Stimmt auch wieder. Welchen Mehrwert hätte denn dann die Option für dynamisches Linken überhaupt? Außer dass die EXE 700 kB kleiner werden dürfte.

himitsu 30. Apr 2020 12:06

AW: SQLite statisch gelinkt und DB in Resource
 
Du kannst die DLL tauschen, wenn es da eine bessere Version gibt, ohne die EXE neu kompilieren zu müssen.

Aber sowas betrifft einen eher, wenn man eine Verbindung zu externen Datenbanken aufnimmt.
z.B. im DB-Server wird ein Sicherheitsbugfix gemacht oder die ändern bei der Connection was, dann brauchst nur die DLL der DB-Komponente zu aktualisieren.


Es gibt bei einigen Dingen auch die Mischung ... da hast dann beide Vorteile. (alles in der EXE, aber upgradefähig)
Es wird das Interne benutzt, außer es wird z.B. neben der EXE die DLL gefunden.
Ist dann wie mit den Sprachressourcen von Delphi. Die SysConst ist in einer der 5 Sprachen einkompiliert, aber wenn man die RessourcenDLLs der anderen Sprachen daneben legt, dann werden die benutzt.

Uwe Raabe 27. Mai 2020 18:49

AW: SQLite statisch gelinkt und DB in Resource
 
Nur so zur Info:
Zitat:

FireDAC SQLite driver offers both static and dynamic linkage
For SQLite, FireDAC adds the ability to choose static vs dynamic linkage of SQLite engine. To use the static linkage of SQLite engine it is required to add the unit "FireDAC.Phys.SQLiteWrapper.Stat" to the uses clause of one of the units of your project. Otherwise dynamical linkage will be chosen. There is a new property TFDPhysSQLiteDriverLink.EngineLinkage. When the value is slDefault or slStatic, then the "FireDAC.Phys.SQLiteWrapper.Stat" unit will be added at design-time to the unit hosting the component. If application defines the connection at run-time, then the "FireDAC.Phys.SQLiteWrapper.Stat" unit must be added manually.
Quelle: New features and customer reported issues fixed in RAD Studio 10.4


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.

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