Index: /branches/version-2_5-dev/data/require_classes.php
===================================================================
--- /branches/version-2_5-dev/data/require_classes.php (revision 18743)
+++ /branches/version-2_5-dev/data/require_classes.php (revision 18773)
@@ -27,5 +27,4 @@
require_once(CLASS_EX_PATH . "db_extends/SC_DB_DBFactory_Ex.php");
require_once(CLASS_PATH . "SC_View.php");
-require_once(CLASS_PATH . "SC_DbConn.php");
require_once(CLASS_PATH . "SC_Session.php");
require_once(CLASS_PATH . "SC_Query.php");
Index: /branches/version-2_5-dev/data/include/module.inc
===================================================================
--- /branches/version-2_5-dev/data/include/module.inc (revision 17672)
+++ /branches/version-2_5-dev/data/include/module.inc (revision 18773)
@@ -29,5 +29,4 @@
// {{{ requires
-require_once CLASS_PATH . 'SC_DbConn.php';
require_once CLASS_PATH . 'SC_Query.php';
require_once CLASS_EX_PATH . 'db_extends/SC_DB_DBFactory_Ex.php';
Index: /branches/version-2_5-dev/data/class/SC_Query.php
===================================================================
--- /branches/version-2_5-dev/data/class/SC_Query.php (revision 18701)
+++ /branches/version-2_5-dev/data/class/SC_Query.php (revision 18773)
@@ -22,6 +22,10 @@
*/
+require_once(realpath(dirname(__FILE__)) . "/../module/MDB2.php");
+
/**
* SQLの構築・実行を行う
+ *
+ * TODO エラーハンドリング, ロギング方法を見直す
*
* @author LOCKON CO.,LTD.
@@ -44,5 +48,23 @@
*/
function SC_Query($dsn = "", $err_disp = true, $new = false) {
- $this->conn = new SC_DBconn($dsn, $err_disp, $new);
+
+ if ($dsn == "") {
+ $dsn = DEFAULT_DSN;
+ }
+
+ // Debugモード指定
+ $options['debug'] = PEAR_DB_DEBUG;
+ // 持続的接続オプション
+ $options['persistent'] = PEAR_DB_PERSISTENT;
+
+ if ($new) {
+ $this->conn = MDB2::connect($dsn, $options);
+ } else {
+ $this->conn = MDB2::singleton($dsn, $options);
+ }
+
+ $this->conn->setCharset(CHAR_CODE);
+ $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
+ $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
$this->where = "";
}
@@ -54,5 +76,5 @@
*/
function isError() {
- if(PEAR::isError($this->conn->conn)) {
+ if(PEAR::isError($this->conn)) {
return true;
}
@@ -74,7 +96,6 @@
$sqlse = "SELECT COUNT(*) FROM $table WHERE $where";
}
- // カウント文の実行
- $ret = $this->conn->getOne($sqlse, $arrval);
- return $ret;
+ $sqlse = $this->dbFactory->sfChangeMySQL($sqlse);
+ return $this->getOne($sqlse, $arrval);
}
@@ -89,13 +110,11 @@
* @return array|null
*/
- function select($col, $table, $where = "", $arrval = array(), $fetchmode = DB_FETCHMODE_ASSOC) {
+ function select($col, $table, $where = "", $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
$sqlse = $this->getSql($col, $table, $where);
- $ret = $this->conn->getAll($sqlse, $arrval, $fetchmode);
- return $ret;
+ return $this->getAll($sqlse, $arrval, $fetchmode);
}
/**
* 直前に実行されたSQL文を取得する.
- * SC_DBconn::getLastQuery() を利用.
*
* @param boolean $disp trueの場合、画面出力を行う.
@@ -103,21 +122,26 @@
*/
function getLastQuery($disp = true) {
- return $this->conn->getLastQuery($disp);
+ $sql = $this->conn->last_query;
+ if($disp) {
+ print($sql.";
\n");
+ }
+ return $sql;
}
function commit() {
- $this->conn->query("COMMIT");
+ $this->conn->commit();
}
function begin() {
- $this->conn->query("BEGIN");
+ $this->conn->beginTransaction();
}
function rollback() {
- $this->conn->query("ROLLBACK");
+ $this->conn->rollback();
}
function exec($str, $arrval = array()) {
- $this->conn->query($str, $arrval);
+ // FIXME MDB2::exec() の実装であるべき
+ $this->query($str, $arrval);
}
@@ -130,7 +154,16 @@
* @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
*/
- function getAll($sql, $arrval = array(), $fetchmode = DB_FETCHMODE_ASSOC) {
- $ret = $this->conn->getAll($sql, $arrval, $fetchmode);
- return $ret;
+ function getAll($sql, $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
+
+ $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);
+ }
+
+ return $affected->fetchAll($fetchmode);
}
@@ -154,4 +187,5 @@
}
+ // TODO MDB2::setLimit() を使用する
function setLimitOffset($limit, $offset = 0, $return = false) {
if (is_numeric($limit) && is_numeric($offset)){
@@ -250,5 +284,5 @@
$sqlin = "INSERT INTO $table(" . $strcol. ") VALUES (" . $strval . ")";
// INSERT文の実行
- $ret = $this->conn->query($sqlin, $arrval);
+ $ret = $this->query($sqlin, $arrval);
return $ret;
@@ -306,5 +340,5 @@
// UPDATE文の実行
- return $this->conn->query($sqlup, $arrVal);
+ return $this->query($sqlup, $arrVal);
}
@@ -330,7 +364,15 @@
function getOne($sql, $arrval = array()) {
- // SQL文の実行
- $ret = $this->conn->getOne($sql, $arrval);
- return $ret;
+
+ $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);
+ }
+
+ return $affected->fetchOne();
}
@@ -345,15 +387,32 @@
* @return array array('カラム名' => '値', ...)の連想配列
*/
- function getRow($table, $col, $where = "", $arrVal = array(), $fetchmode = DB_FETCHMODE_ASSOC) {
- $sqlse = $this->getSql($col, $table, $where);
- // SQL文の実行
- return $this->conn->getRow($sqlse, $arrVal ,$fetchmode);
+ function getRow($table, $col, $where = "", $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
+
+ $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);
+ }
+
+ return $affected->fetchRow($fetchmode);
}
// 1列取得
function getCol($table, $col, $where = "", $arrval = array()) {
- $sqlse = $this->getSql($col, $table, $where);
- // SQL文の実行
- return $this->conn->getCol($sqlse, 0, $arrval);
+ $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);
+ }
+
+ return $affected->fetchCol($col);
}
@@ -372,5 +431,5 @@
$sqlde = "DELETE FROM $table WHERE $where";
}
- $ret = $this->conn->query($sqlde, $arrval);
+ $ret = $this->query($sqlde, $arrval);
return $ret;
}
@@ -385,5 +444,5 @@
$sql = "SELECT last_insert_id();";
}
- $ret = $this->conn->getOne($sql);
+ $ret = $this->getOne($sql);
return $ret;
@@ -398,5 +457,5 @@
$sql = "SELECT last_insert_id();";
}
- $ret = $this->conn->getOne($sql);
+ $ret = $this->getOne($sql);
return $ret;
@@ -408,15 +467,25 @@
$seqtable = $table . "_" . $colname . "_seq";
$sql = "SELECT SETVAL('$seqtable', $data)";
- $ret = $this->conn->getOne($sql);
+ $ret = $this->getOne($sql);
}else if (DB_TYPE == "mysql") {
$sql = "ALTER TABLE $table AUTO_INCREMENT=$data";
- $ret = $this->conn->query($sql);
- }
-
- return $ret;
- }
-
- function query($n ,$arr = "", $ignore_err = false){
- $result = $this->conn->query($n, $arr, $ignore_err);
+ $ret = $this->query($sql);
+ }
+
+ return $ret;
+ }
+
+ // XXX 更新系には exec() を使用するべき
+ 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)) {
+ trigger_error($result->getMessage(), E_USER_ERROR);
+ }
+
return $result;
}
@@ -437,5 +506,5 @@
// 値をカウントアップしておく
- $this->conn->query("ALTER TABLE $table_name AUTO_INCREMENT=?" , $auto_inc_no + 1);
+ $this->query("ALTER TABLE $table_name AUTO_INCREMENT=?" , $auto_inc_no + 1);
// 解除する
Index: /branches/version-2_5-dev/data/class/pages/products/LC_Page_Products_List.php
===================================================================
--- /branches/version-2_5-dev/data/class/pages/products/LC_Page_Products_List.php (revision 18772)
+++ /branches/version-2_5-dev/data/class/pages/products/LC_Page_Products_List.php (revision 18773)
@@ -359,6 +359,5 @@
// 対象商品IDの抽出
- $arrProduct_id = $objQuery->getCol('vw_products_allclass AS allcls', 'DISTINCT product_id', $where, $arrval);
-
+ $arrProduct_id = array_unique($objQuery->getCol('vw_products_allclass AS allcls', 'product_id', $where, $arrval));
// 行数の取得
$linemax = count($arrProduct_id);
Index: anches/version-2_5-dev/data/class/SC_DbConn.php
===================================================================
--- /branches/version-2_5-dev/data/class/SC_DbConn.php (revision 18763)
+++ (revision )
@@ -1,275 +1,0 @@
-= 1) {
- $this->dsn = $dsn;
- } elseif (defined('DEFAULT_DSN')) {
- $this->dsn = DEFAULT_DSN;
- } else {
- // XXX 以前の仕様を継承しているが、意図が良く分からない。(2010/03/03 Seasoft 塚田)
- return;
- }
-
- // 既に接続されていないか、新規接続要望の場合は接続する。
- if (!isset($g_arr_objDbConn[$this->dsn]) || !isset($g_arr_objDbConn[$this->dsn]->connection)) {
- $new = true;
- }
-
- if ($new) {
- // TODO singleton の方が良いかも
- $this->conn = MDB2::connect($this->dsn, $options);
- $g_arr_objDbConn[$this->dsn] = $this->conn;
-
- // TODO MDB2::setCharset() を使った方が良い?
- if (DB_TYPE == 'mysql') {
- $g_arr_objDbConn[$this->dsn]->query('SET NAMES utf8'); // FIXME mysql_set_charset を使える環境では、その方が良さそう (2010/03/03 Seasoft 塚田)
- $g_arr_objDbConn[$this->dsn]->query("SET SESSION sql_mode = 'ANSI'");
- }
- } else {
- $this->conn = $g_arr_objDbConn[$this->dsn];
- }
-
- $this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
- $this->err_disp = $err_disp;
- $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
- }
-
- // クエリの実行
- function query($n ,$arr = array(), $ignore_err = false){
- // mysqlの場合にはビュー表を変換する
- if (DB_TYPE == "mysql") $n = $this->dbFactory->sfChangeMySQL($n);
-
- $sth = $this->conn->prepare($n);
- if ( $arr ) {
- $result = $sth->execute($arr);
- } else {
- $result = $sth->execute();
- }
-
- if ($this->conn->isError($result) && !$ignore_err){
- $this->send_err_mail($result, $n);
- }
-
- $this->result = $result;
- return $this->result;
- }
-
- // 一件のみ取得
- function getOne($n, $arr = array()){
-
- // mysqlの場合にはビュー表を変換する
- if (DB_TYPE == "mysql") $n = $this->dbFactory->sfChangeMySQL($n);
-
- $sth = $this->conn->prepare($n);
- if ( $arr ) {
- $affected = $sth->execute($arr);
- } else {
- $affected = $sth->execute();
- }
-
- if ($this->conn->isError($affected)){
- $this->send_err_mail($affected ,$n);
- }
- $this->result = $affected->fetchOne();
- return $this->result;
- }
-
- /**
- * クエリを実行し、最初の行を返す
- *
- * @param string $sql SQL クエリ
- * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
- * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
- * @return array データを含む1次元配列。失敗した場合に DB_Error オブジェクトを返します。
- */
- function getRow($sql, $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
-
- // mysqlの場合にはビュー表を変換する
- if (DB_TYPE == "mysql") $sql = $this->dbFactory->sfChangeMySQL($sql);
-
- $sth = $this->conn->prepare($sql);
- if ($arrVal) {
- $affected = $sth->execute($arrVal);
- } else {
- $affected = $sth->execute();
- }
- if ($this->conn->isError($affected)) {
- $this->send_err_mail($affected, $sql);
- }
- $this->result = $affected->fetchRow($fetchmode);
-
- return $this->result;
- }
-
- function getCol($n, $col, $arr = array()) {
-
- // mysqlの場合にはビュー表を変換する
- if (DB_TYPE == "mysql") $n = $this->dbFactory->sfChangeMySQL($n);
-
- $sth = $this->conn->prepare($n);
- if ($arr) {
- $affected = $sth->execute($arr);
- } else {
- $affected = $sth->execute();
- }
- if ($this->conn->isError($affected)) {
- $this->send_err_mail($affected, $n);
- }
- $this->result = $affected->fetchCol($col);
- return $this->result;
- }
-
- /**
- * クエリを実行し、全ての行を返す
- *
- * @param string $sql SQL クエリ
- * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
- * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。
- * @return array データを含む2次元配列。失敗した場合に 0 または DB_Error オブジェクトを返します。
- */
- function getAll($sql, $arrVal = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) {
-
- // mysqlの場合にはビュー表を変換する
- if (DB_TYPE == "mysql") $sql = $this->dbFactory->sfChangeMySQL($sql);
-
- // XXX このエラー処理はここで行なうべきなのか疑問。また、戻り値も疑問(なお、変更時はドキュメントも変更を)。
- if (PEAR::isError($this->conn)) {
- if (ADMIN_MODE) {
- SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:" . $this->dsn);
- } else {
- SC_Utils_Ex::sfErrorHeader("DBへの接続に失敗しました。:");
- }
- return 0;
- }
-
- $sth = $this->conn->prepare($sql);
-
- if ($arrVal) { // FIXME 判定が曖昧
- $affected = $sth->execute($arrVal);
- } else {
- $affected = $sth->execute();
- }
-
- if ($this->conn->isError($affected)) {
- $this->send_err_mail($affected, $sql);
- }
- $this->result = $affected->fetchAll($fetchmode);
-
- return $this->result;
- }
-
- function autoExecute($table_name, $fields_values, $sql_where = null){
-
- if ( $sql_where ) {
- $result = $this->conn->autoExecute( $table_name, $fields_values, DB_AUTOQUERY_UPDATE, $sql_where);
- } else {
- $result = $this->conn->autoExecute( $table_name, $fields_values, DB_AUTOQUERY_INSERT);
- }
-
- if ($this->conn->isError($result)){
- $this->send_err_mail($result, $n);
- }
- $this->result = $result;
- return $this->result;
- }
-
-
- function prepare($n){
- global $sql;
- $sql = $n;
- $result = $this->conn->prepare($n);
- $this->result = $result;
- return $this->result;
- }
-
- function execute($n, $obj){
- global $sql;
- $sql = $n;
- $result = $this->conn->execute($n, $obj);
- $this->result = $result;
- return $this->result;
- }
-
- function reset(){
- $this->conn->disconnect();
- }
-
- function send_err_mail($pearResult, $sql){
-
- $errmsg = $sql . "\n\n";
-
- // PEAR エラーを伴う場合
- if (!is_null($pearResult)) {
- $errmsg .= $pearResult->message . "\n\n";
- $errmsg .= $pearResult->userinfo . "\n\n";
- $errmsg .= SC_Utils_Ex::sfBacktraceToString($pearResult->backtrace);
- }
- // (上に該当せず)バックトレースを生成できる環境(一般的には PHP 4 >= 4.3.0, PHP 5)の場合
- else if (function_exists("debug_backtrace")) {
- $errmsg .= SC_Utils_Ex::sfBacktraceToString(array_slice(debug_backtrace(), 2));
- }
-
- GC_Utils_Ex::gfPrintLog($errmsg);
- trigger_error($errmsg, E_USER_ERROR);
- exit();
- }
-
- /**
- * 直前に実行されたSQL文を取得する.
- *
- * @param boolean $disp trueの場合、画面出力を行う.
- * @return string SQL文
- */
- function getLastQuery($disp = true) {
- $sql = $this->conn->last_query;
- if($disp) {
- print($sql.";
\n");
- }
- return $sql;
- }
-}
-?>
Index: /branches/version-2_5-dev/test/class/SC_Query_Test.php
===================================================================
--- /branches/version-2_5-dev/test/class/SC_Query_Test.php (revision 18769)
+++ /branches/version-2_5-dev/test/class/SC_Query_Test.php (revision 18773)
@@ -132,5 +132,5 @@
$this->expected = array(1, 2);
- $this->actual = $this->objQuery->getCol("test_table", "column1, column2", "id < ?", array(3));
+ $this->actual = $this->objQuery->getCol("test_table", "column1", "id < ?", array(3));
$this->verify();