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

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

ロックを強化しても、消えるときは消えてしまうし、
二重になるときや、もうメチャクチャになるときなど、
なかなか厄介な、ユーザーデータの同時アクセス。

以前「ユーザーデータの自動バックアップ」を掲載しましたが、
その改造は「データの中身が消えたとき」に、
自動的に過去のデータを読み出してくる改造でしたので、
二重になったり、一部が消えたデータに関しては、意味がありませんでした。

本当は、オーナーさんがこまめにバックアップを手動で取るのが好ましいのですが、
これはなかなか大変ですし、タイミングを外したりすると、だいぶ前のデータだったり…。
幸い、ことねっつではユーザーデータの破壊が少なく、今まで必要としていなかったのですが、



えー…、わたくし2つほど、とある方々の、とある改造PETROOMたちにハマっておりまして、
先日その片方のPETROOMで、ユーザーデータが二重になったり、
一部が消えたりと、立て続けに問題が発生しておりました。
同時アクセスは、人気PETROOMの宿命でもありますが、
あまりにもオーナーさんが大変そうで…(建て前)。

え? あ、そうです、ぶどうさんの「遙のお見舞い」です、よく分かりましたね。
もう1つは、あっしゅさんの「Crescent Moon」です。
…と何気に宣伝しておいて…。

で、そのユーザーデータがおかしくなる現象ですが、
かなり頻繁に発生しておりましたので、
「こ、これは遙たんのおいらのデータも消えてしまうんじゃ…!?
それはまずいっ! ここまで頑張ったのに、消えてなるものかっ!!!」

(作った理由はそれかいっ!(核爆))



そんな、不純な動機で作りました(爆)
内容は、オーナーさんが遊ぶたびに、勝手にバックアップを取ってくれるというモノです。
過去3つまで保存しますので、どうにか、なんとか、出来るでしょう(謎)
ただし、前述の通り、オーナーさんが遊ばないとバックアップされませんので、
毎日バックアップを取りたい方は、毎日1回は遊ぶようにしてください。

その他注意事項は、また最後に書きますね。



では、さっそく改造に取りかかりましょう。

まず一番最初に、バックアップ用ファイルの元を作ります。
PETROOMを設置したとき、空っぽのpet.datuser.datをアップしましたよね?
それと同じような感じです。

back1.dat
back2.dat
back3.dat

という、空っぽのファイルを3つ作って、
pet.cgiと同じディレクトリ(フォルダ)に転送したあと、
3つとも、パーミッションを666にする。

空っぽのファイルの作り方ですが、
pet.datなどをコピーして、ファイル名を変えて、中身を消したモノでもいいですし、
Windowsでしたら、エクスプローラなどで、
右クリック→新規作成→テキストファイル→ファイル名変更→はい、で作れます。
また、パーミッションはサーバによって違いますが、
とにかく、ペットデータやユーザーデータと同じパーミッションにしてください。

とりあえず、先にこの3つをサーバにアップして、パーミッションを変更しておきましょう。



ではでは、スクリプトの改造へ。

ユーザーデータの書き込み(sub openoutuserdata)に下記のように追記してください。

# ------------------------- #
# Sub Open Out User Data
# ユーザーデータの書きこみ
# ------------------------- #
sub openoutuserdata {
    if ($FORM{'name'} eq 'オーナーさんが遊ぶときの名前') {
        open(BACK,"back2.dat") || &error("Can't Open BackUpFile");
        @back3 = <BACK>;
        close(BACK);
        open(BACK,">back3.dat") || &error("Can't Write BackUpFile");
        print BACK @back3;
        close(BACK);

        open(BACK,"back1.dat") || &error("Can't Open BackUpFile");
        @back2 = <BACK>;
        close(BACK);
        open(BACK,">back2.dat") || &error("Can't Write BackUpFile");
        print BACK @back2;
        close(BACK);

        open(BACK,"$userdata") || &error("Can't open $userdata");
        @back1 = <BACK>;
        close(BACK);
        open(BACK,">back1.dat") || &error("Can't Write BackUpFile");
        print BACK @back1;
        close(BACK);
    }

    if ($lockkey == 1) { &lock; }
    open(OUT,">$userdata") || &error("Can't write $userdata");
    print OUT @new;
    close(OUT);
    &unlock;
}

オーナーさんが遊ぶときの名前を忘れずに書き換えてください。



次に、このスクリプトをアップする前にユーザーデータをダウンロードして、
とりあえず、バックアップを取っておきます、念のため。

次に改造スクリプトをアップして、1回遊んでみてください。

今度は、back1.datをダウンロードして、中身を確認してください。
手動でバックアップを取ってから、オーナーさんが遊ぶまでに誰も遊びに来なかったとすれば、
手動バックアップと、back1.datの中身は、同じハズです。

これでOKです。
あとは注意事項を読んでくださいね。



注意事項

バックアップは、新しいモノがback1.datで、back3.datへいくほど古いモノが入ります。
データを復活させるときは、back1.datの中身から確認していってください。

back1.dat、back2.dat、back3.datのファイル名は、変更することをお勧めします。
ファイル名を変えましたら、スクリプトの中身のファイル名を変えるのも、お忘れなく。

以前の自動バックアップも併用可能ですが、ファイル名がかぶらないようにしてください。