PETROOM大改造
【萌え萌えキャラクターズと遊ぼー。】

ユーザーデータの自動バックアップ

※現在は、「ユーザーデータの半自動アックアップ」の方をお勧めいたします。

おいらも経験しております、ユーザーデータの消滅・・・。
これは、主にファイルの同時アクセスが原因と言われていますが、おいらには詳しいことは分かりません。
ただ一つ言えることは、同時アクセスが原因であるならば、それを防ぐことは100%無理と言うことです。
ファイルロックの手法がいくつかありますが、壊れる確率を低くすることは出来ても、
「真」の同時アクセスがあった場合、それは結局無意味なものになります、多分(^^;

では、消えてしまうのはしょうがないとして、なんとか自動でバックアップを取れないかと、
いろいろ考え始めたのですが、凝れば凝るほど訳が分からなくなってしまい、一回投げました(爆)

が、いくらかでも消滅する確率が減ればいいかな、と言うことで作ってみました。
ちなみに「遊ぼー。」でも「一緒」でも使用しておりませんし、
マイPCによるローカルチェックなので、実際有効なのかどうか分かりません(^^;


どんなことをするのか、簡単に説明しますと、
まずユーザーデータを書き込むときに、バックアップ用にもう一つのファイルにも書き込みます。
ただし、バックアップに書き込もうとしているデータが「データなし」だったら、書き込みをしません。

次にユーザーデータを読みこんだときに、「データなし」だったら、
バックアップ用のファイルからユーザーデータを読みこみます。

・・・それだけです(笑)
つまり、どちらかが生きていれば、生きている方をデータとして採用します。
なので、両方消えちゃったらほとんど意味はありません・・・。


あとですね、PETROOMの仕様で、
ペットを新しく迎えたときは、ユーザーデータが初期化されることを知っていましたか?
通常のPETROOMの場合、ペットが死んでしまったら、新しい名前を付けて、
再び最初からみなさんに遊んでもらう感じだと思うんですが、
ことねっつの改造ページを見に来て下さっている方々は、きっとそうじゃないと思うんです。
たとえ死んでしまっても、同じ名前で復活させて、ユーザーデータも前のままで、
何事もなかったように続きからまた遊んでもらう・・・そういう人が多いと思うんです。

ですが、死んでしまったときや、ペットデータが消えてしまったときは、
現状のままですとユーザーデータも初期化されてしまいます。

つまり、ユーザーデータが消える原因は、ペットデータの消滅にもあるわけです。
危険度2倍ですね、単純に。
そこで、ペットデータが初期化されてもユーザーデータは初期化しないような改造も施します。
必要ない方は、その部分は改造しないでくださいね。


ではまず、自動バックアップの改造から。
新しいファイルを設定しましょう。
プログラムの上の方で、こんな風に追記して下さい。

# データファイル名
$userdata = './user.dat';               # 来客者情報が入ってるデータ
$userback = './userback.dat';           # 来客者情報が入ってるデータ(バックアップ)
$petdata  = './pet.dat';                # ペットの情報が入ってるデータ
$lockkey  = 1;                          # ファイルのロック(0=使用しない 1=使用する)
$lockfile = './pet.lock';               # ロックファイル名
$method   = 'POST';                     # POSTかGETを選択

このuserback.datにバックアップ用のデータを書き込みます。
次に、実際にバックアップを取るところを見てみましょう。
ユーザーデータの書き込み(sub openoutuserdata)に下記のように追記します。

# ------------------------- #
# Sub Open Out User Data
# ユーザーデータの書きこみ
# ------------------------- #
sub openoutuserdata {
    if ($lockkey == 1) { &lock; }
    open(OUT,">$userdata") || &error("Can't write $userdata");
    print OUT @new;
    close(OUT);
    if (@new[0] ne '') {
        open(OUT,">$userback") || &error("Can't write $userback");
        print OUT @new;
        close(OUT);
    }
    &unlock;
}

書き込もうとしているデータが「データなし」じゃなかったら、
バックアップファイルにも同じデータを書き込みます。

次に、ユーザーデータを読みこむところを改造します。
ユーザーデータの読みこみ(sub openinuserdata)に下記のように追記します。

# ------------------------- #
# Sub Open In User Data
# ユーザーデータの読みこみ
# ------------------------- #
sub openinuserdata {
    if ($lockkey == 1) { &lock; }
    open(IN,"$userdata") || &error("Can't open $userdata");
    @lines = <IN>;
    close(IN);
    if ($lines[0] eq '') {
        open(IN,"$userback") || &error("Can't open $userback");
        @lines = <IN>;
        close(IN);
    }
    &unlock;

    foreach $line (@lines) {
        ($name,$pass,$gdate,$love) = split(/<>/,$line);

読みこんだユーザーデータが「データなし」だったら、
バックアップファイルのデータを読みこみます。

自動バックアップの改造は以上で終了です。
念のため、最新のユーザーデータをダウンロードして、とりあえず保存してください。
さらにそれをコピーして、ファイル名をuserback.datに変更し、
改造したスクリプトをアップロードするときに、一緒にアップしてください。


続いて、ペットデータ初期化時にユーザーデータの初期化をしないようにする改造です。
新規ペット登場(sub newpet)の下記の部分をコメントにしてください。

# ------------------------- #
# Sub New Pet
# 新規ペット登場
# ------------------------- #
sub newpet {
    $deadname = $petname;
    $petname = $FORM{'petname'};
    if ($petname eq "")                          { &error("ペットに名前をつけてください"); }
    if ($petname eq $deadname && $samename == 0) { &error("前と同じ名前はつけられません"); }
    if ( $FORM{'sex'} == 1 )                     { $sex = 'メス'; }  else { $sex = 'オス'; }
    $godfather = $FORM{'name'};
    $birth     = time;
    $dead      = 0;
    $lastfeed  = time;
    $lastplay  = time;
    $good      = 0;
    $bad       = 0;
    $out       = 0;
    $outdate   = 0;
    $num++;
    &openoutpetdata;
#   $gdate = time - $dayhour[$playtime + 1];
#   @new = "$FORM{'name'}<>$FORM{'pass'}<>$gdate<>$loved<>\n";
#   &openoutuserdata;
    &petform;
}

心配な方は、やはりご自分でバックアップを取ることをお勧めいたします。