]> git.p6c8.net - selfforum.git/commitdiff
Lock.pm: now you can convert a shared lock into an exclusive lock without a race...
authorndparker <>
Wed, 25 Apr 2001 18:19:39 +0000 (18:19 +0000)
committerndparker <>
Wed, 25 Apr 2001 18:19:39 +0000 (18:19 +0000)
other files adjusted to work with fo_voting.pl

selfforum-cgi/shared/Conf/Admin.pm
selfforum-cgi/shared/Encode/Posting.pm
selfforum-cgi/shared/Lock.pm
selfforum-cgi/shared/Posting/Write.pm
selfforum-cgi/shared/Template/Forum.pm
selfforum-cgi/shared/Template/Posting.pm
selfforum-cgi/shared/Template/_thread.pm
selfforum-cgi/user/config/fo_view.xml
selfforum-cgi/user/fo_posting.pl
selfforum-cgi/user/fo_view.pl

index 0c3a4698700801359d5b8349baadf046a9c05c86..27a8c936ec7ce45540279e63ee52e5382f054c11 100644 (file)
@@ -69,6 +69,9 @@ sub read_admin_conf ($) {
                       quoting       => $quoting -> getAttribute ('quotingON'),
                       quoteChars    => $char?$char -> getFirstChild -> getData:undef};
 
                       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));
 
       # Severance
       $conf {Severance} = &get_severance ($forum -> getElementsByTagName ('Severance', 0) -> item (0));
 
index c0815f4ce89b45cb0ef0f3aac4c5d389e3a7609a..e35e6486e4d7e6deebec26c7acb6f2c0fa15453f 100644 (file)
@@ -209,6 +209,7 @@ sub message_field ($$) {
   my $posting = ${+shift};
   my $params = shift || {};
 
   my $posting = ${+shift};
   my $params = shift || {};
 
+  my $break = '<br>';
 
   if ($params -> {quoting}) {       # quotes are displayed as special?
     my @array = [0 => []];
 
   if ($params -> {quoting}) {       # quotes are displayed as special?
     my @array = [0 => []];
@@ -224,10 +225,14 @@ sub message_field ($$) {
     }
     shift @array unless @{$array[0][-1]};
 
     }
     shift @array unless @{$array[0][-1]};
 
+    my $ll=0;
     $posting = join '<br>' => map {
     $posting = join '<br>' => map {
-      $_->[0]
-        ? join join ('<br>' => @{$_->[-1]}) => ($params->{startCite}, $params->{endCite})
-        : (join '<br>' => @{$_->[-1]});
+      my $string = $_->[0]
+        ? (($ll and $ll != $_->[0]) ? $break : '') .
+          join join ($break => @{$_->[-1]})
+            => ($params->{startCite}, $params->{endCite})
+        : (join $break => @{$_->[-1]});
+      $ll = $_->[0]; $string;
     } @array;
   }
 
     } @array;
   }
 
index f3291c6daaeb1c57487b8fb54ddb7fda308f3d36..3f01861712c1a2c562af21ac2a83b9288f9967e7 100644 (file)
@@ -11,16 +11,19 @@ package Lock;
 ################################################################################
 
 use strict;
 ################################################################################
 
 use strict;
-use Carp;
 use vars qw(
   @EXPORT_OK
   %EXPORT_TAGS
 use vars qw(
   @EXPORT_OK
   %EXPORT_TAGS
+  %LOCKED
   $Timeout
   $violentTimeout
   $masterTimeout
   $iAmMaster
 );
 
   $Timeout
   $violentTimeout
   $masterTimeout
   $iAmMaster
 );
 
+use Carp;
+use Fcntl;
+
 ################################################################################
 #
 # Export
 ################################################################################
 #
 # Export
@@ -48,17 +51,26 @@ use base qw(Exporter);
     write_unlock_file
     violent_unlock_file
   )],
     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)
 ################################################################################
 #
 # Windows section (no symlinks)
