SOCI – MySQL C++ Datenbank Abstraktion
Für ein neues Projekt habe ich mir SOCI, ein MySQL C++ Datenbank Abstraktionslayer, näher angesehen und in einem kleinen Beispielprojekt zum Laufen gebracht. Ich zeige euch in diesem Tutorial wie ihr diese Bibliothek in einem einfachen C++ Programm verwendet um eine externe MySQL Datenbank anzusprechen.
SOCI – MySQL C++ Datenbank Abstraktion
Alle Informationen für dieses Tutorial habe ich von der Dokumentation der Projektseite von SOCI entnommen. Diese ist mehr oder weniger ausreichend, ich musste aber für mein erstes Programm einige Dinge recherchieren beziehungsweise probieren. Ich hoffe mit diesem Tutorial kürze ich diesen Lernprozess für euch deutlich ab.
Installation
Ich habe dieses Projekt auf einem Ubuntu 16.04 System umgesetzt. Damit man die Bibliothek überhaupt erstellen kann wird zwingend cmake benötigt, deshalb habe ich es im ersten Schritt über den Paketmanager installiert:
sudo apt-get install cmake
Nun kann man sich den Source Code des Projekts von GitHub über Git clonen:
git clone git://github.com/SOCI/soci.git
Es wird der Ordner soci erstellt. In diesem Ordner habe ich mir einen build Ordner erstellt in den ich das Programm dank cmake erstelle und auch gleich im Sytem installiere:
mkdir build cd build cmake -G "Unix Makefiles" -DWITH_BOOST=OFF -DWITH_ORACLE=OFF ../soci make make install
ich habe folgende Fehlermeldung bekommen:
CMake Error at cmake_install.cmake:36 (file): file INSTALL cannot make directory "/usr/local/include/soci": Permission denied
Bei mir benötigte make install root Rechte, weil er versucht die erstellte Bibliothek in einem Systemordner abzulegen. Aus diesem Grund habe ich das letzte Kommando mit
sudo make install
ausgeführt.
Verwendung
Um SOCI zu testen habe ich mir auf meinem Webspace eine neue Datenbank angelegt und dort zwei Tabellen country und player. Country enthält dabei eine Liste aller Nationen der Welt, player ist leer und soll Spielernamen enthalten. Im Beispielprogramm werde ich zwei abfragen machen. Zum einen ein Select über die country Tabelle und zum anderen ein Insert in die player Tabelle. Damit sollen die üblichen Statements für ein Programm getestet werden.
Der vollständige Source Code meines Testprogramms:
#include "soci.h" #include "mysql/soci-mysql.h" #include <iostream> #include <exception> #include <string> #include <fstream> using namespace soci; using namespace std; int main() { cout << "Hello database!" << endl; try { session sql("mysql", "db=DATENBANK user=BENUTZER password=PASSWORT host=IPADRESSE"); int count; sql << "select count(*) from country", into(count); cout << "We have " << count << " entries in the country table.\n"; rowset rs = (sql.prepare << "select name from country"); //write result set to file ofstream myfile ("country.txt"); if (myfile.is_open()) { for (rowset::const_iterator it = rs.begin(); it != rs.end(); ++it) { myfile << *it << '\n'; } myfile.close(); } //insert into string firstname = "Hansi"; string lastname = "HansiNachname"; sql << "insert into player(firstname, lastname) values('" << firstname << "','" << lastname << "')"; } catch (exception const &e) { cerr << "Error: " << e.what() << '\n'; } return 0; }
In diesem Testprogramm wird zuerst eine session mit der Verbindung zur Datenbank angelegt. DATENBANK, BENUTZER, PASSWORT und IPADRESSE sind klarerweise mit dein eigenen Logindaten zu ändern. Das erste Statement gibt die Anzahl (count) der Zeilen von der country Tabelle zurück und in der Kommandozeile aus. Danach werden alle Ländernamen der selben Tabelle in ein Resultset geladen und in eine TXT Datei geschrieben. Zuletzt wird dann noch eine neue Zeile in die players Tabelle mit einem Insert Statement geschrieben.
Als IDE verwende ich Code::Blocks, ich habe beim Projekt folgende Einstellungen verwendet:
Die Einstellungen für das Linken:
Der Projektpfad:
Probleme
Bei mir wurde beim ersten Mal compilieren, nachdem die libs und include Pfade gesetzt wurden, folgende Meldung ausgegeben
../../soci/include/soci/mysql/soci-mysql.h|31|fatal error: mysql.h: Datei oder Verzeichnis nicht gefunden|
Das ganze in der Zeile 31 mit folgendem Inhalt
#include // MySQL Client
sudo apt-get install libmysqlclient-dev
zusätzlich musste ich noch /usr/include/mysql als Search Directory hinzufügen.
Fazit
SOCI ist eine C++ Datenbank Abstraktion für MySQL, PostgreSQL, Oracle, usw. Ich habe das mit einem einfachen C++ Programm und einer üblichen MySQL Datenbank getestet die man bei einem Webspace standardmäßig dabei hat. Nach anfänglichen Schwierigkeiten die Bibliothek zu erstellen und dann im Projekt korrekt zu includen beziehungsweise zu verlinken lief alles problemlos. Die Abfragen laufen schnell und sind im Vergleich zu einer reinen PHP Implementierung deutlich schneller.
Welche C++ habt ihr schon getestet? Welche Erfahrungen habt ihr mit SOCI gemacht?
Hallo bei mir steckt das empfangen von objekten bei 46% und geht nicht weiter .