Index: /branches/version-2_5-dev/data/class/helper/SC_Helper_DB.php
===================================================================
--- /branches/version-2_5-dev/data/class/helper/SC_Helper_DB.php	(revision 18777)
+++ /branches/version-2_5-dev/data/class/helper/SC_Helper_DB.php	(revision 18784)
@@ -70,5 +70,5 @@
         $dsn = $dbFactory->getDSN($dsn);
 
-        $objQuery = new SC_Query($dsn, true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         // 正常に接続されている場合
         if(!$objQuery->isError()) {
@@ -109,5 +109,5 @@
         if(!$this->sfTabaleExists($table_name, $dsn)) return false;
 
-        $objQuery = new SC_Query($dsn, true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         // 正常に接続されている場合
         if(!$objQuery->isError()) {
@@ -155,5 +155,5 @@
         if (!$this->sfTabaleExists($table_name, $dsn)) return false;
 
-        $objQuery = new SC_Query($dsn, true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         $arrRet = $dbFactory->getTableIndex($index_name, $table_name);
 
@@ -186,5 +186,5 @@
         $dsn = $dbFactory->getDSN($dsn);
 
-        $objQuery = new SC_Query($dsn, true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         $count = $objQuery->count($table_name, $where, $arrval);
 
@@ -211,5 +211,5 @@
 
         if ($force || !isset($data)) {
-            $objQuery = new SC_Query();
+            $objQuery =& SC_Query::getSingletonInstance();
             $arrRet = $objQuery->select('*', 'dtb_baseinfo');
 
@@ -229,5 +229,5 @@
         if(!$this->g_root_on)   {
             $this->g_root_on = true;
-            $objQuery = new SC_Query();
+            $objQuery =& SC_Query::getSingletonInstance();
 
             if (!isset($_GET['product_id'])) $_GET['product_id'] = "";
@@ -267,5 +267,5 @@
 
         // 商品規格取得
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $col = 'product_id, deliv_fee, name, product_code, main_list_image, main_image, price01, price02, point_rate, product_class_id, classcategory_id1, classcategory_id2, class_id1, class_id2, stock, stock_unlimited, sale_limit';
         $table = 'vw_product_class AS prdcls';
@@ -284,5 +284,5 @@
      */
     function sfGetPayment() {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         // 購入金額が条件額以下の項目を取得
         $where = "del_flg = 0";
@@ -430,5 +430,5 @@
         if($uniqid != "") {
             // 既存データのチェック
-            $objQuery = new SC_Query();
+            $objQuery =& SC_Query::getSingletonInstance();
             $where = "order_temp_id = ?";
             $cnt = $objQuery->count("dtb_order_temp", $where, array($uniqid));
@@ -501,5 +501,5 @@
      */
     function sfEditCustomerData($array, $arrRegistColumn) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         foreach ($arrRegistColumn as $data) {
@@ -535,5 +535,5 @@
      */
     function sfGetCustomerPoint($order_id, $use_point, $add_point) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $arrRet = $objQuery->select("customer_id", "dtb_order", "order_id = ?", array($order_id));
         $customer_id = $arrRet[0]['customer_id'];
@@ -563,5 +563,5 @@
      */
     function sfGetCustomerPointFromCid($customer_id, $use_point, $add_point) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         if (USE_POINT !== false) {
             $arrRet = $objQuery->select("point", "dtb_customer", "customer_id = ?", array($customer_id));
@@ -582,5 +582,5 @@
      */
     function sfGetCatTree($parent_category_id, $count_check = false) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $col = "";
         $col .= " cat.category_id,";
@@ -626,5 +626,5 @@
      */
     function sfGetMultiCatTree($product_id, $count_check = false) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $col = "";
         $col .= " cat.category_id,";
@@ -675,5 +675,5 @@
     function sfGetCatCombName($category_id){
         // 商品が属するカテゴリIDを縦に取得
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $arrCatID = $this->sfGetParents($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id);
         $ConbName = "";
@@ -699,5 +699,5 @@
      */
     function sfGetCat($category_id){
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         // カテゴリーを取得する
@@ -716,5 +716,5 @@
     function sfGetFirstCat($category_id){
         // 商品が属するカテゴリIDを縦に取得
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $arrRet = array();
         $arrCatID = $this->sfGetParents($objQuery, "dtb_category", "parent_category_id", "category_id", $category_id);
@@ -740,5 +740,5 @@
      */
     function sfGetCategoryList($addwhere = "", $products_check = false, $head = CATEGORY_HEAD) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $where = "del_flg = 0";
 
@@ -778,5 +778,5 @@
      */
     function sfGetLevelCatList($parent_zero = true) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         // カテゴリ名リストを取得
@@ -838,5 +838,5 @@
                 $this->g_category_id = array($category_id);
             } else if (SC_Utils_Ex::sfIsInt($product_id) && $product_id != 0 && $this->sfIsRecord("dtb_products","product_id", $product_id, $status)) {
-                $objQuery = new SC_Query();
+                $objQuery =& SC_Query::getSingletonInstance();
                 $where = "product_id = ?";
                 $category_id = $objQuery->getCol("dtb_product_categories", "category_id", "product_id = ?", array($product_id));
@@ -862,5 +862,5 @@
                         "product_id" => $product_id);
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         // 現在の商品カテゴリを取得
@@ -894,5 +894,5 @@
                         "product_id" => $product_id);
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         // 現在の商品カテゴリを取得
@@ -925,5 +925,5 @@
         $sqlval = array("category_id" => $category_id,
                         "product_id" => $product_id);
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->delete("dtb_product_categories",
                           "category_id = ? AND product_id = ?", $sqlval);
@@ -938,5 +938,5 @@
      */
     function updateProductCategories($arrCategory_id, $product_id) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         // 現在のカテゴリ情報を取得
@@ -1051,5 +1051,5 @@
      */
     function sfGetChildrenArray($table, $pid_name, $id_name, $id) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $col = $pid_name . "," . $id_name;
          $arrData = $objQuery->select($col, $table);
@@ -1120,5 +1120,5 @@
      */
     function sfGetParentsArray($table, $pid_name, $id_name, $id) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $col = $pid_name . "," . $id_name;
         $arrData = $objQuery->select($col, $table);
@@ -1169,5 +1169,5 @@
      */
     function sfGetOrderTemp($order_temp_id) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $where = "order_temp_id = ?";
         $arrRet = $objQuery->select("*", "dtb_order_temp", $where, array($order_temp_id));
@@ -1184,5 +1184,5 @@
      */
     function sfGetIDValueList($table, $keyname, $valname) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $col = "$keyname, $valname";
         $objQuery->setWhere("del_flg = 0");
@@ -1208,5 +1208,5 @@
      */
     function sfRankUp($table, $colname, $id, $andwhere = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->begin();
         $where = "$colname = ?";
@@ -1248,5 +1248,5 @@
      */
     function sfRankDown($table, $colname, $id, $andwhere = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->begin();
         $where = "$colname = ?";
@@ -1288,5 +1288,5 @@
      */
     function sfMoveRank($tableName, $keyIdColumn, $keyId, $pos, $where = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->begin();
 
@@ -1353,5 +1353,5 @@
     function sfDeleteRankRecord($table, $colname, $id, $andwhere = "",
                                 $delete = false) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->begin();
         // 削除レコードのランクを取得する。
@@ -1449,5 +1449,5 @@
      */
     function sfGetDelivTime($payment_id = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         $deliv_id = "";
@@ -1479,5 +1479,5 @@
         $payment_id = isset($arrData['payment_id']) ? $arrData['payment_id'] : "";
 
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         $deliv_id = "";
@@ -1505,5 +1505,5 @@
             }
 
-            $objQuery = new SC_Query();
+            $objQuery =& SC_Query::getSingletonInstance();
             $where = "deliv_id = ? AND pref = ?";
             $arrRet= $objQuery->select("fee", "dtb_delivfee", $where, array($deliv_id, $pref));
@@ -1611,5 +1611,5 @@
      */
     function sfIsRecord($table, $col, $arrval, $addwhere = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $arrCol = split("[, ]", $col);
 
@@ -1681,5 +1681,5 @@
                 $this->g_maker_id = array($maker_id);
             } else if (SC_Utils_Ex::sfIsInt($product_id) && $product_id != 0 && $this->sfIsRecord("dtb_products","product_id", $product_id, $status)) {
-                $objQuery = new SC_Query();
+                $objQuery =& SC_Query::getSingletonInstance();
                 $where = "product_id = ?";
                 $maker_id = $objQuery->getCol("dtb_products", "maker_id", "product_id = ?", array($product_id));
@@ -1703,5 +1703,5 @@
      */
     function sfGetMakerList($addwhere = "", $products_check = false) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $where = "del_flg = 0";
 
@@ -1743,5 +1743,5 @@
      */
     function lfCalcAllProductsDelivFee(&$arrData, &$objCartSess) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $deliv_fee_total = 0;
         $max = $objCartSess->getMax();
@@ -1774,5 +1774,5 @@
      */
     function sfUpdateOrderNameCol($order_id, $temp_table = false) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         if ($temp_table) {
@@ -1848,5 +1848,5 @@
      */
     function sfUpdateOrderStatus($orderId, $newStatus = null, $newAddPoint = null, $newUsePoint = null) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
 
         $arrOrderOld = $objQuery->getRow('dtb_order', 'status, add_point, use_point, customer_id', 'order_id = ?', array($orderId));
@@ -1955,5 +1955,5 @@
     function sfExecSqlByFile($sqlFilePath) {
         if (file_exists($sqlFilePath)) {
-            $objQuery = new SC_Query();
+            $objQuery =& SC_Query::getSingletonInstance();
 
             $sqls = file_get_contents($sqlFilePath);
@@ -1981,5 +1981,5 @@
         if (!SC_Utils_Ex::sfIsInt($product_id)) return false;
 
-        $objQuery  = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $where = 'product_id = ? AND (classcategory_id1 <> 0 OR classcategory_id2 <> 0)';
         $count = $objQuery->count('dtb_products_class', $where, array($product_id));
@@ -1994,5 +1994,5 @@
      */
     function chkCartDown($objCartSess) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $down = false;
         $nodown = false;
Index: /branches/version-2_5-dev/data/class/SC_Query.php
===================================================================
--- /branches/version-2_5-dev/data/class/SC_Query.php	(revision 18775)
+++ /branches/version-2_5-dev/data/class/SC_Query.php	(revision 18784)
@@ -33,4 +33,6 @@
  */
 class SC_Query {
+
+    var $instance;
     var $option;
     var $where;
@@ -38,14 +40,14 @@
     var $groupby;
     var $order;
+    var $force_run;
 
     /**
      * コンストラクタ.
      *
-     * @param $dsn
-     * @param boolean $err_disp エラー表示を行うかどうか
+     * @param string $dsn データソース名
+     * @param boolean $force_run エラーが発生しても処理を続行する場合 true
      * @param boolean $new 新規に接続を行うかどうか
-     * @return SC_Query
-     */
-    function SC_Query($dsn = "", $err_disp = true, $new = false) {
+     */
+    function SC_Query($dsn = "", $force_run = true, $new = false) {
 
         if ($dsn == "") {
@@ -64,15 +66,34 @@
         }
 
-        if (!$this->isError()) {
+        if (!PEAR::isError($this->conn)) {
             $this->conn->setCharset(CHAR_CODE);
             $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
         }
+
         $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
+        $this->force_run = $force_run;
         $this->where = "";
     }
 
     /**
+     * シングルトンの SC_Query インスタンスを取得する.
+     *
+     * @param string $dsn データソース名
+     * @param boolean $force_run エラーが発生しても処理を続行する場合 true
+     * @param boolean $new 新規に接続を行うかどうか
+     * @return SC_Query シングルトンの SC_Query インスタンス
+     */
+    function getSingletonInstance($dsn = "", $force_run = true, $new = false) {
+        if (is_null($this->instance)) {
+            $this->instance =& new SC_Query($dsn = "", $force_run = true,
+                                            $new = false);
+        }
+        return $this->instance;
+    }
+
+    /**
      *  エラー判定を行う.
      *
+     * @deprecated PEAR::isError() を使用して下さい
      * @return boolean
      */
@@ -109,5 +130,5 @@
      * @param string $where WHERE句
      * @param array $arrval プレースホルダ
-     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
+     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
      * @return array|null
      */
@@ -131,19 +152,52 @@
     }
 
+    /**
+     * トランザクションをコミットする.
+     *
+     * @return MDB2_OK 成功した場合は MDB2_OK;
+     *         失敗した場合は PEAR::Error オブジェクト
+     */
     function commit() {
-        $this->conn->commit();
-    }
-
+        return $this->conn->commit();
+    }
+
+    /**
+     * トランザクションを開始する.
+     *
+     * @return MDB2_OK 成功した場合は MDB2_OK;
+     *         失敗した場合は PEAR::Error オブジェクト
+     */
     function begin() {
-        $this->conn->beginTransaction();
-    }
-
+        return $this->conn->beginTransaction();
+    }
+
+    /**
+     * トランザクションをロールバックする.
+     *
+     * @return MDB2_OK 成功した場合は MDB2_OK;
+     *         失敗した場合は PEAR::Error オブジェクト
+     */
     function rollback() {
-        $this->conn->rollback();
-    }
-
+        return $this->conn->rollback();
+    }
+
+    /**
+     * トランザクションが開始されているかチェックする.
+     *
+     * @return boolean トランザクションが開始されている場合 true
+     */
+    function inTransaction() {
+        return $this->conn->inTransaction();
+    }
+
+    /**
+     * 更新系の SQL を実行する.
+     *
+     * この関数は SC_Query::query() のエイリアスです.
+     *
+     * FIXME MDB2::exec() の実装であるべき
+     */
     function exec($str, $arrval = array()) {
-        // FIXME MDB2::exec() の実装であるべき
-        $this->query($str, $arrval);
+        return $this->query($str, $arrval);
     }
 
@@ -160,16 +214,12 @@
         $sql = $this->dbFactory->sfChangeMySQL($sql);
 
-        $sth = $this->conn->prepare($sql);
-        if (PEAR::isError($sth)) {
-            /*
-             * XXX インストーラのテーブルチェックに失敗してしまう.
-             * エラーハンドリングの方法を要検討
-             */
-            return;
-        }
-        $affected = $sth->execute($arrval);
-
-        if (PEAR::isError($affected)) {
-            trigger_error($affected->getMessage(), E_USER_ERROR);
+        $sth =& $this->prepare($sql);
+        if (PEAR::isError($sth) && $this->force_run) {
+            return;
+        }
+
+        $affected =& $this->execute($sth, $arrval);
+        if (PEAR::isError($affected) && $this->force_run) {
+            return;
         }
 
@@ -177,4 +227,12 @@
     }
 
+    /**
+     * 構築した SELECT 文を取得する.
+     *
+     * @param string $col SELECT 文に含めるカラム名
+     * @param string $table SELECT 文に含めるテーブル名
+     * @param string $where SELECT 文に含める WHERE 句
+     * @return string 構築済みの SELECT 文
+     */
     function getSql($col, $table, $where = '') {
         $sqlse = "SELECT $col FROM $table";
@@ -192,23 +250,45 @@
     }
 
+    /**
+     * SELECT 文の末尾に付与する SQL を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param string $str 付与する SQL 文
+     * @return SC_Query 自分自身のインスタンス
+     */
     function setOption($str) {
         $this->option = $str;
-    }
-
-    // TODO MDB2::setLimit() を使用する
-    function setLimitOffset($limit, $offset = 0, $return = false) {
+        return $this;
+    }
+
+    /**
+     * SELECT 文に付与する LIMIT, OFFSET 句を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     * TODO MDB2::setLimit() を使用する
+     *
+     * @param integer $limit LIMIT 句に付与する値
+     * @param integer $offset OFFSET 句に付与する値
+     * @return SC_Query 自分自身のインスタンス
+     */
+    function setLimitOffset($limit, $offset = 0) {
         if (is_numeric($limit) && is_numeric($offset)){
 
             $option = " LIMIT " . $limit;
             $option.= " OFFSET " . $offset;
-
-            if($return){
-                return $option;
-            }else{
-                $this->option.= $option;
-            }
-        }
-    }
-
+            $this->option .= $option;
+        }
+        return $this;
+    }
+
+    /**
+     * SELECT 文に付与する GROUP BY 句を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param string $str GROUP BY 句に付与する文字列
+     * @return SC_Query 自分自身のインスタンス
+     */
     function setGroupBy($str) {
         if (strlen($str) == 0) {
@@ -217,7 +297,16 @@
             $this->groupby = "GROUP BY " . $str;
         }
-    }
-
-    function andwhere($str) {
+        return $this;
+    }
+
+    /**
+     * SELECT 文の WHERE 句に付与する AND 条件を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param string $str WHERE 句に付与する AND 条件の文字列
+     * @return SC_Query 自分自身のインスタンス
+     */
+    function andWhere($str) {
         if($this->where != "") {
             $this->where .= " AND " . $str;
@@ -225,6 +314,15 @@
             $this->where = $str;
         }
-    }
-
+        return $this;
+    }
+
+    /**
+     * SELECT 文の WHERE 句に付与する OR 条件を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param string $str WHERE 句に付与する OR 条件の文字列
+     * @return SC_Query 自分自身のインスタンス
+     */
     function orWhere($str) {
         if($this->where != "") {
@@ -233,10 +331,28 @@
             $this->where = $str;
         }
-    }
-
+        return $this;
+    }
+
+    /**
+     * SELECT 文に付与する WHERE 句を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param string $str WHERE 句に付与する文字列
+     * @return SC_Query 自分自身のインスタンス
+     */
     function setWhere($str) {
         $this->where = $str;
-    }
-
+        return $this;
+    }
+
+    /**
+     * SELECT 文に付与する ORDER BY 句を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param string $str ORDER BY 句に付与する文字列
+     * @return SC_Query 自分自身のインスタンス
+     */
     function setOrder($str) {
         if (strlen($str) == 0) {
@@ -245,17 +361,35 @@
             $this->order = "ORDER BY " . $str;
         }
-    }
-
-
+        return $this;
+    }
+
+    /**
+     * SELECT 文に付与する LIMIT 句を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param integer $limit LIMIT 句に設定する値
+     * @return SC_Query 自分自身のインスタンス
+     */
     function setLimit($limit){
         if ( is_numeric($limit)){
             $this->option = " LIMIT " .$limit;
         }
-    }
-
+        return $this;
+    }
+
+    /**
+     * SELECT 文に付与する OFFSET 句を設定する.
+     *
+     * この関数で設定した値は SC_Query::getSql() で使用されます.
+     *
+     * @param integer $offset LIMIT 句に設定する値
+     * @return SC_Query 自分自身のインスタンス
+     */
     function setOffset($offset) {
         if ( is_numeric($offset)){
             $this->offset = " OFFSET " .$offset;
         }
+        return $this;
     }
 
@@ -352,5 +486,13 @@
     }
 
-    // MAX文の実行
+    /**
+     * MAX文を実行する.
+     *
+     * @param string $table テーブル名
+     * @param string $col カラム名
+     * @param string $where 付与する WHERE 句
+     * @param array $arrval ブレースホルダに挿入する値
+     * @return integer MAX文の実行結果
+     */
     function max($table, $col, $where = "", $arrval = array()) {
         $ret = $this->get($table, "MAX($col)", $where, $arrval);
@@ -358,5 +500,13 @@
     }
 
-    // MIN文の実行
+    /**
+     * MIN文を実行する.
+     *
+     * @param string $table テーブル名
+     * @param string $col カラム名
+     * @param string $where 付与する WHERE 句
+     * @param array $arrval ブレースホルダに挿入する値
+     * @return integer MIN文の実行結果
+     */
     function min($table, $col, $where = "", $arrval = array()) {
         $ret = $this->get($table, "MIN($col)", $where, $arrval);
@@ -364,5 +514,13 @@
     }
 
-    // 特定のカラムの値を取得
+    /**
+     * SQL を構築して, 特定のカラムの値を取得する.
+     *
+     * @param string $table テーブル名
+     * @param string $col カラム名
+     * @param string $where 付与する WHERE 句
+     * @param array $arrval ブレースホルダに挿入する値
+     * @return mixed SQL の実行結果
+     */
     function get($table, $col, $where = "", $arrval = array()) {
         $sqlse = $this->getSql($col, $table, $where);
@@ -372,13 +530,23 @@
     }
 
+    /**
+     * SQL を指定して, 特定のカラムの値を取得する.
+     *
+     * @param string $sql 実行する SQL
+     * @param array $arrval ブレースホルダに挿入する値
+     * @return mixed SQL の実行結果
+     */
     function getOne($sql, $arrval = array()) {
 
         $sql = $this->dbFactory->sfChangeMySQL($sql);
 
-        $sth = $this->conn->prepare($sql);
-        $affected = $sth->execute($arrval);
-
-        if (PEAR::isError($affected)) {
-            trigger_error($affected->getMessage(), E_USER_ERROR);
+        $sth =& $this->prepare($sql);
+        if (PEAR::isError($sth) && $this->force_run) {
+            return;
+        }
+
+        $affected =& $this->execute($sth, $arrval);
+        if (PEAR::isError($affected) && $this->force_run) {
+            return;
         }
 
@@ -393,5 +561,5 @@
      * @param string $where WHERE句
      * @param array $arrVal プレースホルダ配列
-     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
+     * @param integer $fetchmode 使用するフェッチモード。デフォルトは MDB2_FETCHMODE_ASSOC。
      * @return array array('カラム名' => '値', ...)の連想配列
      */
@@ -401,9 +569,12 @@
         $sql = $this->dbFactory->sfChangeMySQL($sql);
 
-        $sth = $this->conn->prepare($sql);
-        $affected = $sth->execute($arrVal);
-
-        if (PEAR::isError($affected)) {
-            trigger_error($affected->getMessage(), E_USER_ERROR);
+        $sth =& $this->prepare($sql);
+        if (PEAR::isError($sth) && $this->force_run) {
+            return;
+        }
+
+        $affected =& $this->execute($sth, $arrVal);
+        if (PEAR::isError($affected) && $this->force_run) {
+            return;
         }
 
@@ -411,14 +582,25 @@
     }
 
-    // 1列取得
+    /**
+     * SELECT 文の実行結果を 1行のみ取得する.
+     *
+     * @param string $table テーブル名
+     * @param string $col カラム名
+     * @param string $where 付与する WHERE 句
+     * @param array $arrval ブレースホルダに挿入する値
+     * @return array SQL の実行結果の配列
+     */
     function getCol($table, $col, $where = "", $arrval = array()) {
         $sql = $this->getSql($col, $table, $where);
         $sql = $this->dbFactory->sfChangeMySQL($sql);
 
-        $sth = $this->conn->prepare($sql);
-        $affected = $sth->execute($arrval);
-
-        if (PEAR::isError($affected)) {
-            trigger_error($affected->getMessage(), E_USER_ERROR);
+        $sth =& $this->prepare($sql);
+        if (PEAR::isError($sth) && $this->force_run) {
+            return;
+        }
+
+        $affected =& $this->execute($sth, $arrval);
+        if (PEAR::isError($affected) && $this->force_run) {
+            return;
         }
 
@@ -444,4 +626,5 @@
     }
 
+    // TODO MDB2::nextID のエイリアスとする
     function nextval($table, $colname) {
         $sql = "";
@@ -458,4 +641,5 @@
     }
 
+    // TODO MDB2::currID のエイリアスとする
     function currval($table, $colname) {
         $sql = "";
@@ -471,4 +655,5 @@
     }
 
+    // TODO MDB2 に該当関数が無いため実装を要検討
     function setval($table, $colname, $data) {
         $sql = "";
@@ -485,18 +670,25 @@
     }
 
-    // XXX 更新系には exec() を使用するべき
+    /**
+     * SQL を実行する.
+     *
+     * XXX 更新系には exec() を使用するべき
+     *
+     * @param string $n 実行する SQL 文
+     * @param array $arrval ブレースホルダに挿入する値
+     * @return array SQL の実行結果の配列
+     */
     function query($n ,$arr = array(), $ignore_err = false){
 
         $n = $this->dbFactory->sfChangeMySQL($n);
 
-        $sth = $this->conn->prepare($n);
-        $result = $sth->execute($arr);
-
-        if (PEAR::isError($result)) {
-            /*
-             * XXX インストーラのテーブルチェックに失敗してしまう.
-             * エラーハンドリングの方法を要検討
-             */
-            //trigger_error($result->getMessage(), E_USER_ERROR);
+        $sth =& $this->prepare($n);
+        if (PEAR::isError($sth) && $this->force_run) {
+            return;
+        }
+
+        $result = $this->execute($sth, $arr);
+        if (PEAR::isError($result) && $this->force_run) {
+            return;
         }
 
@@ -543,4 +735,39 @@
         return $this->conn->quote($val);
     }
+
+    /**
+     * プリペアドステートメントを構築する.
+     *
+     * @access private
+     * @param string $sql プリペアドステートメントを構築する SQL
+     * @return MDB2_Statement_Common プリペアドステートメントインスタンス
+     */
+    function prepare($sql) {
+        $sth =& $this->conn->prepare($sql);
+        if (PEAR::isError($sth)) {
+            if (!$this->force_run) {
+               trigger_error($sth->getMessage(), E_USER_ERROR);
+            }
+        }
+        return $sth;
+    }
+
+    /**
+     * プリペアドクエリを実行する.
+     *
+     * @access private
+     * @param MDB2_Statement_Common プリペアドステートメントインスタンス
+     * @param array $arrVal ブレースホルダに挿入する配列
+     * @return MDB2_Result 結果セットのインスタンス
+     */
+    function execute(&$sth, $arrVal = array()) {
+        $affected =& $sth->execute($arrVal);
+        if (PEAR::isError($affected)) {
+            if (!$this->force_run) {
+               trigger_error($affected->getMessage(), E_USER_ERROR);
+            }
+        }
+        return $affected;
+    }
 }
 
Index: /branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
===================================================================
--- /branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php	(revision 18777)
+++ /branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php	(revision 18784)
@@ -38,4 +38,7 @@
 class SC_DB_DBFactory_MYSQL extends SC_DB_DBFactory {
 
+    /** SC_Query インスタンス */
+    var $objQuery;
+
     /**
      * DBのバージョンを取得する.
@@ -45,5 +48,5 @@
      */
     function sfGetDBVersion($dsn = "") {
-        $objQuery = new SC_Query($this->getDSN($dsn), true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         $val = $objQuery->getOne("select version()");
         return "MySQL " . $val;
@@ -77,5 +80,5 @@
      */
     function getCharSet() {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $arrRet = $objQuery->getAll("SHOW VARIABLES LIKE 'char%'");
         return $arrRet;
@@ -90,5 +93,5 @@
     function getTableExistsSql($table_name) {
         // XXX 何故かブレースホルダが使えない
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         return "SHOW TABLE STATUS LIKE " . $objQuery->quote($table_name);
     }
@@ -102,5 +105,5 @@
      */
     function getTableIndex($index_name, $table_name = "") {
-        $objQuery = new SC_Query("", true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         return $objQuery->getAll("SHOW INDEX FROM " . $table_name . " WHERE Key_name = ?",
                                  array($index_name));
@@ -117,5 +120,5 @@
      */
     function createTableIndex($index_name, $table_name, $col_name, $length = 0) {
-        $objQuery = new SC_Query($dsn, true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->query("CREATE INDEX ? ON ? (?(?))", array($index_name, $table_name, $col_name, $length));
     }
@@ -128,5 +131,5 @@
      */
     function sfGetColumnList($table_name) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $sql = "SHOW COLUMNS FROM " . $table_name;
         $arrColList = $objQuery->getAll($sql);
@@ -144,5 +147,5 @@
      */
     function findTableNames($expression = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $sql = "SHOW TABLES LIKE ?";
         $arrColList = $objQuery->getAll($sql, array("%" . $expression . "%"));
Index: /branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php
===================================================================
--- /branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php	(revision 18775)
+++ /branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_PGSQL.php	(revision 18784)
@@ -46,5 +46,5 @@
      */
     function sfGetDBVersion($dsn = "") {
-        $objQuery = new SC_Query($this->getDSN($dsn), true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         $val = $objQuery->getOne("select version()");
         $arrLine = split(" " , $val);
@@ -72,5 +72,5 @@
      */
     function getTableExistsSql($table_name) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         return "  SELECT relname "
              . "    FROM pg_class "
@@ -88,5 +88,5 @@
      */
     function getTableIndex($index_name, $table_name = "") {
-        $objQuery = new SC_Query("", true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         return $objQuery->getAll("SELECT relname FROM pg_class WHERE relname = ?",
                                  array($index_name));
@@ -103,5 +103,5 @@
      */
     function createTableIndex($index_name, $table_name, $col_name, $length = 0) {
-        $objQuery = new SC_Query($dsn, true, true);
+        $objQuery =& SC_Query::getSingletonInstance();
         $objQuery->query("CREATE INDEX ? ON ? (?)", array($index_name, $table_name, $col_name));
     }
@@ -114,5 +114,5 @@
      */
     function sfGetColumnList($table_name) {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $sql = "  SELECT a.attname "
              . "    FROM pg_class c, pg_attribute a "
@@ -137,5 +137,5 @@
      */
     function findTableNames($expression = "") {
-        $objQuery = new SC_Query();
+        $objQuery =& SC_Query::getSingletonInstance();
         $sql = "   SELECT c.relname AS name, "
             .  "     CASE c.relkind "