@@ -78,21 +90,23 @@ sub w_lock_file ($;$) {
   my $filename = shift;
   my $timeout  = +shift || $Timeout;
 
   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
   }
 
   # time out
@@ -114,17 +128,25 @@ sub w_unlock_file ($;$) {
   my $filename = shift;
   my $timeout  = shift || $Timeout;
 
   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
   }
 
   # time out
-  # maybe the system is occupied
-  # or file has not been released yet
-  #
   return;
 }
 
   return;
 }
 
@@ -141,32 +163,36 @@ sub w_unlock_file ($;$) {
 sub w_write_lock_file ($;$) {
   my $filename=shift;
   my $timeout= shift || $Timeout;
 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)
     #
 
     # 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
       #
       # 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 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
       #
 
       # 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);
         return 0;
       }
       sleep(1);
@@ -175,17 +201,15 @@ sub w_write_lock_file ($;$) {
     # write lock failed
     # remove the announcement
     #
     # write lock failed
     # remove the announcement
     #
-    &simple_unlock ($filename);}
+    simple_unlock ($filename);
+  }
 
   else {
 
   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
 
   # time out
-  # maybe the system is occupied
-  #
   0;
 }
 
   0;
 }
 
@@ -203,17 +227,19 @@ sub w_write_unlock_file ($;$) {
   my $filename = shift;
   my $timeout  = shift || $Timeout;
 
   my $filename = shift;
   my $timeout  = shift || $Timeout;
 
-  if (-f &masterlockfile($filename) or $iAmMaster) {
+  if (-f masterlockfile($filename) or $iAmMaster) {
 
     # remove reference counter lock
     #
 
     # remove reference counter lock
     #
-    &simple_unlock (&reffile($filename),$timeout) or return;
+    simple_unlock (reffile($filename),$timeout) or return;
 
     # remove the write lock announce
     #
 
     # remove the write lock announce
     #
-    &simple_unlock ($filename,$timeout) or return;}
+    simple_unlock ($filename,$timeout) or return;
+  }
 
   # done
 
   # done
+  delete $LOCKED{$filename};
   1;
 }
 
   1;
 }
 
@@ -229,20 +255,22 @@ sub w_write_unlock_file ($;$) {
 sub w_violent_unlock_file ($) {
   my $filename = shift;
 
 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;
 
     # 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];
       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
 
     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
     simple_unlock ($filename);}          # release file
+    delete $LOCKED{$filename};
 
   return;
 }
 
   return;
 }
@@ -263,11 +291,11 @@ sub w_set_master_lock ($;$) {
 
   # set exclusive lock or fail
   #
 
   # set exclusive lock or fail
   #
-  return unless (&write_lock_file ($filename,$timeout));
+  return unless (write_lock_file ($filename,$timeout));
 
   # set master lock
   #
 
   # set master lock
   #
-  unlink &masterlockfile($filename) and return 1;
+  unlink masterlockfile($filename)    and return 1;
 
   # no chance (occupied?, master lock set yet?)
   return;
 
   # no chance (occupied?, master lock set yet?)
   return;
@@ -286,11 +314,12 @@ sub w_set_master_lock ($;$) {
 sub w_release_file ($) {
   my $filename=shift;
 
 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;
 
   # done
   1;
@@ -315,25 +344,27 @@ sub x_lock_file ($;$) {
   my $filename = shift;
   my $timeout  = shift || $Timeout;
 
   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
   }
 
   # time out
-  # maybe the system is occupied
   0;
 }
 
   0;
 }
 
@@ -351,16 +382,25 @@ sub x_unlock_file ($;$) {
   my $filename=shift;
   my ($timeout)=(shift (@_) or $Timeout);
 
   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 ($;$) ################################################
 }
 
 ### 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;
 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)
     #
     # 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
       #
 
       # 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 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
       #
 
       # 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);
         return 0;
       }
       sleep(1);
