# データファイル名
$userdata = './user.dat'; # 来客者情報が入ってるデータ
$petdata = './pet.dat'; # ペットの情報が入ってるデータ
$lockkey = 3; # ファイルのロック(0=no 1=mkdir 2=symlink 3=flock)
$lockfile = './petlock'; # ロックファイル名 ver2.1のみ
# flockモード定数
sub LOCK_EX{2} # 排他ロック
sub LOCK_UN{8} # ロック解除
$method = 'POST'; # POSTかGETを選択
|
# ------------------------- #
# Sub Open In Pet Data
# ペットデータの読みこみ
# ------------------------- #
sub openinpetdata {
if ($lockkey != 0) { &lock }
open(IN,"$petdata") || &error("Can't open $petdata");
$line = <IN>;
close(IN);
($petname,$godfather,$birth,$sex,$dead,$lastfeed,$lastplay,$lastvisit,$good,$bad,$out,$outdate,$num)
= split(/<>/,$line);
&unlock;
}
|
# ------------------------- #
# Sub Open Out Pet Data
# ペットデータの更新
# ------------------------- #
sub openoutpetdata {
$lastvisit = time;
$line = "$petname<>$godfather<>$birth<>$sex<>$dead<>$lastfeed<>$lastplay<>$lastvisit<>$good<>$bad<>$out<>$outdate<>$num";
if ($lockkey != 0) { &lock }
open(OUT,">$petdata") || &error("Can't write $petdata");
print OUT $line;
close(OUT);
&unlock;
}
|
# ------------------------- #
# Sub Open In User Data
# ユーザーデータの読みこみ
# ------------------------- #
sub openinuserdata {
if ($lockkey != 0) { &lock }
open(IN,"$userdata") || &error("Can't open $userdata");
@lines = <IN>;
close(IN);
&unlock;
foreach $line (@lines) {
($name,$pass,$gdate,$love) = split(/<>/,$line);
if ($_[0] eq 'checkname') {
if ($FORM{'name'} eq $name) {
$flag = 1; # データの中にユーザーを確認
if ($FORM{'pass'} ne $pass) { &error("パスワードが間違っています") }
|
# ------------------------- #
# Sub Open Out User Data
# ユーザーデータの書きこみ
# ------------------------- #
sub openoutuserdata {
if ($lockkey != 0) { &lock }
open(OUT,">$userdata") || &error("Can't write $userdata");
print OUT @new;
close(OUT);
&unlock;
}
|
# ------------------------- #
# Sub Lock
# ロック
# ------------------------- #
sub lock {
return if !$lockkey;
if ($lockkey == 1) {
local($flag) = 10;
rmdir($lockfile) if (time - (stat($lockfile))[9] > 60);
while (!mkdir($lockfile, 606)) {
--$flag or &error("現在、他の人が使用しています", 1);
select(undef, undef, undef, 1);
}
}
elsif ($lockkey == 2) {
unlink($lockfile) if (time - (stat($lockfile))[9] > 60);
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { &error('現在、他の人が使用しています') }
sleep(1);
}
}
elsif ($lockkey == 3) {
open(LOCK_FH,"> $lockfile");
flock(LOCK_FH,LOCK_EX);
}
}
# ------------------------- #
# Sub Unlock
# アンロック
# Amend for Ver 2.2
# ------------------------- #
sub unlock {
if ($lockkey == 1) { rmdir($lockfile) }
elsif ($lockkey == 2) { unlink($lockfile) }
elsif ($lockkey == 3) { close(LOCK_FH); flock(LOCK_FH,LOCK_UN); }
}
|
# ------------------------- #
# Sub Lock
# ロック
# Amend for Ver 2.2
# ------------------------- #
sub lock {
return if !$lockkey;
if ($lockkey == 1) {
local($flag) = 10;
rmdir($lockfile) if (time - (stat($lockfile))[9] > 60);
while (!mkdir($lockfile, 606)) {
--$flag or &error("現在、他の人が使用しています", 1);
select(undef, undef, undef, 1);
}
}
elsif ($lockkey == 2) {
unlink($lockfile) if (time - (stat($lockfile))[9] > 60);
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { &error('現在、他の人が使用しています') }
sleep(1);
}
}
elsif ($lockkey == 3) {
open(LOCK_FH,"> $lockfile");
flock(LOCK_FH,LOCK_EX);
}
}
# ------------------------- #
# Sub Unlock
# アンロック
# Amend for Ver 2.2
# ------------------------- #
sub unlock {
if ($lockkey == 1) { rmdir($lockfile) }
elsif ($lockkey == 2) { unlink($lockfile) }
elsif ($lockkey == 3) { close(LOCK_FH); flock(LOCK_FH,LOCK_UN); }
}
|