Ausliefern von Datenbankscripten in Programmen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Lemmy
Beiträge: 57
Registriert: Do 23. Feb 2017, 06:18

Ausliefern von Datenbankscripten in Programmen

Beitrag von Lemmy »

Servus,

ich habe hier ein "kleines" Programm, das insbesondere Daten importiert. Dazu wird bei Bedarf auch die Datenbank angepasst (Felder hinzugefügt, StoredProcedures angepasst).

Die StoredProcedures wurden dabei lange Zeit aus Textdateien in eine Pascaldatei zusammengefasst mit je einer Funktion pro StoredProcedure die den DDL für die SP zurück geliefert hat. Eine weitere Methode ist alle Funktionen durch gelaufen und hat die SQL die zurück gegeben wurden ausgeführt.

Das Zusammenbauen der Unit ist im Buildprozess passiert. Das hat dazu geführt, dass aber die komplette Formatierung (Leerzeilen, Einrückung,..) aus den SPs verschwunden sind.

Ich habe das irgend wann umgebaut in ein Resourcefile, das hat deutlich geschmeidiger funktioniert, allerdings musste ich das Projekt von Delphi auf Lazarus portieren, weil die neue Zielplattform Linux ist. Ich könnte zwar mit Windres mit den Resourcen weiter machen, allerdings gibt es 2 Probleme:
1. Zielplattform ist Centos 7 und ich habe es noch nicht geschafft dort Windres installiert zu bekommen.
2. WIndows-Resourcen und Linuxplattform - irgend wie passt das nicht zusammen....

Welche Option habe ich sonst noch. Wie macht ihr das?

eine separate Datei mit den SQL in irgend einem Format wäre noch eine Option (JSON/XML Whatever), das macht das Updateprozedere aber wieder etwas komplexer.

Grüße

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Ausliefern von Datenbankscripten in Programmen

Beitrag von MacWomble »

Meine Devise:
Entweder echtes Linuxprogramm erstellen oder eben gar nicht ... nach Möglichkeit plattformunabhängig bleiben!

Die DDLs kanns du doch in sql-files (.sql) vorhalten und aus dem Programm nach Bedarf einlesen und abarbeiten lassen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MmVisual
Beiträge: 1437
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Ausliefern von Datenbankscripten in Programmen

Beitrag von MmVisual »

Mit Lazarus kann man eine Ressourcendatei erstellen:

Code: Alles auswählen

LazRes.exe MeineRessorce.lrs MeineDatei.txt=Meins


Und dann die mit Linken in das Projekt:

Code: Alles auswählen

initialization
{$I MeineRessorce.lrs}
 


Und als Stream zur Laufzeit auslesen:

Code: Alles auswählen

 
Uses ..., LResources, ...
 
st := TLazarusResourceStream.Create('Meins', 'TXT');


Diesen Stream kann man in eine TStringList mit LoadFromStream(st) einlesen, oder auch in einem TMemo darstellen. Damit bekommt man alles mit in die EXE gelinkt und hat es zur Verfügung.

Und sollten die Daten größer sein so kann man:
- alle Dateien Zippen
- Das eine ZIP als Ressource wandeln
- zur Laufzeit diese Ressource als Stream laden
- Mit der Komponnete TAbZipKit im RAM das ZIP in einen zweiten TMemoryStream entpacken und dann diesen zweiten Stream weiter verwenden

Funktioniert unter Windows und Linux.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Lemmy
Beiträge: 57
Registriert: Do 23. Feb 2017, 06:18

Re: Ausliefern von Datenbankscripten in Programmen

Beitrag von Lemmy »

MacWomble hat geschrieben:Meine Devise:
Entweder echtes Linuxprogramm erstellen oder eben gar nicht ... nach Möglichkeit plattformunabhängig bleiben!


sehe ich auch so..
MacWomble hat geschrieben:Die DDLs kanns du doch in sql-files (.sql) vorhalten und aus dem Programm nach Bedarf einlesen und abarbeiten lassen.

wird dann zu kompilziert das auszurollen (ok nicht mein Problem, aber wenn was nicht funktioniert muss ich dann doch wieder ran) - wenn dann eine Datei mit den DDLs drin, sei es als komplettes Script oder als JSON/XML Datei

MmVisual hat geschrieben:Mit Lazarus kann man eine Ressourcendatei erstellen:


hm.. Aber LazRes ist doch "abgekündigt"?

http://wiki.freepascal.org/lazres

MmVisual
Beiträge: 1437
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Ausliefern von Datenbankscripten in Programmen

Beitrag von MmVisual »

In der aktuellen Lazarus Version geht das noch und in Lazarus V2.0 auch noch. So schnell wird das auch nicht aus Lazaurs verschwinden
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Ausliefern von Datenbankscripten in Programmen

Beitrag von af0815 »

LazRes als Ersatz für den Resourcenkompiler ja, aber nicht für andere Zwecke. Es steht dort nur, das es für Lazarus nicht mehr verwendet wird, das ist aber klar, da es einen normalen Resourcencompiler gibt. So nebenbei liefere ich mit diesem auch die nötigen Treiber unter Windows aus, also sollte es für andere Zwecke auch gehen. Man muss nur sehen wie man die Resourcen wieder zurūckwandeln kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 842
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Ausliefern von Datenbankscripten in Programmen

Beitrag von charlytango »

MacWomble hat geschrieben:Die DDLs kanns du doch in sql-files (.sql) vorhalten und aus dem Programm nach Bedarf einlesen und abarbeiten lassen.

Lemmy hat geschrieben:wird dann zu kompilziert das auszurollen (ok nicht mein Problem, aber wenn was nicht funktioniert muss ich dann doch wieder ran) - wenn dann eine Datei mit den DDLs drin, sei es als komplettes Script oder als JSON/XML Datei


grübel... was ist an DDL in einer eigenen Datei (.sql-file) kompliziert? Ist im übrigen ja egal wie du die Datei nennst und wenn du meinst dass der User da reinpfuschen könnst kannst die Datei ja auch verschlüsseln.

in größeren Applikationen mache ich das meist so:
Die Datenbank bekommt eine zusätzliche Tabelle, die als einzige Zeile ihre aktuelle Version mitführt.
Die Applikation bekommt eine Konstante, welche die für das Programm nötige DB-Version speichert.
Bei Programmstart wird beides verglichen und ggfs eine Routine gestartet die aus (in einem eigenen Verzeichnies liegenden) Dateien mit DDL-Statements die komplette Datenbank erstellt bzw alle nötigen Änderungen macht samt vorherigen DB-Backup. Diese Funktion ist oft nur mit Administratorrechten des Programms verfügbar.
Wenn ein Programm mit nicht zur aktuellen DB passenden DB-Version gestartet wird verweigert es bis zum DB-Update die Mitarbeit.

gut getestet klappt das seit >20 Jahren ... Ist vielleicht keine Raketentechnik, funktioniert aber verlässlich.
und wenn wirklich was passiert musst du eh selbst ran -- ich mach das dann meistens per Teamviewer et al.


Wäre vielleicht auch ein Anregung für grundlegende Applikationsbedürfnisse hier im Forum Units oder Komponenten zur Verfügung zu stellen, würde das Forum sicher auch aufwerten.

enjoy

Antworten