@@ -410,7 +454,8 @@ sub x_write_lock_file ($;$) {
     # write lock failed
     # remove the announcement
     #
     # write lock failed
     # remove the announcement
     #
-    &simple_unlock ($filename);}
+    simple_unlock ($filename);
+  }
 
   else {
     # master lock is set
 
   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
     #
   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
     #
 
     # remove the write lock announce
     #
-    &simple_unlock ($filename,$timeout) or return;
+    simple_unlock ($filename,$timeout) or return;
   }
 
   # done
   }
 
   # done
+  delete $LOCKED{$filename};
   1;
 }
 
   1;
 }
 
@@ -475,16 +521,17 @@ sub x_violent_unlock_file ($) {
     if (-f ($reffile = $filename)) {
       $time = (stat $reffile)[9];}
 
     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
       $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
     simple_unlock ($filename);}          # release file
+    delete $LOCKED{$filename};
 }
 
 ### sub x_set_master_lock ($;$) ################################################
 }
 
 ### sub x_set_master_lock ($;$) ################################################
@@ -503,11 +550,11 @@ sub x_set_master_lock ($;$) {
 
   # set exclusive lock or fail
   #
 
   # set exclusive lock or fail
   #
-  return unless (&write_lock_file ($filename,$timeout));
+  return unless (write_lock_file ($filename,$timeout));
 
   # set master lock
   #
 
   # 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;
 
   # no chance (occupied?, master lock set yet?)
   return;
@@ -526,39 +573,17 @@ sub x_set_master_lock ($;$) {
 sub x_release_file ($) {
   my $filename=shift;
 
 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;
 }
 
 
   # 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 ($) ####################################################
 #
 ### sub w_simple_lock ($;$) ####################################################
 ### sub w_simple_unlock ($) ####################################################
 #
@@ -575,7 +600,7 @@ sub w_simple_lock ($;$) {
   my $timeout  = shift || $Timeout;
   my $lockfile = lockfile $filename;
 
   my $timeout  = shift || $Timeout;
   my $lockfile = lockfile $filename;
 
-  for (0..$timeout) {
+  for (1..$timeout) {
     unlink $lockfile and return 1;
     sleep(1);
   }
     unlink $lockfile and return 1;
     sleep(1);
   }
@@ -590,7 +615,7 @@ sub w_simple_unlock ($) {
   my $lockfile = lockfile $filename;
   local *LF;
 
   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);
   }
 
     return 1 if close (LF);
   }
 
@@ -599,8 +624,8 @@ sub w_simple_unlock ($) {
   return;
 }
 
   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)
 #
 # 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;
 
   my $timeout  = shift || $Timeout;
   my $lockfile = lockfile $filename;
 
-  for (0..$timeout) {
+  for (1..$timeout) {
     symlink $filename,$lockfile and return 1;
     sleep(1);
   }
 
   # time out
     symlink $filename,$lockfile and return 1;
     sleep(1);
   }
 
   # time out
