source: branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php @ 21730

Revision 21730, 20.8 KB checked in by Seasoft, 12 years ago (diff)

#1716 (Postgres Plus Advanced Server 9.1 対応)

  • シーケンス

#1720 (バックアップ管理 同一シーケンス値を再発行させる不具合)
#1739 (PostgreSQL で SC_Query#setVal した直後 SC_Query#currVal == SC_Query#nextVal となる)

  • 根本的な解決ではない。

#1743 (バックアップファイルのみでのリストアに対応)
#1613 (typo修正・ソース整形・ソースコメントの改善)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
RevLine 
[16251]1<?php
2/*
[16582]3 * This file is part of EC-CUBE
4 *
[20764]5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
[16251]6 *
7 * http://www.lockon.co.jp/
[16582]8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
[16251]22 */
23
24// {{{ requires
[20534]25require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
[21490]26
[16251]27/**
28 * バックアップ のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
[20345]34class LC_Page_Admin_System_Bkup extends LC_Page_Admin_Ex {
[16251]35
[21730]36    /** リストア中にエラーが発生したか */
37    var $tpl_restore_err = false;
38
39    /** 対象外とするシーケンス生成器 */
40    var $arrExcludeSequence = array(
41        'plsql_profiler_runid', // Postgres Plus Advanced Server 9.1
42        'snapshot_num',         // Postgres Plus Advanced Server 9.1
43    );
44
[16251]45    // }}}
46    // {{{ functions
47
48    /**
49     * Page を初期化する.
50     *
51     * @return void
52     */
53    function init() {
54        parent::init();
55        $this->tpl_mainpage = 'system/bkup.tpl';
56        $this->tpl_mainno = 'system';
57        $this->tpl_subno = 'bkup';
[20911]58        $this->tpl_maintitle = 'システム設定';
[16251]59        $this->tpl_subtitle = 'バックアップ管理';
60
[21514]61        $this->bkup_dir = DATA_REALDIR . 'downloads/backup/';
[17975]62        $this->bkup_ext = '.tar.gz';
[16251]63    }
64
65    /**
66     * Page のプロセス.
67     *
68     * @return void
69     */
70    function process() {
[19661]71        $this->action();
72        $this->sendResponse();
73    }
74
75    /**
76     * Page のアクション.
77     *
78     * @return void
79     */
80    function action() {
[21591]81        // フックポイント.
[21689]82        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
[21693]83        $objPlugin->doAction('LC_Page_Admin_System_Bkup_action_before', array($this));
[21592]84
[20363]85        $objFormParam = new SC_FormParam;
86
[20970]87        // パラメーターの初期化
[20363]88        $this->initParam($objFormParam, $_POST);
89
[20431]90        $arrErrTmp  = array();
[20363]91        $arrForm = array();
92
[21730]93        $this->mode = $this->getMode();
94        switch ($this->mode) {
[20363]95
[21526]96            // バックアップを作成する
97            case 'bkup':
[16251]98
[21526]99                // データ型エラーチェック
100                $arrErrTmp[1] = $objFormParam->checkError();
[16251]101
[21526]102                // データ型に問題がない場合
103                if (SC_Utils_Ex::isBlank($arrErrTmp[1])) {
104                    // データ型以外のエラーチェック
[21730]105                    $arrErrTmp[2] = $this->lfCheckError($objFormParam->getHashArray(), $this->mode);
[21526]106                }
[20363]107
[21526]108                // エラーがなければバックアップ処理を行う
109                if (SC_Utils_Ex::isBlank($arrErrTmp[1]) && SC_Utils_Ex::isBlank($arrErrTmp[2])) {
[20540]110
[21526]111                    $arrData = $objFormParam->getHashArray();
[20540]112
[21526]113                    $work_dir = $this->bkup_dir . $arrData['bkup_name'] . '/';
114                    // バックアップデータの事前削除
115                    SC_Utils_Ex::sfDelFile($work_dir);
116                    // バックアップファイル作成
117                    $res = $this->lfCreateBkupData($arrData['bkup_name'], $work_dir);
118                    // バックアップデータの事後削除
119                    SC_Utils_Ex::sfDelFile($work_dir);
[16251]120
[21526]121                    $arrErrTmp[3] = array();
122                    if ($res !== true) {
123                        $arrErrTmp[3]['bkup_name'] = 'バックアップに失敗しました。(' . $res . ')';
124                    }
[21426]125
[21526]126                    // DBにデータ更新
127                    if (SC_Utils_Ex::isBlank($arrErrTmp[3])) {
128                        $this->lfUpdBkupData($arrData);
129                    } else {
130                        $arrForm = $arrData;
131                        $arrErr = $arrErrTmp[3];
132                    }
133
134                    $this->tpl_onload = "alert('バックアップ完了しました');";
[21441]135                } else {
[21526]136                    $arrForm = $objFormParam->getHashArray();
137                    $arrErr = array_merge((array)$arrErrTmp[1],(array)$arrErrTmp[2]);
[16251]138                }
[21526]139                break;
[16251]140
[21526]141            // リストア
142            case 'restore_config':
143            case 'restore':
144                // データベースに存在するかどうかチェック
[21730]145                $arrErr = $this->lfCheckError($objFormParam->getHashArray(), $this->mode);
[20363]146
[21526]147                // エラーがなければリストア処理を行う
148                if (SC_Utils_Ex::isBlank($arrErr)) {
149                    $arrData = $objFormParam->getHashArray();
[21730]150
151                    $msg = '「' . $arrData['list_name'] . '」のリストアを開始します。';
152                    GC_Utils_Ex::gfPrintLog($msg);
153
154                    $success = $this->lfRestore($arrData['list_name'], $this->bkup_dir, $this->bkup_ext, $this->mode);
155
156                    $msg = '「' . $arrData['list_name'] . '」の';
157                    $msg .= $success ? 'リストアを終了しました。' : 'リストアに失敗しました。';
158
159                    $this->tpl_restore_msg .= $msg . "\n";
160                    GC_Utils_Ex::gfPrintLog($msg);
[21526]161                }
162                break;
[20431]163
[21526]164            // 削除
165            case 'delete':
[16251]166
[21526]167                // データベースに存在するかどうかチェック
[21730]168                $arrErr = $this->lfCheckError($objFormParam->getHashArray(), $this->mode);
[20431]169
[21526]170                // エラーがなければリストア処理を行う
171                if (SC_Utils_Ex::isBlank($arrErr)) {
[20431]172
[21526]173                    $arrData = $objFormParam->getHashArray();
[20431]174
[21526]175                    // DBとファイルを削除
176                    $this->lfDeleteBackUp($arrData, $this->bkup_dir, $this->bkup_ext);
177                }
[20431]178
[21526]179                break;
[16251]180
[21526]181                // ダウンロード
182            case 'download' :
[16251]183
[21526]184                // データベースに存在するかどうかチェック
[21730]185                $arrErr = $this->lfCheckError($objFormParam->getHashArray(), $this->mode);
[16251]186
[21526]187                // エラーがなければダウンロード処理を行う
188                if (SC_Utils_Ex::isBlank($arrErr)) {
[16251]189
[21526]190                    $arrData = $objFormParam->getHashArray();
[20431]191
[21526]192                    $filename = $arrData['list_name'] . $this->bkup_ext;
193                    $dl_file = $this->bkup_dir.$arrData['list_name'] . $this->bkup_ext;
[20431]194
[21526]195                    // ダウンロード開始
196                    Header("Content-disposition: attachment; filename=${filename}");
197                    Header("Content-type: application/octet-stream; name=${filename}");
198                    header('Content-Length: ' .filesize($dl_file));
199                    readfile ($dl_file);
200                    exit();
201                    break;
202                }
[20431]203
[21526]204            default:
[20431]205                break;
[16251]206        }
207
[20431]208        // 不要になった変数を解放
209        unset($arrErrTmp);
210
[16251]211        // バックアップリストを取得する
[21514]212        $arrBkupList = $this->lfGetBkupData('ORDER BY create_date DESC');
[16251]213        // テンプレートファイルに渡すデータをセット
[18526]214        $this->arrErr = isset($arrErr) ? $arrErr : array();
215        $this->arrForm = isset($arrForm) ? $arrForm : array();
[16251]216        $this->arrBkupList = $arrBkupList;
[21591]217
218        // フックポイント.
[21689]219        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($this->plugin_activate_flg);
[21693]220        $objPlugin->doAction('LC_Page_Admin_System_Bkup_action_after', array($this));
[16251]221    }
222
223    /**
224     * デストラクタ.
225     *
226     * @return void
227     */
228    function destroy() {
229        parent::destroy();
230    }
231
[20363]232    /**
[20970]233     * パラメーター初期化.
[20363]234     *
235     * @param object $objFormParam
236     * @param array  $arrParams  $_POST値
237     * @return void
238     */
239    function initParam(&$objFormParam, &$arrParams) {
240
241        $objFormParam->addParam('バックアップ名', 'bkup_name', STEXT_LEN, 'a', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NO_SPTAB', 'ALNUM_CHECK'));
242        $objFormParam->addParam('バックアップメモ', 'bkup_memo', MTEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
[20431]243        $objFormParam->addParam('バックアップ名(リスト)', 'list_name', STEXT_LEN, 'a', array('MAX_LENGTH_CHECK', 'NO_SPTAB', 'ALNUM_CHECK'));
[20363]244        $objFormParam->setParam($arrParams);
245        $objFormParam->convParam();
246
[16251]247    }
248
[20363]249    /**
250     * データ型以外のエラーチェック.
251     *
[20431]252     * @param array  $arrForm
253     * @param string $mode
[20363]254     * @return $arrErr
255     */
[21479]256    function lfCheckError(&$arrForm, $mode) {
[16251]257
[21441]258        switch ($mode) {
[21526]259            case 'bkup':
[21730]260                $name = $arrForm['bkup_name'];
[21526]261                break;
[20431]262
[21526]263            case 'restore_config':
264            case 'restore':
265            case 'download':
266            case 'delete':
[21730]267                $name = $arrForm['list_name'];
[21526]268                break;
[20431]269
[21526]270            default:
[21730]271                trigger_error('不明な処理', E_USER_ERROR);
[21526]272                break;
[20431]273        }
274
275        // 重複・存在チェック
[21730]276        $ret = $this->lfGetBkupData('', $name);
[20431]277        if (count($ret) > 0 && $mode == 'bkup') {
[21514]278            $arrErr['bkup_name'] = 'バックアップ名が重複しています。別名を入力してください。';
[20431]279        } elseif (count($ret) <= 0 && $mode != 'bkup') {
[21514]280            $arrErr['list_name'] = '選択されたデータがみつかりませんでした。既に削除されている可能性があります。';
[16251]281        }
282
[20363]283        return $arrErr;
[16251]284    }
285
[20363]286    /**
287     * バックアップファイル作成.
288     *
289     * @param string $bkup_name
[21426]290     * @return boolean|int 結果。true:成功 int:失敗 FIXME 本来は int ではなく、エラーメッセージを戻すべき
[20363]291     */
[21479]292    function lfCreateBkupData($bkup_name, $work_dir) {
[17879]293        // 実行時間を制限しない
294        set_time_limit(0);
[18791]295
[20507]296        $objQuery =& SC_Query_Ex::getSingletonInstance();
[21514]297        $csv_autoinc = '';
[20363]298        $arrData = array();
[16251]299
[21426]300        $success = mkdir($work_dir, 0777, true);
301        if (!$success) {
302            return __LINE__;
303        }
[16251]304
305        // 全テーブル取得
[18791]306        $arrTableList = $objQuery->listTables();
[16251]307
308        // 各テーブル情報を取得する
[20965]309        foreach ($arrTableList as $table) {
[16251]310
[21426]311            if ($table == 'dtb_bkup' || $table == 'mtb_zip') {
312                continue;
313            }
[16251]314
[21426]315            // dataをCSV出力
316            $csv_file = $work_dir . $table . '.csv';
317            $fp = fopen($csv_file, 'w');
318            if (!$fp) {
319                return __LINE__;
320            }
[16251]321
[21426]322            // 全データを取得
323            $sql = "SELECT * FROM $table";
[16251]324
[21426]325            $this->fpOutput =& $fp;
326            $this->first_line = true;
327            $success = $objQuery->doCallbackAll(array(&$this, 'cbOutputCSV'), $sql);
328            unset($this->fpOutput);
[16251]329
[21426]330            if ($success === false) {
331                return __LINE__;
332            }
[20965]333
[21426]334            fclose($fp);
[20965]335
[21426]336            // タイムアウトを防ぐ
337            SC_Utils_Ex::sfFlush();
[16251]338        }
339
[18791]340        // 自動採番型の構成を取得する
341        $csv_autoinc = $this->lfGetAutoIncrement();
342
[21514]343        $csv_autoinc_file = $work_dir . 'autoinc_data.csv';
[21426]344
[16251]345        // CSV出力
346
[21426]347        // 自動採番をCSV出力
348        $fp = fopen($csv_autoinc_file,'w');
[21441]349        if ($fp) {
[21514]350            if ($csv_autoinc != '') {
[21426]351                $success = fwrite($fp, $csv_autoinc);
352                if (!$success) {
353                    return __LINE__;
[16251]354                }
355            }
[21426]356            fclose($fp);
[16251]357        }
358
[21426]359        //圧縮フラグTRUEはgzip圧縮をおこなう
360        $tar = new Archive_Tar($this->bkup_dir . $bkup_name . $this->bkup_ext, TRUE);
[16251]361
[21426]362        //bkupフォルダに移動する
363        chdir($work_dir);
[16251]364
[21426]365        //圧縮をおこなう
366        $zip = $tar->create('./');
[16251]367
[21426]368        return true;
369    }
[16251]370
[21426]371    /**
372     * CSV作成 テンポラリファイル出力 コールバック関数
373     *
374     * @param mixed $data 出力データ
375     * @return boolean true (true:固定 false:中断)
376     */
377    function cbOutputCSV($data) {
378        $line = '';
379        if ($this->first_line) {
380            // カラム名
381            $line .= SC_Helper_CSV_Ex::sfArrayToCsv(array_keys($data)) . "\n";
382            $this->first_line = false;
[16251]383        }
[21426]384        $line .= SC_Helper_CSV_Ex::sfArrayToCsv($data);
385        $line .= "\n";
386        return fwrite($this->fpOutput, $line);
[16251]387    }
388
[18791]389    /**
390     * シーケンス一覧をCSV出力形式に変換する.
391     *
392     * シーケンス名,シーケンス値 の形式に出力する.
393     *
394     * @return string シーケンス一覧の文字列
[20363]395     * @return string $ret
[18791]396     */
397    function lfGetAutoIncrement() {
[20507]398        $objQuery =& SC_Query_Ex::getSingletonInstance();
[18791]399        $arrSequences = $objQuery->listSequences();
[16251]400
[21730]401        foreach ($arrSequences as $name) {
402            if (in_array($name, $this->arrExcludeSequence, true)) {
403                continue 1;
404            }
[16251]405
[21730]406            // XXX SC_Query::currVal は、PostgreSQL で nextval と等しい値を戻すケースがある。欠番を生じうるが、さして問題無いと推測している。
407            $seq = $objQuery->currVal($name);
408
409            // TODO CSV 生成の共通処理を使う
410            $ret .= $name . ',';
[21481]411            $ret .= is_null($seq) ? '0' : $seq;
[18791]412            $ret .= "\r\n";
[16251]413        }
414        return $ret;
415    }
416
417    // バックアップテーブルにデータを更新する
[21479]418    function lfUpdBkupData($data) {
[20507]419        $objQuery =& SC_Query_Ex::getSingletonInstance();
[16251]420
[20431]421        $arrVal = array();
422        $arrVal['bkup_name'] = $data['bkup_name'];
423        $arrVal['bkup_memo'] = $data['bkup_memo'];
[21185]424        $arrVal['create_date'] = 'CURRENT_TIMESTAMP';
[20540]425
[20431]426        $objQuery->insert('dtb_bkup', $arrVal);
[16251]427    }
428
[21730]429    /**
430     * バックアップの一覧を取得する
431     */
432    function lfGetBkupData($sql_option = '', $filter_bkup_name) {
[20507]433        $objQuery =& SC_Query_Ex::getSingletonInstance();
[16251]434
[21730]435        // テーブルから取得
436        $arrVal = array();
437
438        $sql = 'SELECT bkup_name, bkup_memo, create_date FROM dtb_bkup';
439        if (strlen($filter_bkup_name) >= 1) {
440            $sql .= ' WHERE bkup_name = ?';
441            $arrVal[] = $filter_bkup_name;
[20562]442        }
[21730]443        if ($sql_option != '') {
444            $sql .= ' ' . $sql_option;
445        }
[16251]446
[21730]447        $ret = $objQuery->getAll($sql, $arrVal);
[16251]448
[21730]449        // ファイルのみのものを取得
450        $glob = glob($this->bkup_dir . '*' . $this->bkup_ext);
451        if (is_array($glob)) {
452            foreach ($glob as $path) {
453                $bkup_name = basename($path, $this->bkup_ext);
454                if (strlen($filter_bkup_name) >= 1 && $bkup_name !== $filter_bkup_name) {
455                    continue 1;
456                }
457                unset($row);
458                foreach (array_keys($ret) as $key) {
459                    if ($ret[$key]['bkup_name'] == $bkup_name) {
460                        $row =& $ret[$key];
461                    }
462                }
463                if (!isset($row)) {
464                    $ret[] = array();
465                    $row =& $ret[array_pop(array_keys($ret))];
466                    $row['bkup_name'] = $bkup_name;
467                    $row['bkup_memo'] = '(記録なし。バックアップファイルのみ。)';
468                    $row['create_date'] = date("Y-m-d H:i:s", filemtime($path));
469                }
470            }
471        }
472
[16251]473        return $ret;
474    }
475
[20363]476    /**
477     * バックアップファイルをリストアする
478     *
479     * @param string $bkup_name
480     * @param string $bkup_dir
481     * @param string $bkup_ext
482     * @return void
483     */
[21479]484    function lfRestore($bkup_name, $bkup_dir, $bkup_ext, $mode) {
[21540]485        $objQuery =& SC_Query_Ex::getSingletonInstance();
486
[17879]487        // 実行時間を制限しない
[21540]488        // FIXME ファイル展開時に限定すべき
[17879]489        set_time_limit(0);
[18791]490
[21540]491        $bkup_filepath = $bkup_dir . $bkup_name . $bkup_ext;
[21426]492        $work_dir = $bkup_dir . $bkup_name . '/';
493
[16251]494        //圧縮フラグTRUEはgzip解凍をおこなう
[21540]495        $tar = new Archive_Tar($bkup_filepath, TRUE);
[21420]496
[16251]497        //指定されたフォルダ内に解凍する
[21540]498        $success = $tar->extract($work_dir);
[16251]499
[21540]500        if (!$success) {
501            $msg = 'バックアップファイルの展開に失敗しました。' . "\n";
502            $msg .= '展開元: ' . $bkup_filepath . "\n";
503            $msg .= '展開先: ' . $work_dir;
[21582]504            trigger_error($msg, E_USER_ERROR);
[21540]505        }
[16251]506
[21540]507        // トランザクション開始
508        $objQuery->begin();
[16251]509
[21540]510        // INSERT実行
511        $success = $this->lfExeInsertSQL($objQuery, $work_dir, $mode);
[16251]512
[21730]513        // シーケンス生成器を復元する
514        if ($success) $this->restoreSequence($objQuery, $work_dir . 'autoinc_data.csv');
[16251]515
[21540]516        // リストア成功ならコミット失敗ならロールバック
517        if ($success) {
518            $objQuery->commit();
[21730]519            $this->tpl_restore_err = true;
[21540]520        } else {
521            $objQuery->rollback();
[21730]522            $this->tpl_restore_name = $bkup_name;
[16251]523        }
[20431]524
[21426]525        // FIXME この辺りで、バックアップ時と同等の一時ファイルの削除を実行すべきでは?
[21730]526
527        return $success;
[16251]528    }
529
[20363]530    /**
531     * CSVファイルからインサート実行.
532     *
533     * @param object $objQuery
[21426]534     * @param string $dir
[20363]535     * @param string $mode
536     * @return void
537     */
[21479]538    function lfExeInsertSQL(&$objQuery, $dir, $mode) {
[16251]539
540        $tbl_flg = false;
541        $col_flg = false;
542        $ret = true;
543        $pagelayout_flg = false;
[20431]544        $arrVal = array();
545        $arrCol = array();
[21426]546        $arrAllTableList = $objQuery->listTables();
[16251]547
[21426]548        $objDir = dir($dir);
549        while (false !== ($file_name = $objDir->read())) {
550            if (!preg_match('/^((dtb|mtb)_(\w+))\.csv$/', $file_name, $matches)) {
[16251]551                continue;
552            }
[21426]553            $file_path = $dir . $file_name;
554            $table = $matches[1];
[16251]555
[21426]556            // テーブル存在チェック
557            if (!in_array($table, $arrAllTableList)) {
558                if ($mode === 'restore_config') {
559                    continue;
[16251]560                }
[21426]561                return false;
[16251]562            }
563
[21426]564            // csvファイルからデータの取得
565            $fp = fopen($file_path, 'r');
[21441]566            if ($fp === false) {
[21582]567                trigger_error($file_name . ' のファイルオープンに失敗しました。', E_USER_ERROR);
[16251]568            }
569
[21540]570            GC_Utils_Ex::gfPrintLog('リストア実行: ' . $table);
571            $objQuery->delete($table);
572
[21426]573            $line = 0;
[21540]574            $arrColName = array();
[21426]575            while (!feof($fp)) {
576                $line++;
[21730]577                $arrCsvLine = fgetcsv($fp, 1024 * 1024);
[21426]578
579                // 1行目: 列名
580                if ($line === 1) {
581                    $arrColName = $arrCsvLine;
582                    continue;
[20687]583                }
[16251]584
[21540]585                // 空行を無視
586                // false との比較は PHP 5.2.x Windows バグ対応
587                // 参考: http://www.php.net/manual/ja/function.fgetcsv.php#98502
588                if ($arrCsvLine === array(null) || $arrCsvLine === false) {
589                    continue;
590                }
591
[21426]592                $arrVal = array_combine($arrColName, $arrCsvLine);
593                $objQuery->insert($table, $arrVal);
[20431]594
[21426]595                SC_Utils_Ex::extendTimeOut();
[16251]596            }
597
[21426]598            fclose($fp);
[16251]599        }
600
601        return $ret;
602    }
603
[21730]604    /**
605     * シーケンス生成器を復元する
606     */
607    function restoreSequence(&$objQuery, $csv) {
[16251]608        // csvファイルからデータの取得
609        $arrCsvData = file($csv);
610
[21730]611        foreach ($arrCsvData as $line) {
612            list($name, $currval) = explode(',', trim($line));
[16251]613
[21730]614            if (in_array($name, $this->arrExcludeSequence, true)) {
615                continue 1;
616            }
617
618            // FIXME テーブルと同様に整合チェックを行う。また不整合時はスキップして続行する。
619
620            // XXX +1 ではなく、nextVal を呼ぶべきかも。
621            $objQuery->setVal($name, $currval + 1);
[16251]622        }
623    }
624
[20431]625    // 選択したバックアップをDBから削除
626    function lfDeleteBackUp(&$arrForm, $bkup_dir, $bkup_ext) {
627
[20507]628        $objQuery =& SC_Query_Ex::getSingletonInstance();
[20431]629
630        $del_file = $bkup_dir.$arrForm['list_name'] . $bkup_ext;
631        // ファイルの削除
[21441]632        if (is_file($del_file)) {
[20431]633            $ret = unlink($del_file);
634        }
635
[21514]636        $delsql = 'DELETE FROM dtb_bkup WHERE bkup_name = ?';
637        $objQuery->delete('dtb_bkup', 'bkup_name = ?', array($arrForm['list_name']));
[20431]638
639    }
640
[16251]641}
Note: See TracBrowser for help on using the repository browser.