+#
+# Залочить файл и получить его распрасенное представление.
+# Возвращает пару ($tree,$lockfd)
+
+sub gettree {
+ my $filename = shift;
+ my $f;
+ open $f,"<",$filename or return undef;
+ flock $f, LOCK_EX;
+ my $tree = HTML::TreeBuider->new_from_file($f);
+ return ($tree,$f);
+}
+#
+# Сохранить дерево и закрыть lockfd.
+#
+#
+
+sub savetree {
+ my ($filename,$tree,$lockfd) = shift;
+ my $f;
+ open $f,">",$filename . ".new" or return undef;
+ print $f $tree->as_HTML("<>&");
+ close $f;
+ # FIXME - только для POSIX.
+ unlink $filename;
+ rename $filename.".new",$filename;
+ close $lockfd if defined($lockfd);
+}
+
+
+
+#
+# Получает уникальный числовой идентификатор.
+#
+sub get_uid {
+ my $forum = shift;
+ my $f;
+ open $f,"<+",datafile($forum,"sequence");
+ flock $f,LOCK_EX;
+ my $id=<$f> || "0";
+ $id++;
+ seek $f,0,0;
+ printf $f "%8s\n",$id;
+ close $f;
+ return sprintf ("%08s",$id);
+}
+