Index: /branches/feature-module-update/test/TestSuite.php
===================================================================
--- /branches/feature-module-update/test/TestSuite.php	(revision 15116)
+++ /branches/feature-module-update/test/TestSuite.php	(revision 15135)
@@ -10,9 +10,16 @@
 require_once("../html/require.php");
 require_once("class/page/LC_Page_Test.php");
+require_once("class/db/SC_DB_DBFactory_Test.php");
+require_once("class/db/SC_DB_MasterData_Test.php");
 require_once("PHPUnit.php");
 
-$suite = new PHPUnit_TestSuite("LC_Page_Test");
-$result = PHPUnit::run($suite);
+$suites = array();
+$suites[0] = new PHPUnit_TestSuite("LC_Page_Test");
+$suites[1] = new PHPUnit_TestSuite("SC_DB_DBFactory_Test");
+$suites[2] = new PHPUnit_TestSuite("SC_DB_MasterData_Test");
 
-print $result->toString();
+foreach ($suites as $suite) {
+    $result = PHPUnit::run($suite);
+    print $result->toString();
+}
 ?>
Index: /branches/feature-module-update/test/class/db/SC_DB_MasterData_Test.php
===================================================================
--- /branches/feature-module-update/test/class/db/SC_DB_MasterData_Test.php	(revision 15134)
+++ /branches/feature-module-update/test/class/db/SC_DB_MasterData_Test.php	(revision 15135)
@@ -22,12 +22,22 @@
     // {{{ functions
 
+    /**
+     * SC_DB_MasterData::getMasterData() のテストケース
+     */
     function testGetMasterData() {
 
+        $columns = array("pref_id", "pref_name", "rank");
         $masterData = new SC_DB_MasterData_Ex();
-        $actual = $masterData->getMasterData("mtb_pref");
+        $actual = $masterData->getMasterData("mtb_pref", $columns);
 
         $objQuery = new SC_Query();
-        $expected = $objQuery->select("*", $name);
+        $objQuery->setorder($columns[2]);
+        $results = $objQuery->select($columns[0] . ", " . $columns[1], "mtb_pref");
 
+        $expected = array();
+        foreach ($results as $result) {
+
+            $expected[$result[$columns[0]]] = $result[$columns[1]];
+        }
         $this->assertEquals($expected, $actual);
     }
Index: /branches/feature-module-update/data/class/db/SC_DB_MasterData.php
===================================================================
--- /branches/feature-module-update/data/class/db/SC_DB_MasterData.php	(revision 15134)
+++ /branches/feature-module-update/data/class/db/SC_DB_MasterData.php	(revision 15135)
@@ -8,4 +8,17 @@
 /**
  * マスタデータを扱うクラス.
+ *
+ * プルダウン等で使用するマスタデータを扱う.
+ * マスタデータは, DB に格納されているが, パフォーマンスを得るため,
+ * 初回のみ DBへアクセスし, データを定義したキャッシュファイルを生成する.
+ *
+ * マスタデータのテーブルは, 下記のようなカラムが必要がある.
+ * 1. キーとなる文字列
+ * 2. 表示文字列
+ * 3. 表示順
+ * 上記カラムのデータ型は特に指定しないが, 1 と 2 は常に string 型となる.
+ *
+ * マスタデータがキャッシュされると, key => value 形式の配列として使用できる.
+ * マスタデータのキャッシュは, MASTER_DATA_DIR/マスタデータ名.php というファイルが生成される.
  *
  * @package DB
@@ -15,4 +28,9 @@
 class SC_DB_MasterData {
 
+    // {{{ properties
+
+    /** SC_Query インスタンス **/
+    var $objQuery;
+
     // }}}
     // {{{ functions
@@ -22,5 +40,5 @@
      *
      * 以下の順序でマスタデータを取得する.
-     * 1. data/conf/cache のマスタデータキャッシュを include_once() で読み込む
+     * 1. MASTER_DATA_DIR のマスタデータキャッシュを include_once() で読み込む
      * 2. 1 で読み込んだ値をチェックし, 値が変数定義されていれば値を返す.
      *    されていなければ, 次の処理を行う.
@@ -28,11 +46,26 @@
      * 4. 取得した後, マスタデータのキャッシュを生成し, 値を返す.
      *
-     * @param string $name マスタデータ名
+     * 返り値は, key => value 形式の配列である.
+     *
+     * @param string $name マスタデータ名
+     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
+     *                        を表すカラム名を格納した配列
      * @return array マスタデータ
      */
