Changeset 15135


Ignore:
Timestamp:
2007/07/26 22:05:08 (13 years ago)
Author:
nanasess
Message:

未実装だった関数を実装

Location:
branches/feature-module-update
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/feature-module-update/data/class/db/SC_DB_MasterData.php

    r15134 r15135  
    88/** 
    99 * マスタデータを扱うクラス. 
     10 * 
     11 * プルダウン等で使用するマスタデータを扱う. 
     12 * マスタデータは, DB に格納されているが, パフォーマンスを得るため, 
     13 * 初回のみ DBへアクセスし, データを定義したキャッシュファイルを生成する. 
     14 * 
     15 * マスタデータのテーブルは, 下記のようなカラムが必要がある. 
     16 * 1. キーとなる文字列 
     17 * 2. 表示文字列 
     18 * 3. 表示順 
     19 * 上記カラムのデータ型は特に指定しないが, 1 と 2 は常に string 型となる. 
     20 * 
     21 * マスタデータがキャッシュされると, key => value 形式の配列として使用できる. 
     22 * マスタデータのキャッシュは, MASTER_DATA_DIR/マスタデータ名.php というファイルが生成される. 
    1023 * 
    1124 * @package DB 
     
    1528class SC_DB_MasterData { 
    1629 
     30    // {{{ properties 
     31 
     32    /** SC_Query インスタンス **/ 
     33    var $objQuery; 
     34 
    1735    // }}} 
    1836    // {{{ functions 
     
    2240     * 
    2341     * 以下の順序でマスタデータを取得する. 
    24      * 1. data/conf/cache のマスタデータキャッシュを include_once() で読み込む 
     42     * 1. MASTER_DATA_DIR のマスタデータキャッシュを include_once() で読み込む 
    2543     * 2. 1 で読み込んだ値をチェックし, 値が変数定義されていれば値を返す. 
    2644     *    されていなければ, 次の処理を行う. 
     
    2846     * 4. 取得した後, マスタデータのキャッシュを生成し, 値を返す. 
    2947     * 
    30      * @param string $name マスタデータ名 
     48     * 返り値は, key => value 形式の配列である. 
     49     * 
     50     * @param string $name マスタデータ名 
     51     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順 
     52     *                        を表すカラム名を格納した配列 
    3153     * @return array マスタデータ 
    3254     */ 
    33     function getMasterData($name) { 
    34         $objQuery = new SC_Query(); 
    35         $result = $objQuery->select("*", $name); 
    36         return $result; 
     55    function getMasterData($name, $columns) { 
     56        // 可変変数を定義 
     57        $valiable = "_" . $name . "_master"; 
     58        // キャッシュを読み込み 
     59        @include_once(MASTER_DATA_DIR . $name . ".php"); 
     60 
     61        // キャッシュがあれば, キャッシュの値を返す. 
     62        if (!empty($$valiable)) { 
     63            return $$valiable; 
     64        } 
     65        // マスタデータを取得 
     66        $masterData = $this->getDbMasterData($name, $columns); 
     67        // キャッシュ生成 
     68        $this->createCache($name, $masterData); 
     69        return $masterData; 
    3770    } 
    3871 
     
    4073     * マスタデータをDBに追加する. 
    4174     * 
    42      * 引数 $value をマスタデータとしてDBに追加し, 
     75     * 引数 $masterData をマスタデータとしてDBに追加し, 
    4376     * キャッシュを生成する. 
    4477     * 既存のキャッシュが存在する場合は上書きする. 
    45      * $value は key => value 形式の配列である必要がある. 
    46      * 
    47      * @param string $name マスタデータ名 
    48      * @param array $value マスタデータ 
     78     * $masterData は key => value 形式の配列である必要がある. 
     79     * 
     80     * @param string $name マスタデータ名 
     81     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順 
     82     *                        を表すカラム名を格納した配列 
     83     * @param array $masterData マスタデータ 
     84     * @param bool $autoCommit トランザクションを自動的に commit する場合 true 
    4985     * @return integer マスタデータの登録数 
    5086     */ 
    51     function registMasterData($name, $value) { 
    52         // TODO 
     87    function registMasterData($name, $columns, $masterData, $autoCommit = true) { 
     88        $this->objQuery = new SC_Query(); 
     89        if ($autoCommit) { 
     90            $this->objQuery->begin(); 
     91        } 
     92        $i = 0; 
     93        foreach ($masterData as $key => $val) { 
     94            $sqlVal = array($columns[0] => $key, 
     95                            $columns[1] => $val, 
     96                            $columns[2] => $i); 
     97            $this->objQuery->insert($name, $sqlVal); 
     98            $i++; 
     99        } 
     100        if ($autoCommit) { 
     101            $this->objQuery->commit(); 
     102        } 
     103 
     104        // キャッシュを消去 
     105        $this->clearCache($name); 
     106        // 新規にデータを取得してキャッシュ生成 
     107        $newData = $this->getMasterData($name, $columns); 
     108        return $i; 
    53109    } 
    54110 
     
    56112     * マスタデータを更新する. 
    57113     * 
    58      * 引数 $value の値でマスタデータを更新し, 
     114     * 引数 $masterData の値でマスタデータを更新し, 
    59115     * キャッシュを更新する. 
    60      * $value は key => value 形式の配列である必要がある. 
    61      * 
    62      * @param string $name マスタデータ名 
    63      * @param array $value マスタデータ 
     116     * $masterData は key => value 形式の配列である必要がある. 
     117     * 
     118     * @param string $name マスタデータ名 
     119     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順 
     120     *                        を表すカラム名を格納した配列 
     121     * @param array $masterData マスタデータ 
     122     * @param bool $autoCommit トランザクションを自動的に commit する場合 true 
    64123     * @return integer マスタデータの更新数 
    65124     */ 
    66     function updateMasterData($name, $value) { 
    67         // TODO 
     125    function updateMasterData($name, $columns, $masterData, $autoCommit = true) { 
     126        $this->objQuery = new SC_Query(); 
     127        if ($autoCommit) { 
     128            $this->objQuery->begin(); 
     129        } 
     130        // マスタデータを削除 
     131        $this->deleteMasterData($name, false); 
     132        // マスタデータを追加 
     133        $this->registMasterData($name, $columns, $masterData, false); 
     134        if ($autoCommit) { 
     135            $this->objQuery->commit(); 
     136        } 
     137 
     138        // キャッシュを消去 
     139        $this->clearCache($name); 
     140        // 新規にデータを取得してキャッシュ生成 
     141        $newData = $this->getMasterData($name, $columns); 
     142        return count($newData); 
    68143    } 
    69144 
     
    75150     * 
    76151     * @param string $name マスタデータ名 
     152     * @param bool $autoCommit トランザクションを自動的に commit する場合 true 
    77153     * @return integer マスタデータの削除数 
    78154     */ 
    79     function deleteMasterData($name) { 
    80         // TODO 
     155    function deleteMasterData($name, $autoCommit = true) { 
     156        $this->objQuery = new SC_Query(); 
     157        return $this->objQuery->delete($name); 
    81158    } 
    82159 
     
    85162     * 
    86163     * @param string $name マスタデータ名 
    87      * @return void 
     164     * @return bool 消去した場合 true 
    88165     */ 
    89166    function clearCache($name) { 
    90         // TODO 
     167        unlink(MASTER_DATA_DIR . $name . ".php"); 
    91168    } 
    92169 
     
    98175     * 
    99176     * @param string $name マスタデータ名 
    100      * @return void 
    101      */ 
    102     function createCache($name) { 
    103         // TODO 
     177     * @param array $masterData マスタデータ 
     178     * @return bool キャッシュの生成に成功した場合 true 
     179     */ 
     180    function createCache($name, $masterData) { 
     181 
     182        // 配列の定義を文字列にする 
     183        $data = "<?php\n" 
     184              . "\$_" . $name . "_master = array(\n"; 
     185        $i = count($masterData); 
     186        foreach ($masterData as $key => $val) { 
     187            $data .= "'" . $key . "' => '" . $val . "'"; 
     188            if ($i > 1) { 
     189                $data .= ",\n"; 
     190            } 
     191            $i--; 
     192        } 
     193        $data .= ");\n" 
     194              .  "?>\n"; 
     195 
     196        // ファイルを書き出しモードで開く 
     197        $path = MASTER_DATA_DIR . $name . ".php"; 
     198        $handle = fopen($path, "w"); 
     199        if (!$handle) { 
     200            return false; 
     201        } 
     202        // ファイルの内容を書き出す. 
     203        if (fwrite($handle, $data) === false) { 
     204            return false; 
     205        } 
     206        return true; 
    104207    } 
    105208 
     
    112215     * キャッシュの有無に関係なく, DBからマスタデータを検索し, 取得する. 
    113216     * 
    114      * @param string $name マスタデータ名 
     217     * 返り値は, key => value 形式の配列である. 
     218     * 
     219     * @param string $name マスタデータ名 
     220     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順 
     221     *                        を表すカラム名を格納した配列 
    115222     * @return array マスタデータ 
    116223     */ 
    117     function getDbMasterData($name) { 
    118         // TODO 
     224    function getDbMasterData($name, $columns) { 
     225        $this->objQuery = new SC_Query(); 
     226        $this->objQuery->setorder($columns[2]); 
     227        $results = $this->objQuery->select($columns[0] . ", " . $columns[1], $name); 
     228 
     229        // 結果を key => value 形式に格納 
     230        $masterData = array(); 
     231        foreach ($results as $result) { 
     232 
     233            $masterData[$result[$columns[0]]] = $result[$columns[1]]; 
     234        } 
     235        return $masterData; 
    119236    } 
    120237} 
  • branches/feature-module-update/test/TestSuite.php

    r15116 r15135  
    1010require_once("../html/require.php"); 
    1111require_once("class/page/LC_Page_Test.php"); 
     12require_once("class/db/SC_DB_DBFactory_Test.php"); 
     13require_once("class/db/SC_DB_MasterData_Test.php"); 
    1214require_once("PHPUnit.php"); 
    1315 
    14 $suite = new PHPUnit_TestSuite("LC_Page_Test"); 
    15 $result = PHPUnit::run($suite); 
     16$suites = array(); 
     17$suites[0] = new PHPUnit_TestSuite("LC_Page_Test"); 
     18$suites[1] = new PHPUnit_TestSuite("SC_DB_DBFactory_Test"); 
     19$suites[2] = new PHPUnit_TestSuite("SC_DB_MasterData_Test"); 
    1620 
    17 print $result->toString(); 
     21foreach ($suites as $suite) { 
     22    $result = PHPUnit::run($suite); 
     23    print $result->toString(); 
     24} 
    1825?> 
  • branches/feature-module-update/test/class/db/SC_DB_MasterData_Test.php

    r15134 r15135  
    2222    // {{{ functions 
    2323 
     24    /** 
     25     * SC_DB_MasterData::getMasterData() のテストケース 
     26     */ 
    2427    function testGetMasterData() { 
    2528 
     29        $columns = array("pref_id", "pref_name", "rank"); 
    2630        $masterData = new SC_DB_MasterData_Ex(); 
    27         $actual = $masterData->getMasterData("mtb_pref"); 
     31        $actual = $masterData->getMasterData("mtb_pref", $columns); 
    2832 
    2933        $objQuery = new SC_Query(); 
    30         $expected = $objQuery->select("*", $name); 
     34        $objQuery->setorder($columns[2]); 
     35        $results = $objQuery->select($columns[0] . ", " . $columns[1], "mtb_pref"); 
    3136 
     37        $expected = array(); 
     38        foreach ($results as $result) { 
     39 
     40            $expected[$result[$columns[0]]] = $result[$columns[1]]; 
     41        } 
    3242        $this->assertEquals($expected, $actual); 
    3343    } 
Note: See TracChangeset for help on using the changeset viewer.