Hallo, ich möchte meine SQL Anweisungen in einer separaten .sql Datei abspeichern, alleine schon aufgrund der Lesbarkeit. Ich Möchte nun jedoch, dass der Inhalt dieser Dateien beim Übersetzen quasi statisch an die Stelle im Quellcode gesetzt wird. Damit möchte ich verhindern, dass ich diese Datei nach dem Übersetzen noch benötige und diese einsehbar ist. Die Sprache ist C++, Visual Studio 2019. Wie stelle ich das am besten an? Danke!
Wie soll das funktionieren?
1 | void sql(string sTXT){ |
2 | //...
|
3 | }
|
4 | |
5 | sql(' |
6 | #include "bla.sql" |
7 | '); |
Sql schrieb: > sql(' > #include "bla.sql" > '); was soll das denn sein? auf jeden Fall kein C++. Selbst, wenn du ein C-String literal benutzt. > sql(" > #include <bla.sql> > "); im String funktioniert das natürlich nicht. Das hast du aber auch nicht gesagt. Ich dachte in deiner Datei Steht sowas wie
1 | std::string Abfrage1 = "SELECT ...."; |
Was bring es dir denn, wenn alle SQL statements in einem String drin sind? Falls es wirklich das ist was du willst, könntest du das versuchen: https://github.com/graphitemaster/incbin Sql schrieb: > Damit möchte ich verhindern, dass > ich diese Datei nach dem Übersetzen noch benötige und diese einsehbar > ist. Funfact: es ist trotzdem in deinem Binary und mit jedem Texteditor oder dem 'strings' util https://en.wikipedia.org/wiki/Strings_(Unix) könnte man das extrahieren
:
Bearbeitet durch User
Es ist schon erstaunlich was nach vielen Jahrzehnten C++ immernoch nicht funktioniert. Ich habe eine Datei sql.sql in der eine SQL Anweisung drin steht. Kein C++ Code, sondern:
1 | select |
2 | name, |
3 | nachname |
4 | from |
5 | mitglieder |
Diesen SQL Befehl möchte ich nicht zur Laufzeit, sondern zur Compilierzeit in einer .cpp Datei inkludieren und einer Funktion übergeben. Pseudocode:
1 | executeSQL(" |
2 | #include "sql.sql" |
3 | "); |
Warum? Sämtliche SQL Befehle sind in einer .sql Datei abgelegt, inkl. passendem Syntax Highlightning. Und nach dem Compilieren spielen diese .sql Dateien keine Rolle mehr, da quasi statisch im Programmcode eingefügt und übersetzt. Es kann doch nicht sein, dass sowas nicht möglich ist?
Und wenn du in deiner Anwendung 500 verschiedene SQL-Statements verwendest hast du 500 .sql-Files im Projekt? Bau dir ein Script, dass vor dem Build den Inhalt des SQL-Files in ein .h/.c/.cpp schreibt. merciless
Hm. Schaue ich mit beiden Strings "C++" und "SQL" sehr genau an, dann fällt auf, daß die keinerlei Gemeinsamkeiten aufweisen. Was genau also erwartest du? Vielelicht könnte man aus deiner db einen Stream generieren, und dann SQLLite unterschieben. Probiers halt aus. Oliver
Immer dieser IDE spezifische BS. Mit Makefiles ist sowas viel einfacher (alles ungetestet): makefile
1 | # Alle quelldateien suchen |
2 | sources=$(shell find src -type f) |
3 | |
4 | # Alle resourcen suchen |
5 | resources=$(shell find res -type f) |
6 | |
7 | # Liste von Objektdateien erstellen |
8 | resource_objects=$(resources:%=build/%.res.o) |
9 | objects += $(resource_objects) |
10 | objects += $(sources:%.c=build/%.c.o) |
11 | |
12 | # Default target |
13 | all: my_program |
14 | |
15 | # Anwendung linken |
16 | my_program: $(objects) build/include/resources.h |
17 | $(cc) $(objects) -o "$@" |
18 | |
19 | # .c Quelldatei kompilieren |
20 | build/%.o: %.c |
21 | $(cc) -I build/include/ -I include/ -c "$<" -o "$@" |
22 | |
23 | # Header für alle Resourcen erstellen |
24 | # Nachher als char array Zugreifbar, Variablenname ist Dateiname, mit allen Sonderzeichen ersetzt mit _ |
25 | # Grösse ist in <name>_size gespeichert. |
26 | build/include/resources.h: $(resource_objects) |
27 | mkdir "$(dir $@)" |
28 | printf "#ifndef RESOURCES_H\n#define RESOURCES_H\n\n" > "$@".tmp |
29 | for file in $(resources); \ |
30 | do \ |
31 | id="res_$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \ |
32 | printf "extern const char %s[];" "$$id" >> "$@".tmp; \ |
33 | printf "extern const size_t %s_size;" "$$id" >> "$@".tmp; \ |
34 | done |
35 | printf "\n#endif\n" >> "$@".tmp |
36 | mv "$@".tmp "$@" |
37 | |
38 | # Resourcen zu Objektdateien umwandeln |
39 | build/%.res.o: % |
40 | mkdir "$(dir $@)" |
41 | file="$^"; \ |
42 | id="$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \ |
43 | ( \ |
44 | echo '#include <stddef.h>'; \ |
45 | printf "extern const char %s[];" "$$id"; \ |
46 | printf "extern const size_t %s_size;" "$$id"; \ |
47 | printf "const char %s[] = {" "$$id"; \ |
48 | cat "$$file" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | sed 's/.*/ "\0\\n"/'; \ |
49 | printf "};\nconst size_t %s_size = sizeof(%s)-1;\n" "$$id" "$$id"; \ |
50 | ) | $(CC) -c -o "$@" -x c - $(CC_OPTS) $(CPPFLAGS) $(CFLAGS) |
res/hello.txt
1 | Hello World! |
src/main.c
1 | #include <stdio.h> |
2 | |
3 | int main(){ |
4 | puts(res_hello_txt); |
5 | } |
Edit: Müsste
1 | id="$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \ |
Statt:
1 | id="res_$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; |
sein.
Sql schrieb: > Sämtliche SQL Befehle sind in einer .sql Datei abgelegt, inkl. > passendem Syntax Highlightning. ...der ist gut und hat mich fast vom Stuhl gehauen...:D
Sql schrieb: > Es ist schon erstaunlich was nach vielen Jahrzehnten C++ immernoch nicht > funktioniert. für genau sowas wurden resource compiler erfunden. Man definiert ein resource script, was die einzukompilierenden resourcen enthält und es gibt eine API um auf diese zuzugreifen. Bei windows ist gehört dies zur Win32-API. Ist natürlich Win-only. Aber du scheinst ja mit VS2019 zu arbeiten. Also füge deinem Projekt dein File als Resource hinzu und lade diese. Wenn du was Platformunabhängiges suchst, kann ich nur Qt empfehlen. Das bringt sowas auch mit. Das geht sogar soweit, dass es quasi ein eigenes Dateisystem für die Resourcen simuliert und alle Funktionen, die Dateinamen erwarten auch mit Resourceidentifiern klarkommen (die wie Dateipfade aussehen nur mit vorangestelltem ':') https://doc.qt.io/qt-5/resources.html Für kleinere Projekte ist sowas wahrschienlich overkill, aber eine sehr einfache Variante (das INCBIN repository) habe ich dir ja oben schon verlinkt. Wirklich sehr angenehm und einfach zu integrieren. Erfordert für den M$ Compiler leider einen extra prebuildstep.
DPA schrieb: > Immer dieser IDE spezifische BS. Mit Makefiles ist sowas viel einfacher > (alles ungetestet): Ja - sehr viel einfacher, als in einer IDE eine Resource hinzuzufügen. und makefiles sind auch so intuitiv und laufen überall.
Sql schrieb: > Es ist schon erstaunlich was nach vielen Jahrzehnten C++ immernoch nicht > funktioniert. > > Ich habe eine Datei sql.sql in der eine SQL Anweisung drin steht. Kein > C++ Code, sondern:select > name, > nachname > from > mitglieder In welcher anderen Sprache funktioniert das denn? Mit irgendwelchen SQL Befehlen ohne Zuordnung kann doch keine Sprache was anfangen?!
Sql schrieb: > Warum? Sämtliche SQL Befehle sind in einer .sql Datei abgelegt, inkl. > passendem Syntax Highlightning. Und nach dem Compilieren spielen diese > .sql Dateien keine Rolle mehr, da quasi statisch im Programmcode > eingefügt und übersetzt. wenn dich 7 weitere Zeichen in deinen SQL-Dateien nicht stören, kannst du auch sowas machen: bla.sql:
1 | R"=( |
2 | |
3 | SELECT * FROM table;
|
4 | |
5 | )="
|
Code:
1 | const char *s = |
2 | #include "bla.sql" |
3 | ;
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.