インストーラ改修(4) テーブルprefix対応
DBのprefix設定に対応してみました。
2010/04/19
1つのDBに複数をインストールする場合のために、外部キ−名にもprefixを適用追加が必要でした
SQL実行は、
1.SQLダンプファイルを__executeSQLScript()でファイルに読み込み、stringで取得
2. ; でSQL一文ごとの配列に区切り
3.逐次実行
なので、2と3の間に正規表現置換を入れました。
ダンプファイルの形式細部が違うと無効ですが、 mysqldumpで作成したダンプを使う前提にしました。
--- a/app/plugins/install/controllers/install_controller.php
+++ b/app/plugins/install/controllers/install_controller.php
@@ -126,7 +126,7 @@ class InstallController extends InstallAppController {
$content = str_replace('{default_password}', $this->data['Install']['password']
$content = str_replace('{default_database}', $this->data['Install']['database']
// The database import script does not support prefixes at this point
- $content = str_replace('{default_prefix}', ''/*$this->data['Install']['prefix']
+ $content = str_replace('{default_prefix}', $this->data['Install']['prefix'], $c
if($file->write($content) ) {
$this->redirect(array('action' => 'data'));
@@ -200,8 +200,22 @@ class InstallController extends InstallAppController {
$statements = file_get_contents($fileName);
$statements = explode(';', $statements);
+ $prefix = $db->config["prefix"];
+
foreach ($statements as $statement) {
if (trim($statement) != '') {
+
+ // table prefix
+ $pattern = array(
+ '/(DROP TABLE IF EXISTS `)([a-z_]+)(`)/i', // DROP TABLE
+ '/(CREATE TABLE `)([a-z_]+)(`)/i', // CREATE TABLE
+ '/(FOREIGN KEY \(`[a-z_]+`\) REFERENCES `)([a-z_]+)(`)/i', // FOREIGN KEY
+ '/(LOCK TABLES `)([a-z_]+)(`)/i', // TABLE LOCK
+ '/(INSERT INTO `)([a-z_]+)(` VALUES)/i', // INSERT
+ '/(ALTER TABLE `)([a-z_]+)(`)/i', // ALTER TABLE
+ );
+ $statement = preg_replace($pattern, '$1'.$prefix.'$2$3', $statement);
+
$db->query($statement);
}
}
(追記分)
上記改修のみでは、1つのDBにprefixを違えて複数インストールしようとすると、 errorno 121が発生しました。
これは、同一のデータベースで複数のテーブルで同じ外部キー名を用いた時に発生するエラーだそうです。
MySQL errno 121 – K blog
以下の追加改修で、解消しました。
--- a/app/plugins/install/controllers/install_controller.php
+++ b/app/plugins/install/controllers/install_controller.php
@@ -280,6 +280,7 @@ class InstallController extends InstallAppController {
$pattern = array(
'/(DROP TABLE IF EXISTS `)([a-z_]+)(`)/i', // DROP TABLE
'/(CREATE TABLE `)([a-z_]+)(`)/i', // CREATE TABLE
+ '/(CONSTRAINT `fk_)([-a-z_]+)(`)/i', // CONSTRAINT
'/(FOREIGN KEY \(`[a-z_]+`\) REFERENCES `)([a-z_]+)(`)/i', // FOREIGN KEY
'/(LOCK TABLES `)([a-z_]+)(`)/i', // TABLE LOCK
'/(INSERT INTO `)([a-z_]+)(` VALUES)/i', // INSERT