OSDN Git Service

DBリストア処理追加。
authornaoki hirata <naoki@magic3.org>
Sun, 24 Nov 2013 11:10:49 +0000 (20:10 +0900)
committernaoki hirata <naoki@magic3.org>
Sun, 24 Nov 2013 11:10:49 +0000 (20:10 +0900)
include/db/specificDb.php
include/global.php
include/manager/dbManager.php
widgets/admin_main/include/container/admin_mainDbbackupWidgetContainer.php
widgets/admin_main/include/template/dbbackup.tmpl.html

index 85dca52..ca3576e 100644 (file)
@@ -106,6 +106,46 @@ class specificDb extends BaseDb
                return $ret;
        }
        /**
+        * データベースをリストア
+        *
+        * @param string $filename              バックアップファイル名
+        * @return bool                                 true=正常、false=異常
+        */
+       function restoreDb($filename)
+       {
+               $ret = false;
+               $dbType = $this->getDbType();
+               switch ($dbType){
+                       case M3_DB_TYPE_MYSQL:          // MySQLの場合
+                               // 一時ファイルに解凍
+                               $tmpFile = tempnam($this->gEnv->getWorkDirPath(), M3_SYSTEM_WORK_BACKUP_FILENAME_HEAD);
+                               $sfp = gzopen($filename, "rb");
+                               $fp = fopen($tmpFile, "w");
+                               while ($string = gzread($sfp, 4096)) {
+                                       fwrite($fp, $string, strlen($string));
+                               }
+                               gzclose($sfp);
+                               fclose($fp);
+
+                               // リストアコマンド実行
+                               $cmd = "mysql -u$this->_connect_user -p$this->_connect_password -e 'source $tmpFile' $this->_dbName";
+                               $ret = $this->_procExec($cmd);
+                               if ($ret == 0){
+                                       $ret = true;
+                               } else {
+                                       $ret = false;
+                               }
+                               
+                               // 一時ファイル削除
+                               unlink($tmpFile);
+                               break;
+                       case M3_DB_TYPE_PGSQL:          // PostgreSQLの場合
+
+                               break;
+               }
+               return $ret;
+       }
+       /**
         * シェルコマンドを実行
         *
         * @param string $command               コマンド
index e4cab0f..81ff032 100644 (file)
@@ -188,6 +188,7 @@ define('M3_WIDGET_TYPE_USER',       'user');                                // ユーザ作成コンテンツ
 define('M3_SYSTEM_WORK_DIR_PATH',                              '/tmp');                        // 作業用ディレクトリ
 define('M3_SYSTEM_WORK_UPLOAD_FILENAME_HEAD',  'm3_upload_');          // アップロードファイル一時退避用ファイル名ヘッダ
 define('M3_SYSTEM_WORK_DOWNLOAD_FILENAME_HEAD',        'm3_download_');        // ダウンロードファイル一時退避用ファイル名ヘッダ
+define('M3_SYSTEM_WORK_BACKUP_FILENAME_HEAD',  'm3_backup_');          // バックアップファイル一時退避用ファイル名ヘッダ
 define('M3_SYSTEM_WORK_DIRNAME_HEAD',                  'm3_tmp_');                     // 一時ディレクトリ名ヘッダ
 
 // ######### DB定義 ###########
index 1dd95d9..9f0fcaf 100644 (file)
@@ -273,5 +273,16 @@ class DbManager extends Core
                $ret = $this->specificDb->backupDb($filename);
                return $ret;
        }
+       /**
+        * データベースをリストア
+        *
+        * @param string $filename              バックアップファイル名
+        * @return bool                                 true=正常、false=異常
+        */
+       function restoreDb($filename)
+       {
+               $ret = $this->specificDb->restoreDb($filename);
+               return $ret;
+       }
 }
 ?>
index 197b1a3..9d7ebab 100644 (file)
@@ -77,9 +77,18 @@ class admin_mainDbbackupWidgetContainer extends admin_mainMainteBaseWidgetContai
                $backupDir = $this->gEnv->getIncludePath() . self::BACKUP_DIR;                          // バックアップファイル格納ディレクトリ
                if (!file_exists($backupDir)) @mkdir($backupDir, M3_SYSTEM_DIR_PERMISSION, true/*再帰的に作成*/);
 
-               if ($act == 'new'){
+               if ($act == 'new'){                     // バックアップ処理
+                       // タイムアウトを停止
+                       $this->gPage->setNoTimeout();
+                       
                        $backupFile = $backupDir . DIRECTORY_SEPARATOR . self::BACKUP_FILENAME_HEAD . date('Ymd-His') . '.sql.gz';
                        $this->gInstance->getDbManager()->backupDb($backupFile);
+               } else if ($act == 'restore'){          // リストア処理
+                       // タイムアウトを停止
+                       $this->gPage->setNoTimeout();
+                       
+                       $restoreFilename = $backupDir . DIRECTORY_SEPARATOR . $filename;
+                       $this->gInstance->getDbManager()->restoreDb($restoreFilename);
                } if ($act == 'delete'){                // メニュー項目の削除
                        $listedItem = explode(',', $request->trimValueOf('filelist'));
                        $delItems = array();
@@ -127,7 +136,7 @@ class admin_mainDbbackupWidgetContainer extends admin_mainMainteBaseWidgetContai
                        $row = array(
                                'index'                 => $i,
                                'filename'      => $this->convertToDispString($fileName),                       // ファイル名
-                               'size'                  => $size                        // ファイルサイズ
+                               'size'                  => number_format($size)                 // ファイルサイズ
                        );
                        $this->tmpl->addVars('file_list', $row);
                        $this->tmpl->parseTemplate('file_list', 'a');
index 30818ea..41b8a31 100644 (file)
@@ -19,6 +19,13 @@ function newItem(){
        document.main.submit();
        return true;
 }
+function restore(filename){
+       if (!window.confirm('DBのリストアを行いますか?\nこの操作を行うとDBの内容はすべて置き替わります')) return false;
+       document.main.act.value = 'restore';
+       document.main.filename.value = filename;
+       document.main.submit();
+       return true;
+}
 function download(filename){
        document.main.act.value = 'download';
        document.main.filename.value = filename;
@@ -81,7 +88,7 @@ $(function(){
         <td align="center"><input type="checkbox" name="item{INDEX}_selected" /></td>
            <td>{FILENAME}</td>
                <td align="right">{SIZE}</td>
-           <td align="center"><input type="button" class="button" onclick="download('{FILENAME}');" value="ダウンロード" /></td>
+           <td align="center"><input type="button" class="button" onclick="download('{FILENAME}');" value="ダウンロード" /><input type="button" class="button" onclick="restore('{FILENAME}');" value="リストア" /></td>
        </tr>
        </patTemplate:tmpl>
     </tbody>