-    function getMasterData($name) {
-        $objQuery = new SC_Query();
-        $result = $objQuery->select("*", $name);
-        return $result;
+    function getMasterData($name, $columns) {
+        // 可変変数を定義
+        $valiable = "_" . $name . "_master";
+        // キャッシュを読み込み
+        @include_once(MASTER_DATA_DIR . $name . ".php");
+
+        // キャッシュがあれば, キャッシュの値を返す.
+        if (!empty($$valiable)) {
+            return $$valiable;
+        }
+        // マスタデータを取得
+        $masterData = $this->getDbMasterData($name, $columns);
+        // キャッシュ生成
+        $this->createCache($name, $masterData);
+        return $masterData;
     }
 
@@ -40,15 +73,38 @@
      * マスタデータをDBに追加する.
      *
-     * 引数 $value をマスタデータとしてDBに追加し,
+     * 引数 $masterData をマスタデータとしてDBに追加し,
      * キャッシュを生成する.
      * 既存のキャッシュが存在する場合は上書きする.
-     * $value は key => value 形式の配列である必要がある.
-     *
-     * @param string $name マスタデータ名
-     * @param array $value マスタデータ
+     * $masterData は key => value 形式の配列である必要がある.
+     *
+     * @param string $name マスタデータ名
+     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
+     *                        を表すカラム名を格納した配列
+     * @param array $masterData マスタデータ
+     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
      * @return integer マスタデータの登録数
      */
-    function registMasterData($name, $value) {
-        // TODO
+    function registMasterData($name, $columns, $masterData, $autoCommit = true) {
+        $this->objQuery = new SC_Query();
+        if ($autoCommit) {
+            $this->objQuery->begin();
+        }
+        $i = 0;
+        foreach ($masterData as $key => $val) {
+            $sqlVal = array($columns[0] => $key,
+                            $columns[1] => $val,
+                            $columns[2] => $i);
+            $this->objQuery->insert($name, $sqlVal);
+            $i++;
+        }
+        if ($autoCommit) {
+            $this->objQuery->commit();
+        }
+
+        // キャッシュを消去
+        $this->clearCache($name);
+        // 新規にデータを取得してキャッシュ生成
+        $newData = $this->getMasterData($name, $columns);
+        return $i;
     }
 
@@ -56,14 +112,33 @@
      * マスタデータを更新する.
      *
-     * 引数 $value の値でマスタデータを更新し,
+     * 引数 $masterData の値でマスタデータを更新し,
      * キャッシュを更新する.
-     * $value は key => value 形式の配列である必要がある.
-     *
-     * @param string $name マスタデータ名
-     * @param array $value マスタデータ
+     * $masterData は key => value 形式の配列である必要がある.
+     *
+     * @param string $name マスタデータ名
+     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
+     *                        を表すカラム名を格納した配列
+     * @param array $masterData マスタデータ
+     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
      * @return integer マスタデータの更新数
      */
-    function updateMasterData($name, $value) {
-        // TODO
+    function updateMasterData($name, $columns, $masterData, $autoCommit = true) {
+        $this->objQuery = new SC_Query();
+        if ($autoCommit) {
+            $this->objQuery->begin();
+        }
+        // マスタデータを削除
+        $this->deleteMasterData($name, false);
+        // マスタデータを追加
+        $this->registMasterData($name, $columns, $masterData, false);
+        if ($autoCommit) {
+            $this->objQuery->commit();
+        }
+
+        // キャッシュを消去
+        $this->clearCache($name);
+        // 新規にデータを取得してキャッシュ生成
+        $newData = $this->getMasterData($name, $columns);
+        return count($newData);
     }
 
@@ -75,8 +150,10 @@
      *
      * @param string $name マスタデータ名
+     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
      * @return integer マスタデータの削除数
      */
-    function deleteMasterData($name) {
-        // TODO
+    function deleteMasterData($name, $autoCommit = true) {
+        $this->objQuery = new SC_Query();
+        return $this->objQuery->delete($name);
     }
 
@@ -85,8 +162,8 @@
      *
      * @param string $name マスタデータ名
-     * @return void
+     * @return bool 消去した場合 true
      */
     function clearCache($name) {
-        // TODO
+        unlink(MASTER_DATA_DIR . $name . ".php");
     }
 
@@ -98,8 +175,34 @@
      *
      * @param string $name マスタデータ名
-     * @return void
-     */
-    function createCache($name) {
-        // TODO
+     * @param array $masterData マスタデータ
+     * @return bool キャッシュの生成に成功した場合 true
+     */
+    function createCache($name, $masterData) {
+
+        // 配列の定義を文字列にする
+        $data = "<?php\n"
+              . "\$_" . $name . "_master = array(\n";
+        $i = count($masterData);
+        foreach ($masterData as $key => $val) {
+            $data .= "'" . $key . "' => '" . $val . "'";
+            if ($i > 1) {
+                $data .= ",\n";
+            }
+            $i--;
+        }
+        $data .= ");\n"
+              .  "?>\n";
+
+        // ファイルを書き出しモードで開く
+        $path = MASTER_DATA_DIR . $name . ".php";
+        $handle = fopen($path, "w");
+        if (!$handle) {
+            return false;
+        }
+        // ファイルの内容を書き出す.
+        if (fwrite($handle, $data) === false) {
+            return false;
+        }
+        return true;
     }
 
@@ -112,9 +215,23 @@
      * キャッシュの有無に関係なく, DBからマスタデータを検索し, 取得する.
      *
-     * @param string $name マスタデータ名
+     * 返り値は, key => value 形式の配列である.
+     *
+     * @param string $name マスタデータ名
+     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
+     *                        を表すカラム名を格納した配列
      * @return array マスタデータ
      */
-    function getDbMasterData($name) {
-        // TODO
+    function getDbMasterData($name, $columns) {
+        $this->objQuery = new SC_Query();
+        $this->objQuery->setorder($columns[2]);
+        $results = $this->objQuery->select($columns[0] . ", " . $columns[1], $name);
+
+        // 結果を key => value 形式に格納
+        $masterData = array();
+        foreach ($results as $result) {
+
+            $masterData[$result[$columns[0]]] = $result[$columns[1]];
+        }
+        return $masterData;
     }
 }
