(LIST1) interface Directory : persistent { //Attributes attribute String name mt_make_entry "make-entry"; //Relationships relationship Set parent[0,1] inverse Directory::childs; relationship Set childs inverse Directory::parent; //Operations Long GetDepth(); }; (LIST2) #ifndef Directory_INCLUDE #define Directory_INCLUDE #include "matisseCXX.h" class Directory; //******************************************************* // // Class Directory // //******************************************************* // Class definition //================= class Directory : public Mt_Object{ public: static Mt_Class MTCLASS; static Directory* Create(); static Directory** Create(MtSize numInstances); static Mt_Cursor* Instances(); static MtSize InstanceNumber(); Directory(MtKey k) : Mt_InternalObject(k) {} Directory() : Mt_InternalObject(GetMtKey()) {} // Attributes //----------- static Mt_Attribute MTATT_name; const MtString name(); Directory* name(const MtString val); Directory* Clear_name(); // Relationships //-------------- static Mt_Relationship MTREL_parent; Mt_Cursor* parent(); MtSize parent_Cardinality(); Directory* parent(MtSize numSuccs, ...); Directory* parent(Mt_Object** succs, MtSize numSuccs); Directory* Remove_parent(MtSize numSuccs, ...); Directory* Remove_parent(Mt_Object** succs, MtSize numSuccs); Directory* Clear_parent(); static Mt_Relationship MTREL_childs; Mt_Cursor* childs(); MtSize childs_Cardinality(); Directory* childs(MtSize numSuccs, ...); Directory* childs(Mt_Object** succs, MtSize numSuccs); Directory* Remove_childs(MtSize numSuccs, ...); Directory* Remove_childs(Mt_Object** succs, MtSize numSuccs); Directory* Clear_childs(); // Methods //-------- virtual MtS32 GetDepth(); }; #endif (LIST3) #include #include "Directory.h" MtS32 Directory::GetDepth() { MtS32 depth; Mt_Cursor* pCursor = parent(); Directory* pParent = (Directory*)pCursor->Next(); if (pParent == NULL) { depth = 1; } else { depth = pParent->GetDepth() + 1; delete pParent; } delete pCursor; return depth; } (LIST4) #include #include "Directory.h" int main(int argc, char** argv) { Mt_Database db("MYHOST", "example"); //ホスト名とDB名を指定する db.Open(); //DBをオープン db.Select(); //カレントに設定 db.StartTransaction(); //トランザクションを開始 //親ディレクトリを作成 Directory* pParent = Directory::Create(); pParent->name("parent"); //子ディレクトリを作成 Directory* pChild = Directory::Create(); pChild->name("child"); //子ディレクトリを関連に設定 pParent->childs(1, pChild); //ディレクトリの階層を取得 MtS32 depth1 = pParent->GetDepth(); MtS32 depth2 = pChild->GetDepth(); //C++オブジェクトを削除(永続オブジェクトは削除しない) delete pParent; delete pChild; db.Commit(); //成功ならコミット db.Unselect(); //選択を解除 db.Close(); //DBをクローズ return 0; }