From 42e7ab8a13679442f2cd7524ab7fa38bb2166951 Mon Sep 17 00:00:00 2001 From: ndparker <> Date: Wed, 25 Apr 2001 18:19:39 +0000 Subject: [PATCH 1/1] Lock.pm: now you can convert a shared lock into an exclusive lock without a race condition other files adjusted to work with fo_voting.pl --- selfforum-cgi/shared/Conf/Admin.pm | 3 + selfforum-cgi/shared/Encode/Posting.pm | 11 +- selfforum-cgi/shared/Lock.pm | 376 ++++++++++++----------- selfforum-cgi/shared/Posting/Write.pm | 6 +- selfforum-cgi/shared/Template/Forum.pm | 7 +- selfforum-cgi/shared/Template/Posting.pm | 18 +- selfforum-cgi/shared/Template/_thread.pm | 3 +- selfforum-cgi/user/config/fo_view.xml | 166 ---------- selfforum-cgi/user/fo_posting.pl | 34 +- selfforum-cgi/user/fo_view.pl | 23 +- 10 files changed, 277 insertions(+), 370 deletions(-) diff --git a/selfforum-cgi/shared/Conf/Admin.pm b/selfforum-cgi/shared/Conf/Admin.pm index 0c3a469..27a8c93 100644 --- a/selfforum-cgi/shared/Conf/Admin.pm +++ b/selfforum-cgi/shared/Conf/Admin.pm @@ -69,6 +69,9 @@ sub read_admin_conf ($) { quoting => $quoting -> getAttribute ('quotingON'), quoteChars => $char?$char -> getFirstChild -> getData:undef}; + my $voting = $forum -> getElementsByTagName ('Voting', 0) -> item (0); + $conf {Voting} = {voteLock => $voting -> getAttribute ('voteLock')}; + # Severance $conf {Severance} = &get_severance ($forum -> getElementsByTagName ('Severance', 0) -> item (0)); diff --git a/selfforum-cgi/shared/Encode/Posting.pm b/selfforum-cgi/shared/Encode/Posting.pm index c0815f4..e35e648 100644 --- a/selfforum-cgi/shared/Encode/Posting.pm +++ b/selfforum-cgi/shared/Encode/Posting.pm @@ -209,6 +209,7 @@ sub message_field ($$) { my $posting = ${+shift}; my $params = shift || {}; + my $break = '
'; if ($params -> {quoting}) { # quotes are displayed as special? my @array = [0 => []]; @@ -224,10 +225,14 @@ sub message_field ($$) { } shift @array unless @{$array[0][-1]}; + my $ll=0; $posting = join '
' => map { - $_->[0] - ? join join ('
' => @{$_->[-1]}) => ($params->{startCite}, $params->{endCite}) - : (join '
' => @{$_->[-1]}); + my $string = $_->[0] + ? (($ll and $ll != $_->[0]) ? $break : '') . + join join ($break => @{$_->[-1]}) + => ($params->{startCite}, $params->{endCite}) + : (join $break => @{$_->[-1]}); + $ll = $_->[0]; $string; } @array; } diff --git a/selfforum-cgi/shared/Lock.pm b/selfforum-cgi/shared/Lock.pm index f3291c6..3f01861 100644 --- a/selfforum-cgi/shared/Lock.pm +++ b/selfforum-cgi/shared/Lock.pm @@ -11,16 +11,19 @@ package Lock; ################################################################################ use strict; -use Carp; use vars qw( @EXPORT_OK %EXPORT_TAGS + %LOCKED $Timeout $violentTimeout $masterTimeout $iAmMaster ); +use Carp; +use Fcntl; + ################################################################################ # # Export @@ -48,17 +51,26 @@ use base qw(Exporter); write_unlock_file violent_unlock_file )], - ALL => [qw( - lock_file - unlock_file - write_lock_file - write_unlock_file - violent_unlock_file - set_master_lock - release_file - )] + ALL => \@EXPORT_OK ); +### sub ~file ($) ############################################################## +# +# create lock file names +# +sub reffile ($) { + return $_[0].'.lock.ref'; +} +sub lockfile ($) { + return $_[0].'.lock'; +} +sub masterfile ($) { + return $_[0].'.master'; +} +sub masterlockfile ($) { + return lockfile(masterfile $_[0]); +} + ################################################################################ # # Windows section (no symlinks) @@ -78,21 +90,23 @@ sub w_lock_file ($;$) { my $filename = shift; my $timeout = +shift || $Timeout; - if (-f &masterlockfile($filename)) { - for (0..$timeout) { - - # try to increment the reference counter - # - &set_ref($filename,1,$timeout) and return 1; - sleep (1); + unless ($LOCKED{$filename}) { + if (-f masterlockfile($filename)) { + for (1..$timeout) { + + # try to increment the reference counter + # + if (set_ref($filename,1,$timeout)) { + $LOCKED{$filename}=1; + return 1; + } + sleep (1); + } + } + else { + # master lock is set or file has not been released yet + return; } - } - - else { - # master lock is set - # or file has not been realeased yet - # - return; } # time out @@ -114,17 +128,25 @@ sub w_unlock_file ($;$) { my $filename = shift; my $timeout = shift || $Timeout; - if (-f &masterlockfile($filename)) { - - # try do decrement the reference counter - # - &set_ref($filename,-1,$timeout) and return 1; + if ($LOCKED{$filename}) { + if ($LOCKED{$filename} == 3) { + return unless write_unlock_file($filename, $timeout); + $LOCKED{$filename} = 1; + } + if ($LOCKED{$filename} == 1) { + if (-f masterlockfile($filename)) { + + # try do decrement the reference counter + # + if (set_ref($filename,-1,$timeout)) { + delete $LOCKED{$filename}; + return 1; + } + } + } } # time out - # maybe the system is occupied - # or file has not been released yet - # return; } @@ -141,32 +163,36 @@ sub w_unlock_file ($;$) { sub w_write_lock_file ($;$) { my $filename=shift; my $timeout= shift || $Timeout; + my $rest = ($LOCKED{$filename} and $LOCKED{$filename} == 1) ? 1 : 0; - if (-f &masterlockfile($filename) or $iAmMaster) { + if (-f masterlockfile($filename) or $iAmMaster) { # announce the write lock # and wait $timeout seconds for # references == 0 (no shared locks set) # - &simple_lock ($filename,$timeout) or return 0; - for (0..$timeout) { + simple_lock ($filename,$timeout) or return 0; + for (1..$timeout) { # lock reference counter # or fail # - unless (&simple_lock (&reffile($filename),$timeout)) { - &simple_unlock($filename,$timeout); + unless (simple_lock (reffile($filename),$timeout)) { + simple_unlock($filename,$timeout); return 0; } # ready if we have no shared locks # - return 1 if (&get_ref ($filename) == 0); + if (get_ref ($filename) == $rest) { + $LOCKED{$filename} = 2 | ($rest ? 1 : 0); + return 1; + }; # release reference counter # shared locks get the chance to be removed # - unless (&simple_unlock (&reffile($filename),$timeout)) { - &simple_unlock($filename,$timeout); + unless (simple_unlock (reffile($filename),$timeout)) { + simple_unlock($filename,$timeout); return 0; } sleep(1); @@ -175,17 +201,15 @@ sub w_write_lock_file ($;$) { # write lock failed # remove the announcement # - &simple_unlock ($filename);} + simple_unlock ($filename); + } else { - # master lock is set - # or file has not been released yet - # - return;} + # master lock is set or file has not been released yet + return; + } # time out - # maybe the system is occupied - # 0; } @@ -203,17 +227,19 @@ sub w_write_unlock_file ($;$) { my $filename = shift; my $timeout = shift || $Timeout; - if (-f &masterlockfile($filename) or $iAmMaster) { + if (-f masterlockfile($filename) or $iAmMaster) { # remove reference counter lock # - &simple_unlock (&reffile($filename),$timeout) or return; + simple_unlock (reffile($filename),$timeout) or return; # remove the write lock announce # - &simple_unlock ($filename,$timeout) or return;} + simple_unlock ($filename,$timeout) or return; + } # done + delete $LOCKED{$filename}; 1; } @@ -229,20 +255,22 @@ sub w_write_unlock_file ($;$) { sub w_violent_unlock_file ($) { my $filename = shift; - if (-f &masterlockfile($filename)) { + if (-f masterlockfile($filename)) { # find out last modification time # and do nothing unless 'violent-timout' is over # my $reffile; - if (-f ($reffile = $filename) or -f ($reffile = &lockfile($filename))) { + if (-f ($reffile = $filename) or -f ($reffile = lockfile($filename))) { my $time = (stat $reffile)[9]; - return if ((time - $time) < $violentTimeout);} + (time - $time) >= $violentTimeout or return; + } write_lock_file ($filename,1); # last try, to set an exclusive lock on $filename - unlink (&reffile($filename)); # reference counter = 0 - simple_unlock (&reffile($filename)); # release reference counter file + unlink (reffile($filename)); # reference counter = 0 + simple_unlock (reffile($filename)); # release reference counter file simple_unlock ($filename);} # release file + delete $LOCKED{$filename}; return; } @@ -263,11 +291,11 @@ sub w_set_master_lock ($;$) { # set exclusive lock or fail # - return unless (&write_lock_file ($filename,$timeout)); + return unless (write_lock_file ($filename,$timeout)); # set master lock # - unlink &masterlockfile($filename) and return 1; + unlink masterlockfile($filename) and return 1; # no chance (occupied?, master lock set yet?) return; @@ -286,11 +314,12 @@ sub w_set_master_lock ($;$) { sub w_release_file ($) { my $filename=shift; - unlink (&reffile($filename)); # reference counter = 0 - return if (-f &reffile($filename)); # really? - return unless (simple_unlock (&reffile($filename))); # release reference counter - return unless (&simple_unlock ($filename)); # remove any write lock announce - return unless (&simple_unlock (&masterfile($filename))); # remove master lock + unlink (reffile($filename)); # reference counter = 0 + return if (-f reffile($filename)); # really? + return unless (simple_unlock (reffile($filename))); # release reference counter + return unless (simple_unlock ($filename)); # remove any write lock announce + return unless (simple_unlock (masterfile($filename))); # remove master lock + delete $LOCKED{$filename}; # done 1; @@ -315,25 +344,27 @@ sub x_lock_file ($;$) { my $filename = shift; my $timeout = shift || $Timeout; - unless (-l &masterlockfile($filename)) { - for (0..$timeout) { - - # try to increment the reference counter - # - &set_ref($filename,1,$timeout) and return 1; - sleep (1); + unless ($LOCKED{$filename}) { + unless (-l masterlockfile($filename)) { + for (1..$timeout) { + + # try to increment the reference counter + # + if (set_ref($filename,1,$timeout)) { + $LOCKED{$filename} = 1; + return 1; + } + sleep (1); + } } - } - else { - # master lock is set - # or file has not been realeased yet - # - return; + else { + # master lock is set or file has not been realeased yet + return; + } } # time out - # maybe the system is occupied 0; } @@ -351,16 +382,25 @@ sub x_unlock_file ($;$) { my $filename=shift; my ($timeout)=(shift (@_) or $Timeout); - unless (-l &masterlockfile($filename)) { - # try do decrement the reference counter - # - &set_ref($filename,-1,$timeout) and return 1;} + if ($LOCKED{$filename}) { + if ($LOCKED{$filename} == 3) { + return unless write_unlock_file($filename, $timeout); + $LOCKED{$filename} = 1; + } + if ($LOCKED{$filename} == 1) { + unless (-l masterlockfile($filename)) { + # try to decrement the reference counter + # + set_ref($filename,-1,$timeout) and do { + delete $LOCKED{$filename}; + return 1; + } + } - # time out - # maybe the system is occupied - # or file has not been released yet - # - return; + # time out + return; + } + } } ### sub x_write_lock_file ($;$) ################################################ @@ -376,32 +416,36 @@ sub x_unlock_file ($;$) { sub x_write_lock_file ($;$) { my $filename = shift; my $timeout = shift || $Timeout; + my $rest = ($LOCKED{$filename} and $LOCKED{$filename} == 1) ? 1 : 0; - unless (-l &masterlockfile($filename) and not $iAmMaster) { + unless (-l masterlockfile($filename) and not $iAmMaster) { # announce the write lock # and wait $timeout seconds for # references == 0 (no shared locks set) # - &simple_lock ($filename,$timeout) or return 0; - for (0..$timeout) { + simple_lock ($filename,$timeout) or return 0; + for (1..$timeout) { # lock reference counter # or fail # - unless (&simple_lock (&reffile($filename),$timeout)) { - &simple_unlock($filename,$timeout); + unless (simple_lock (&reffile($filename),$timeout)) { + simple_unlock($filename,$timeout); return 0; } # ready if we have no shared locks # - return 1 if (&get_ref ($filename) == 0); + if (get_ref ($filename) == $rest) { + $LOCKED{$filename} = 2 | ($rest ? 1 : 0); + return 1; + }; # release reference counter # shared locks get the chance to be removed # - unless (&simple_unlock (&reffile($filename),$timeout)) { - &simple_unlock($filename,$timeout); + unless (simple_unlock (&reffile($filename),$timeout)) { + simple_unlock($filename,$timeout); return 0; } sleep(1); @@ -410,7 +454,8 @@ sub x_write_lock_file ($;$) { # write lock failed # remove the announcement # - &simple_unlock ($filename);} + simple_unlock ($filename); + } else { # master lock is set @@ -442,14 +487,15 @@ sub x_write_unlock_file ($;$) { unless (-l &masterlockfile($filename) and not $iAmMaster) { # remove reference counter lock # - &simple_unlock (&reffile($filename),$timeout) or return; + simple_unlock (reffile($filename),$timeout) or return; # remove the write lock announce # - &simple_unlock ($filename,$timeout) or return; + simple_unlock ($filename,$timeout) or return; } # done + delete $LOCKED{$filename}; 1; } @@ -475,16 +521,17 @@ sub x_violent_unlock_file ($) { if (-f ($reffile = $filename)) { $time = (stat $reffile)[9];} - elsif (-l ($reffile = &lockfile($filename))) { + elsif (-l ($reffile = lockfile($filename))) { $time = (lstat $reffile)[9];} if ($reffile) { return if ((time - $time) < $violentTimeout);} write_lock_file ($filename,1); # last try, to set an exclusive lock on $filename - unlink (&reffile($filename)); # reference counter = 0 - simple_unlock (&reffile($filename)); # release reference counter file + unlink (reffile($filename)); # reference counter = 0 + simple_unlock (reffile($filename)); # release reference counter file simple_unlock ($filename);} # release file + delete $LOCKED{$filename}; } ### sub x_set_master_lock ($;$) ################################################ @@ -503,11 +550,11 @@ sub x_set_master_lock ($;$) { # set exclusive lock or fail # - return unless (&write_lock_file ($filename,$timeout)); + return unless (write_lock_file ($filename,$timeout)); # set master lock # - symlink $filename, &masterlockfile($filename) and return 1; + symlink $filename, masterlockfile($filename) and return 1; # no chance (occupied?, master lock set yet?) return; @@ -526,39 +573,17 @@ sub x_set_master_lock ($;$) { sub x_release_file ($) { my $filename=shift; - unlink (&reffile($filename)); # reference counter = 0 - return if (-f &reffile($filename)); # really? - return unless (simple_unlock (&reffile($filename))); # release reference counter - return unless (&simple_unlock ($filename)); # remove any write lock announce - return unless (&simple_unlock (&masterfile($filename))); # remove master lock + unlink (reffile($filename)); # reference counter = 0 + return if (-f reffile($filename)); # really? + return unless (simple_unlock (reffile($filename))); # release reference counter + return unless (simple_unlock ($filename)); # remove any write lock announce + return unless (simple_unlock (masterfile($filename))); # remove master lock + delete $LOCKED{$filename}; # done 1; } -################################################################################ -# -# private subs -# - -### sub ~file ($) ############################################################## -# -# create lock file names -# -sub reffile ($) { - "$_[0].lock.ref"; -} -sub lockfile ($) { - "$_[0].lock"; -} -sub masterlockfile ($) { - &lockfile(&masterfile($_[0])); -} -sub masterfile ($) { - confess unless defined $_[0]; - "$_[0].master"; -} - ### sub w_simple_lock ($;$) #################################################### ### sub w_simple_unlock ($) #################################################### # @@ -575,7 +600,7 @@ sub w_simple_lock ($;$) { my $timeout = shift || $Timeout; my $lockfile = lockfile $filename; - for (0..$timeout) { + for (1..$timeout) { unlink $lockfile and return 1; sleep(1); } @@ -590,7 +615,7 @@ sub w_simple_unlock ($) { my $lockfile = lockfile $filename; local *LF; - if (open(LF, "> $lockfile")) { + if (sysopen(LF, $lockfile, O_WRONLY|O_CREAT|O_TRUNC)) { return 1 if close (LF); } @@ -599,8 +624,8 @@ sub w_simple_unlock ($) { return; } -### sub w_simple_lock ($;$) #################################################### -### sub w_simple_unlock ($) #################################################### +### sub x_simple_lock ($;$) #################################################### +### sub x_simple_unlock ($) #################################################### # # simple file lock/unlock # (symlinks possible: create/unlink symlink) @@ -615,21 +640,19 @@ sub x_simple_lock ($;$) { my $timeout = shift || $Timeout; my $lockfile = lockfile $filename; - for (0..$timeout) { + for (1..$timeout) { symlink $filename,$lockfile and return 1; sleep(1); } # time out - # locking failed (occupied?) - # return; } sub x_simple_unlock ($) { my $filename=shift; - unlink (&lockfile($filename)) and return 1; + unlink (lockfile $filename) and return 1; # not able to unlink symlink, hmmm... # @@ -652,30 +675,20 @@ sub w_set_ref ($$$) { my $filename = shift; my $z = shift; my $timeout = shift || $Timeout; - my $old; - my $reffile = reffile $filename; + my $reffile = reffile $filename; local *REF; # if write lock announced, only count down allowed # - if ($z > 0) { - return unless(-f lockfile($filename)); - } + ($z < 0 or -f lockfile ($filename)) or return; # lock reference counter file # - return unless(&simple_lock ($reffile,$timeout)); + simple_lock ($reffile,$timeout) or return; # load reference counter # - unless (open REF,"<$reffile") { - $old=0; - } - else { - $old=; - chomp $old; - close REF or return; - } + my $old = get_ref ($filename); # compute and write new ref. counter # @@ -686,17 +699,21 @@ sub w_set_ref ($$$) { # if ref. counter == 0 # if ($old == 0) { - unlink $reffile or return; + unlink $reffile or return; } else { - open REF,">$reffile" or return; - print REF $old or return; - close REF or return; + local $\="\n"; + sysopen (REF, $reffile, O_WRONLY | O_TRUNC | O_CREAT) or return; + print REF $old or do { + close REF; + return + }; + close REF or return; } # release ref. counter file # - return unless(&simple_unlock($reffile)); + simple_unlock($reffile) or return; # done 1; @@ -718,47 +735,44 @@ sub x_set_ref ($$$) { my $filename = shift; my $z = shift; my $timeout = shift || $Timeout; - my $old; - my $reffile = reffile $filename; + my $reffile = reffile $filename; local *REF; # if write lock announced, only count down allowed # if ($z > 0) { - return if(-l &lockfile($filename)); + return if(-l lockfile($filename)); } # lock reference counter file # - return unless(&simple_lock ($reffile,$timeout)); + return unless(simple_lock ($reffile,$timeout)); # load reference counter # - unless (open REF,"<$reffile") { - $old=0; - } - else { - $old=; - chomp $old; - close REF or return; - } + my $old = get_ref ($filename); # compute and write new ref. counter # $old += $z; $old = 0 if ($old < 0); + if ($old == 0) { - unlink $reffile or return; + unlink $reffile or return; } else { - open REF,">$reffile" or return; - print REF $old or return; - close REF or return; + local $\="\n"; + sysopen (REF, $reffile, O_WRONLY | O_TRUNC | O_CREAT) or return; + print REF $old or do { + close REF; + return + }; + close REF or return; } # release ref. counter file # - return unless(&simple_unlock($reffile)); + simple_unlock($reffile) or return; # done 1; @@ -774,23 +788,21 @@ sub x_set_ref ($$$) { # # Return: reference counter # -sub get_ref ($$) { +sub get_ref ($) { my $filename = shift; my $reffile = reffile $filename; my $old; local *REF; - unless (open REF,"< $reffile") { - $old = 0; - } - else { - $old=; - chomp $old; + if (sysopen (REF, $reffile, O_RDONLY)) { + local $/="\n"; + read REF, $old, -s $reffile; close REF; + chomp $old; } # return value - $old; + $old or 0; } ################################################################################ @@ -806,6 +818,8 @@ BEGIN { $iAmMaster = 0; # default: I am nobody + %LOCKED = (); + # assign the aliases to the needed functions # (perldoc -f symlink) diff --git a/selfforum-cgi/shared/Posting/Write.pm b/selfforum-cgi/shared/Posting/Write.pm index 507cd81..98f71fe 100644 --- a/selfforum-cgi/shared/Posting/Write.pm +++ b/selfforum-cgi/shared/Posting/Write.pm @@ -117,7 +117,7 @@ sub write_new_thread ($) { save_file ($param -> {forumFile}, $forum) or return $error{forumWrite}; release_file ($param -> {messagePath}.$tid.'.xml'); - return (0, $thread, $mid); + return (0, $thread, $mid, $tid); } ### sub write_reply_posting ($) ################################################ @@ -228,14 +228,14 @@ sub write_reply_posting ($) { $param -> {parsedThreads}, { dtd => $param -> {dtd}, lastMessage => $mid, - lastThread => $tid + lastThread => 't'.$param -> {lastThread} } ); save_file ($param -> {forumFile}, $forum) or return $error{forumWrite}; } - return (0, $thread, $mid); + return (0, $thread, $mid, $tid); } # keep 'require' happy diff --git a/selfforum-cgi/shared/Template/Forum.pm b/selfforum-cgi/shared/Template/Forum.pm index 9140478..5963008 100644 --- a/selfforum-cgi/shared/Template/Forum.pm +++ b/selfforum-cgi/shared/Template/Forum.pm @@ -14,7 +14,10 @@ use strict; use Lock qw(:READ); use Encode::Plain; $Encode::Plain::utf8 = 1; -use Posting::_lib qw(get_all_threads long_hr_time); +use Posting::_lib qw( + get_all_threads + long_hr_time +); use Template; use Template::_conf; use Template::_thread; @@ -100,4 +103,4 @@ sub print_forum_as_HTML ($$$) { # # -### end of Template::Forum ##################################################### +### end of Template::Forum ##################################################### \ No newline at end of file diff --git a/selfforum-cgi/shared/Template/Posting.pm b/selfforum-cgi/shared/Template/Posting.pm index 348a7db..0ffb6c2 100644 --- a/selfforum-cgi/shared/Template/Posting.pm +++ b/selfforum-cgi/shared/Template/Posting.pm @@ -24,6 +24,7 @@ use Posting::_lib qw( parse_xml_file hr_time ); +use Posting::Cache; use Template; use Template::_conf; use Template::_query; @@ -169,11 +170,26 @@ sub print_posting_as_HTML ($$$) { $formdata->{uniqueID} ->{assign}->{value} => plain(unique_id), $formdata->{followUp} ->{assign}->{value} => plain($param -> {thread}.';'.$param -> {posting}), $formdata->{quoteChar} ->{assign}->{value} => "ÿ".plain(defined $view -> {quoteChars} ? $view -> {quoteChars} : ''), - $formdata->{userID} ->{assign}->{value} => '' + $formdata->{userID} ->{assign}->{value} => '', + $assign->{firsttime} => $param->{firsttime} ? $param->{firsttime} : '', + $assign->{voted} => $param->{voted} ? $param->{voted} : '' }, $pars, $parent_pars )}; + + # all output done + # + close STDOUT; + + if ($param->{firsttime}) { + my $cache = new Posting::Cache ($param->{cachefile}); + $cache -> add_view ( + { thread => $param -> {thread}, + posting => $param -> {posting} + } + ); + } } } diff --git a/selfforum-cgi/shared/Template/_thread.pm b/selfforum-cgi/shared/Template/_thread.pm index 7b65d1d..3f00ad2 100644 --- a/selfforum-cgi/shared/Template/_thread.pm +++ b/selfforum-cgi/shared/Template/_thread.pm @@ -170,5 +170,4 @@ sub html_thread ($$$) { # # -### end of Template::_thread ################################################### - +### end of Template::_thread ################################################### \ No newline at end of file diff --git a/selfforum-cgi/user/config/fo_view.xml b/selfforum-cgi/user/config/fo_view.xml index 6ec121f..c9f86ee 100644 --- a/selfforum-cgi/user/config/fo_view.xml +++ b/selfforum-cgi/user/config/fo_view.xml @@ -3,31 +3,6 @@ - - - - i - t - m - c - - - - _THREAD - TREE_START - TREE_LINE - TREE_CLOSED - TREE_START_NC - TREE_LINE_NC - TREE_CLOSED_NC - _LINK - _NAME - _COMMAND - _TITLE - _CATEGORY - _TIME - - @@ -47,147 +22,6 @@ - - e:/localhosts/i_selfhtml/cgi-local/user/config/posting.tmpl.xml - - - DOC_POSTING - DOC_ERROR - _CSS_FILE - _MESSAGE - _BEF_NAME - _BEF_MAIL - _BEF_TIME - _BEF_HOME - _BEF_IMAGE - _BEF_TITLE - _REF_CATEGORY - _BEF_CATEGORY - _REF_TITLE - _REF_NAME - _REF_TIME - _REF_LINK - CITE_START - CITE_END - - _N_A - _OCCUPIED - _ERROR_TEXT - - - - - - /cgi-local/user/fo_posting.pl - - _FORM_ACTION - - - - /cgi-local/user/fo_voting.pl - - _VOTE_ACTION - - - - - - - _FORM_FUP_NAME - _FORM_FUP_VALUE - - - fup - 20 - - - - - _FORM_UID_NAME - _FORM_UID_VALUE - - - userid - 25 - - - - - _FORM_UNID_NAME - _FORM_UNID_VALUE - - - unid - 25 - - - - - _FORM_QCHAR_NAME - _FORM_QCHAR_VALUE - - - qchar - 5 - - - - - _FORM_NAME_NAME - _FORM_NAME_VALUE - - - name - 60 - 2 - - - - - _FORM_MAIL_NAME - _FORM_MAIL_VALUE - - - email - 60 - 7 - - - - - _FORM_BODY_NAME - _FORM_BODY_VALUE - - body - 12288 - 10 - - - - _FORM_SIGN_VALUE - - - - - _FORM_URL_NAME - _FORM_URL_VALUE - - url - 1024 - - - - - _FORM_IMG_NAME - _FORM_IMG_VALUE - - image - 1024 - - - - - diff --git a/selfforum-cgi/user/fo_posting.pl b/selfforum-cgi/user/fo_posting.pl index 0bb18de..c78cab7 100644 --- a/selfforum-cgi/user/fo_posting.pl +++ b/selfforum-cgi/user/fo_posting.pl @@ -11,22 +11,35 @@ ################################################################################ use strict; -use vars qw($Bin $Shared $Script $Config); +use vars qw( + $Bin + $Shared + $Script + $Config +); # locate the script # BEGIN { - my $null = $0; $null =~ s/\\/\//g; # for win :-( +# my $null = $0; $null =~ s/\\/\//g; # for win :-( +# $Bin = ($null =~ /^(.*)\/.*$/)? $1 : '.'; +# $Shared = "$Bin/../shared"; +# $Config = "$Bin/config"; +# $Script = ($null =~ /^.*\/(.*)$/)? $1 : $null; + + my $null = $0; #$null =~ s/\\/\//g; # for win :-( $Bin = ($null =~ /^(.*)\/.*$/)? $1 : '.'; - $Shared = "$Bin/../shared"; - $Config = "$Bin/config"; + $Config = "$Bin/../../../cgi-config/devforum"; + $Shared = "$Bin/../../../cgi-shared"; $Script = ($null =~ /^.*\/(.*)$/)? $1 : $null; } + use lib "$Shared"; use CGI::Carp qw(fatalsToBrowser); use Conf; use Conf::Admin; +use Posting::Cache; # load script configuration and admin default conf. # @@ -396,17 +409,17 @@ sub save { if (defined $q -> param ($formdata -> {$may{$_}} -> {name})); } - my ($stat, $xml, $mid); + my ($stat, $xml, $mid, $tid); # we've got a fup if it's a reply # if ($self -> {response} -> {reply}) { $pars -> {parentMessage} = $self -> {fup_mid}; $pars -> {thread} = $self -> {fup_tid}; - ($stat, $xml, $mid) = write_reply_posting ($pars); + ($stat, $xml, $mid, $tid) = write_reply_posting ($pars); } else { - ($stat, $xml, $mid) = write_new_thread ($pars); + ($stat, $xml, $mid, $tid) = write_new_thread ($pars); } if ($stat) { @@ -417,6 +430,13 @@ sub save { }; } else { + my $cache = new Posting::Cache ($self->{conf}->{original}->{files}->{cacheFile}); + $cache -> add_posting ( + { thread => ($tid =~ /(\d+)/)[0], + posting => ($mid =~ /(\d+)/)[0] + } + ); + $self -> {check_success} = 1; my $thx = $self -> {conf} -> {show_posting} -> {thanx}; diff --git a/selfforum-cgi/user/fo_view.pl b/selfforum-cgi/user/fo_view.pl index ee83ce2..37260e3 100644 --- a/selfforum-cgi/user/fo_view.pl +++ b/selfforum-cgi/user/fo_view.pl @@ -11,13 +11,24 @@ ################################################################################ use strict; -use vars qw($Bin $Shared $Script $Config); +use vars qw( + $Bin + $Shared + $Script + $Config +); BEGIN { - my $null = $0; $null =~ s/\\/\//g; # for win :-( +# my $null = $0; $null =~ s/\\/\//g; # for win :-( +# $Bin = ($null =~ /^(.*)\/.*$/)? $1 : '.'; +# $Shared = "$Bin/../shared"; +# $Config = "$Bin/config"; +# $Script = ($null =~ /^.*\/(.*)$/)? $1 : $null; + + my $null = $0; #$null =~ s/\\/\//g; # for win :-( $Bin = ($null =~ /^(.*)\/.*$/)? $1 : '.'; - $Shared = "$Bin/../shared"; - $Config = "$Bin/config"; + $Config = "$Bin/../../../cgi-config/devforum"; + $Shared = "$Bin/../../../cgi-shared"; $Script = ($null =~ /^.*\/(.*)$/)? $1 : $null; } @@ -58,7 +69,9 @@ if (defined ($tid) and defined ($mid)) { messages => $conf -> {template} -> {messages}, form => $show_posting -> {form}, cgi => $cgi, - tree => $tree + tree => $tree, + firsttime => 1, + cachefile => $conf -> {files} -> {cacheFile} } ); } -- 2.34.1