source: branches/version-2_5-dev/data/class/SC_Query.php @ 19730

Revision 19730, 27.9 KB checked in by Seasoft, 13 years ago (diff)

#855(SC_Query の #select, #getRow, #getCol, #get, #min, #max の引数順を統一する)

  • SC_Query#getCol を改訂
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24require_once(realpath(dirname(__FILE__)) . "/../module/MDB2.php");
25
26/**
27 * SQLの構築・実行を行う
28 *
29 * TODO エラーハンドリング, ロギング方法を見直す
30 *
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class SC_Query {
35
36    var $instance;
37    var $option;
38    var $where;
39    var $conn;
40    var $groupby;
41    var $order;
42    var $force_run;
43
44    /**
45     * コンストラクタ.
46     *
47     * @param string $dsn データソース名
48     * @param boolean $force_run エラーが発生しても処理を続行する場合 true
49     * @param boolean $new 新規に接続を行うかどうか
50     */
51    function SC_Query($dsn = "", $force_run = false, $new = false) {
52
53        if ($dsn == "") {
54            $dsn = DEFAULT_DSN;
55        }
56
57        // Debugモード指定
58        // 常時ONにするとメモリが解放されない。
59        // 連続クエリ実行時に問題が生じる。
60        if(DEBUG_MODE) {
61            $options['debug'] = PEAR_DB_DEBUG;
62        } else {
63            $options['debug'] = 0;
64        }
65
66        // 持続的接続オプション
67        $options['persistent'] = PEAR_DB_PERSISTENT;
68
69        // バッファリング trueにするとメモリが解放されない。
70        // 連続クエリ実行時に問題が生じる。
71        $options['result_buffering'] = false;
72
73        if ($new) {
74            $this->conn = MDB2::connect($dsn, $options);
75        } else {
76            $this->conn = MDB2::singleton($dsn, $options);
77        }
78        if (!PEAR::isError($this->conn)) {
79            $this->conn->setCharset(CHAR_CODE);
80            $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
81        }
82        $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
83        $this->force_run = $force_run;
84        $this->where = "";
85        $this->order = "";
86        $this->groupby = "";
87        $this->option = "";
88    }
89
90    /**
91     * シングルトンの SC_Query インスタンスを取得する.
92     *
93     * @param string $dsn データソース名
94     * @param boolean $force_run エラーが発生しても処理を続行する場合 true
95     * @param boolean $new 新規に接続を行うかどうか
96     * @return SC_Query シングルトンの SC_Query インスタンス
97     */
98    function getSingletonInstance($dsn = "", $force_run = false, $new = false) {
99        if (is_null($this->instance)) {
100            $this->instance =& new SC_Query($dsn, $force_run, $new);
101        }
102        $this->instance->where = "";
103        $this->instance->order = "";
104        $this->instance->groupby = "";
105        $this->instance->option = "";
106        return $this->instance;
107    }
108
109    /**
110     *  エラー判定を行う.
111     *
112     * @deprecated PEAR::isError() を使用して下さい
113     * @return boolean
114     */
115    function isError() {
116        if(PEAR::isError($this->conn)) {
117            return true;
118        }
119        return false;
120    }
121
122    /**
123     * COUNT文を実行する.
124     *
125     * @param string $table テーブル名
126     * @param string $where where句
127     * @param array $arrval プレースホルダ
128     * @return integer 件数
129     */
130    function count($table, $where = "", $arrval = array()) {
131        if(strlen($where) <= 0) {
132            $sqlse = "SELECT COUNT(*) FROM $table";
133        } else {
134            $sqlse = "SELECT COUNT(*) FROM $table WHERE $where";
135        }
136        $sqlse = $this->dbFactory->sfChangeMySQL($sqlse);
137        return $this->getOne($sqlse, $arrval);
138    }
139
140    /**
141     * SELECT文を実行する.
142     *
143     * @param string $col カラム名. 複数カラムの場合はカンマ区切りで書く
144     * @param string $table テーブル名
145     * @param string $where WHERE句
146     * @param array $arrval プレースホルダ
147     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
148     * @return array|null
149     */
150    function select($col, $table, $where = "", $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
151        $sqlse = $this->getSql($col, $table, $where);
152        return $this->getAll($sqlse, $arrval, $fetchmode);
153    }
154
155    /**
156     * 直前に実行されたSQL文を取得する.
157     *
158     * @param boolean $disp trueの場合、画面出力を行う.
159     * @return string SQL文
160     */
161    function getLastQuery($disp = true) {
162        $sql = $this->conn->last_query;
163        if($disp) {
164            print($sql.";<br />\n");
165        }
166        return $sql;
167    }
168
169    /**
170     * トランザクションをコミットする.
171     *
172     * @return MDB2_OK 成功した場合は MDB2_OK;
173     *         失敗した場合は PEAR::Error オブジェクト
174     */
175    function commit() {
176        return $this->conn->commit();
177    }
178
179    /**
180     * トランザクションを開始する.
181     *
182     * @return MDB2_OK 成功した場合は MDB2_OK;
183     *         失敗した場合は PEAR::Error オブジェクト
184     */
185    function begin() {
186        return $this->conn->beginTransaction();
187    }
188
189    /**
190     * トランザクションをロールバックする.
191     *
192     * @return MDB2_OK 成功した場合は MDB2_OK;
193     *         失敗した場合は PEAR::Error オブジェクト
194     */
195    function rollback() {
196        return $this->conn->rollback();
197    }
198
199    /**
200     * トランザクションが開始されているかチェックする.
201     *
202     * @return boolean トランザクションが開始されている場合 true
203     */
204    function inTransaction() {
205        return $this->conn->inTransaction();
206    }
207
208    /**
209     * 更新系の SQL を実行する.
210     *
211     * この関数は SC_Query::query() のエイリアスです.
212     *
213     * FIXME MDB2::exec() の実装であるべき
214     */
215    function exec($str, $arrval = array()) {
216        return $this->query($str, $arrval);
217    }
218
219    /**
220     * クエリを実行し、全ての行を返す
221     *
222     * @param string $sql SQL クエリ
223     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
224     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
225     * @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
226     */
227    function getAll($sql, $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
228
229        $sql = $this->dbFactory->sfChangeMySQL($sql);
230
231        $sth =& $this->prepare($sql);
232        if (PEAR::isError($sth) && $this->force_run) {
233            return;
234        }
235
236        $affected =& $this->execute($sth, $arrval);
237        if (PEAR::isError($affected) && $this->force_run) {
238            return;
239        }
240
241        return $affected->fetchAll($fetchmode);
242    }
243
244    /**
245     * 構築した SELECT 文を取得する.
246     *
247     * @param string $col SELECT 文に含めるカラム名
248     * @param string $table SELECT 文に含めるテーブル名
249     * @param string $where SELECT 文に含める WHERE 句
250     * @return string 構築済みの SELECT 文
251     */
252    function getSql($col, $table, $where = '') {
253        $sqlse = "SELECT $col FROM $table";
254
255        // 引数の$whereを優先する。
256        if (strlen($where) >= 1) {
257            $sqlse .= " WHERE $where";
258        } elseif (strlen($this->where) >= 1) {
259            $sqlse .= " WHERE " . $this->where;
260        }
261
262        $sqlse .= ' ' . $this->groupby . ' ' . $this->order . ' ' . $this->option;
263
264        return $sqlse;
265    }
266
267    /**
268     * SELECT 文の末尾に付与する SQL を設定する.
269     *
270     * この関数で設定した値は SC_Query::getSql() で使用されます.
271     *
272     * @param string $str 付与する SQL 文
273     * @return SC_Query 自分自身のインスタンス
274     */
275    function setOption($str) {
276        $this->option = $str;
277        return $this;
278    }
279
280    /**
281     * SELECT 文に付与する LIMIT, OFFSET 句を設定する.
282     *
283     * この関数で設定した値は SC_Query::getSql() で使用されます.
284     * TODO MDB2::setLimit() を使用する
285     *
286     * @param integer $limit LIMIT 句に付与する値
287     * @param integer $offset OFFSET 句に付与する値
288     * @return SC_Query 自分自身のインスタンス
289     */
290    function setLimitOffset($limit, $offset = 0) {
291        if (is_numeric($limit) && is_numeric($offset)){
292
293            $option = " LIMIT " . $limit;
294            $option.= " OFFSET " . $offset;
295            $this->option .= $option;
296        }
297        return $this;
298    }
299
300    /**
301     * SELECT 文に付与する GROUP BY 句を設定する.
302     *
303     * この関数で設定した値は SC_Query::getSql() で使用されます.
304     *
305     * @param string $str GROUP BY 句に付与する文字列
306     * @return SC_Query 自分自身のインスタンス
307     */
308    function setGroupBy($str) {
309        if (strlen($str) == 0) {
310            $this->groupby = '';
311        } else {
312            $this->groupby = "GROUP BY " . $str;
313        }
314        return $this;
315    }
316
317    /**
318     * SELECT 文の WHERE 句に付与する AND 条件を設定する.
319     *
320     * この関数で設定した値は SC_Query::getSql() で使用されます.
321     *
322     * @param string $str WHERE 句に付与する AND 条件の文字列
323     * @return SC_Query 自分自身のインスタンス
324     */
325    function andWhere($str) {
326        if($this->where != "") {
327            $this->where .= " AND " . $str;
328        } else {
329            $this->where = $str;
330        }
331        return $this;
332    }
333
334    /**
335     * SELECT 文の WHERE 句に付与する OR 条件を設定する.
336     *
337     * この関数で設定した値は SC_Query::getSql() で使用されます.
338     *
339     * @param string $str WHERE 句に付与する OR 条件の文字列
340     * @return SC_Query 自分自身のインスタンス
341     */
342    function orWhere($str) {
343        if($this->where != "") {
344            $this->where .= " OR " . $str;
345        } else {
346            $this->where = $str;
347        }
348        return $this;
349    }
350
351    /**
352     * SELECT 文に付与する WHERE 句を設定する.
353     *
354     * この関数で設定した値は SC_Query::getSql() で使用されます.
355     *
356     * @param string $str WHERE 句に付与する文字列
357     * @return SC_Query 自分自身のインスタンス
358     */
359    function setWhere($str) {
360        $this->where = $str;
361        return $this;
362    }
363
364    /**
365     * SELECT 文に付与する ORDER BY 句を設定する.
366     *
367     * この関数で設定した値は SC_Query::getSql() で使用されます.
368     *
369     * @param string $str ORDER BY 句に付与する文字列
370     * @return SC_Query 自分自身のインスタンス
371     */
372    function setOrder($str) {
373        if (strlen($str) == 0) {
374            $this->order = '';
375        } else {
376            $this->order = "ORDER BY " . $str;
377        }
378        return $this;
379    }
380
381    /**
382     * SELECT 文に付与する LIMIT 句を設定する.
383     *
384     * この関数で設定した値は SC_Query::getSql() で使用されます.
385     *
386     * @param integer $limit LIMIT 句に設定する値
387     * @return SC_Query 自分自身のインスタンス
388     */
389    function setLimit($limit){
390        if ( is_numeric($limit)){
391            $this->option = " LIMIT " .$limit;
392        }
393        return $this;
394    }
395
396    /**
397     * SELECT 文に付与する OFFSET 句を設定する.
398     *
399     * この関数で設定した値は SC_Query::getSql() で使用されます.
400     *
401     * @param integer $offset LIMIT 句に設定する値
402     * @return SC_Query 自分自身のインスタンス
403     */
404    function setOffset($offset) {
405        if ( is_numeric($offset)){
406            $this->offset = " OFFSET " .$offset;
407        }
408        return $this;
409    }
410
411    /**
412     * INSERT文を実行する.
413     *
414     * @param string $table テーブル名
415     * @param array $sqlval array('カラム名' => '値',...)の連想配列
416     * @return
417     */
418    function insert($table, $sqlval) {
419        $strcol = '';
420        $strval = '';
421        $find = false;
422
423        if(count($sqlval) <= 0 ) return false;
424        foreach ($sqlval as $key => $val) {
425            $strcol .= $key . ',';
426            if(strcasecmp("Now()", $val) === 0) {
427                $strval .= 'Now(),';
428            } else if(strpos($val, '~') === 0) {
429                $strval .= preg_replace("/^~/", "", $val);
430            } else {
431                $strval .= '?,';
432                $arrval[] = $val;
433            }
434            $find = true;
435        }
436        if(!$find) {
437            return false;
438        }
439        // 文末の","を削除
440        $strcol = preg_replace("/,$/", "", $strcol);
441        $strval = preg_replace("/,$/", "", $strval);
442        $sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")";
443        // INSERT文の実行
444        $ret = $this->query($sqlin, $arrval, false, null, MDB2_PREPARE_MANIP);
445
446        return $ret;
447    }
448
449    /**
450     * UPDATE文を実行する.
451     *
452     * @param string $table テーブル名
453     * @param array $sqlval array('カラム名' => '値',...)の連想配列
454     * @param string $where WHERE句
455     * @param array $arrValIn WHERE句用のプレースホルダ配列 (従来は追加カラム用も兼ねていた)
456     * @param array $arrRawSql 追加カラム
457     * @param array $arrRawSqlVal 追加カラム用のプレースホルダ配列
458     * @return
459     */
460    function update($table, $sqlval, $where = "", $arrValIn = array(), $arrRawSql = array(), $arrRawSqlVal = array()) {
461        $arrCol = array();
462        $arrVal = array();
463        $find = false;
464
465        foreach ($sqlval as $key => $val) {
466            if (strcasecmp("Now()", $val) === 0) {
467                $arrCol[] = $key . '= Now()';
468            } else if(strpos('~', $val) === 0) {
469                $arrCol[] = $key . '= ' . $val;
470            } else {
471                $arrCol[] = $key . '= ?';
472                $arrVal[] = $val;
473            }
474            $find = true;
475        }
476
477        if ($arrRawSql != "") {
478            foreach($arrRawSql as $key => $val) {
479                $arrCol[] = "$key = $val";
480            }
481        }
482       
483        $arrVal = array_merge($arrVal, $arrRawSqlVal);
484       
485        if (empty($arrCol)) {
486            return false;
487        }
488
489        // 文末の","を削除
490        $strcol = implode(', ', $arrCol);
491
492        if (is_array($arrValIn)) { // 旧版との互換用
493            // プレースホルダー用に配列を追加
494            $arrVal = array_merge($arrVal, $arrValIn);
495        }
496
497        $sqlup = "UPDATE $table SET $strcol";
498        if (strlen($where) >= 1) {
499            $sqlup .= " WHERE $where";
500        }
501
502        // UPDATE文の実行
503        return $this->query($sqlup, $arrVal, false, null, MDB2_PREPARE_MANIP);
504    }
505
506    /**
507     * MAX文を実行する.
508     *
509     * @param string $table テーブル名
510     * @param string $col カラム名
511     * @param string $where 付与する WHERE 句
512     * @param array $arrval ブレースホルダに挿入する値
513     * @return integer MAX文の実行結果
514     */
515    function max($table, $col, $where = "", $arrval = array()) {
516        $ret = $this->get($table, "MAX($col)", $where, $arrval);
517        return $ret;
518    }
519
520    /**
521     * MIN文を実行する.
522     *
523     * @param string $table テーブル名
524     * @param string $col カラム名
525     * @param string $where 付与する WHERE 句
526     * @param array $arrval ブレースホルダに挿入する値
527     * @return integer MIN文の実行結果
528     */
529    function min($table, $col, $where = "", $arrval = array()) {
530        $ret = $this->get($table, "MIN($col)", $where, $arrval);
531        return $ret;
532    }
533
534    /**
535     * SQL を構築して, 特定のカラムの値を取得する.
536     *
537     * @param string $table テーブル名
538     * @param string $col カラム名
539     * @param string $where 付与する WHERE 句
540     * @param array $arrval ブレースホルダに挿入する値
541     * @return mixed SQL の実行結果
542     */
543    function get($col, $table, $where = "", $arrval = array()) {
544        $sqlse = $this->getSql($col, $table, $where);
545        // SQL文の実行
546        $ret = $this->getOne($sqlse, $arrval);
547        return $ret;
548    }
549
550    /**
551     * SQL を指定して, 特定のカラムの値を取得する.
552     *
553     * @param string $sql 実行する SQL
554     * @param array $arrval ブレースホルダに挿入する値
555     * @return mixed SQL の実行結果
556     */
557    function getOne($sql, $arrval = array()) {
558
559        $sql = $this->dbFactory->sfChangeMySQL($sql);
560
561        $sth =& $this->prepare($sql);
562        if (PEAR::isError($sth) && $this->force_run) {
563            return;
564        }
565
566        $affected =& $this->execute($sth, $arrval);
567        if (PEAR::isError($affected) && $this->force_run) {
568            return;
569        }
570
571        return $affected->fetchOne();
572    }
573
574    /**
575     * 一行をカラム名をキーとした連想配列として取得
576     *
577     * @param string $table テーブル名
578     * @param string $col カラム名
579     * @param string $where WHERE句
580     * @param array $arrVal プレースホルダ配列
581     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
582     * @return array array('カラム名' => '値', ...)の連想配列
583     */
584    function getRow($table, $col, $where = "", $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
585
586        $sql = $this->getSql($col, $table, $where);
587        $sql = $this->dbFactory->sfChangeMySQL($sql);
588
589        $sth =& $this->prepare($sql);
590        if (PEAR::isError($sth) && $this->force_run) {
591            return;
592        }
593
594        $affected =& $this->execute($sth, $arrVal);
595        if (PEAR::isError($affected) && $this->force_run) {
596            return;
597        }
598
599        return $affected->fetchRow($fetchmode);
600    }
601
602    /**
603     * SELECT 文の実行結果を 1行のみ取得する.
604     *
605     * @param string $table テーブル名
606     * @param string $col カラム名
607     * @param string $where 付与する WHERE 句
608     * @param array $arrval ブレースホルダに挿入する値
609     * @return array SQL の実行結果の配列
610     */
611    function getCol($col, $table, $where = "", $arrval = array()) {
612        $sql = $this->getSql($col, $table, $where);
613        $sql = $this->dbFactory->sfChangeMySQL($sql);
614
615        $sth =& $this->prepare($sql);
616        if (PEAR::isError($sth) && $this->force_run) {
617            return;
618        }
619
620        $affected =& $this->execute($sth, $arrval);
621        if (PEAR::isError($affected) && $this->force_run) {
622            return;
623        }
624
625        return $affected->fetchCol($col);
626    }
627
628    /**
629     * レコードの削除
630     *
631     * @param string $table テーブル名
632     * @param string $where WHERE句
633     * @param array $arrval プレースホルダ
634     * @return
635     */
636    function delete($table, $where = "", $arrval = array()) {
637        if(strlen($where) <= 0) {
638            $sqlde = "DELETE FROM $table";
639        } else {
640            $sqlde = "DELETE FROM $table WHERE $where";
641        }
642        $ret = $this->query($sqlde, $arrval, false, null, MDB2_PREPARE_MANIP);
643        return $ret;
644    }
645
646    /**
647     * 次のシーケンス値を取得する.
648     *
649     * @param string $seq_name 取得するシーケンス名
650     * @param integer 次のシーケンス値
651     */
652    function nextVal($seq_name) {
653        return $this->conn->nextID($seq_name);
654    }
655
656    /**
657     * 現在のシーケンス値を取得する.
658     *
659     * @param string $seq_name 取得するシーケンス名
660     * @return integer 現在のシーケンス値
661     */
662    function currVal($seq_name) {
663        return $this->conn->currID($seq_name);
664    }
665
666    /**
667     * シーケンス値を設定する.
668     *
669     * @param string $seq_name シーケンス名
670     * @param integer $start 設定するシーケンス値
671     * @return MDB2_OK
672     */
673    function setVal($seq_name, $start) {
674        $objManager =& $this->conn->loadModule('Manager');
675        // XXX エラーハンドリングを行う
676        $objManager->dropSequence($seq_name);
677        return $objManager->createSequence($seq_name, $start);
678    }
679
680    /**
681     * SQL を実行する.
682     *
683     * FIXME $ignore_errが無視されるようになっているが互換性として問題が無いか確認が必要
684     *
685     * @param string $n 実行する SQL 文
686     * @param array $arr ブレースホルダに挿入する値
687     * @param boolean $ignore_err MDB2切替で無効化されている (エラーが発生しても処理を続行する場合 true)
688     * @param mixed $types プレースホルダの型指定 デフォルトnull = string
689     * @param mixed $result_types 返値の型指定またはDML実行(MDB2_PREPARE_MANIP)
690     * @return array SQL の実行結果の配列
691     */
692    function query($n ,$arr = array(), $ignore_err = false, $types = null, $result_types = MDB2_PREPARE_RESULT ){
693
694        $n = $this->dbFactory->sfChangeMySQL($n);
695
696        $sth =& $this->prepare($n, $types, $result_types);
697        if (PEAR::isError($sth) && $this->force_run) {
698            return;
699        }
700
701        $result = $this->execute($sth, $arr);
702        if (PEAR::isError($result) && $this->force_run) {
703            return;
704        }
705       
706        //PREPAREの解放
707        $sth->free();
708       
709        return $result;
710    }
711
712    /**
713     * シーケンスの一覧を取得する.
714     *
715     * @return array シーケンス名の配列
716     */
717    function listSequences() {
718        $objManager =& $this->conn->loadModule('Manager');
719        return $objManager->listSequences();
720    }
721
722    /**
723     * テーブル一覧を取得する.
724     *
725     * @return array テーブル名の配列
726     */
727    function listTables() {
728        $objManager =& $this->conn->loadModule('Manager');
729        return $objManager->listTables();
730    }
731
732    /**
733     * テーブルのカラム一覧を取得する.
734     *
735     * @param string $table テーブル名
736     * @return array 指定のテーブルのカラム名の配列
737     */
738    function listTableFields($table) {
739        $objManager =& $this->conn->loadModule('Manager');
740        return $objManager->listTableFields($table);
741    }
742
743    /**
744     * テーブルのインデックス一覧を取得する.
745     *
746     * @param string $table テーブル名
747     * @return array 指定のテーブルのインデックス一覧
748     */
749    function listTableIndexes($table) {
750        $objManager =& $this->conn->loadModule('Manager');
751        return $objManager->listTableIndexes($table);
752    }
753   
754    /**
755     * テーブルにインデックスを付与する
756     *
757     * @param string $table テーブル名
758     * @param string $name インデックス名
759     * @param array $definition フィールド名など 通常のフィールド指定時は、$definition=array('fields' => array('フィールド名' => array()));
760     */
761    function createIndex($table, $name, $definition) {
762        $objManager =& $this->conn->loadModule('Manager');
763        return $objManager->createIndex($table, $name, $definition);
764    }
765
766    /**
767     * テーブルにインデックスを破棄する
768     *
769     * @param string $table テーブル名
770     * @param string $name インデックス名
771     */
772    function dropIndex($table, $name) {
773        $objManager =& $this->conn->loadModule('Manager');
774        return $objManager->dropIndex($table, $name);
775    }
776   
777    /**
778     * 値を適切にクォートする.
779     *
780     * TODO MDB2 に対応するための暫定的な措置.
781     *      ブレースホルダが使用できない実装があるため.
782     *      本来であれば, MDB2::prepare() を適切に使用するべき
783     *
784     * @see MDB2::quote()
785     * @param string $val クォートを行う文字列
786     * @return string クォートされた文字列
787     */
788    function quote($val) {
789        return $this->conn->quote($val);
790    }
791
792    /**
793     * プリペアドステートメントを構築する.
794     *
795     * @access private
796     * @param string $sql プリペアドステートメントを構築する SQL
797     * @param mixed $types プレースホルダの型指定 デフォルト null
798     * @param mixed $result_types 返値の型指定またはDML実行(MDB2_PREPARE_MANIP)、nullは指定無し
799     * @return MDB2_Statement_Common プリペアドステートメントインスタンス
800     */
801    function prepare($sql, $types = null, $result_types = MDB2_PREPARE_RESULT) {
802        $sth =& $this->conn->prepare($sql, $types, $result_types);
803        if (PEAR::isError($sth)) {
804            if (!$this->force_run) {
805                trigger_error($this->traceError($sth, $sql), E_USER_ERROR);
806            } else {
807                error_log($this->traceError($sth, $sql), 3, LOG_PATH);
808            }
809        }
810        return $sth;
811    }
812
813    /**
814     * プリペアドクエリを実行する.
815     *
816     * @access private
817     * @param MDB2_Statement_Common プリペアドステートメントインスタンス
818     * @param array $arrVal ブレースホルダに挿入する配列
819     * @return MDB2_Result 結果セットのインスタンス
820     */
821    function execute(&$sth, $arrVal = array()) {
822        $timeStart = SC_Utils_Ex::sfMicrotimeFloat();
823        $affected =& $sth->execute($arrVal);
824
825        // 一定以上時間かかったSQLの場合、ログ出力する。
826        if(defined('SQL_QUERY_LOG_MODE') && SQL_QUERY_LOG_MODE == true) {
827            $timeEnd = SC_Utils_Ex::sfMicrotimeFloat();;
828            $timeExecTime = $timeEnd - $timeStart;
829            if(defined('SQL_QUERY_LOG_MIN_EXEC_TIME') && $timeExecTime >= (float)SQL_QUERY_LOG_MIN_EXEC_TIME) {
830                //$logMsg = sprintf("SQL_LOG [%.2fsec]\n%s", $timeExecTime, $this->getLastQuery(false));
831                $logMsg = sprintf("SQL_LOG [%.2fsec]\n%s", $timeExecTime, $sth->query);
832                GC_Utils_Ex::gfPrintLog($logMsg);
833            }
834        }
835
836        if (PEAR::isError($affected)) {
837            $sql = isset($sth->query) ? $sth->query : '';
838            if (!$this->force_run) {
839                trigger_error($this->traceError($affected, $sql), E_USER_ERROR);
840            } else {
841                error_log($this->traceError($affected, $sql), 3, LOG_PATH);
842            }
843        }
844        return $affected;
845    }
846
847    /**
848     * エラーの内容をトレースする.
849     *
850     * @access private
851     * @param PEAR::Error $error PEAR::Error インスタンス
852     * @param string $sql エラーの発生した SQL 文
853     * @return string トレースしたエラー文字列
854     */
855    function traceError($error, $sql = "") {
856        $scheme = '';
857        if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
858            $scheme = "http://";
859        } else {
860            $scheme = "https://";
861        }
862
863        $err = $scheme . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . "\n\n"
864            . "SERVER_ADDR: " . $_SERVER['SERVER_ADDR'] . "\n"
865            . "REMOTE_ADDR: " . $_SERVER['REMOTE_ADDR'] . "\n"
866            . "USER_AGENT: " . $_SERVER['HTTP_USER_AGENT'] . "\n\n"
867            . "SQL: " . $sql . "\n\n"
868            . $error->getMessage() . "\n\n"
869            . $error->getUserInfo() . "\n\n";
870
871        $err .= SC_Utils_Ex::sfBacktraceToString($error->getBackTrace());
872
873        return $err;
874    }
875}
876
877?>
Note: See TracBrowser for help on using the repository browser.