-  # locking failed (occupied?)
-  #
   return;
 }
 
 sub x_simple_unlock ($) {
   my $filename=shift;
 
   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...
   #
 
   # 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 $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
   #
   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
   #
 
   # lock reference counter file
   #
-  return unless(&simple_lock ($reffile,$timeout));
+  simple_lock ($reffile,$timeout)                         or return;
 
   # load reference counter
   #
 
   # load reference counter
   #
-  unless (open REF,"<$reffile") {
-    $old=0;
-  }
-  else {
-    $old=<REF>;
-    chomp $old;
-    close REF or return;
-  }
+  my $old = get_ref ($filename);
 
   # compute and write new ref. counter
   #
 
   # compute and write new ref. counter
   #
@@ -686,17 +699,21 @@ sub w_set_ref ($$$) {
   # if ref. counter == 0
   #
   if ($old == 0) {
   # if ref. counter == 0
   #
   if ($old == 0) {
-    unlink $reffile or return;
+    unlink $reffile                                       or return;
   }
   else {
   }
   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
   #
   }
 
   # release ref. counter file
   #
-  return unless(&simple_unlock($reffile));
+  simple_unlock($reffile)                                 or return;
 
   # done
   1;
 
   # done
   1;
@@ -718,47 +735,44 @@ sub x_set_ref ($$$) {
   my $filename = shift;
   my $z        = shift;
   my $timeout  = shift || $Timeout;
   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) {
   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
   #
   }
 
   # lock reference counter file
   #
-  return unless(&simple_lock ($reffile,$timeout));
+  return unless(simple_lock ($reffile,$timeout));
 
   # load reference counter
   #
 
   # load reference counter
   #
-  unless (open REF,"<$reffile") {
-    $old=0;
-  }
-  else {
-    $old=<REF>;
-    chomp $old;
-    close REF or return;
-  }
+  my $old = get_ref ($filename);
 
   # compute and write new ref. counter
   #
   $old += $z;
   $old = 0 if ($old < 0);
 
   # compute and write new ref. counter
   #
   $old += $z;
   $old = 0 if ($old < 0);
+
   if ($old == 0) {
   if ($old == 0) {
-    unlink $reffile or return;
+    unlink $reffile                                       or return;
   }
   else {
   }
   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
   #
   }
 
   # release ref. counter file
   #
-  return unless(&simple_unlock($reffile));
+  simple_unlock($reffile)                                 or return;
 
   # done
   1;
 
   # done
   1;
@@ -774,23 +788,21 @@ sub x_set_ref ($$$) {
 #
 # Return: reference counter
 #
 #
 # Return: reference counter
 #
-sub get_ref ($$) {
+sub get_ref ($) {
   my $filename = shift;
   my $reffile  = reffile $filename;
   my $old;
   local *REF;
 
   my $filename = shift;
   my $reffile  = reffile $filename;
   my $old;
   local *REF;
 
-  unless (open REF,"< $reffile") {
-    $old = 0;
-  }
-  else {
-    $old=<REF>;
-    chomp $old;
+  if (sysopen (REF, $reffile, O_RDONLY)) {
+    local $/="\n";
+    read REF, $old, -s $reffile;
     close REF;
     close REF;
+    chomp $old;
   }
 
   # return value
   }
 
   # return value
-  $old;
+  $old or 0;
 }
 
 ################################################################################
 }
 
 ################################################################################
@@ -806,6 +818,8 @@ BEGIN {
 
   $iAmMaster = 0;        # default: I am nobody
 
 
   $iAmMaster = 0;        # default: I am nobody
 
+  %LOCKED = ();
+
   # assign the aliases to the needed functions
   # (perldoc -f symlink)
 
   # assign the aliases to the needed functions
   # (perldoc -f symlink)
 
index 507cd81337b121778ea8bf018cb101122e921795..98f71fe886c1a673593fa03906ceb76b23c35ddb 100644 (file)
@@ -117,7 +117,7 @@ sub write_new_thread ($) {
 
   save_file ($param -> {forumFile}, $forum) or return $error{forumWrite};
   release_file ($param -> {messagePath}.$tid.'.xml');
 
   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 ($) ################################################
 }
 
 ### sub write_reply_posting ($) ################################################
@@ -228,14 +228,14 @@ sub write_reply_posting ($) {
       $param -> {parsedThreads},
       { dtd         => $param -> {dtd},
         lastMessage => $mid,
       $param -> {parsedThreads},
       { dtd         => $param -> {dtd},
         lastMessage => $mid,
-        lastThread  => $tid
+        lastThread  => 't'.$param -> {lastThread}
       }
     );
 
     save_file ($param -> {forumFile}, $forum) or return $error{forumWrite};
   }
 
       }
     );
 
     save_file ($param -> {forumFile}, $forum) or return $error{forumWrite};
   }
 
-  return (0, $thread, $mid);
+  return (0, $thread, $mid, $tid);
 }
 
 # keep 'require' happy
 }
 
 # keep 'require' happy
index 9140478016004869c6f2f5df95aca5bda8812ed9..59630081d1c9b0fae697903679ff07550bd72f93 100644 (file)
@@ -14,7 +14,10 @@ use strict;
 
 use Lock qw(:READ);
 use Encode::Plain; $Encode::Plain::utf8 = 1;
 
 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;
 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
