Seite 1 von 1

C++11 Datenbanken API

Verfasst: 17.10.2011, 00:38
von Halan
Ahoi,

ich hab über das Wochenende mir mal C++11 etwas genauer angeschaut. Am meisten hab ich mich dabei über die neuen "initializer lists" gefreut. Damit kann man sehr einfach komplexe Strukturen basteln. Jetzt habe ich damit eine SQL-API geschrieben mit der man eigentlich garkein SQL mehr braucht. Hier mal ein kleiner Einblick.

Zuerst definiert man Relationen im Code (könnte man ja auch von einer XML auslesen oder so). Der Sinn dahinter ist, das der Datenbankmanager deinen Syntax überprüfen kann und Fehler auswirft wie "Feld 'xy' in Relation 'ij' gibt es nicht".
Das z.B. sieht so aus:

Code: Alles auswählen

map<string, SDataField> datafields;
datafields["identifier"] = SDataField(Unsigned64);
datafields["type"]       = SDataField(Unsigned8);
datafields["parent"]     = SDataField(Unsigned64);
DatabaseManager.registerRelation("Items", datafields);
In Zukunft könnte der Datenbank Manager mit diesen Informationen auch Backups o.Ä. durchführen. Eine Datenbankmigration ähnlich wie in Ruby on Rails wäre auch denkbar.

Nun kann man sehr einfach zB neue Werte in die Tabelle einfügen. Eben mit den oben erwähnten Initializerlisten. Das sieht zB so aus.

Code: Alles auswählen

 DatabaseManager.insertTuple("Items", {{"identifier" , id}, {"parent", parent},{"type", ItemType_Weapon}});
Ihr seht also hier wird kein SQL mehr geschrieben. Intern wird das ganze dann in "INSERT INTO "Items" (identifier, type, parent) VALUES (23, 2, 123);" (etc) umgewandelt. Aber sowas will man ja nicht jedes mal manuell zusammenfrickeln. Hab da teilweise schon zick Probleme gehabt weil z.B. irgendwo ein Komma gefehlt hat. Meine API verhindert das :)

Sehr schön finde ich auch das überladen von Operatoren zum erstellen von Bedigungen (habe die klasse 'S' für Statements genannt). Das Item mit der ID 25 zu entfernen würde dann so aussehen.

Code: Alles auswählen

DatabaseManager.removeTuples("Items", S("identifier")==25);
Natürlich können auch hier wieder Mittels Initializerlisten mehrere Bedingungen aneinander gehängt werden!

Intern werden Templates benutzt mit bestimmten Spezialisierungen. Zum Beispiel werden bei einem string automatisch die Anführungszeichen hinzugefügt wie es in SQL benötigt wird.

Das coolste ist aber mMn dass es eine solche Libary ermöglichen würde komplett auf SQL verzichten. Also irgend eine andere Software zum Ablegen der Daten zu verwenden. Ohne SQL-Verarbeitung im Datenverwaltungssystem sollte auch eine Menge Overhead wegfallen. Gibts solche Konzepte irgendwo schon? ( kenn mich mit den ganzen NoSQL Datenbanken nicht so aus)

Meine Frage ist. Was haltet ihr davon? Die kleine Bib hat natürlich auch eine schöne C++ API für "normalen" Zugriff per SQL der unabhängig von der Implementierung ( zurzeit nur libpq) ist.
Gäbe es Interesse an dem Code?

Re: C++11 Datenbanken API

Verfasst: 17.10.2011, 11:49
von EyDu
Hallo,

die Antwort ist eigentlich ganz einfach: du solltest dir Literatur zum Thema NoSQL durchlesen ;-) Daher muss ich dich auch enttäuschen, dass dein Ansatz nicht neu ist und eigentlich schon lange so eingestzt wird. Noch etwas einfacher wirds mittels ORMs, dort bekommts du direkt Objekte aus der Datenbank und kannst auch solche dort abspeichern.

Sebastian

Re: C++11 Datenbanken API

