version 1.5, 2006/05/30 19:29:48
|
version 1.13, 2006/08/11 20:07:18
|
Line 43 our @ISA = qw (Exporter);
|
Line 43 our @ISA = qw (Exporter);
|
our @EXPORT = qw(&add_get_param &escape &unescape &tie_domain_hash &untie_domain_hash &tie_user_hash &untie_user_hash &propath); |
our @EXPORT = qw(&add_get_param &escape &unescape &tie_domain_hash &untie_domain_hash &tie_user_hash &untie_user_hash &propath); |
my %perlvar; |
my %perlvar; |
|
|
|
|
|
|
# Inputs are a url, and a hash ref of |
# Inputs are a url, and a hash ref of |
# form name => value pairs |
# form name => value pairs |
# takes care of properly adding the form name elements and values to the |
# takes care of properly adding the form name elements and values to the |
Line 167 sub untie_user_hash {
|
Line 169 sub untie_user_hash {
|
return &_locking_hash_untie(@_); |
return &_locking_hash_untie(@_); |
} |
} |
|
|
|
# routines if you just have a filename |
|
# return tied hashref or undef |
|
|
|
sub locking_hash_tie { |
|
my ($filename,$how)=@_; |
|
my ($file_prefix,$namespace)=&db_filename_parts($filename); |
|
if ($namespace eq '') { return undef; } |
|
return &_locking_hash_tie($file_prefix,$namespace,$how); |
|
} |
|
|
|
sub locking_hash_untie { |
|
return &_locking_hash_untie(@_); |
|
} |
|
|
|
sub db_filename_parts { |
|
my ($filename)=@_; |
|
my ($file_path,$namespace)=($filename=~/^(.*)\/([^\/]+)\.db$/); |
|
if ($namespace eq '') { return undef; } |
|
return ($file_path.'/'.$namespace,$namespace); |
|
} |
|
|
# internal routines that handle the actual tieing and untieing process |
# internal routines that handle the actual tieing and untieing process |
|
|
sub _do_hash_tie { |
sub _do_hash_tie { |
Line 197 sub _do_hash_untie {
|
Line 220 sub _do_hash_untie {
|
|
|
{ |
{ |
my $sym; |
my $sym; |
|
my @pushed_syms; |
|
|
|
sub clean_sym { |
|
undef($sym); |
|
} |
|
sub push_locking_hash_tie { |
|
if (!defined($sym)) { |
|
die("Invalid used of push_locking_hash_tie, should only be called after a lock has occurred and before and unlock."); |
|
} |
|
push(@pushed_syms,$sym); |
|
undef($sym); |
|
} |
|
|
|
sub pop_locking_hash_tie { |
|
if (defined($sym)) { |
|
die("Invalid nested used of pop_locking_hash_tie, should only be called after a unlock has occurred."); |
|
} |
|
$sym = pop(@pushed_syms); |
|
} |
|
|
sub _locking_hash_tie { |
sub _locking_hash_tie { |
my ($file_prefix,$namespace,$how,$loghead,$what) = @_; |
my ($file_prefix,$namespace,$how,$loghead,$what) = @_; |
|
if (defined($sym)) { |
|
die('Nested locking attempted without proper use of push_locking_hash_tie, this is unsupported'); |
|
} |
|
|
my $lock_type=LOCK_SH; |
my $lock_type=LOCK_SH; |
# Are we reading or writing? |
# Are we reading or writing? |
if ($how eq &GDBM_READER()) { |
if ($how eq &GDBM_READER()) { |
Line 211 sub _do_hash_untie {
|
Line 257 sub _do_hash_untie {
|
if ((! -e "$file_prefix.db") && (! -e "$file_prefix.db.gz")) { |
if ((! -e "$file_prefix.db") && (! -e "$file_prefix.db.gz")) { |
# No such file. Forget it. |
# No such file. Forget it. |
$! = 2; |
$! = 2; |
|
&clean_sym(); |
return undef; |
return undef; |
} |
} |
# Apparently just no lock file yet. Make one |
# Apparently just no lock file yet. Make one |
open($sym,">>$file_prefix.db.lock"); |
open($sym,">>$file_prefix.db.lock"); |
} |
} |
# Do a shared lock |
# Do a shared lock |
if (!&flock_sym(LOCK_SH)) { return undef; } |
if (!&flock_sym(LOCK_SH)) { |
|
&clean_sym(); |
|
return undef; |
|
} |
# If this is compressed, we will actually need an exclusive lock |
# If this is compressed, we will actually need an exclusive lock |
if (-e "$file_prefix.db.gz") { |
if (-e "$file_prefix.db.gz") { |
if (!&flock_sym(LOCK_EX)) { return undef; } |
if (!&flock_sym(LOCK_EX)) { |
|
&clean_sym(); |
|
return undef; |
|
} |
} |
} |
} elsif ($how eq &GDBM_WRCREAT()) { |
} elsif ($how eq &GDBM_WRCREAT()) { |
# We are writing |
# We are writing |
open($sym,">>$file_prefix.db.lock"); |
open($sym,">>$file_prefix.db.lock"); |
# Writing needs exclusive lock |
# Writing needs exclusive lock |
if (!&flock_sym(LOCK_EX)) { return undef; } |
if (!&flock_sym(LOCK_EX)) { |
|
&clean_sym(); |
|
return undef; |
|
} |
} else { |
} else { |
die("Unknown method $how for $file_prefix"); |
die("Unknown method $how for $file_prefix"); |
} |
} |
Line 241 sub _do_hash_untie {
|
Line 297 sub _do_hash_untie {
|
# Change access mode to non-blocking |
# Change access mode to non-blocking |
$how=$how|&GDBM_NOLOCK(); |
$how=$how|&GDBM_NOLOCK(); |
# Go ahead and tie the hash |
# Go ahead and tie the hash |
return &_do_hash_tie($file_prefix,$namespace,$how,$loghead,$what); |
my $result = |
|
&_do_hash_tie($file_prefix,$namespace,$how,$loghead,$what); |
|
if (!$result) { |
|
&clean_sym(); |
|
} |
|
return $result; |
} |
} |
|
|
sub flock_sym { |
sub flock_sym { |
Line 270 sub _do_hash_untie {
|
Line 331 sub _do_hash_untie {
|
my $result = untie(%$hashref); |
my $result = untie(%$hashref); |
flock($sym,LOCK_UN); |
flock($sym,LOCK_UN); |
close($sym); |
close($sym); |
undef($sym); |
&clean_sym(); |
return $result; |
return $result; |
} |
} |
} |
} |