index 348a7dbb07797d7c2f16e1d153dc1b1fbc4f453b..0ffb6c20550cf5204d97955608ec9a155ff4d0ab 100644 (file)
@@ -24,6 +24,7 @@ use Posting::_lib qw(
   parse_xml_file
   hr_time
 );
   parse_xml_file
   hr_time
 );
+use Posting::Cache;
 use Template;
 use Template::_conf;
 use Template::_query;
 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} => "&#255;".plain(defined $view -> {quoteChars} ? $view -> {quoteChars} : ''),
           $formdata->{uniqueID}  ->{assign}->{value} => plain(unique_id),
           $formdata->{followUp}  ->{assign}->{value} => plain($param -> {thread}.';'.$param -> {posting}),
           $formdata->{quoteChar} ->{assign}->{value} => "&#255;".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
       )};
         },
         $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}
+          }
+        );
+      }
     }
   }
 
     }
   }
 
index 7b65d1d2b3a43184bf170a8a11bf0ee13632f137..3f00ad25c8655a146ed959dd0154c805fcbc2729 100644 (file)
@@ -170,5 +170,4 @@ sub html_thread ($$$) {
 
 #
 #
 
 #
 #
-### end of Template::_thread ###################################################
-
+### end of Template::_thread ###################################################
\ No newline at end of file
index 6ec121f2b14923b766d78415c77c70a9cc201c3f..c9f86eee8db037528c11725618466013e7918e82 100644 (file)
@@ -3,31 +3,6 @@
 <Config>
 
   <Property name="show">
 <Config>
 
   <Property name="show">
-    <Property name="assign">
-
-      <Property name="cgi">
-        <Variable name="user">i</Variable>
-        <Variable name="thread">t</Variable>
-        <Variable name="posting">m</Variable>
-        <Variable name="command">c</Variable>
-      </Property>
-
-      <Property name="thread">
-        <Variable name="main">_THREAD</Variable>
-        <Variable name="start">TREE_START</Variable>
-        <Variable name="line">TREE_LINE</Variable>
-        <Variable name="closed">TREE_CLOSED</Variable>
-        <Variable name="startNC">TREE_START_NC</Variable>
-        <Variable name="lineNC">TREE_LINE_NC</Variable>
-        <Variable name="closedNC">TREE_CLOSED_NC</Variable>
-        <Variable name="link">_LINK</Variable>
-        <Variable name="name">_NAME</Variable>
-        <Variable name="command">_COMMAND</Variable>
-        <Variable name="subject">_TITLE</Variable>
-        <Variable name="cat">_CATEGORY</Variable>
-        <Variable name="time">_TIME</Variable>
-      </Property>
-    </Property>
 
     <Property name="Forum">
 
 
     <Property name="Forum">
 
 
     </Property>
 
 
     </Property>
 
-    <Property name="Posting">
-      <Variable name="templateFile">e:/localhosts/i_selfhtml/cgi-local/user/config/posting.tmpl.xml</Variable>
-<!-- * -->
-      <Property name="assign">
-        <Variable name="mainDoc">DOC_POSTING</Variable>
-        <Variable name="errorDoc">DOC_ERROR</Variable>
-        <Variable name="cssFile">_CSS_FILE</Variable>
-        <Variable name="message">_MESSAGE</Variable>
-        <Variable name="name">_BEF_NAME</Variable>
-        <Variable name="email">_BEF_MAIL</Variable>
-        <Variable name="time">_BEF_TIME</Variable>
-        <Variable name="home">_BEF_HOME</Variable>
-        <Variable name="image">_BEF_IMAGE</Variable>
-        <Variable name="messageTitle">_BEF_TITLE</Variable>
-        <Variable name="parentCat">_REF_CATEGORY</Variable>
-        <Variable name="messageCat">_BEF_CATEGORY</Variable>
-        <Variable name="parentTitle">_REF_TITLE</Variable>
-        <Variable name="parentName">_REF_NAME</Variable>
-        <Variable name="parentTime">_REF_TIME</Variable>
-        <Variable name="parentLink">_REF_LINK</Variable>
-        <Variable name="startCite">CITE_START</Variable>
-        <Variable name="endCite">CITE_END</Variable>
-
-        <Variable name="notAvailable">_N_A</Variable>
-        <Variable name="occupied">_OCCUPIED</Variable>
-        <Variable name="errorText">_ERROR_TEXT</Variable>
-      </Property>
-
-      <Property name="form">
-        <Property name="action">
-          <Property name="post">
-            <Variable name="url">/cgi-local/user/fo_posting.pl</Variable>
-<!-- * -->
-            <Variable name="assign">_FORM_ACTION</Variable>
-          </Property>
-
-          <Property name="vote">
-            <Variable name="url">/cgi-local/user/fo_voting.pl</Variable>
-<!-- * -->
-            <Variable name="assign">_VOTE_ACTION</Variable>
-          </Property>
-        </Property>
-
-        <Property name="data">
-          <Property name="followUp">
-            <Property name="assign">
-              <Variable name="name">_FORM_FUP_NAME</Variable>
-              <Variable name="value">_FORM_FUP_VALUE</Variable>
-            </Property>
-
-            <Variable name="name">fup</Variable>
-            <Variable name="maxlength">20</Variable>
-          </Property>
-
-          <Property name="userID">
-            <Property name="assign">
-              <Variable name="name">_FORM_UID_NAME</Variable>
-              <Variable name="value">_FORM_UID_VALUE</Variable>
-            </Property>
-
-            <Variable name="name">userid</Variable>
-            <Variable name="maxlength">25</Variable>
-          </Property>
-
-          <Property name="uniqueID">
-            <Property name="assign">
-              <Variable name="name">_FORM_UNID_NAME</Variable>
-              <Variable name="value">_FORM_UNID_VALUE</Variable>
-            </Property>
-
-            <Variable name="name">unid</Variable>
-            <Variable name="maxlength">25</Variable>
-          </Property>
-
-          <Property name="quoteChar">
-            <Property name="assign">
-              <Variable name="name">_FORM_QCHAR_NAME</Variable>
-              <Variable name="value">_FORM_QCHAR_VALUE</Variable>
-            </Property>
-
-            <Variable name="name">qchar</Variable>
-            <Variable name="maxlength">5</Variable>
-          </Property>
-
-          <Property name="posterName">
-            <Property name="assign">
-              <Variable name="name">_FORM_NAME_NAME</Variable>
-              <Variable name="value">_FORM_NAME_VALUE</Variable>
-            </Property>
-
-            <Variable name="name">name</Variable>
-            <Variable name="maxlength">60</Variable>
-            <Variable name="minlength">2</Variable>
-          </Property>
-
-          <Property name="posterEmail">
-            <Property name="assign">
-              <Variable name="name">_FORM_MAIL_NAME</Variable>
-              <Variable name="value">_FORM_MAIL_VALUE</Variable>
-            </Property>
-
-            <Variable name="name">email</Variable>
-            <Variable name="maxlength">60</Variable>
-            <Variable name="minlength">7</Variable>
-          </Property>
-
-          <Property name="posterBody">
-            <Property name="assign">
-              <Variable name="name">_FORM_BODY_NAME</Variable>
-              <Variable name="value">_FORM_BODY_VALUE</Variable>
-            </Property>
-            <Variable name="name">body</Variable>
-            <Variable name="maxlength">12288</Variable>
-            <Variable name="minlength">10</Variable>
-          </Property>
-
-          <Property name="posterSignature">
-            <Variable name="assignValue">_FORM_SIGN_VALUE</Variable>
-          </Property>
-
-          <Property name="posterURL">
-            <Property name="assign">
-              <Variable name="name">_FORM_URL_NAME</Variable>
-              <Variable name="value">_FORM_URL_VALUE</Variable>
-            </Property>
-            <Variable name="name">url</Variable>
-            <Variable name="maxlength">1024</Variable>
-          </Property>
-
-          <Property name="posterImage">
-            <Property name="assign">
-              <Variable name="name">_FORM_IMG_NAME</Variable>
-              <Variable name="value">_FORM_IMG_VALUE</Variable>
-            </Property>
-            <Variable name="name">image</Variable>
-            <Variable name="maxlength">1024</Variable>
-          </Property>
-
-        </Property>
-      </Property>
-    </Property>
   </Property>
 </Config>
 
   </Property>
 </Config>
 
index 0bb18deb8b50ff1461f1e9db1493414a4f27e477..c78cab7d6e440becb20f9d2a06c5df6bf8f48bd7 100644 (file)
 ################################################################################
 
 use strict;
 ################################################################################
 
 use strict;
-use vars qw($Bin $Shared $Script $Config);
+use vars qw(
+  $Bin
+  $Shared
+  $Script
+  $Config
+);
 
 # locate the script
 #
 BEGIN {
 
 # 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 : '.';
   $Bin     = ($null =~ /^(.*)\/.*$/)? $1 : '.';
-  $Shared  = "$Bin/../shared";
-  $Config  = "$Bin/config";
+  $Config  = "$Bin/../../../cgi-config/devforum";
+  $Shared  = "$Bin/../../../cgi-shared";
   $Script  = ($null =~ /^.*\/(.*)$/)? $1 : $null;
 }
   $Script  = ($null =~ /^.*\/(.*)$/)? $1 : $null;
 }
