Changeset 16251 for branches/feature-module-update
- Timestamp:
- 2007/10/03 17:47:48 (16 years ago)
- Location:
- branches/feature-module-update
- Files:
-
- 2 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/feature-module-update/html/admin/system/bkup.php
r15532 r16251 5 5 * http://www.lockon.co.jp/ 6 6 */ 7 require_once("../require.php");8 require_once(DATA_PATH. "module/Tar.php");9 7 10 //ページ管理クラス 11 class LC_Page { 12 //コンストラクタ 13 function LC_Page() { 14 //メインテンプレートの指定 15 $this->tpl_mainpage = 'system/bkup.tpl'; 16 $this->tpl_subnavi = 'system/subnavi.tpl'; 17 $this->tpl_mainno = 'system'; 18 $this->tpl_subno = 'bkup'; 19 $this->tpl_subtitle = 'バックアップ管理'; 20 21 $this->bkup_dir = USER_PATH . "bkup/"; 22 } 23 } 8 // {{{ requires 9 require_once("../../require.php"); 10 require_once(CLASS_PATH . "page_extends/admin/system/LC_Page_Admin_System_Bkup_Ex.php"); 24 11 25 $objPage = new LC_Page(); 26 $objView = new SC_AdminView(); 27 $objQuery = new SC_Query(); 12 // }}} 13 // {{{ generate page 28 14 29 // セッションクラス 30 $objSess = new SC_Session(); 31 // 認証可否の判定 32 sfIsSuccess($objSess); 33 34 // バックアップテーブルがなければ作成する 35 lfCreateBkupTable(); 36 37 switch($_POST['mode']) { 38 // バックアップを作成する 39 case 'bkup': 40 // 入力文字列の変換 41 $arrData = lfConvertParam($_POST); 42 43 // エラーチェック 44 $arrErr = lfCheckError($arrData); 45 46 // エラーがなければバックアップ処理を行う 47 if (count($arrErr) <= 0) { 48 // バックアップファイル作成 49 $arrErr = lfCreateBkupData($arrData['bkup_name']); 50 51 // DBにデータ更新 52 if (count($arrErr) <= 0) { 53 lfUpdBkupData($arrData); 54 }else{ 55 $arrForm = $arrData; 56 } 57 58 $objPage->tpl_onload = "alert('バックアップ完了しました');"; 59 }else{ 60 $arrForm = $arrData; 61 } 62 63 break; 64 65 // リストア 66 case 'restore': 67 case 'restore_config': 68 if ($_POST['mode'] == 'restore_config') { 69 $objPage->mode = "restore_config"; 70 } 71 72 lfRestore($_POST['list_name']); 73 74 break; 75 76 // 削除 77 case 'delete': 78 $del_file = $objPage->bkup_dir.$_POST['list_name'] . ".tar.gz"; 79 // ファイルの削除 80 if(is_file($del_file)){ 81 $ret = unlink($del_file); 82 } 83 84 // DBから削除 85 $delsql = "DELETE FROM dtb_bkup WHERE bkup_name = ?"; 86 $objQuery->query($delsql, array($_POST['list_name'])); 87 88 break; 89 90 // ダウンロード 91 case 'download' : 92 $filename = $_POST['list_name'] . ".tar.gz"; 93 $dl_file = $objPage->bkup_dir.$_POST['list_name'] . ".tar.gz"; 94 95 // ダウンロード開始 96 Header("Content-disposition: attachment; filename=${filename}"); 97 Header("Content-type: application/octet-stream; name=${filename}"); 98 header("Content-Length: " .filesize($dl_file)); 99 readfile ($dl_file); 100 exit(); 101 break; 102 103 default: 104 break; 105 } 106 107 // バックアップリストを取得する 108 $arrBkupList = lfGetBkupData("ORDER BY create_date DESC"); 109 // テンプレートファイルに渡すデータをセット 110 $objPage->arrErr = $arrErr; 111 $objPage->arrForm = $arrForm; 112 $objPage->arrBkupList = $arrBkupList; 113 114 $objView->assignobj($objPage); //変数をテンプレートにアサインする 115 $objView->display(MAIN_FRAME); //テンプレートの出力 116 117 //------------------------------------------------------------------------------------------------------- 118 /* 取得文字列の変換 */ 119 function lfConvertParam($array) { 120 /* 121 * 文字列の変換 122 * K : 「半角(ハンカク)片仮名」を「全角片仮名」に変換 123 * C : 「全角ひら仮名」を「全角かた仮名」に変換 124 * V : 濁点付きの文字を一文字に変換。"K","H"と共に使用します 125 * n : 「全角」数字を「半角(ハンカク)」に変換 126 * a : 全角英数字を半角英数字に変換する 127 */ 128 $arrConvList['bkup_name'] = "a"; 129 $arrConvList['bkup_memo'] = "KVa"; 130 131 // 文字変換 132 foreach ($arrConvList as $key => $val) { 133 // POSTされてきた値のみ変換する。 134 if(isset($array[$key])) { 135 $array[$key] = mb_convert_kana($array[$key] ,$val); 136 } 137 } 138 return $array; 139 } 140 141 // エラーチェック 142 function lfCheckError($array){ 143 $objErr = new SC_CheckError($array); 144 145 $objErr->doFunc(array("バックアップ名", "bkup_name", STEXT_LEN), array("EXIST_CHECK","MAX_LENGTH_CHECK","NO_SPTAB","ALNUM_CHECK")); 146 $objErr->doFunc(array("バックアップメモ", "bkup_memo", MTEXT_LEN), array("MAX_LENGTH_CHECK")); 147 148 // 重複チェック 149 $ret = lfGetBkupData("WHERE bkup_name = ?", array($array['bkup_name'])); 150 if (count($ret) > 0) { 151 $objErr->arrErr['bkup_name'] = "バックアップ名が重複しています。別名を入力してください。"; 152 } 153 154 return $objErr->arrErr; 155 } 156 157 // バックアップファイル作成 158 function lfCreateBkupData($bkup_name){ 159 global $objPage; 160 $objQuery = new SC_Query(); 161 $csv_data = ""; 162 $csv_autoinc = ""; 163 $err = true; 164 165 $bkup_dir = $objPage->bkup_dir; 166 if (!is_dir(dirname($bkup_dir))) $err = mkdir(dirname($bkup_dir)); 167 $bkup_dir = $bkup_dir . $bkup_name . "/"; 168 169 // 全テーブル取得 170 $arrTableList = lfGetTableList(); 171 172 // 各テーブル情報を取得する 173 foreach($arrTableList as $key => $val){ 174 175 if ($val != "dtb_bkup") { 176 177 // 自動採番型の構成を取得する 178 $csv_autoinc .= lfGetAutoIncrement($val); 179 180 // 全データを取得 181 if ($val == "dtb_pagelayout"){ 182 $arrData = $objQuery->getAll("SELECT * FROM $val ORDER BY page_id"); 183 }else{ 184 $arrData = $objQuery->getAll("SELECT * FROM $val"); 185 } 186 187 // CSVデータ生成 188 if (count($arrData) > 0) { 189 190 // カラムをCSV形式に整える 191 $arrKyes = sfGetCommaList(array_keys($arrData[0]), false); 192 193 // データをCSV形式に整える 194 $data = ""; 195 foreach($arrData as $data_key => $data_val){ 196 //$val = str_replace("\"", "\\\"", $val); 197 $data .= lfGetCSVList($arrData[$data_key]); 198 199 } 200 // CSV出力データ生成 201 $csv_data .= $val . "\n"; 202 $csv_data .= $arrKyes . "\n"; 203 $csv_data .= $data; 204 $csv_data .= "\n"; 205 } 206 207 // タイムアウトを防ぐ 208 sfFlush(); 209 } 210 } 211 212 $csv_file = $bkup_dir . "bkup_data.csv"; 213 $csv_autoinc_file = $bkup_dir . "autoinc_data.csv"; 214 mb_internal_encoding(CHAR_CODE); 215 // CSV出力 216 // ディレクトリが存在していなければ作成する 217 if (!is_dir(dirname($csv_file))) { 218 $err = mkdir(dirname($csv_file)); 219 } 220 if ($err) { 221 // dataをCSV出力 222 $fp = fopen($csv_file,"w"); 223 if($fp) { 224 if($csv_data != ""){ 225 $err = fwrite($fp, $csv_data); 226 } 227 fclose($fp); 228 } 229 230 // 自動採番をCSV出力 231 $fp = fopen($csv_autoinc_file,"w"); 232 if($fp) { 233 if($csv_autoinc != ""){ 234 $err = fwrite($fp, $csv_autoinc); 235 } 236 fclose($fp); 237 } 238 } 239 240 // 各種ファイルコピー 241 if ($err) { 242 // 商品画像ファイルをコピー 243 // ディレクトリが存在していなければ作成する 244 $image_dir = $bkup_dir . "save_image/"; 245 if (!is_dir(dirname($image_dir))) $err = mkdir(dirname($image_dir)); 246 $copy_mess = ""; 247 $copy_mess = sfCopyDir("../../upload/save_image/",$image_dir, $copy_mess); 248 249 // テンプレートファイルをコピー 250 // ディレクトリが存在していなければ作成する 251 $templates_dir = $bkup_dir . "templates/"; 252 if (!is_dir(dirname($templates_dir))) $err = mkdir(dirname($templates_dir)); 253 $copy_mess = ""; 254 $copy_mess = sfCopyDir("../../user_data/templates/",$templates_dir, $copy_mess); 255 256 // インクルードファイルをコピー 257 // ディレクトリが存在していなければ作成する 258 $inc_dir = $bkup_dir . "include/"; 259 if (!is_dir(dirname($inc_dir))) $err = mkdir(dirname($inc_dir)); 260 $copy_mess = ""; 261 $copy_mess = sfCopyDir("../../user_data/include/",$inc_dir, $copy_mess); 262 263 // CSSファイルをコピー 264 // ディレクトリが存在していなければ作成する 265 $css_dir = $bkup_dir . "css/"; 266 if (!is_dir(dirname($css_dir))) $err = mkdir(dirname($css_dir)); 267 $copy_mess = ""; 268 $copy_mess = sfCopyDir("../../user_data/css/",$css_dir, $copy_mess); 269 270 //圧縮フラグTRUEはgzip圧縮をおこなう 271 $tar = new Archive_Tar($objPage->bkup_dir . $bkup_name.".tar.gz", TRUE); 272 273 //bkupフォルダに移動する 274 chdir($objPage->bkup_dir); 275 276 //圧縮をおこなう 277 $zip = $tar->create("./" . $bkup_name . "/"); 278 279 // バックアップデータの削除 280 if ($zip) sfDelFile($bkup_dir); 281 } 282 283 if (!$err) { 284 $arrErr['bkup_name'] = "バックアップに失敗しました。"; 285 // バックアップデータの削除 286 sfDelFile($bkup_dir); 287 } 288 289 return $arrErr; 290 } 291 292 /* 配列の要素をCSVフォーマットで出力する。*/ 293 function lfGetCSVList($array) { 294 if (count($array) > 0) { 295 foreach($array as $key => $val) { 296 $val = mb_convert_encoding($val, CHAR_CODE, CHAR_CODE); 297 $val = str_replace("\"", "\\\"", $val); 298 $line .= "\"".$val."\","; 299 } 300 $line = ereg_replace(",$", "\n", $line); 301 }else{ 302 return false; 303 } 304 return $line; 305 } 306 307 // 全テーブルリストを取得する 308 function lfGetTableList(){ 309 $objQuery = new SC_Query(); 310 311 if(DB_TYPE == "pgsql"){ 312 $sql = "SELECT tablename FROM pg_tables WHERE tableowner = ? ORDER BY tablename ; "; 313 $arrRet = $objQuery->getAll($sql, array(DB_USER)); 314 $arrRet = sfSwapArray($arrRet); 315 $arrRet = $arrRet['tablename']; 316 }else if(DB_TYPE == "mysql"){ 317 $sql = "SHOW TABLES;"; 318 $arrRet = $objQuery->getAll($sql); 319 $arrRet = sfSwapArray($arrRet); 320 321 // キーを取得 322 $arrKey = array_keys($arrRet); 323 324 $arrRet = $arrRet[$arrKey[0]]; 325 } 326 return $arrRet; 327 } 328 329 // 自動採番型をCSV出力形式に変換する 330 function lfGetAutoIncrement($table_name){ 331 $arrColList = lfGetColumnList($table_name); 332 $ret = ""; 333 334 if(DB_TYPE == "pgsql"){ 335 $match = 'nextval(\''; 336 }else if(DB_TYPE == "mysql"){ 337 $match = "auto_incr"; 338 } 339 340 foreach($arrColList['col_def'] as $key => $val){ 341 342 if (substr($val,0,9) == $match) { 343 $col = $arrColList['col_name'][$key]; 344 $autoVal = lfGetAutoIncrementVal($table_name, $col); 345 $ret .= "$table_name,$col,$autoVal\n"; 346 } 347 } 348 349 return $ret; 350 } 351 352 // テーブル構成を取得する 353 function lfGetColumnList($table_name){ 354 $objQuery = new SC_Query(); 355 356 if(DB_TYPE == "pgsql"){ 357 $sql = "SELECT 358 a.attname, t.typname, a.attnotnull, d.adsrc as defval, a.atttypmod, a.attnum as fldnum, e.description 359 FROM 360 pg_class c, 361 pg_type t, 362 pg_attribute a left join pg_attrdef d on (a.attrelid=d.adrelid and a.attnum=d.adnum) 363 left join pg_description e on (a.attrelid=e.objoid and a.attnum=e.objsubid) 364 WHERE (c.relname=?) AND (c.oid=a.attrelid) AND (a.atttypid=t.oid) AND a.attnum > 0 365 ORDER BY fldnum"; 366 $arrColList = $objQuery->getAll($sql, array($table_name)); 367 $arrColList = sfSwapArray($arrColList); 368 369 $arrRet['col_def'] = $arrColList['defval']; 370 $arrRet['col_name'] = $arrColList['attname']; 371 }else if(DB_TYPE == "mysql"){ 372 $sql = "SHOW COLUMNS FROM $table_name"; 373 $arrColList = $objQuery->getAll($sql); 374 $arrColList = sfSwapArray($arrColList); 375 376 $arrRet['col_def'] = $arrColList['Extra']; 377 $arrRet['col_name'] = $arrColList['Field']; 378 } 379 return $arrRet; 380 } 381 382 // 自動採番型の値を取得する 383 function lfGetAutoIncrementVal($table_name , $colname = ""){ 384 $objQuery = new SC_Query(); 385 $ret = ""; 386 387 if(DB_TYPE == "pgsql"){ 388 $ret = $objQuery->nextval($table_name, $colname) - 1; 389 }else if(DB_TYPE == "mysql"){ 390 $sql = "SHOW TABLE STATUS LIKE ?"; 391 $arrData = $objQuery->getAll($sql, array($table_name)); 392 $ret = $arrData[0]['Auto_increment']; 393 } 394 return $ret; 395 } 396 397 // バックアップテーブルにデータを更新する 398 function lfUpdBkupData($data){ 399 $objQuery = new SC_Query(); 400 401 $sql = "INSERT INTO dtb_bkup (bkup_name,bkup_memo,create_date) values (?,?,now())"; 402 $objQuery->query($sql, array($data['bkup_name'],$data['bkup_memo'])); 403 } 404 405 // バックアップテーブルからデータを取得する 406 function lfGetBkupData($where = "", $data = array()){ 407 $objQuery = new SC_Query(); 408 409 $sql = "SELECT bkup_name, bkup_memo, create_date FROM dtb_bkup "; 410 if ($where != "") $sql .= $where; 411 412 $ret = $objQuery->getall($sql,$data); 413 414 return $ret; 415 } 416 417 // バックアップファイルをリストアする 418 function lfRestore($bkup_name){ 419 global $objPage; 420 $objQuery = new SC_Query("", false); 421 $csv_data = ""; 422 $err = true; 423 424 $bkup_dir = $objPage->bkup_dir . $bkup_name . "/"; 425 426 //バックアップフォルダに移動する 427 chdir($objPage->bkup_dir); 428 429 //圧縮フラグTRUEはgzip解凍をおこなう 430 $tar = new Archive_Tar($bkup_name . ".tar.gz", TRUE); 431 432 //指定されたフォルダ内に解凍する 433 $err = $tar->extract("./"); 434 435 // 無事解凍できれば、リストアを行う 436 if ($err) { 437 438 // トランザクション開始 439 $objQuery->begin(); 440 441 // DBをクリア 442 $err = lfDeleteAll($objQuery); 443 444 // INSERT実行 445 if ($err) $err = lfExeInsertSQL($objQuery, $bkup_dir . "bkup_data.csv"); 446 447 // 自動採番の値をセット 448 if ($err) lfSetAutoInc($objQuery, $bkup_dir . "autoinc_data.csv"); 449 450 // 各種ファイルのコピー 451 if ($err) { 452 // 画像のコピー 453 $image_dir = $bkup_dir . "save_image/"; 454 $copy_mess = ""; 455 $copy_mess = sfCopyDir($image_dir, "../../upload/save_image/", $copy_mess, true); 456 457 // テンプレートのコピー 458 $tmp_dir = $bkup_dir . "templates/"; 459 $copy_mess = ""; 460 $copy_mess = sfCopyDir($tmp_dir, "../../user_data/templates/", $copy_mess, true); 461 462 // インクルードファイルのコピー 463 $inc_dir = $bkup_dir . "include/"; 464 $copy_mess = ""; 465 $copy_mess = sfCopyDir($inc_dir, "../../user_data/include/", $copy_mess, true); 466 467 // CSSのコピー 468 $css_dir = $bkup_dir . "css/"; 469 $copy_mess = ""; 470 $copy_mess = sfCopyDir($css_dir, "../../user_data/css/", $copy_mess, true); 471 472 // バックアップデータの削除 473 sfDelFile($bkup_dir); 474 } 475 476 // リストア成功ならコミット失敗ならロールバック 477 if ($err) { 478 $objQuery->commit(); 479 $objPage->restore_msg = "リストア終了しました。"; 480 $objPage->restore_err = true; 481 }else{ 482 $objQuery->rollback(); 483 $objPage->restore_msg = "リストアに失敗しました。"; 484 $objPage->restore_name = $bkup_name; 485 $objPage->restore_err = false; 486 } 487 } 488 } 489 490 // CSVファイルからインサート実行 491 function lfExeInsertSQL($objQuery, $csv){ 492 global $objPage; 493 494 $sql = ""; 495 $base_sql = ""; 496 $tbl_flg = false; 497 $col_flg = false; 498 $ret = true; 499 $pagelayout_flg = false; 500 $mode = $objPage->mode; 501 502 // csvファイルからデータの取得 503 $fp = fopen($csv, "r"); 504 while (!feof($fp)) { 505 $data = fgetcsv($fp, 1000000); 506 507 //空白行のときはテーブル変更 508 if (count($data) <= 1 and $data[0] == "") { 509 $base_sql = ""; 510 $tbl_flg = false; 511 $col_flg = false; 512 continue; 513 } 514 515 // テーブルフラグがたっていない場合にはテーブル名セット 516 if (!$tbl_flg) { 517 $base_sql = "INSERT INTO $data[0] "; 518 $tbl_flg = true; 519 520 if($data[0] == "dtb_pagelayout"){ 521 $pagelayout_flg = true; 522 } 523 524 continue; 525 } 526 527 // カラムフラグがたっていない場合にはカラムセット 528 if (!$col_flg) { 529 if ($mode != "restore_config"){ 530 $base_sql .= " ( $data[0] "; 531 for($i = 1; $i < count($data); $i++){ 532 $base_sql .= "," . $data[$i]; 533 } 534 $base_sql .= " ) "; 535 } 536 $col_flg = true; 537 continue; 538 } 539 540 // インサートする値をセット 541 $sql = $base_sql . "VALUES ( ? "; 542 for($i = 1; $i < count($data); $i++){ 543 $sql .= ", ?"; 544 } 545 $sql .= " );"; 546 $data = str_replace("\\\"", "\"", $data); 547 $err = $objQuery->query($sql, $data); 548 549 // エラーがあれば終了 550 if ($err->message != ""){ 551 sfErrorHeader(">> " . $objQuery->getlastquery(false)); 552 return false; 553 } 554 555 if ($pagelayout_flg) { 556 // dtb_pagelayoutの場合には最初のデータはpage_id = 0にする 557 $sql = "UPDATE dtb_pagelayout SET page_id = '0'"; 558 $objQuery->query($sql); 559 $pagelayout_flg = false; 560 } 561 562 // タイムアウトを防ぐ 563 sfFlush(); 564 } 565 fclose($fp); 566 567 return $ret; 568 } 569 570 // 自動採番をセット 571 function lfSetAutoInc($objQuery, $csv){ 572 // csvファイルからデータの取得 573 $arrCsvData = file($csv); 574 575 foreach($arrCsvData as $key => $val){ 576 $arrData = split(",", trim($val)); 577 578 if ($arrData[2] == 0) $arrData[2] = 1; 579 $objQuery->setval($arrData[0], $arrData[1], $arrData[2]); 580 } 581 } 582 583 // DBを全てクリアする 584 function lfDeleteAll($objQuery){ 585 $ret = true; 586 587 $arrTableList = lfGetTableList(); 588 589 foreach($arrTableList as $key => $val){ 590 // バックアップテーブルは削除しない 591 if ($val != "dtb_bkup") { 592 $trun_sql = "DELETE FROM $val;"; 593 $ret = $objQuery->query($trun_sql); 594 595 if (!$ret) return $ret; 596 } 597 } 598 599 return $ret; 600 } 601 602 // バックアップテーブルを作成する 603 function lfCreateBkupTable(){ 604 $objQuery = new SC_Query(); 605 606 // テーブルの存在チェック 607 $arrTableList = lfGetTableList(); 608 609 if(!in_array("dtb_bkup", $arrTableList)){ 610 // 存在していなければ作成 611 $cre_sql = " 612 create table dtb_bkup 613 ( 614 bkup_name text, 615 bkup_memo text, 616 create_date timestamp 617 ); 618 "; 619 620 $objQuery->query($cre_sql); 621 } 622 } 623 15 $objPage = new LC_Page_Admin_System_Bkup_Ex(); 16 $objPage->init(); 17 $objPage->process(); 18 register_shutdown_function(array($objPage, "destroy")); 624 19 ?>
Note: See TracChangeset
for help on using the changeset viewer.