Index: branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php	(revision 21527)
+++ branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php	(revision 21540)
@@ -420,45 +420,47 @@
      */
     function lfRestore($bkup_name, $bkup_dir, $bkup_ext, $mode) {
+        $objQuery =& SC_Query_Ex::getSingletonInstance();
+
         // 実行時間を制限しない
+        // FIXME ファイル展開時に限定すべき
         set_time_limit(0);
 
-        $objQuery =& SC_Query_Ex::getSingletonInstance();
-        $success = true;
-
+        $bkup_filepath = $bkup_dir . $bkup_name . $bkup_ext;
         $work_dir = $bkup_dir . $bkup_name . '/';
 
         //圧縮フラグTRUEはgzip解凍をおこなう
-        $tar = new Archive_Tar($work_dir . $bkup_name . $bkup_ext, TRUE);
+        $tar = new Archive_Tar($bkup_filepath, TRUE);
 
         //指定されたフォルダ内に解凍する
-        $success = $tar->extract($work_dir . $bkup_name);
-
-        // 無事解凍できれば、リストアを行う
+        $success = $tar->extract($work_dir);
+
+        if (!$success) {
+            $msg = 'バックアップファイルの展開に失敗しました。' . "\n";
+            $msg .= '展開元: ' . $bkup_filepath . "\n";
+            $msg .= '展開先: ' . $work_dir;
+            SC_Utils_Ex::sfDispException($msg);
+        }
+
+        // トランザクション開始
+        $objQuery->begin();
+
+        // INSERT実行
+        $success = $this->lfExeInsertSQL($objQuery, $work_dir, $mode);
+
+        // 自動採番の値をセット
+        if ($success) $this->lfSetAutoInc($objQuery, $work_dir . 'autoinc_data.csv');
+
+        // リストア成功ならコミット失敗ならロールバック
         if ($success) {
-
-            // トランザクション開始
-            $objQuery->begin();
-
-            // DBをクリア
-            $success = $this->lfDeleteAll($objQuery);
-
-            // INSERT実行
-            if ($success) $success = $this->lfExeInsertSQL($objQuery, $work_dir, $mode);
-
-            // 自動採番の値をセット
-            if ($success) $this->lfSetAutoInc($objQuery, $work_dir . 'autoinc_data.csv');
-
-            // リストア成功ならコミット失敗ならロールバック
-            if ($success) {
-                $objQuery->commit();
-                $this->restore_msg = 'リストア終了しました。';
-                $this->restore_err = true;
-            } else {
-                $objQuery->rollback();
-                $this->restore_msg = 'リストアに失敗しました。';
-                $this->restore_name = $bkup_name;
-                $this->restore_err = false;
-            }
-        }
+            $objQuery->commit();
+            $this->restore_msg = 'リストア終了しました。';
+            $this->restore_err = true;
+        } else {
+            $objQuery->rollback();
+            $this->restore_msg = 'リストアに失敗しました。';
+            $this->restore_name = $bkup_name;
+            $this->restore_err = false;
+        }
+        GC_Utils_Ex::gfPrintLog($this->restore_msg);
 
         // FIXME この辺りで、バックアップ時と同等の一時ファイルの削除を実行すべきでは?
@@ -488,5 +490,4 @@
                 continue;
             }
-            var_dump($matches);
             $file_path = $dir . $file_name;
             $table = $matches[1];
@@ -506,5 +507,9 @@
             }
 
+            GC_Utils_Ex::gfPrintLog('リストア実行: ' . $table);
+            $objQuery->delete($table);
+
             $line = 0;
+            $arrColName = array();
             while (!feof($fp)) {
                 $line++;
@@ -517,4 +522,11 @@
                 }
 
+                // 空行を無視
+                // false との比較は PHP 5.2.x Windows バグ対応
+                // 参考: http://www.php.net/manual/ja/function.fgetcsv.php#98502
+                if ($arrCsvLine === array(null) || $arrCsvLine === false) {
+                    continue;
+                }
+
                 $arrVal = array_combine($arrColName, $arrCsvLine);
                 $objQuery->insert($table, $arrVal);
@@ -541,21 +553,4 @@
     }
 
-    // DBを全てクリアする
-    function lfDeleteAll(&$objQuery) {
-        $ret = true;
-
-        $arrTableList = $objQuery->listTables();
-
-        foreach ($arrTableList as $val) {
-            // バックアップテーブルは削除しない
-            // XXX mtb_zip も削除不要では?
-            if ($val != 'dtb_bkup') {
-                $ret = $objQuery->delete($val);
-                if (PEAR::isError($ret)) return false;
-            }
-        }
-        return true;
-    }
-
     // 選択したバックアップをDBから削除
     function lfDeleteBackUp(&$arrForm, $bkup_dir, $bkup_ext) {
