Zdravim,
pro interni potreby mame implementovano neco podobneho. Jen ne pro objektove databaze nybrz bezne SQL (MySQL, SQLite, SQLServer).
Nase implementace vychazi z Hibernate/Doctrine2, tzn Entity manager.
Pro definovani modelu pouzivame nas ORM Designer (www.orm-designer.com), ktery vyexportuje XML definice (komercne jej prodavame pro PHP ORM frameworky).
Z techto XML pomoci naseho preprocesoru vygenerujeme base tridy pro entity a jejich epository, dal pak strom konstatn pro Query Builder (slozeny z struct/namespaces), aby bylo mozne dotazy skladat pomoci intellisense, pri zmene DB hlasily errory atd. Tridy s base entitami v sobe maji vsechny Gettery/Settery pro property i asociace. Dal se musi vygenerovat jedna velka map super-class ktera obsahuje vsechny moduly/entity/fieldy/associace pro prochazeni modelu, factory pro repository/entity a mozna jeste neco.
Prace s ORM pak vypada zhruba v tomto duchu:
OrmModel::XMelvinUser objUser;
objUser->SetIp(strUserIpAdress);
objUser->SetCreatedAt(tmCreatedAt);
objUser->SetCountry(strCountry);
objUser->SetGeolocation(strGeolocation);
m_em.Persist(objUser);
m_em.Flush();
Pro ziskavani objekty z DB mame query builder, ktery umi data vratit bud jako array/scalar/objekt/pole objektu:
Atomix::Orm::CQueryBuilder qb = GetEntityManager().GetQueryBuilder();
qb.SelectEntity(_T("a"));
qb.FromEntity(_T("a"));
qb.GetConditions().AddFieldCondition(_T("a"), objParentAttribute->GetId(), Atomix::Orm::Operators::Equal);
qb.SetLimit(1);
qb.SetOffset(nPosition);
qb.AddOrderBy(_T("a"), true, Atomix::Orm::DataTypes::Integer);
OrmModel::XAttribute objResult = qb.CreateQuery().GetSingleResult();
Popsat detailne cely principu by bylo na nekolik clanku. Pokud by nekoho zajimalo vic, rad poradim. Ve zkratce jem ale chtel ukazat, ze s trochou sikovnosti, kombinace templates, maker a preprocesru lze implementovat ORM v c++ tak aby bylo efektivni na vyuziti i vykon ;-)
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 30 492×
Přečteno 19 486×
Přečteno 17 065×
Přečteno 16 925×
Přečteno 13 912×
Internet Info Root.cz (www.root.cz)
Informace nejen ze světa Linuxu. ISSN 1212-8309
Copyright © 1998 – 2021 Internet Info, s.r.o. Všechna práva vyhrazena.