source: branches/feature-module-update/data/class/db/SC_DB_MasterData.php @ 15139

Revision 15139, 8.5 KB checked in by nanasess, 16 years ago (diff)

トランザクションとキャッシュまわり修正

  • Property charset set to UTF-8'
  • Property svn:keywords set to Id Revision Date
  • Property svn:mime-type set to 'application/x-httpd-php
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8/**
9 * マスタデータを扱うクラス.
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 というファイルが生成される.
23 *
24 * @package DB
25 * @author LOCKON CO.,LTD.
26 * @version $Id$
27 */
28class SC_DB_MasterData {
29
30    // {{{ properties
31
32    /** SC_Query インスタンス **/
33    var $objQuery;
34
35    // }}}
36    // {{{ functions
37
38    /**
39     * マスタデータを取得する.
40     *
41     * 以下の順序でマスタデータを取得する.
42     * 1. MASTER_DATA_DIR のマスタデータキャッシュを include_once() で読み込む
43     * 2. 1 で読み込んだ値をチェックし, 値が変数定義されていれば値を返す.
44     *    されていなければ, 次の処理を行う.
45     * 3. 値が未定義の場合は, DBからマスタデータを取得する.
46     * 4. 取得した後, マスタデータのキャッシュを生成し, 値を返す.
47     *
48     * 返り値は, key => value 形式の配列である.
49     *
50     * @param string $name マスタデータ名
51     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
52     *                        を表すカラム名を格納した配列
53     * @return array マスタデータ
54     */
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;
70    }
71
72    /**
73     * マスタデータをDBに追加する.
74     *
75     * 引数 $masterData をマスタデータとしてDBに追加し,
76     * キャッシュを生成する.
77     * 既存のキャッシュが存在する場合は上書きする.
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
85     * @return integer マスタデータの登録数
86     */
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] => (string) $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;
109    }
110
111    /**
112     * マスタデータを更新する.
113     *
114     * 引数 $masterData の値でマスタデータを更新し,
115     * キャッシュを更新する.
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
123     * @return integer マスタデータの更新数
124     */
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        // マスタデータを追加
134        $this->registMasterData($name, $columns, $masterData, false);
135
136        if ($autoCommit) {
137            $this->objQuery->commit();
138        }
139        return count($masterData);
140    }
141
142    /**
143     * マスタデータを削除する.
144     *
145     * 引数 $name のマスタデータを削除し,
146     * キャッシュも削除する.
147     *
148     * @param string $name マスタデータ名
149     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
150     * @return integer マスタデータの削除数
151     */
152    function deleteMasterData($name, $autoCommit = true) {
153        $this->objQuery = new SC_Query();
154        if ($autoCommit) {
155            $this->objQuery->begin();
156        }
157
158        // DB の内容とキャッシュをクリア
159        $result = $this->objQuery->delete($name);
160        $this->clearCache($name);
161
162        if ($autoCommit) {
163            $this->objQuery->commit();
164        }
165        return $result;
166    }
167
168    /**
169     * マスタデータのキャッシュを消去する.
170     *
171     * @param string $name マスタデータ名
172     * @return bool 消去した場合 true
173     */
174    function clearCache($name) {
175        $masterDataFile = MASTER_DATA_DIR . $name . ".php";
176        if (is_file($masterDataFile)) {
177            unlink($masterDataFile);
178        }
179    }
180
181    /**
182     * マスタデータのキャッシュを生成する.
183     *
184     * 引数 $name のマスタデータキャッシュを生成する.
185     * 既存のキャッシュが存在する場合は上書きする.
186     *
187     * @param string $name マスタデータ名
188     * @param array $masterData マスタデータ
189     * @return bool キャッシュの生成に成功した場合 true
190     */
191    function createCache($name, $masterData) {
192
193        // 配列の定義を文字列にする
194        $data = "<?php\n"
195              . "\$_" . $name . "_master = array(\n";
196        $i = count($masterData);
197        foreach ($masterData as $key => $val) {
198            $data .= "'" . $key . "' => '" . $val . "'";
199            if ($i > 1) {
200                $data .= ",\n";
201            }
202            $i--;
203        }
204        $data .= ");\n"
205              .  "?>\n";
206
207        // ファイルを書き出しモードで開く
208        $path = MASTER_DATA_DIR . $name . ".php";
209        $handle = fopen($path, "w");
210        if (!$handle) {
211            return false;
212        }
213        // ファイルの内容を書き出す.
214        if (fwrite($handle, $data) === false) {
215            return false;
216        }
217        return true;
218    }
219
220    // }}}
221    // {{{ private functions
222
223    /**
224     * DBからマスタデータを取得する.
225     *
226     * キャッシュの有無に関係なく, DBからマスタデータを検索し, 取得する.
227     *
228     * 返り値は, key => value 形式の配列である.
229     *
230     * @param string $name マスタデータ名
231     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
232     *                        を表すカラム名を格納した配列
233     * @return array マスタデータ
234     */
235    function getDbMasterData($name, $columns) {
236        $this->objQuery = new SC_Query();
237        $this->objQuery->setorder($columns[2]);
238        $results = $this->objQuery->select($columns[0] . ", " . $columns[1], $name);
239
240        // 結果を key => value 形式に格納
241        $masterData = array();
242        foreach ($results as $result) {
243
244            $masterData[$result[$columns[0]]] = $result[$columns[1]];
245        }
246        return $masterData;
247    }
248}
249?>
Note: See TracBrowser for help on using the repository browser.