サイケデリックビビアンさんところにもあるが、自分のところでもバックアップしといたデータのリストアがうまくいかなかったので、同じように修正。でもそれでも変なのでさらにいろいろいじってみた。
元々うちは unix 系のマシン上で動かしているんだが、それをローカルの win なマシンでリストアしようってのが間違いだったのかもしれん。ちゃんと調べていないので定かではないが、改行コードとかいろいろ変わるし...
まぁとにかくバックアップファイルを mysql に直接食わせるとちゃんとリストできるのに、管理画面からはできない。ってなことで backup.php をいくつか変更した。
まず、line279行目あたりにある
$backup_file_type = $uploadInfo['backup_file']['type'];
ってやつ。これを以下のように変更。
$backup_file_type = $uploadInfo['type'];
ちゃんと type がとれないようで、数行後の
if (!preg_match("/^(text\/[a-zA-Z]+)|(application\/(x\-)?gzip(\-compressed)?)|(application\/octet-stream)$/is", $backup_file_type) )
return 'The uploaded file is not of the correct type';
ってところでエラーになる。
さらにその下の _execute_queries($sql_query); って中でもエラー。
なのでこれをざっくり下記の通り変更。
function _execute_queries($sql_query) {
if (!$sql_query) return;
// separate sql_query to each line
$lines = explode("\n", $sql_query);
printf( "count:%d\n", count($lines));
$bFirst = TRUE;
$sql = "";
for ($i=0; $i<count($lines); $i++) {
$len = strlen($lines[$i]);
if ($bFirst) {
// skip comment line and empty line<
if (($len>0 && $lines[$i][0] == "#") ||
$len==0 ) {
continue;
}
// if the end of line is not ";",
// the sql statement continue to the next line
if ($len>0 && $lines[$i][$len-1] != ";" ) {
$bFirst = FALSE;
$sql .= $lines[$i]."\n";
continue;
}
}
else {
// if the end of line is not ";" or
// the line is empty,
// the sql statement continue to the next line
if (($len>0 && $lines[$i][$len-1] != ";") || $len==0) {
$sql .= $lines[$i]."\n";
continue;
}
}
$sql .= $lines[$i];
$sql = trim( $sql, ";" );
if (!empty($sql)) {
$result = mysql_query($sql);
if (!$result) {
debug ("SQL Error: " . mysql_error());
break;
}
}
$sql = "";
$bFirst = TRUE;
}
}
もともとこの関数の中では、remove_remarks や split_sql_file といたコメント行をとっぱらったり、SQL 文ごとに分割したりする関数を呼んでいるんだが、例えばコメント本文の各行の最初に # がある場合なんかが考慮されてないみたいで、エラーになる。
とくに split_sql_file の方は phpBB からもらってきてるらしいので、それなりに実績があるはずなんだが...最初ちょこちょこデバッグルーチンつっこんで、あーでもない、こーでもないってやってたんだが、どうにも array と string の違いにいまいちピンときてない(<自分^^;)ようでなかなか修正できず。
で、面倒なので1から書いてしまえ、ってことで上のような結果になった。
と、ざっくり書き換えてるので、動作の保証はし兼ねるが、まぁ少なくとも手元にあったバックアップファイル2つはちゃんとリストアできた。
って、そもそもなんでこんなこと始めたかというと、まぁそれなりに理由があるんだが、それはまた別エントリーにて。
OpenID を使ってログインすることができます。
poker, backgammon, tramadol, casino, insurance, loans