You are on page 1of 6

DB Independence

Work Items
PHP Changes
DB independent setup script
Move direct DB manipulation to API (watchlists)
API Changes
Provide the ability to switch between existing MySql
implementation and NHibernate
Port all queries to NHibernate
API Changes
DekiData: Maps Deki Instance to SessionFactory
SessionFactory: Manages Sessions for a Deki Instance
Session: Exposes all DA methods
MindTouch.Deki.dll

BLs
MindTouch.Deki.Data.dll

BEs
DekiData
IDekiDataSessionFactory
IDekiDataSession
MindTouch.Deki.Data.MySql.dll

DAs
MySqlDekiDataSessionFactory
MySqlDekiDataSession
MindTouch.Deki.Data.NHibernate.dll

DAs
NHibernateDekiDataSessionFactory
NHibernateDekiDataSession
DekiData.RegisterInstance XXXDekiDataSessionFactory.Initialize DekiData.StartSession
DekiDataSessionFactory.CreateSession
DekiData.CurrentSession.Pages_GetPageById DekiData.EndSession Session.Dispose DekiData.UnregisterInstance
NHibernate Mappings
Map database fields to BE fields
User:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MindTouch.Deki.UserBE,DekiNHibernate" table="users" lazy="true">
<id name="ID" column="user_id" type="UInt32">
<generator class="native" />
</id>
<property name="Name" column="user_name" type="string" not-null="true" />
<property name="RealName" column="user_real_name" type="string" />
<property name="_Password" column="user_password" type="Byte[]" not-null="true" />
<property name="_NewPassword" column="user_newpassword" type="Byte[]" not-null="true" />

<many-to-one name="Role" column="user_role_id" class="MindTouch.Deki.RoleBE,DekiNHibernate" cascade="none" insert="false"
update="false" />
<many-to-one name="Service" column="user_service_id" class="MindTouch.Deki.ServiceBE,DekiNHibernate" cascade="none"
insert="false" update="false" />
<bag name="Groups" lazy="true" table="user_groups" cascade="none">
<key column="user_id" />
<many-to-many class="MindTouch.Deki.GroupBE,DekiNHibernate" column="group_id"/>
</bag>
</class>
</hibernate-mapping>
NHibernate Queries
Once DB->BE mappings are in place, we can leverage
NHibernates DB independent query language

GetUsersByID:
ICriteria criteria = session.CreateCriteria(typeof(UserBE));
criteria.Add(Expression.In("ID", userIds));
IList<UserBE> users = criteria.List<UserBE>();

InsertUser:
session.Save(newUser);

RenameUser (cant use Criteria API)
IQuery renameUserQuery = session.CreateQuery("update RecentChangeBE set UserText = :targetUserName where
UserText = :currentUserName")
.SetString("targetUserName", newUserName)
.SetString("currentUserName", user.Name);
renameUserQuery.ExecuteUpdate();
NHibernate Queries
NHibernate mappings can simplify queries

GetUsersByGroupID
ICriteria userCriteria = session.CreateCriteria(typeof(UserBE));
userCriteria.CreateCriteria("Groups").Add(Expression.IdEq((int)groupId));
IList<UserBE> users = userCriteria.List<UserBE>();

Join is implied by User DB->BE mapping:
<bag name="Groups" lazy="true" table="user_groups" cascade="none">
<key column="user_id" />
<many-to-many class="MindTouch.Deki.GroupBE,DekiNHibernate"
column="group_id"/>
</bag>

You might also like