SQL File in Visual Studio 2019 statisch in Quellcode einfügen

Gast #6101718
Lesenswert?

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!
#6102017
Lesenswert?

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
Gast #6102034
Lesenswert?

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?
Gast #6102072
Lesenswert?

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
}
#6102088
Lesenswert?

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.
Gast #6102116
Lesenswert?

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?!
#6102129
Lesenswert?

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
;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren