Ignore:
Timestamp:
2010/08/12 19:33:49 (16 years ago)
Author:
nanasess
bzr:base-revision:
svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_5-dev:18783
bzr:committer:
Kentaro Ohkouchi <[email protected]>
bzr:file-ids:

data/class/SC_Query.php 15078@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2FSC_Query.php
data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php 15123@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fdb%2Fdbfactory%2FSC_DB_DBFactory_MYSQL.php
data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php 15123@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fdb%2Fdbfactory%2FSC_DB_DBFactory_PGSQL.php
data/class/helper/SC_Helper_DB.php 15176@1e3b908f-19a9-db11-a64c-001125224ba8:branches%2Ffeature-module-update%2Fdata%2Fclass%2Fhelper%2FSC_Helper_DB.php
bzr:mapping-version:
v4
bzr:repository-uuid:
1e3b908f-19a9-db11-a64c-001125224ba8
bzr:revision-id:
[email protected]
bzr:revno:
2267
bzr:revprop:branch-nick:
branches/version-2_5-dev
bzr:root:
branches/version-2_5-dev
bzr:text-parents:

data/class/SC_Query.php [email protected]
data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_5-dev:18777
data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php [email protected]
data/class/helper/SC_Helper_DB.php svn-v4:1e3b908f-19a9-db11-a64c-001125224ba8:branches/version-2_5-dev:18777
bzr:timestamp:
2010-08-12 19:33:42.628999949 +0900
bzr:user-agent:
bzr2.1.2+bzr-svn1.0.2
svn:original-date:
2010-08-12T10:33:42.629000Z
Message:

#565関連(SC_DbConnの削除)

  • data/class/SC_Query.php
    • PHPDoc コメントを追加
    • コンストラクタの第二引数を $force_run に変更
    • SC_Query::isError() を PEAR::isError() に変更し, @deprecated コメント付与
    • SC_Query::getSingletonInstance() 関数を追加
    • SC_Query::inTransaction() 関数を追加
    • 内部変数のリファレンスを修正
    • setXXX 関数を Chain of Responsibility パターンに対応
  • data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
    • SC_Query のインスタンスを SC_Query::getSingletonInstance() で取得するよう修正
  • data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php
    • SC_Query のインスタンスを SC_Query::getSingletonInstance() で取得するよう修正
  • data/class/helper/SC_Helper_DB.php
    • SC_Query のインスタンスを SC_Query::getSingletonInstance() で取得するよう修正
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_5-dev/data/class/SC_Query.php

    r18775 r18784  
    3333 */ 
    3434class SC_Query { 
     35 
     36    var $instance; 
    3537    var $option; 
    3638    var $where; 
     
    3840    var $groupby; 
    3941    var $order; 
     42    var $force_run; 
    4043 
    4144    /** 
    4245     * コンストラクタ. 
    4346     * 
    44      * @param $dsn 
    45      * @param boolean $err_disp エラー表示を行うかどうか 
     47     * @param string $dsn データソース名 
     48     * @param boolean $force_run エラーが発生しても処理を続行する場合 true 
    4649     * @param boolean $new 新規に接続を行うかどうか 
    47      * @return SC_Query 
    48      */ 
    49     function SC_Query($dsn = "", $err_disp = true, $new = false) { 
     50     */ 
     51    function SC_Query($dsn = "", $force_run = true, $new = false) { 
    5052 
    5153        if ($dsn == "") { 
     
    6466        } 
    6567 
    66         if (!$this->isError()) { 
     68        if (!PEAR::isError($this->conn)) { 
    6769            $this->conn->setCharset(CHAR_CODE); 
    6870            $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC); 
    6971        } 
     72 
    7073        $this->dbFactory = SC_DB_DBFactory_Ex::getInstance(); 
     74        $this->force_run = $force_run; 
    7175        $this->where = ""; 
    7276    } 
    7377 
    7478    /** 
     79     * シングルトンの SC_Query インスタンスを取得する. 
     80     * 
     81     * @param string $dsn データソース名 
     82     * @param boolean $force_run エラーが発生しても処理を続行する場合 true 
     83     * @param boolean $new 新規に接続を行うかどうか 
     84     * @return SC_Query シングルトンの SC_Query インスタンス 
     85     */ 
     86    function getSingletonInstance($dsn = "", $force_run = true, $new = false) { 
     87        if (is_null($this->instance)) { 
     88            $this->instance =& new SC_Query($dsn = "", $force_run = true, 
     89                                            $new = false); 
     90        } 
     91        return $this->instance; 
     92    } 
     93 
     94    /** 
    7595     *  エラー判定を行う. 
    7696     * 
     97     * @deprecated PEAR::isError() を使用して下さい 
    7798     * @return boolean 
    7899     */ 
     
    109130     * @param string $where WHERE句 
    110131     * @param array $arrval プレースホルダ 
    111      * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。 
     132     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。 
    112133     * @return array|null 
    113134     */ 
     
    131152    } 
    132153 
     154    /** 
     155     * トランザクションをコミットする. 
     156     * 
     157     * @return MDB2_OK 成功した場合は MDB2_OK; 
     158     *         失敗した場合は PEAR::Error オブジェクト 
     159     */ 
    133160    function commit() { 
    134         $this->conn->commit(); 
    135     } 
    136  
     161        return $this->conn->commit(); 
     162    } 
     163 
     164    /** 
     165     * トランザクションを開始する. 
     166     * 
     167     * @return MDB2_OK 成功した場合は MDB2_OK; 
     168     *         失敗した場合は PEAR::Error オブジェクト 
     169     */ 
    137170    function begin() { 
    138         $this->conn->beginTransaction(); 
    139     } 
    140  
     171        return $this->conn->beginTransaction(); 
     172    } 
     173 
     174    /** 
     175     * トランザクションをロールバックする. 
     176     * 
     177     * @return MDB2_OK 成功した場合は MDB2_OK; 
     178     *         失敗した場合は PEAR::Error オブジェクト 
     179     */ 
    141180    function rollback() { 
    142         $this->conn->rollback(); 
    143     } 
    144  
     181        return $this->conn->rollback(); 
     182    } 
     183 
     184    /** 
     185     * トランザクションが開始されているかチェックする. 
     186     * 
     187     * @return boolean トランザクションが開始されている場合 true 
     188     */ 
     189    function inTransaction() { 
     190        return $this->conn->inTransaction(); 
     191    } 
     192 
     193    /** 
     194     * 更新系の SQL を実行する. 
     195     * 
     196     * この関数は SC_Query::query() のエイリアスです. 
     197     * 
     198     * FIXME MDB2::exec() の実装であるべき 
     199     */ 
    145200    function exec($str, $arrval = array()) { 
    146         // FIXME MDB2::exec() の実装であるべき 
    147         $this->query($str, $arrval); 
     201        return $this->query($str, $arrval); 
    148202    } 
    149203 
     
    160214        $sql = $this->dbFactory->sfChangeMySQL($sql); 
    161215 
    162         $sth = $this->conn->prepare($sql); 
    163         if (PEAR::isError($sth)) { 
    164             /* 
    165              * XXX インストーラのテーブルチェックに失敗してしまう. 
    166              * エラーハンドリングの方法を要検討 
    167              */ 
    168             return; 
    169         } 
    170         $affected = $sth->execute($arrval); 
    171  
    172         if (PEAR::isError($affected)) { 
    173             trigger_error($affected->getMessage(), E_USER_ERROR); 
     216        $sth =& $this->prepare($sql); 
     217        if (PEAR::isError($sth) && $this->force_run) { 
     218            return; 
     219        } 
     220 
     221        $affected =& $this->execute($sth, $arrval); 
     222        if (PEAR::isError($affected) && $this->force_run) { 
     223            return; 
    174224        } 
    175225 
     
    177227    } 
    178228 
     229    /** 
     230     * 構築した SELECT 文を取得する. 
     231     * 
     232     * @param string $col SELECT 文に含めるカラム名 
     233     * @param string $table SELECT 文に含めるテーブル名 
     234     * @param string $where SELECT 文に含める WHERE 句 
     235     * @return string 構築済みの SELECT 文 
     236     */ 
    179237    function getSql($col, $table, $where = '') { 
    180238        $sqlse = "SELECT $col FROM $table"; 
     
    192250    } 
    193251 
     252    /** 
     253     * SELECT 文の末尾に付与する SQL を設定する. 
     254     * 
     255     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     256     * 
     257     * @param string $str 付与する SQL 文 
     258     * @return SC_Query 自分自身のインスタンス 
     259     */ 
    194260    function setOption($str) { 
    195261        $this->option = $str; 
    196     } 
    197  
    198     // TODO MDB2::setLimit() を使用する 
    199     function setLimitOffset($limit, $offset = 0, $return = false) { 
     262        return $this; 
     263    } 
     264 
     265    /** 
     266     * SELECT 文に付与する LIMIT, OFFSET 句を設定する. 
     267     * 
     268     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     269     * TODO MDB2::setLimit() を使用する 
     270     * 
     271     * @param integer $limit LIMIT 句に付与する値 
     272     * @param integer $offset OFFSET 句に付与する値 
     273     * @return SC_Query 自分自身のインスタンス 
     274     */ 
     275    function setLimitOffset($limit, $offset = 0) { 
    200276        if (is_numeric($limit) && is_numeric($offset)){ 
    201277 
    202278            $option = " LIMIT " . $limit; 
    203279            $option.= " OFFSET " . $offset; 
    204  
    205             if($return){ 
    206                 return $option; 
    207             }else{ 
    208                 $this->option.= $option; 
    209             } 
    210         } 
    211     } 
    212  
     280            $this->option .= $option; 
     281        } 
     282        return $this; 
     283    } 
     284 
     285    /** 
     286     * SELECT 文に付与する GROUP BY 句を設定する. 
     287     * 
     288     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     289     * 
     290     * @param string $str GROUP BY 句に付与する文字列 
     291     * @return SC_Query 自分自身のインスタンス 
     292     */ 
    213293    function setGroupBy($str) { 
    214294        if (strlen($str) == 0) { 
     
    217297            $this->groupby = "GROUP BY " . $str; 
    218298        } 
    219     } 
    220  
    221     function andwhere($str) { 
     299        return $this; 
     300    } 
     301 
     302    /** 
     303     * SELECT 文の WHERE 句に付与する AND 条件を設定する. 
     304     * 
     305     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     306     * 
     307     * @param string $str WHERE 句に付与する AND 条件の文字列 
     308     * @return SC_Query 自分自身のインスタンス 
     309     */ 
     310    function andWhere($str) { 
    222311        if($this->where != "") { 
    223312            $this->where .= " AND " . $str; 
     
    225314            $this->where = $str; 
    226315        } 
    227     } 
    228  
     316        return $this; 
     317    } 
     318 
     319    /** 
     320     * SELECT 文の WHERE 句に付与する OR 条件を設定する. 
     321     * 
     322     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     323     * 
     324     * @param string $str WHERE 句に付与する OR 条件の文字列 
     325     * @return SC_Query 自分自身のインスタンス 
     326     */ 
    229327    function orWhere($str) { 
    230328        if($this->where != "") { 
     
    233331            $this->where = $str; 
    234332        } 
    235     } 
    236  
     333        return $this; 
     334    } 
     335 
     336    /** 
     337     * SELECT 文に付与する WHERE 句を設定する. 
     338     * 
     339     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     340     * 
     341     * @param string $str WHERE 句に付与する文字列 
     342     * @return SC_Query 自分自身のインスタンス 
     343     */ 
    237344    function setWhere($str) { 
    238345        $this->where = $str; 
    239     } 
    240  
     346        return $this; 
     347    } 
     348 
     349    /** 
     350     * SELECT 文に付与する ORDER BY 句を設定する. 
     351     * 
     352     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     353     * 
     354     * @param string $str ORDER BY 句に付与する文字列 
     355     * @return SC_Query 自分自身のインスタンス 
     356     */ 
    241357    function setOrder($str) { 
    242358        if (strlen($str) == 0) { 
     
    245361            $this->order = "ORDER BY " . $str; 
    246362        } 
    247     } 
    248  
    249  
     363        return $this; 
     364    } 
     365 
     366    /** 
     367     * SELECT 文に付与する LIMIT 句を設定する. 
     368     * 
     369     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     370     * 
     371     * @param integer $limit LIMIT 句に設定する値 
     372     * @return SC_Query 自分自身のインスタンス 
     373     */ 
    250374    function setLimit($limit){ 
    251375        if ( is_numeric($limit)){ 
    252376            $this->option = " LIMIT " .$limit; 
    253377        } 
    254     } 
    255  
     378        return $this; 
     379    } 
     380 
     381    /** 
     382     * SELECT 文に付与する OFFSET 句を設定する. 
     383     * 
     384     * この関数で設定した値は SC_Query::getSql() で使用されます. 
     385     * 
     386     * @param integer $offset LIMIT 句に設定する値 
     387     * @return SC_Query 自分自身のインスタンス 
     388     */ 
    256389    function setOffset($offset) { 
    257390        if ( is_numeric($offset)){ 
    258391            $this->offset = " OFFSET " .$offset; 
    259392        } 
     393        return $this; 
    260394    } 
    261395 
     
    352486    } 
    353487 
    354     // MAX文の実行 
     488    /** 
     489     * MAX文を実行する. 
     490     * 
     491     * @param string $table テーブル名 
     492     * @param string $col カラム名 
     493     * @param string $where 付与する WHERE 句 
     494     * @param array $arrval ブレースホルダに挿入する値 
     495     * @return integer MAX文の実行結果 
     496     */ 
    355497    function max($table, $col, $where = "", $arrval = array()) { 
    356498        $ret = $this->get($table, "MAX($col)", $where, $arrval); 
     
    358500    } 
    359501 
    360     // MIN文の実行 
     502    /** 
     503     * MIN文を実行する. 
     504     * 
     505     * @param string $table テーブル名 
     506     * @param string $col カラム名 
     507     * @param string $where 付与する WHERE 句 
     508     * @param array $arrval ブレースホルダに挿入する値 
     509     * @return integer MIN文の実行結果 
     510     */ 
    361511    function min($table, $col, $where = "", $arrval = array()) { 
    362512        $ret = $this->get($table, "MIN($col)", $where, $arrval); 
     
    364514    } 
    365515 
    366     // 特定のカラムの値を取得 
     516    /** 
     517     * SQL を構築して, 特定のカラムの値を取得する. 
     518     * 
     519     * @param string $table テーブル名 
     520     * @param string $col カラム名 
     521     * @param string $where 付与する WHERE 句 
     522     * @param array $arrval ブレースホルダに挿入する値 
     523     * @return mixed SQL の実行結果 
     524     */ 
    367525    function get($table, $col, $where = "", $arrval = array()) { 
    368526        $sqlse = $this->getSql($col, $table, $where); 
     
    372530    } 
    373531 
     532    /** 
     533     * SQL を指定して, 特定のカラムの値を取得する. 
     534     * 
     535     * @param string $sql 実行する SQL 
     536     * @param array $arrval ブレースホルダに挿入する値 
     537     * @return mixed SQL の実行結果 
     538     */ 
    374539    function getOne($sql, $arrval = array()) { 
    375540 
    376541        $sql = $this->dbFactory->sfChangeMySQL($sql); 
    377542 
    378         $sth = $this->conn->prepare($sql); 
    379         $affected = $sth->execute($arrval); 
    380  
    381         if (PEAR::isError($affected)) { 
    382             trigger_error($affected->getMessage(), E_USER_ERROR); 
     543        $sth =& $this->prepare($sql); 
     544        if (PEAR::isError($sth) && $this->force_run) { 
     545            return; 
     546        } 
     547 
     548        $affected =& $this->execute($sth, $arrval); 
     549        if (PEAR::isError($affected) && $this->force_run) { 
     550            return; 
    383551        } 
    384552 
     
    393561     * @param string $where WHERE句 
    394562     * @param array $arrVal プレースホルダ配列 
    395      * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。 
     563     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。 
    396564     * @return array array('カラム名' => '値', ...)の連想配列 
    397565     */ 
     
    401569        $sql = $this->dbFactory->sfChangeMySQL($sql); 
    402570 
    403         $sth = $this->conn->prepare($sql); 
    404         $affected = $sth->execute($arrVal); 
    405  
    406         if (PEAR::isError($affected)) { 
    407             trigger_error($affected->getMessage(), E_USER_ERROR); 
     571        $sth =& $this->prepare($sql); 
     572        if (PEAR::isError($sth) && $this->force_run) { 
     573            return; 
     574        } 
     575 
     576        $affected =& $this->execute($sth, $arrVal); 
     577        if (PEAR::isError($affected) && $this->force_run) { 
     578            return; 
    408579        } 
    409580 
     
    411582    } 
    412583 
    413     // 1列取得 
     584    /** 
     585     * SELECT 文の実行結果を 1行のみ取得する. 
     586     * 
     587     * @param string $table テーブル名 
     588     * @param string $col カラム名 
     589     * @param string $where 付与する WHERE 句 
     590     * @param array $arrval ブレースホルダに挿入する値 
     591     * @return array SQL の実行結果の配列 
     592     */ 
    414593    function getCol($table, $col, $where = "", $arrval = array()) { 
    415594        $sql = $this->getSql($col, $table, $where); 
    416595        $sql = $this->dbFactory->sfChangeMySQL($sql); 
    417596 
    418         $sth = $this->conn->prepare($sql); 
    419         $affected = $sth->execute($arrval); 
    420  
    421         if (PEAR::isError($affected)) { 
    422             trigger_error($affected->getMessage(), E_USER_ERROR); 
     597        $sth =& $this->prepare($sql); 
     598        if (PEAR::isError($sth) && $this->force_run) { 
     599            return; 
     600        } 
     601 
     602        $affected =& $this->execute($sth, $arrval); 
     603        if (PEAR::isError($affected) && $this->force_run) { 
     604            return; 
    423605        } 
    424606 
     
    444626    } 
    445627 
     628    // TODO MDB2::nextID のエイリアスとする 
    446629    function nextval($table, $colname) { 
    447630        $sql = ""; 
     
    458641    } 
    459642 
     643    // TODO MDB2::currID のエイリアスとする 
    460644    function currval($table, $colname) { 
    461645        $sql = ""; 
     
    471655    } 
    472656 
     657    // TODO MDB2 に該当関数が無いため実装を要検討 
    473658    function setval($table, $colname, $data) { 
    474659        $sql = ""; 
     
    485670    } 
    486671 
    487     // XXX 更新系には exec() を使用するべき 
     672    /** 
     673     * SQL を実行する. 
     674     * 
     675     * XXX 更新系には exec() を使用するべき 
     676     * 
     677     * @param string $n 実行する SQL 文 
     678     * @param array $arrval ブレースホルダに挿入する値 
     679     * @return array SQL の実行結果の配列 
     680     */ 
    488681    function query($n ,$arr = array(), $ignore_err = false){ 
    489682 
    490683        $n = $this->dbFactory->sfChangeMySQL($n); 
    491684 
    492         $sth = $this->conn->prepare($n); 
    493         $result = $sth->execute($arr); 
    494  
    495         if (PEAR::isError($result)) { 
    496             /* 
    497              * XXX インストーラのテーブルチェックに失敗してしまう. 
    498              * エラーハンドリングの方法を要検討 
    499              */ 
    500             //trigger_error($result->getMessage(), E_USER_ERROR); 
     685        $sth =& $this->prepare($n); 
     686        if (PEAR::isError($sth) && $this->force_run) { 
     687            return; 
     688        } 
     689 
     690        $result = $this->execute($sth, $arr); 
     691        if (PEAR::isError($result) && $this->force_run) { 
     692            return; 
    501693        } 
    502694 
     
    543735        return $this->conn->quote($val); 
    544736    } 
     737 
     738    /** 
     739     * プリペアドステートメントを構築する. 
     740     * 
     741     * @access private 
     742     * @param string $sql プリペアドステートメントを構築する SQL 
     743     * @return MDB2_Statement_Common プリペアドステートメントインスタンス 
     744     */ 
     745    function prepare($sql) { 
     746        $sth =& $this->conn->prepare($sql); 
     747        if (PEAR::isError($sth)) { 
     748            if (!$this->force_run) { 
     749               trigger_error($sth->getMessage(), E_USER_ERROR); 
     750            } 
     751        } 
     752        return $sth; 
     753    } 
     754 
     755    /** 
     756     * プリペアドクエリを実行する. 
     757     * 
     758     * @access private 
     759     * @param MDB2_Statement_Common プリペアドステートメントインスタンス 
     760     * @param array $arrVal ブレースホルダに挿入する配列 
     761     * @return MDB2_Result 結果セットのインスタンス 
     762     */ 
     763    function execute(&$sth, $arrVal = array()) { 
     764        $affected =& $sth->execute($arrVal); 
     765        if (PEAR::isError($affected)) { 
     766            if (!$this->force_run) { 
     767               trigger_error($affected->getMessage(), E_USER_ERROR); 
     768            } 
     769        } 
     770        return $affected; 
     771    } 
    545772} 
    546773 
Note: See TracChangeset for help on using the changeset viewer.