動作確認
基本的なDB操作(登録、更新、削除)を確認するために、次のコード(C#)を使用します。db4o DBはEmbeded Serverモードでオープンします。作業する上でのディレクトリ構造は、下表の通りとします。
| ディレクトリ | ファイル |
|---|---|
| ~/src/cs/db4oExample | IProductRepository.cs |
| ~/src/cs/db4oExample/Test | client.cs, client.exe.config |
| ~/src/cs/db4oExample/TestData | ProductRepository.cs, TestDataHelper.cs |
IProductRepositoryインターフェース、ProductRepository、TestDataHelperクラス
[IProductRepository.cs]
using System;
namespace db4oExample
{
public interface IProductRepository : IDisposable
{
void Add(Product product);
void Update(Product product);
void Remove(Product product);
void GetAll();
}
}
[ProductRepository.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using Db4objects.Db4o;
using Db4objects.Db4o.Linq;
using db4oExample;
namespace db4oExample.TestData
{
public class ProductRepository : IProductRepository
{
private static IList<Product> _cache;
public void Add(Product product)
{
using (IObjectContainer client = TestDataHelper.OpenClient())
{
Product r1 = _getByIdFromCache(product.Id);
if (r1 != null)
{
Console.WriteLine("Add:既にデータあり #1");
return;
}
Product r2 = _getById(client, product.Id);
if (r2 != null)
{
Console.WriteLine("Add:既にデータあり #2");
return;
}
try
{
client.Store(product);
client.Commit();
}
catch(Exception ex)
{
Console.WriteLine("例外: {0}", ex.Message);
client.Rollback();
}
}
}
public void Update(Product product)
{
using (IObjectContainer client = TestDataHelper.OpenClient())
{
Product r1 = _getByIdFromCache(product.Id);
if (r1 == null)
{
Console.WriteLine("Update:該当データなし #1");
return;
}
Product r2 = _getByProduct(client, r1);
if (r2 == null)
{
Console.WriteLine("Update:該当データなし #2");
return;
}
r2.Name = product.Name;
r2.Price = product.Price;
r2.Description = product.Description;
try
{
client.Store(r2);
client.Commit();
}
catch(Exception ex)
{
Console.WriteLine("例外: {0}", ex.Message);
client.Rollback();
}
}
}
public void Remove(Product product)
{
using (IObjectContainer client = TestDataHelper.OpenClient())
{
Product r1 = _getByIdFromCache(product.Id);
if (r1 == null)
{
Console.WriteLine("Remove:該当データなし #1");
return;
}
Product r2 = _getByProduct(client, r1);
if (r2 == null)
{
Console.WriteLine("Remove:該当データなし #2");
return;
}
try
{
client.Delete(r2);
client.Commit();
}
catch(Exception ex)
{
Console.WriteLine("例外: {0}", ex.Message);
client.Rollback();
}
}
}
public void GetAll()
{
using (IObjectContainer client = TestDataHelper.OpenClient())
{
_cache = (from Product p in client
orderby p.Id
select p).ToList();
foreach (Product p in _cache)
{
Console.WriteLine(p);
}
}
}
public void Dispose()
{
TestDataHelper.CloseServer();
}
private Product _getById(IObjectContainer client, int id)
{
return (from Product p in client
where p.Id == id
select p).SingleOrDefault();
}
private Product _getByIdFromCache(int id)
{
return (from Product p in _cache
where p.Id == id
select p).SingleOrDefault();
}
private Product _getByProduct(IObjectContainer client, Product product)
{
return (from Product p in client
where p.Id == product.Id &&
p.Name == product.Name &&
p.Price == product.Price &&
p.Description == product.Description
select p).SingleOrDefault();
}
}
}
[TestDataHelper.cs]
using System;
using System.Configuration;
using Db4objects.Db4o;
namespace db4oExample.TestData
{
public class TestDataHelper
{
private static IObjectServer _server;
private static IObjectServer Server
{
get
{
if (_server == null)
{
string dbfile = ConfigurationManager.AppSettings["dbfile"];
_server = Db4oFactory.OpenServer(dbfile, 0);
}
return _server;
}
}
public static IObjectContainer OpenClient()
{
return Server.OpenClient();
}
public static void CloseServer()
{
if (Server != null)
{
Server.Close();
}
}
}
}
ライブラリとしてビルドします。[ビルド実行例]
$ cd ~/src/cs/db4oExample
$ gmcs -t:library -r:System.Configuration.dll,Db4objects.Db4o.dll,Db4objects.Db4o.Linq.dll -out:./Test/db4oExample.dll Product.cs IProductRepository.cs -recurse:./TestData/*.cs
$ gmcs -t:library -r:System.Configuration.dll,Db4objects.Db4o.dll,Db4objects.Db4o.Linq.dll -out:./Test/db4oExample.dll Product.cs IProductRepository.cs -recurse:./TestData/*.cs
動作確認用プログラム
ProductRepositoryインスタンスを使用したDB操作を行います。[client.cs]
using System;
using db4oExample;
using db4oExample.TestData;
namespace db4oExample.Test
{
public class Client
{
public static void Main(string[] args)
{
using (IProductRepository products = new ProductRepository())
{
products.GetAll();
string s = "";
while(s != "5")
{
Console.WriteLine();
Console.Write("1:ADD\n2:UPDATE\n3:REMOVE\n4:RELOAD\n5:EXIT\n?> ");
s = Console.ReadLine();
switch(s)
{
case "1": AddProduct(products); goto case "4"; // 追加
case "2": UpdateProduct(products); goto case "4"; // 更新
case "3": RemoveProduct(products); goto case "4"; // 削除
case "4": products.GetAll(); goto default; // 再読込
case "5": goto default; // 終了
default : break;
}
}
}
}
private static void AddProduct(IProductRepository products)
{
try
{
products.Add(CreateProduct());
}
catch(Exception ex)
{
Console.WriteLine("例外: {0}", ex.Message);
}
}
private static void UpdateProduct(IProductRepository products)
{
try
{
products.Update(CreateProduct());
}
catch(Exception ex)
{
Console.WriteLine("例外: {0}", ex.Message);
}
}
private static void RemoveProduct(IProductRepository products)
{
Console.Write("ID(int)?> ");
string id = Console.ReadLine();
try
{
Product product = new Product();
product.Id = Int32.Parse(id);
products.Remove(product);
}
catch(Exception ex)
{
Console.WriteLine("例外: {0}", ex.Message);
}
}
private static Product CreateProduct()
{
Console.Write("ID(int)?> ");
string id = Console.ReadLine();
Console.Write("NAME(string)?> ");
string name = Console.ReadLine();
Console.Write("PRICE(num)?> ");
string price = Console.ReadLine();
Console.Write("DESCRIPTION(string)?> ");
string description = Console.ReadLine();
Product product = new Product();
product.Id = Int32.Parse(id);
product.Name = name;
if (price != "")
{
product.Price = Decimal.Parse(price);
}
product.Description = description;
return product;
}
}
}
/*
* ビルド:
*
* gmcs -r:db4oExample.dll client.cs
*
* 実行:
*
* mono client.exe
*
*/
[client.exe.config]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="dbfile" value="/home/sta/data/db4o/TestData.db4o" />
</appSettings>
</configuration>
[実行例]
$ cd ~/src/cs/db4oExample/Test
$ mono client.exe
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 1
ID(int)?> 2
NAME(string)?> test2
PRICE(num)?> 2.2
DESCRIPTION(string)?> for test2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:test2 PRICE:2.2 DESCRIPTION:for test2
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 2
ID(int)?> 2
NAME(string)?> Test2
PRICE(num)?> 2.22
DESCRIPTION(string)?> テスト2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:Test2 PRICE:2.22 DESCRIPTION:テスト2
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 3
ID(int)?> 2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 5
$ mono client.exe
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 1
ID(int)?> 2
NAME(string)?> test2
PRICE(num)?> 2.2
DESCRIPTION(string)?> for test2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:test2 PRICE:2.2 DESCRIPTION:for test2
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 2
ID(int)?> 2
NAME(string)?> Test2
PRICE(num)?> 2.22
DESCRIPTION(string)?> テスト2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:2 NAME:Test2 PRICE:2.22 DESCRIPTION:テスト2
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 3
ID(int)?> 2
ID:0 NAME:db4o PRICE: DESCRIPTION:db4o 7.4
ID:1 NAME:Clamp PRICE:12.48 DESCRIPTION:Workbench clamp
ID:50 NAME:Flat Head Screwdriver PRICE:3.17 DESCRIPTION:Flat head
ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires.
ID:3000 NAME:3mm Bracket PRICE:0.52 DESCRIPTION:
1:ADD
2:UPDATE
3:REMOVE
4:RELOAD
5:EXIT
?> 5
Monoで他のDBも使ってみたよ!+(db4o、NHibernate編)4 へ続く。


0 件のコメント:
コメントを投稿