C++11 Datenbanken API

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Antworten
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

C++11 Datenbanken API

Beitrag 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?
EyDu
Establishment
Beiträge: 102
Registriert: 24.08.2002, 18:52
Wohnort: Berlin
Kontaktdaten:

Re: C++11 Datenbanken API

Beitrag 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
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4273
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: C++11 Datenbanken API

Beitrag 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.
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: C++11 Datenbanken API

Beitrag 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());
			}
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4273
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: C++11 Datenbanken API

Beitrag 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...
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: C++11 Datenbanken API

Beitrag 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.
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: C++11 Datenbanken API

Beitrag 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.
Antworten