[Svn-src-all:2752] [version-2_12-dev 21651] #1666 (create_table_*.sql 間の差異を減らす)
Seasoft
admin @ mail.ec-cube.net
2012年 3月 16日 (金) 20:14:59 JST
Subversion committed to /home/svn/open 21651
http://svn.ec-cube.net/open_trac/changeset/21651
┌────────────────────────────┐
│更新者 : Seasoft │
│更新日時: 2012-03-16 20:14:58 +0900 (金, 16 3月 2012)│
└────────────────────────────┘
Log:
--------------------------------------------------------
#1666 (create_table_*.sql 間の差異を減らす)
* インストーラから SC_DB_DBFactory_Ex#initObjQuery が呼ばれていない不具合を回避。
* インストーラから誤ったDB用の SC_DB_DBFactory_Ex#initObjQuery が呼ばれる不具合を修正。
#1613 (typo修正・ソース整形・ソースコメントの改善)
Changed: [U:修正,A:追加,D:削除]
--------------------------------------------------------
U branches/version-2_12-dev/data/class/SC_Query.php
U branches/version-2_12-dev/html/install/index.php
変更: branches/version-2_12-dev/data/class/SC_Query.php
===================================================================
--- branches/version-2_12-dev/data/class/SC_Query.php 2012-03-16 05:47:46 UTC (rev 21650)
+++ branches/version-2_12-dev/data/class/SC_Query.php 2012-03-16 11:14:58 UTC (rev 21651)
@@ -77,8 +77,11 @@
$this->conn->setCharset('utf8');
$this->conn->setFetchMode(MDB2_FETCHMODE_ASSOC);
}
- $this->dbFactory = SC_DB_DBFactory_Ex::getInstance();
+
+ // XXX 上書きインストール時にDBを変更するケースを想定し第1引数を与えている。
+ $this->dbFactory = SC_DB_DBFactory_Ex::getInstance($this->conn->dsn['phptype']);
$this->dbFactory->initObjQuery($this);
+
$this->force_run = $force_run;
}
変更: branches/version-2_12-dev/html/install/index.php
===================================================================
--- branches/version-2_12-dev/html/install/index.php 2012-03-16 05:47:46 UTC (rev 21650)
+++ branches/version-2_12-dev/html/install/index.php 2012-03-16 11:14:58 UTC (rev 21651)
@@ -119,10 +119,7 @@
break;
// テーブルの作成
case 'step3':
- // 入力データを渡す。
- $arrRet = $objDBParam->getHashArray();
- define('DB_TYPE', $arrRet['db_type']);
- $dsn = $arrRet['db_type'] . '://' . $arrRet['db_user'] . ':' . $arrRet['db_password'] . '@' . $arrRet['db_server'] . ':' . $arrRet['db_port'] . '/' . $arrRet['db_name'];
+ $arrDsn = getArrayDsn($objDBParam);
if (count($objPage->arrErr) == 0) {
// スキップする場合には次画面へ遷移
@@ -134,7 +131,7 @@
}
// テーブルの作成
- $objPage->arrErr = lfExecuteSQL('./sql/create_table_' . $arrRet['db_type'] . '.sql', $dsn);
+ $objPage->arrErr = lfExecuteSQL('./sql/create_table_' . $arrDsn['phptype'] . '.sql', $arrDsn);
if (count($objPage->arrErr) == 0) {
$objPage->tpl_message .= '○:テーブルの作成に成功しました。<br />';
} else {
@@ -143,7 +140,7 @@
// 初期データの作成
if (count($objPage->arrErr) == 0) {
- $objPage->arrErr = lfExecuteSQL('./sql/insert_data.sql', $dsn);
+ $objPage->arrErr = lfExecuteSQL('./sql/insert_data.sql', $arrDsn);
if (count($objPage->arrErr) == 0) {
$objPage->tpl_message .= '○:初期データの作成に成功しました。<br />';
} else {
@@ -153,7 +150,7 @@
// シーケンスの作成
if (count($objPage->arrErr) == 0) {
- $objPage->arrErr = lfCreateSequence(getSequences(), $dsn);
+ $objPage->arrErr = lfCreateSequence(getSequences(), $arrDsn);
if (count($objPage->arrErr) == 0) {
$objPage->tpl_message .= '○:シーケンスの作成に成功しました。<br />';
} else {
@@ -174,16 +171,11 @@
// テーブル類削除
case 'drop':
- // 入力データを渡す。
- $arrRet = $objDBParam->getHashArray();
- if (!defined('DB_TYPE')) {
- define('DB_TYPE', $arrRet['db_type']);
- }
- $dsn = $arrRet['db_type'] . '://' . $arrRet['db_user'] . ':' . $arrRet['db_password'] . '@' . $arrRet['db_server'] . ':' . $arrRet['db_port'] . '/' . $arrRet['db_name'];
+ $arrDsn = getArrayDsn($objDBParam);
// テーブルの削除
if (count($objPage->arrErr) == 0) {
- $objPage->arrErr = lfExecuteSQL('./sql/drop_table.sql', $dsn, false);
+ $objPage->arrErr = lfExecuteSQL('./sql/drop_table.sql', $arrDsn, false);
if (count($objPage->arrErr) == 0) {
$objPage->tpl_message .= '○:テーブルの削除に成功しました。<br />';
} else {
@@ -193,7 +185,7 @@
// シーケンスの削除
if (count($objPage->arrErr) == 0) {
- $objPage->arrErr = lfDropSequence(getSequences(), $dsn);
+ $objPage->arrErr = lfDropSequence(getSequences(), $arrDsn);
if (count($objPage->arrErr) == 0) {
$objPage->tpl_message .= '○:シーケンスの削除に成功しました。<br />';
} else {
@@ -501,21 +493,14 @@
// 語尾に'/'をつける
if (!ereg('/$', $normal_url)) $normal_url = $normal_url . '/';
- $arrDbParam = $objDBParam->getHashArray();
- if (!defined('DB_TYPE')) {
- define('DB_TYPE', $arrDbParam['db_type']);
- }
- $dsn = $arrDbParam['db_type'] . '://' . $arrDbParam['db_user'] . ':' . $arrDbParam['db_password'] . '@' . $arrDbParam['db_server'] . ':' . $arrDbParam['db_port'] . '/' . $arrDbParam['db_name'];
- if (!defined('DEFAULT_DSN')) {
- define('DEFAULT_DSN', $dsn);
- }
+ $arrDsn = getArrayDsn($objDBParam);
$objPage->tpl_site_url = $normal_url;
$objPage->tpl_shop_name = $objWebParam->getValue('shop_name');
$objPage->tpl_cube_ver = ECCUBE_VERSION;
$objPage->tpl_php_ver = phpversion();
- $dbFactory = SC_DB_DBFactory_Ex::getInstance($arrDbParam['db_type']);
- $objPage->tpl_db_ver = $dbFactory->sfGetDBVersion($dsn);
+ $dbFactory = SC_DB_DBFactory_Ex::getInstance($arrDsn['phptype']);
+ $objPage->tpl_db_ver = $dbFactory->sfGetDBVersion($arrDsn);
$objPage->tpl_db_skip = $_POST['db_skip'];
$objPage->tpl_mainpage = 'step4.tpl';
$objPage->tpl_mode = 'complete';
@@ -531,10 +516,8 @@
// hiddenに入力値を保持
$objPage->arrHidden = array_merge($objPage->arrHidden, $objDBParam->getHashArray());
- // ショップマスター情報の書き込み
- $arrRet = $objDBParam->getHashArray();
+ $arrDsn = getArrayDsn($objDBParam);
- $dsn = $arrRet['db_type'] . '://' . $arrRet['db_user'] . ':' . $arrRet['db_password'] . '@' . $arrRet['db_server'] . ':' . $arrRet['db_port'] . '/' . $arrRet['db_name'];
$sqlval['shop_name'] = $objWebParam->getValue('shop_name');
$sqlval['email01'] = $objWebParam->getValue('admin_mail');
$sqlval['email02'] = $objWebParam->getValue('admin_mail');
@@ -546,7 +529,7 @@
$sqlval['detail_tpl'] = 'default1';
$sqlval['mypage_tpl'] = 'default1';
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
- $objQuery = new SC_Query($dsn);
+ $objQuery = new SC_Query($arrDsn);
$cnt = $objQuery->count('dtb_baseinfo');
if ($cnt > 0) {
$objQuery->update('dtb_baseinfo', $sqlval);
@@ -705,11 +688,11 @@
}
// 入力内容のチェック
-function lfCheckWebError($objFormParam) {
+function lfCheckWebError($objWebParam) {
// 入力データを渡す。
- $arrRet = $objFormParam->getHashArray();
+ $arrRet = $objWebParam->getHashArray();
$objErr = new SC_CheckError($arrRet);
- $objErr->arrErr = $objFormParam->checkError();
+ $objErr->arrErr = $objWebParam->checkError();
// ディレクトリ名のみ取得する
$normal_dir = ereg_replace('^https?://[a-zA-Z0-9_~=&\?\.\-]+', '', $arrRet['normal_url']);
@@ -724,13 +707,13 @@
$objErr->doFunc(array('管理者:ログインID', 'login_id', ID_MIN_LEN, ID_MAX_LEN), array('SPTAB_CHECK', 'NUM_RANGE_CHECK'));
// パスワードのチェック
- $objErr->doFunc( array('管理者:パスワード', 'login_pass', ID_MIN_LEN, ID_MAX_LEN), array('SPTAB_CHECK', 'NUM_RANGE_CHECK'));
+ $objErr->doFunc(array('管理者:パスワード', 'login_pass', ID_MIN_LEN, ID_MAX_LEN), array('SPTAB_CHECK', 'NUM_RANGE_CHECK'));
// 管理機能ディレクトリのチェック
- $objErr->doFunc( array('管理機能:ディレクトリ', 'admin_dir', ID_MIN_LEN, ID_MAX_LEN), array('SPTAB_CHECK', 'NUM_RANGE_CHECK'));
+ $objErr->doFunc(array('管理機能:ディレクトリ', 'admin_dir', ID_MIN_LEN, ID_MAX_LEN), array('SPTAB_CHECK', 'NUM_RANGE_CHECK'));
$oldAdminDir = SC_Utils_Ex::sfTrimURL(ADMIN_DIR);
- $newAdminDir = $objFormParam->getValue('admin_dir');
+ $newAdminDir = $objWebParam->getValue('admin_dir');
if ($oldAdminDir !== $newAdminDir AND file_exists(HTML_REALDIR . $newAdminDir) and $newAdminDir != 'admin') {
$objErr->arrErr['admin_dir'] = '※ 指定した管理機能ディレクトリは既に存在しています。別の名前を指定してください。';
}
@@ -739,29 +722,25 @@
}
// 入力内容のチェック
-function lfCheckDBError($objFormParam) {
+function lfCheckDBError($objDBParam) {
global $objPage;
// 入力データを渡す。
- $arrRet = $objFormParam->getHashArray();
+ $arrRet = $objDBParam->getHashArray();
$objErr = new SC_CheckError($arrRet);
- $objErr->arrErr = $objFormParam->checkError();
+ $objErr->arrErr = $objDBParam->checkError();
if (count($objErr->arrErr) == 0) {
- if (!defined('DB_TYPE')) {
- define('DB_TYPE', $arrRet['db_type']);
- }
- // 接続確認
- $dsn = $arrRet['db_type'] . '://' . $arrRet['db_user'] . ':' . $arrRet['db_password'] . '@' . $arrRet['db_server'] . ':' . $arrRet['db_port'] . '/' . $arrRet['db_name'];
+ $arrDsn = getArrayDsn($objDBParam);
// Debugモード指定
$options['debug'] = PEAR_DB_DEBUG;
- $objDB = MDB2::connect($dsn, $options);
+ $objDB = MDB2::connect($arrDsn, $options);
// 接続成功
if (!PEAR::isError($objDB)) {
- $dbFactory = SC_DB_DBFactory_Ex::getInstance($arrRet['db_type']);
+ $dbFactory = SC_DB_DBFactory_Ex::getInstance($arrDsn['phptype']);
// データベースバージョン情報の取得
- $objPage->tpl_db_version = $dbFactory->sfGetDBVersion($dsn);
+ $objPage->tpl_db_version = $dbFactory->sfGetDBVersion($arrDsn);
} else {
$objErr->arrErr['all'] = '>> ' . $objDB->message . '<br />';
// エラー文を取得する
@@ -774,7 +753,7 @@
}
// SQL文の実行
-function lfExecuteSQL($filepath, $dsn, $disp_err = true) {
+function lfExecuteSQL($filepath, $arrDsn, $disp_err = true) {
$arrErr = array();
if (!file_exists($filepath)) {
@@ -786,10 +765,18 @@
}
// Debugモード指定
$options['debug'] = PEAR_DB_DEBUG;
- $objDB = MDB2::connect($dsn, $options);
+ $objDB = MDB2::connect($arrDsn, $options);
// 接続エラー
if (!PEAR::isError($objDB)) {
$objDB->setCharset('utf8');
+
+ // MySQL 用の初期化
+ // XXX SC_Query を使うようにすれば、この処理は不要となる
+ if ($arrDsn['phptype'] === 'mysql') {
+ $objDB->exec('SET SESSION storage_engine = InnoDB');
+ $objDB->exec("SET SESSION sql_mode = 'ANSI'");
+ }
+
$sql_split = split(';', $sql);
foreach ($sql_split as $key => $val) {
SC_Utils::sfFlush(true);
@@ -820,15 +807,15 @@
* シーケンスを削除する.
*
* @param array $arrSequences シーケンスのテーブル名, カラム名の配列
- * @param string $dsn データソース名
+ * @param array $arrDsn データソース名の配列
* @return array エラーが発生した場合はエラーメッセージの配列
*/
-function lfDropSequence($arrSequences, $dsn) {
+function lfDropSequence($arrSequences, $arrDsn) {
$arrErr = array();
// Debugモード指定
$options['debug'] = PEAR_DB_DEBUG;
- $objDB = MDB2::connect($dsn, $options);
+ $objDB = MDB2::connect($arrDsn, $options);
$objManager =& $objDB->loadModule('Manager');
// 接続エラー
@@ -859,15 +846,15 @@
* シーケンスを生成する.
*
* @param array $arrSequences シーケンスのテーブル名, カラム名の配列
- * @param string $dsn データソース名
+ * @param array $arrDsn データソース名の配列
* @return array エラーが発生した場合はエラーメッセージの配列
*/
-function lfCreateSequence($arrSequences, $dsn) {
+function lfCreateSequence($arrSequences, $arrDsn) {
$arrErr = array();
// Debugモード指定
$options['debug'] = PEAR_DB_DEBUG;
- $objDB = MDB2::connect($dsn, $options);
+ $objDB = MDB2::connect($arrDsn, $options);
$objManager =& $objDB->loadModule('Manager');
// 接続エラー
@@ -1072,3 +1059,28 @@
}
return true;
}
+
+function getArrayDsn(SC_FormParam $objDBParam) {
+ $arrRet = $objDBParam->getHashArray();
+
+ if (!defined('DB_TYPE')) {
+ define('DB_TYPE', $arrRet['db_type']);
+ }
+
+ $arrDsn = array(
+ 'phptype' => $arrRet['db_type'],
+ 'username' => $arrRet['db_user'],
+ 'password' => $arrRet['db_password'],
+ 'hostspec' => $hostspec,
+ 'port' => $arrRet['db_port'],
+ 'database' => $arrRet['db_name'],
+ );
+
+ // 文字列形式の DSN との互換処理
+ if ($arrRet['db_server'] !== '+') {
+ $arrDsn['hostspec'] = $arrRet['db_server'];
+ $arrDsn['port'] = $arrRet['db_port'];
+ }
+
+ return $arrDsn;
+}
Svn-src-all メーリングリストの案内