Databáze a C++: najdete řešení?

14. 9. 2013 13:03 zboj

Článek k zamyšlení pro ty, kdo opravdu dobře znají C++. Nejprve si přečtěte toto: Native Queries for Persistent Objects

Málokoho asi překvapí, že objektová databáze včetně nativních dotazů, jak je popsána ve zmíněném článku, je implementovatelná v Javě a C# (existují také podobné projekty pro Smalltalk a další objektově-orientované jazyky). Výzvou je implementovat takovou databázi v C++. Co by měla umět?

  1. Uložit do databáze objekt (instanci třídy). Omezme se na POCO (plain old C++ object).
  2. Získat z databáze kolekci objektů odpovídajících deklarativně vyjádřenému dotazu.
  3. Umožnit formulaci dotazů přímo v C++ (a ne jako řetězec à la SQL).

Už bod 1 je netriviální. C++ nemá introspekci, takže si budeme muset pomoci nějakým trikem, abychom mohli napsat něco jako:

Database db; PersistentObject obj; obj.numField = 20; db.save(obj);

Bod 2, pokud se nám povede splnit bod 1, je triviální. Není problémem napsat funkci get použitelnou takto:

std::vector<PersistentObject> collection = db.get("FROM PersistentObject obj WHERE obj.numField = 20");

Opravdovou výzvou je ovšem bod 3. Chceme možnost vyjadřovat dotazy do databáze přímo v C++ (důvodů je mnoho, jedním z nich je například syntaktická kontrola dotazů během kompilace, viz výše zmíněný článek), tedy něco jako:

std::vector<PersistentObject> collection = db.get(Query(PersistentObject, obj.numField == 20));

Nějaké návrhy? Těším se na diskusi (otázkou je, zda to v C++ vůbec jde, a pokud ano, nastínit řešení).

Sdílet