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

Revision 15720, 11.4 KB checked in by nanasess, 15 years ago (diff)

WHERE 句のキーを quote するように修正

  • Property charset set to UTF-8'
  • Property svn:keywords set to Id Revision Date
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
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:SC_DB_MasterData.php 15532 2007-08-31 14:39:46Z nanasess $
27 */
28class SC_DB_MasterData {
29
30    // {{{ properties
31
32    /** SC_Query インスタンス */
33    var $objQuery;
34
35    /** デフォルトのテーブルカラム名 */
36    var $columns = array("id", "name", "rank");
37
38    // }}}
39    // {{{ functions
40
41    /**
42     * マスタデータを取得する.
43     *
44     * 以下の順序でマスタデータを取得する.
45     * 1. MASTER_DATA_DIR のマスタデータキャッシュを include_once() で読み込む
46     * 2. 1 で読み込んだ値をチェックし, 値が変数定義されていれば値を返す.
47     *    されていなければ, 次の処理を行う.
48     * 3. 値が未定義の場合は, DBからマスタデータを取得する.
49     * 4. 取得した後, マスタデータのキャッシュを生成し, 値を返す.
50     *
51     * 返り値は, key => value 形式の配列である.
52     *
53     * @param string $name マスタデータ名
54     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
55     *                        を表すカラム名を格納した配列
56     * @return array マスタデータ
57     */
58    function getMasterData($name, $columns = array()) {
59
60        $columns = $this->getDefaultColumnName($columns);
61
62        // 可変変数を定義
63        $valiable = "_" . $name . "_master";
64        // キャッシュを読み込み
65        @include_once(MASTER_DATA_DIR . $name . ".php");
66
67        // キャッシュがあれば, キャッシュの値を返す.
68        if (!empty($$valiable)) {
69            return $$valiable;
70        }
71        // マスタデータを取得
72        $masterData = $this->getDbMasterData($name, $columns);
73        // キャッシュ生成
74        $this->createCache($name, $masterData);
75        return $masterData;
76    }
77
78    /**
79     * マスタデータをDBに追加する.
80     *
81     * 引数 $masterData をマスタデータとしてDBに追加し,
82     * キャッシュを生成する.
83     * 既存のキャッシュが存在する場合は上書きする.
84     * $masterData は key => value 形式の配列である必要がある.
85     *
86     * @param string $name マスタデータ名
87     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
88     *                        を表すカラム名を格納した配列
89     * @param array $masterData マスタデータ
90     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
91     * @return integer マスタデータの登録数
92     */
93    function registMasterData($name, $columns, $masterData, $autoCommit = true) {
94
95        $columns = $this->getDefaultColumnName($columns);
96
97        $this->objQuery = new SC_Query();
98        if ($autoCommit) {
99            $this->objQuery->begin();
100        }
101        $i = 0;
102        foreach ($masterData as $key => $val) {
103            $sqlVal = array($columns[0] => $key,
104                            $columns[1] => $val,
105                            $columns[2] => (string) $i);
106            $this->objQuery->insert($name, $sqlVal);
107            $i++;
108        }
109        if ($autoCommit) {
110            $this->objQuery->commit();
111        }
112        return $i;
113    }
114
115    /**
116     * マスタデータを更新する.
117     *
118     * 引数 $masterData の値でマスタデータを更新する.
119     * $masterData は key => value 形式の配列である必要がある.
120     *
121     * @param string $name マスタデータ名
122     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
123     *                        を表すカラム名を格納した配列
124     * @param array $masterData マスタデータ
125     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
126     * @return integer マスタデータの更新数
127     */
128    function updateMasterData($name, $columns, $masterData, $autoCommit = true) {
129
130        $columns = $this->getDefaultColumnName($columns);
131
132        $this->objQuery = new SC_Query();
133        if ($autoCommit) {
134            $this->objQuery->begin();
135        }
136
137        // 指定のデータを更新
138        $i = 0;
139        foreach ($masterData as $key => $val) {
140            $sqlVal = array($columns[1] => $val);
141            $this->objQuery->update($name, $sqlVal, $columns[0] . " = " .  SC_Utils_Ex::sfQuoteSmart($key));
142            $i++;
143        }
144        if ($autoCommit) {
145            $this->objQuery->commit();
146        }
147        return $i;
148    }
149
150    /**
151     * マスタデータを削除する.
152     *
153     * 引数 $name のマスタデータを削除し,
154     * キャッシュも削除する.
155     *
156     * @param string $name マスタデータ名
157     * @param bool $autoCommit トランザクションを自動的に commit する場合 true
158     * @return integer マスタデータの削除数
159     */
160    function deleteMasterData($name, $autoCommit = true) {
161        $this->objQuery = new SC_Query();
162        if ($autoCommit) {
163            $this->objQuery->begin();
164        }
165
166        // DB の内容とキャッシュをクリア
167        $result = $this->objQuery->delete($name);
168        $this->clearCache($name);
169
170        if ($autoCommit) {
171            $this->objQuery->commit();
172        }
173        return $result;
174    }
175
176    /**
177     * マスタデータのキャッシュを消去する.
178     *
179     * @param string $name マスタデータ名
180     * @return bool 消去した場合 true
181     */
182    function clearCache($name) {
183        $masterDataFile = MASTER_DATA_DIR . $name . ".php";
184        if (is_file($masterDataFile)) {
185            unlink($masterDataFile);
186        }
187    }
188
189    /**
190     * マスタデータのキャッシュを生成する.
191     *
192     * 引数 $name のマスタデータキャッシュを生成する.
193     * 既存のキャッシュが存在する場合は上書きする.
194     *
195     * 引数 $isDefine が true の場合は, 定数を生成する.
196     * 定数コメントを生成する場合は, $commentColumn を指定する.
197     *
198     * @param string $name マスタデータ名
199     * @param array $masterData マスタデータ
200     * @param bool $isDefine 定数を生成する場合 true
201     * @param array $commentColumn [0] => キー, [1] => コメント文字列,
202                                   [2] => 表示順 を表すカラム名を格納した配列
203     * @return bool キャッシュの生成に成功した場合 true
204     */
205    function createCache($name, $masterData, $isDefine = false,
206                         $commentColumn = array()) {
207
208        // マスタデータを文字列にする
209        $data = "<?php\n";
210        // 定数を生成する場合
211        if ($isDefine) {
212
213            // 定数コメントを生成する場合
214            if (!empty($commentColumn)) {
215                $data .= $this->getMasterDataAsDefine($masterData,
216                                 $this->getDbMasterData($name, $commentColumn));
217            } else {
218                $data .= $this->getMasterDataAsDefine($masterData);
219            }
220
221        // 配列を生成する場合
222        } else {
223            $data .= $this->getMasterDataAsString($name, $masterData);
224        }
225        $data .=  "?>\n";
226
227        // ファイルを書き出しモードで開く
228        $path = MASTER_DATA_DIR . $name . ".php";
229        $handle = fopen($path, "w");
230        if (!$handle) {
231            return false;
232        }
233        // ファイルの内容を書き出す.
234        if (fwrite($handle, $data) === false) {
235            return false;
236        }
237        return true;
238    }
239
240    /**
241     * DBからマスタデータを取得する.
242     *
243     * キャッシュの有無に関係なく, DBからマスタデータを検索し, 取得する.
244     *
245     * 返り値は, key => value 形式の配列である.
246     *
247     * @param string $name マスタデータ名
248     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
249     *                        を表すカラム名を格納した配列
250     * @return array マスタデータ
251     */
252    function getDbMasterData($name, $columns = array()) {
253
254        $columns = $this->getDefaultColumnName($columns);
255
256        $this->objQuery = new SC_Query();
257        $this->objQuery->setorder($columns[2]);
258        $results = $this->objQuery->select($columns[0] . ", " . $columns[1], $name);
259
260        // 結果を key => value 形式に格納
261        $masterData = array();
262        foreach ($results as $result) {
263
264            $masterData[$result[$columns[0]]] = $result[$columns[1]];
265        }
266        return $masterData;
267    }
268
269    // }}}
270    // {{{ private functions
271
272    /**
273     * デフォルトのカラム名の配列を返す.
274     *
275     * 引数 $columns が空の場合, デフォルトのカラム名の配列を返す.
276     * 空でない場合は, 引数の値をそのまま返す.
277     *
278     * @param array $columns [0] => キー, [1] => 表示文字列, [2] => 表示順
279     *                        を表すカラム名を格納した配列
280     * @return array カラム名を格納した配列
281     */
282    function getDefaultColumnName($columns = array()) {
283
284        if (!empty($columns)) {
285            return $columns;
286        } else {
287            return $this->columns;
288        }
289    }
290
291    /**
292     * マスタデータの配列を配列定義の文字列として出力する.
293     *
294     * @access private
295     * @param string $name マスタデータ名
296     * @param array $masterData マスタデータの配列
297     * @return string 配列定義の文字列
298     */
299    function getMasterDataAsString($name, $masterData) {
300        $data = "\$_" . $name . "_master = array(\n";
301        $i = count($masterData);
302        foreach ($masterData as $key => $val) {
303            $data .= "'" . $key . "' => '" . $val . "'";
304            if ($i > 1) {
305                $data .= ",\n";
306            }
307            $i--;
308        }
309        $data .= ");\n";
310        return $data;
311    }
312
313    /**
314     * マスタデータの配列を定数定義の文字列として出力する.
315     *
316     * @access private
317     * @param array $masterData マスタデータの配列
318     * @param array $comments コメントの配列
319     * @return string 定数定義の文字列
320     */
321    function getMasterDataAsDefine($masterData, $comments = array()) {
322        $data = "";
323        foreach ($masterData as $key => $val) {
324            if (!empty($comments[$key])) {
325                $data .= "/** " . $comments[$key] . " */\n";
326            }
327            $data .= "define('" . $key . "', " . $val . ");\n";
328        }
329        return $data;
330    }
331}
332?>
Note: See TracBrowser for help on using the repository browser.