Hlavní navigace

Názor ke článku Databáze a C++: najdete řešení? od Ludek Vodicka - Zdravim, pro interni potreby mame implementovano neco podobneho. Jen...

  • 16. 9. 2013 15:19

    Ludek Vodicka (neregistrovaný) 31.7.243.---

    Zdravim,
    pro interni potreby mame implementovano neco podobneho. Jen ne pro objektove databaze nybrz bezne SQL (MySQL, SQLite, SQLServer).
    Nase implementace vychazi z Hibernate/Doc­trine2, 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/fi­eldy/associace pro prochazeni modelu, factory pro repository/entity a mozna jeste neco.

    Prace s ORM pak vypada zhruba v tomto duchu:

    OrmModel::XMel­vinUser objUser;
    objUser->SetIp(strUse­rIpAdress);
    objUser->SetCreatedAt(tmCre­atedAt);
    objUser->SetCountry(strCou­ntry);
    objUser->SetGeolocati­on(strGeoloca­tion);
    m_em.Persist(ob­jUser);
    m_em.Flush();

    Pro ziskavani objekty z DB mame query builder, ktery umi data vratit bud jako array/scalar/ob­jekt/pole objektu:

    Atomix::Orm::CQu­eryBuilder qb = GetEntityMana­ger().GetQuery­Builder();
    qb.SelectEnti­ty(_T("a"));
    qb.FromEntity(_T("a"));
    qb.GetConditi­ons().AddFiel­dCondition(_T("a"), objParentAttribute->GetId(), Atomix::Orm::O­perators::Equ­al);
    qb.SetLimit(1);
    qb.SetOffset(nPo­sition);
    qb.AddOrderBy(_T("a"), true, Atomix::Orm::Da­taTypes::Inte­ger);
    OrmModel::XAt­tribute objResult = qb.CreateQuery()­.GetSingleResul­t();

    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 ;-)