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 コマンド
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定義 ###########
$ret = $this->specificDb->backupDb($filename);
return $ret;
}
+ /**
+ * データベースをリストア
+ *
+ * @param string $filename バックアップファイル名
+ * @return bool true=正常、false=異常
+ */
+ function restoreDb($filename)
+ {
+ $ret = $this->specificDb->restoreDb($filename);
+ return $ret;
+ }
}
?>
$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();
$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');
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;
<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>