Codeschnipsel für C
sqlite3* dbs; char command[300]; char *ptr_command = command; char *error_exec=NULL; printf("SQL Kommando eingeben:"); fgets(ptr_command,300,stdin); if (sqlite3_exec(dbs,ptr_command,callback,NULL,&error_exec) != SQLITE_OK) printf("SQLite Fehler: %s\n",error_exec); { sqlite3_free(error_exec); error_exec=NULL; }
Callback-Funktion in C:
int callback(void *unused_ptr, int number_of_lines, char **column_value, char **column_name) { int i; for (i = 0; i != number_of_lines; ++i) { printf("%s: ",&*column_name[i]); if (column_value[i]) printf("%s\n",&*column_value[i]); } return 0; }
Codeschnipsel für C++
sqlite3* dbs; string command; char* error_exec=NULL; cout << "SQL Kommando eingeben:"; getline(cin,command); if (sqlite3_exec(dbs,command.c_str(),callback,NULL,&error_exec) != SQLITE_OK) { cerr << "SQLite Fehler: " << error_exec << endl; sqlite3_free(error_exec); error_exec=NULL; }
Callback-Funktion in C++
int callback(void *unused_ptr, int number_of_lines, char **column_value, char **column_name) { for (int i = 0; i != number_of_lines; ++i) { cout << column_name[i] << ": "; if (column_value[i]) cout << column_value[i] << endl; } cout << endl; return 0; }
Um ein SQL-Kommando mit sqlite3_exec() ausführen zu können, ist eine geöffnete Datenbankverbindung Voraussetzung. Im obigen Beispiel interessiert uns vor allem diese Zeile:
sqlite3_exec(dbs,ptr_command,callback,NULL,&error_exec;
Die Funktion erwartet mehrere Parameter:
Der Char-Pointer für die Fehlermeldung wird von der Funktion dazu benutzt, dynamisch ein Chararray auf dem Heap zu erzeugen, das die Fehlermeldung enthält. Damit kein Speicherleck entsteht, muss dieser Speicher wieder freigegeben werden. Dies geschieht über sqlite3_free(). Der Funktion wird einfach der Pointer auf die Fehlermeldung übergeben und der Pointer auf NULL gerichtet.
Die Callbackfunktion wird benutzt, um die Werte, die durch den Befehl zurückgeliefert werden, auszuwerten. Die obige Callbackfunktion gibt die Werte lediglich über das Terminal aus. Die Parameter, die die Funktion übernehmen muss, sind vorgegeben:
Wie man die Werte dann allerdings verarbeitet, bleibt der eigenen Phantasie überlassen.
Wer sich jetzt noch Fragen sollte, was ein char** Pointer ist: Es ist ein „Pointer auf Pointer auf Wert“ Konstrukt. Da es sich in bei der libsqlite3 um eine C-Bibliothek handelt, muss mit C-Strings gearbeitet werden und die werden als Chararrays abgelegt. Der rechte Pointer zeigt auf ein Chararray, das einen String mit einem Tabellenwert enthält. Der linke Pointer zeigt auf diesen Pointer. Erhöht man nun den linken Pointer, kann man durch die Texte springen. Es entspricht also im Grunde einem Array von Strings, das man über den linken Pointer durchlaufen kann.