今天看freshmeat的時(shí)候,又發(fā)現(xiàn)一個(gè)有趣Object Persistent方案。
http://litesql.sourceforge.net/
Features
按文檔,做一個(gè)Persistent類(lèi)的步驟如下:
一、繼承 Persistent
class OwnPersistent : public Persistent {};
二、使用宏P(guān)ERSISTENT_BASE聲明哪些變量需要Persistent
class OwnPersistent : public Persistent {
??? PERSISTENT_BASE(OwnPersistent, 1, name, TEXT);
};
其中,第一個(gè)參數(shù)是類(lèi)名,第二個(gè)參數(shù)表示后面有多少個(gè)變量,后面兩個(gè)兩個(gè)參數(shù)為一組,描述每一個(gè)變量。
三、可以用RELATIONS宏描述類(lèi)之間關(guān)聯(lián)
RELATIONS(object, relnum,
???????? rel1type, rel1from, rel1to, rel1id, rel1bidir, rel1name,
?????????rel2type, rel2from, rel2to, rel2id, rel2bidir, rel2name, ...)
其中的 relntype可以為以下幾種:
OORelation : one-to-one relation
OMRelation : one-to-many relation
MORelation : many-to-one relation
MMRelation : many-to-many relation
relnfrom、relnto是說(shuō)從哪個(gè)類(lèi)映射到哪個(gè)類(lèi)
relnid是映射關(guān)系的編號(hào)
relnbidir是指定映射是否雙向(只有當(dāng)from和to是同一個(gè)類(lèi)的時(shí)候可以使用)
relnname映射關(guān)系的名字
例如:
class Person : public Persistent {
??? PERSISTENT_BASE(Person, 1, name, TEXT);
??? RELATIONS(Persistent, 3,
????????????? OORelation, Person, Person, 1, false, mother,
????????????? OORelation, Person, Person, 2, false, father,
????????????? MMRelation, Person, Person, 3, true, friends);
};
最后就是聲明cleanUp函數(shù)了,這里看得不是很明白,呵呵。
最后的結(jié)果就是:
class Person : public Persistent {
??? PERSISTENT_BASE(Person, 1, name, TEXT);
??? RELATIONS(Persistent, 3,
????????????? OORelation, Person, Person, 1, false, mother,
????????????? OORelation, Person, Person, 2, false, father,
????????????? MMRelation, Person, Person, 3, true, friends);
???? virtual void cleanUp() {
???????? mother.flush();
???????? father.flush();
???????? friends.flush();
???? }
};
Person bill(db), bob(db);
bill.name = "Bill";
bill.update();
bob.name = "Bob";
bob.update();
// both objects must be stored in database before they can be linked
bill.friends.link(bob);
// following statement would throw an exception because they are already friends
bob.friends.link(bill);
Person bob = bill.friends.fetchOne(Person::name_() == "Bob");
vector
效果的確有趣。不過(guò)沒(méi)有仔細(xì)看具體實(shí)現(xiàn)。按作者自己說(shuō)難度之一就是實(shí)現(xiàn)這種不定參數(shù)的宏。
只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。 | ||
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
|
||
|