tpl_mainpage = 'system/bkup.tpl';
$this->tpl_subnavi = 'system/subnavi.tpl';
$this->tpl_mainno = 'system';
$this->tpl_subno = 'bkup';
$this->tpl_subtitle = 'バックアップ管理';
}
}
$objPage = new LC_Page();
$objView = new SC_AdminView();
$objQuery = new SC_Query();
// セッションクラス
$objSess = new SC_Session();
// 認証可否の判定
sfIsSuccess($objSess);
switch($_POST['mode']) {
// バックアップを作成する
case 'bkup':
// エラーチェック
$arrErr = lfCheckError($_POST);
// エラーがなければバックアップ処理を行う
if (count($arrErr) <= 0) {
// バックアップファイル作成
lfCreateBkupData();
// DBにデータ更新
}
break;
// インストール
case 'install':
// 更新情報を最新にする
lfLoadUpdateList();
// モジュール郡のインストール
lfInstallModule();
break;
// アンインストール
case 'uninstall':
// 更新情報を最新にする
lfLoadUpdateList();
// モジュール郡のインストール
lfUninstallModule();
break;
default:
break;
}
// テンプレートファイルに渡すデータをセット
$objPage->arrErr = $arrErr;
$objView->assignobj($objPage); //変数をテンプレートにアサインする
$objView->display(MAIN_FRAME); //テンプレートの出力
//-------------------------------------------------------------------------------------------------------
// エラーチェック
function lfCheckError($array){
$objErr = new SC_CheckError($array);
$objErr->doFunc(array("バックアップ名", "bkup_name", STEXT_LEN), array("EXIST_CHECK","MAX_LENGTH_CHECK"));
return $objErr->arrErr;
}
// バックアップファイル作成
function lfCreateBkupData(){
$objQuery = new SC_Query();
$csv_data = "";
// 全テーブル取得
$arrTableList = lfGetTableList();
// 各テーブル情報を取得する
foreach($arrTableList as $key => $val){
// テーブル構成を取得
$arrColumnList = lfGetColumnList($val);
// テーブル構成のCSV出力データ生成
// 全データを取得
$arrData = $objQuery->getAll("SELECT * FROM $val");
// CSVデータ生成
if (count($arrData) > 0) {
// カラムを出力
$arrKyes = sfGetCommaList(array_keys($arrData[0]), false);
$arrDataTmp = sfGetCSVList($arrData[0], false);
sfprintr($arrDataTmp);
$csv_data .= $val . "\n";
$csv_data .= $arrKyes . "\n";
$csv_data .= "\n";
}
//sfprintr(array_keys($arrData[0]));
//sfprintr(sfGetCSVList($arrData));
}
sfprintr($csv_data);
}
// 全テーブルリストを取得する
function lfGetTableList(){
$objQuery = new SC_Query();
if(DB_TYPE == "pgsql"){
$sql = "SELECT tablename FROM pg_tables where tableowner = ? ORDER BY tablename ; ";
$arrRet = $objQuery->getAll($sql, array(DB_USER));
$arrRet = sfSwapArray($arrRet);
$arrRet = $arrRet['tablename'];
}else if(DB_TYPE == "mysql"){
}
return $arrRet;
}
// テーブル構成を取得する
function lfGetColumnList($table_name){
$objQuery = new SC_Query();
if(DB_TYPE == "pgsql"){
$sql = "SELECT
a.attname, t.typname, a.attnotnull, d.adsrc as defval, a.atttypmod, a.attnum as fldnum, e.description
FROM
pg_class c,
pg_type t,
pg_attribute a left join pg_attrdef d on (a.attrelid=d.adrelid and a.attnum=d.adnum)
left join pg_description e on (a.attrelid=e.objoid and a.attnum=e.objsubid)
WHERE (c.relname=?) AND (c.oid=a.attrelid) AND (a.atttypid=t.oid) AND a.attnum > 0
ORDER BY fldnum";
$arrRet = $objQuery->getAll($sql, array($table_name));
}
return sfswaparray($arrRet);
}
// 更新ファイルの取得
function lfCopyUpdateFile($val) {
global $objPage;
$src_path = sfRmDupSlash(UPDATE_HTTP . $val . ".txt");
$dst_path = sfRmDupSlash(ROOT_DIR . $val);
$flg_ok = true; // 処理の成功判定
$src_fp = @fopen($src_path, "rb");
if(!$src_fp) {
sfErrorHeader(">> " . $src_path . "の取得に失敗しました。");
$flg_ok = false;
} else {
// ファイルをすべて読み込む
$contents = '';
while (!feof($src_fp)) {
$contents .= fread($src_fp, 1024);
}
fclose($src_fp);
// ディレクトリ作成を試みる
lfMakeDirectory($dst_path);
// ファイル書込み
$dst_fp = @fopen($dst_path, "wb");
if(!$dst_fp) {
sfErrorHeader(">> " . $dst_path . "をオープンできません。");
$flg_ok = false;
} else {
fwrite($dst_fp, $contents);
fclose($dst_fp);
}
}
if($flg_ok) {
$objPage->update_mess.= ">> " . $dst_path . ":コピー成功
";
} else {
$objPage->update_mess.= ">> " . $dst_path . ":コピー失敗
";
}
return $flg_ok;
}
// すべてのパスのディレクトリを作成する
function lfMakeDirectory($path) {
$pos = 0;
$cnt = 0; // 無限ループ対策
$len = strlen($path); // 無限ループ対策
while($cnt <= $len) {
$pos = strpos($path, "/", $pos);
// ここでの判定は、等号3つを使用
if($pos === false) {
// スラッシュが見つからない場合はループから抜ける
break;
}
$pos++; // 文字発見位置を一文字進める
$dir = substr($path, 0, $pos);
// すでに存在するかどうか調べる
if(!file_exists($dir)) {
mkdir($dir);
}
$cnt++; // 無限ループ対策
}
}
// 更新情報を最新にする
function lfLoadUpdateList() {
$objQuery = new SC_Query();
$path = UPDATE_HTTP . "update.txt";
$fp = @fopen($path, "rb");
if(!$fp) {
sfErrorHeader(">> " . $path . "の取得に失敗しました。");
} else {
while (!feof($fp)) {
$arrCSV = fgetcsv($fp, UPDATE_CSV_LINE_MAX);
// カラム数が正常であった場合のみ
if(count($arrCSV) == UPDATE_CSV_COL_MAX) {
// 取得したアップデート情報をDBに書き込む
$sqlval['module_id'] = $arrCSV[0];
$sqlval['module_name'] = $arrCSV[1];
$sqlval['latest_version'] = $arrCSV[3];
$sqlval['module_explain'] = $arrCSV[4];
$sqlval['main_php'] = $arrCSV[5];
$sqlval['extern_php'] = $arrCSV[6];
$sqlval['install_sql'] = $arrCSV[7];
$sqlval['uninstall_sql'] = $arrCSV[8];
$sqlval['other_files'] = $arrCSV[9];
$sqlval['del_flg'] = $arrCSV[10];
$sqlval['update_date'] = "now()";
$sqlval['release_date'] = $arrCSV[12];
// 既存レコードのチェック
$cnt = $objQuery->count("dtb_update", "module_id = ?", array($sqlval['module_id']));
if($cnt > 0) {
// すでに取得されている場合は更新する。
$objQuery->update("dtb_update", $sqlval, "module_id = ?", array($sqlval['module_id']));
} else {
// 新規レコードの追加
$sqlval['create_date'] = "now()";
$objQuery->insert("dtb_update", $sqlval);
}
}
}
fclose($fp);
}
}
// インストール処理
function lfInstallModule() {
global $objPage;
$objQuery = new SC_Query();
$arrRet = $objQuery->select("module_id, extern_php, other_files, install_sql, latest_version", "dtb_update", "module_id = ?", array($_POST['module_id']));
$flg_ok = true; // 処理の成功判定
if(count($arrRet) > 0) {
$arrFiles = array();
if($arrRet[0]['other_files'] != "") {
$arrFiles = split("\|", $arrRet[0]['other_files']);
}
$arrFiles[] = $arrRet[0]['extern_php'];
foreach($arrFiles as $val) {
// 更新ファイルの取得
$ret=lfCopyUpdateFile($val);
if(!$ret) {
$flg_ok = false;
}
}
} else {
sfErrorHeader(">> 対象の機能は、配布を終了しております。");
$flg_ok = false;
}
// 必要なSQL文の実行
if($arrRet[0]['install_sql'] != "") {
// SQL文実行、パラーメータなし、エラー無視
$arrInstallSql = split(";",$arrRet[0]['install_sql']);
foreach($arrInstallSql as $key => $val){
if (trim($val) != ""){
$ret = $objQuery->query(trim($val),"",true);
}
}
if(DB::isError($ret)) {
// エラー文を取得する
ereg("\[(.*)\]", $ret->userinfo, $arrKey);
$objPage->update_mess.=">> テーブル構成の変更に失敗しました。
";
$objPage->update_mess.= $arrKey[0] . "
";
$flg_ok = false;
} else {
$objPage->update_mess.=">> テーブル構成の変更を行いました。
";
}
}
if($flg_ok) {
$sqlval['now_version'] = $arrRet[0]['latest_version'];
$sqlval['update_date'] = "now()";
$objQuery->update("dtb_update", $sqlval, "module_id = ?", array($arrRet[0]['module_id']));
}
}
// アンインストール処理
function lfUninstallModule() {
global $objPage;
$objQuery = new SC_Query();
$arrRet = $objQuery->select("module_id, extern_php, other_files, install_sql, uninstall_sql, latest_version", "dtb_update", "module_id = ?", array($_POST['module_id']));
$flg_ok = true; // 処理の成功判定
if(count($arrRet) > 0) {
$arrFiles = array();
if($arrRet[0]['other_files'] != "") {
$arrFiles = split("\|", $arrRet[0]['other_files']);
}
$arrFiles[] = $arrRet[0]['extern_php'];
foreach($arrFiles as $val) {
$path = ROOT_DIR . $val;
if(file_exists($path)) {
// ファイルを削除する
if(unlink($path)) {
$objPage->update_mess.= ">> " . $path . ":削除成功
";
} else {
$objPage->update_mess.= ">> " . $path . ":削除失敗
";
}
}
}
// 必要なSQL文の実行
if($arrRet[0]['uninstall_sql'] != "") {
// SQL文実行、パラーメータなし、エラー無視
$ret = $objQuery->query($arrRet[0]['uninstall_sql'],"",true);
if(DB::isError($ret)) {
// エラー文を取得する
ereg("\[(.*)\]", $ret->userinfo, $arrKey);
$objPage->update_mess.=">> テーブル構成の変更に失敗しました。
";
$objPage->update_mess.= $arrKey[0] . "
";
$flg_ok = false;
} else {
$objPage->update_mess.=">> テーブル構成の変更を行いました。
";
}
}
} else {
sfErrorHeader(">> 対象の機能は、配布を終了しております。");
}
if($flg_ok) {
// バージョン情報を削除する。
$sqlval['now_version'] = "";
$sqlval['update_date'] = "now()";
$objQuery->update("dtb_update", $sqlval, "module_id = ?", array($arrRet[0]['module_id']));
}
}
?>