いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

db4oのメモ書き (IObjectContainer, Db4objects, Db4o)


以下メモ書きです。


db4o(http://www.db4o.com/default.aspx)が、なんか面白そうなのでちょっと触ってみました。
確かにちょこっと使う分には簡単ですね。組み込みのデータベースにはもってこいです。


以下はselect,insert,update,deleteをやってみたサンプルです。
サンプルを作成する前に、一応Util系クラスも作成してみました。


db4oでは、データベースを開く際に以下のように通常します。

IObjectContainer db = Db4oFactory.OpenFile(Util.YapFileName);
try
{
    // do something with db4o
}
finally
{
    db.Close();
}

でも、usingを使いたいので以下のようなヘボいラッパーを作成しました。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;

using Db4objects.Db4o;

namespace Gsf.Samples.Tmp{

    public class DisposableObjectContainerWrapper : IDisposable{

        IObjectContainer _container;

        public DisposableObjectContainerWrapper(IObjectContainer container){
            _container = container;
        }

        public IObjectContainer Container{
            get{
                return _container;
            }
        }

        public void Dispose(){
            _container.Close();
        }
    }
}

これで、以下のように実行できます。

using(DisposableObjectContainerWrapper wrapper = new DisposableObjectContainerWrapper(Db4oFactory.OpenFile(DB_FILE_NAME))){
}

んで、以下が今回使用するモデルオブジェクトです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;

namespace Gsf.Samples.Tmp.Models{

    public class Person{

        string _id;
        string _name;

        public Person() : this(null, null){
            // nop;
        }

        public Person(string id, string name){
            _id   = id;
            _name = name;
        }

        public string Id{
            get{
                return _id;
            }
            set{
                _id = value;
            }
        }

        public string Name{
            get{
                return _name;
            }
            set{
                _name = value;
            }
        }

        public override string ToString(){
            return string.Format("Id:{0}, Name:{1}", Id, Name);
        }
    }
}

んで、実際のサンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using Db4objects.Db4o;
using Gsf.Samples.Tmp.Models;

namespace Gsf.Samples.Tmp{

    public class SimpleCRUDSample : IExecutor{

        const string DB_FILE_NAME = "mydb.db";

        public void Execute(){
            //
            // データベースオープン.
            //
            using(DisposableObjectContainerWrapper wrapper = new DisposableObjectContainerWrapper(Db4oFactory.OpenFile(DB_FILE_NAME))){

                IObjectContainer db = wrapper.Container;

                //
                // select and delete.
                //
                foreach(object o in db.Get(typeof(Person))){
                    db.Delete(o);
                }
                db.Commit();

                //
                // select.
                //
                Console.WriteLine("============ DELETE後 ================");
                Console.WriteLine(db.Get(typeof(Person)).Size());

                //
                // insert.
                //
                db.Set(new Person("1", "gsf_zero1"));
                db.Commit();

                //
                // select.
                //
                Console.WriteLine("============ INSERT後 ================");
                Console.WriteLine(db.Get(typeof(Person)).Size());
                Console.WriteLine(db.Get(new Person("1", null)).Next());

                //
                // update.
                //
                Person aPerson = db.Get(new Person("1", null)).Next() as Person;
                aPerson.Name   = "gsf_zero2";
                db.Set(aPerson);
                db.Commit();

                //
                // select.
                //
                Console.WriteLine("============ UPDATE後 ================");
                Console.WriteLine(db.Get(typeof(Person)).Size());
                Console.WriteLine(db.Get(new Person("1", null)).Next());
                
            }

        }

    }

}