Perl процедура для обновления wiki страниц trac-а
Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):
PERL:
-
#! /usr/bin/perl
-
-
use strict;
-
use warnings;
-
use DBI;
-
-
=head2 Структура таблицы wiki в траке
-
-
CREATE TABLE wiki (
-
name text,
-
version integer,
-
time integer,
-
author text,
-
ipnr text,
-
text text,
-
comment text,
-
readonly integer,
-
UNIQUE (name,version)
-
);
-
-
=cut
-
-
=head2 sub write_wiki_trac
-
Процедуре передаются параметры:
-
-
file - файл с базой данных trac
-
name - название страницы
-
author - кто будет автором редакции страницы
-
text - текст, который будет размещен на странице
-
-
Процедура создает страницу, если страницы с таким именем нет.
-
Время создания страницы выставляется текущее время.
-
Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
-
Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
-
-
=cut
-
-
-
sub write_wiki_trac {
-
my ($file, $name, $author, $text) = @_;
-
-
my $dbh = DBI->connect("dbi:SQLite:dbname=$file","","", { RaiseError => 1, PrintError => 0 }) or die "Failed to connect to SQLite filesystem digest cache database at $file: " . DBI->errstr;
-
-
$dbh->{unicode} = 1;
-
-
# Нахожу последнюю версию страницы
-
my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
-
-
$sth->execute();
-
-
my $result = $sth->fetchrow_hashref;
-
-
# Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
-
my $text_db;
-
if ( $result->{text} ) {
-
$text_db = $result->{text};
-
} else {
-
$text_db = "";
-
}
-
-
# Записываем только если текст отличается от того, который сейчас в бд
-
if ( $text_db ne $text ) {
-
-
my $version;
-
-
unless ( $result->{version} ) {
-
$version = 1;
-
} else {
-
$version = $result->{version}+1;
-
}
-
-
$sth = $dbh->prepare("INSERT INTO wiki (name, version, time, author, text, ipnr, readonly, comment) VALUES ('$name', '$version', $time, '$author', '$text', '127.0.0.1', 0, '')");
-
$sth->execute();
-
}
-
-
return 1;
-
}
-
-
-
# проверка работы процедуры:
-
my $file = "/var/trac/test/db/trac.db";
-
&write_wiki_trac($file, "SandBox", "tester", "New page content");