+
 use lib "$Shared";
 use CGI::Carp qw(fatalsToBrowser);
 
 use Conf;
 use Conf::Admin;
 use lib "$Shared";
 use CGI::Carp qw(fatalsToBrowser);
 
 use Conf;
 use Conf::Admin;
+use Posting::Cache;
 
 # load script configuration and admin default conf.
 #
 
 # load script configuration and admin default conf.
 #
@@ -396,17 +409,17 @@ sub save {
             if (defined $q -> param ($formdata -> {$may{$_}} -> {name}));
         }
 
             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};
 
         # 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 {
         }
         else {
-          ($stat, $xml, $mid) = write_new_thread ($pars);
+          ($stat, $xml, $mid, $tid) = write_new_thread ($pars);
         }
 
         if ($stat) {
         }
 
         if ($stat) {
@@ -417,6 +430,13 @@ sub save {
           };
         }
         else {
           };
         }
         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};
 
           $self -> {check_success} = 1;
           my $thx = $self -> {conf} -> {show_posting} -> {thanx};
 
index ee83ce28ba9955c5d1606d488f67a2cd5af49cf0..37260e3278e766ab0073c1687877d0caec6eb0f0 100644 (file)
 ################################################################################
 
 use strict;
 ################################################################################
 
 use strict;
-use vars qw($Bin $Shared $Script $Config);
+use vars qw(
+  $Bin
+  $Shared
+  $Script
+  $Config
+);
 
 BEGIN {
 
 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 : '.';
   $Bin     = ($null =~ /^(.*)\/.*$/)? $1 : '.';
-  $Shared  = "$Bin/../shared";
-  $Config  = "$Bin/config";
+  $Config  = "$Bin/../../../cgi-config/devforum";
+  $Shared  = "$Bin/../../../cgi-shared";
   $Script  = ($null =~ /^.*\/(.*)$/)? $1 : $null;
 }
 
   $Script  = ($null =~ /^.*\/(.*)$/)? $1 : $null;
 }
 
@@ -58,7 +69,9 @@ if (defined ($tid) and defined ($mid)) {
       messages     => $conf -> {template} -> {messages},
       form         => $show_posting -> {form},
       cgi          => $cgi,
       messages     => $conf -> {template} -> {messages},
       form         => $show_posting -> {form},
       cgi          => $cgi,
-      tree         => $tree
+      tree         => $tree,
+      firsttime    => 1,
+      cachefile    => $conf -> {files} -> {cacheFile}
     }
   );
 }
     }
   );
 }

patrick-canterino.de