Verfasst: 17.10.2011, 12:43
von Chromanoid
@EyDu: Was hat dieser Ansatz jetzt genau mit NoSql zu tun? Im Grunde ist doch Halan's System einfach eine Schicht zur Abstraktion der Datenbank!?
@Halan: Wie gesagt ist das ja eine Datenbankabstraktionsschicht (Database abstraction layer), da gibt es sicher schon einige Sachen für C++. Bei einigen solcher Systeme hat man bestimmt auch bei C++ die Möglichkeit Treiber für beliebige Speicherziele zu implementieren (ODBC?). Übrigens ist mir auch nach kurzem googeln kein System vor die Flinte geraten, das SQL Abfragen selbst wegabstrahiert (Die Entwicklung eines eigenen Treiber bleibt somit recht kompliziert). Nur bei den ORM Geschichten bin ich da natürlich fündig geworden z.B. http://sourceforge.net/apps/trac/litesql/wiki/Examples oder http://www.codesynthesis.com/products/odb/
Erschreckend wie wenig Zeug es da für C++ gibt, entweder ich übersehe da was oder das ist mal wieder ein weiterer Grund warum C++ bei größeren geschäftlichen Anwendungen eher gemieden wird.

Re: C++11 Datenbanken API

Verfasst: 17.10.2011, 15:16
von Halan
Chromanoid hat geschrieben:Erschreckend wie wenig Zeug es da für C++ gibt, entweder ich übersehe da was oder das ist mal wieder ein weiterer Grund warum C++ bei größeren geschäftlichen Anwendungen eher gemieden wird.
Jup das ist leider so. Für PHP habe ich eine ähnliche Abstraktionsschicht schon gefunden aber für C++ gab es als ich mein Projekt angefangen hab nichts in der Richtung gefunden, also hab ich mir die Bib komplett selber geschrieben auf Basis der C-Schnittstellen.

Das mit NoSQL war nur so eine Idee. Intern benutzt das ganze immernoch normales SQL und greift auf PostgreSQL zu ( MySQL wär aber auch kein Problem wie gesagt).
Hier mal eine der Funktionen damit ihr seht wie das abläuft.

Code: Alles auswählen

			bool updateTuple(const std::string relationname, const ParamMap fields, const std::vector<S> statements)
			{
				if(!statmentValid(relationname, fields))
					return false;

                std::stringstream sql;
				sql << "UPDATE \"" << relationname << "\" SET ";

				for(auto it = fields.begin(); it != fields.end(); ++it)
				{
					if(it != fields.begin())
						sql << " AND ";

					sql << (*it).Key << "=" << (*it).Value;
				}

				sql << " WHERE ";

				for(auto it = statements.begin(); it != statements.end(); ++it)
				{
					if(it != statements.begin())
						sql << " AND ";

					sql << (*it).getSQL();
				}

				sql << ";";

				return this->executeB(sql.str());
			}

Re: C++11 Datenbanken API

Verfasst: 17.10.2011, 15:33
von Chromanoid
Du kannst das Ding sicher auch für NoSQL Geschichten ausbauen. Manche Sachen sind halt in NoSQL nicht machbar in SQL aber schon und umgekehrt...

Re: C++11 Datenbanken API

Verfasst: 18.10.2011, 10:37
von Eisflamme
Ich finde auch, das ist ne gute Sache. Entwickel das doch Mal weiter, es gibt nicht sonderlich viel. Und allein durch die Syntax, die eben nur für C++11 geht, kannst Du ja erstmal glänzen, weil ein Laie sich dann denkt "hey, damit geht das doch echt einfach", während andere APIs das nicht so unterstützen. ;)

Mir gefällt's.

Re: C++11 Datenbanken API

Verfasst: 17.03.2012, 16:47
von Halan
Also hier ist der aktuelle Code. Langsam gibt es eigentlich alle Features die ich in SQL brauche. Die Bibliothek kann auch z.B. aus einer Json-Definition eines Datenbanksschemas alle Relationen + Constraints und Sequences erstellen.

http://bazaar.launchpad.net/~kai-mast/y ... nk/files/1

Ist zurzeit noch nicht in der lage als Bibliothek kompliliert zu werden sondern muss ins Projekt direkt eingebunden werden. Das werde ich demnächst aber ändern und dann gibts auch Debian-Packete und vielleicht eine kleine Doku.