Archive for December 19th, 2008

Perl процедура для обновления wiki страниц trac-а

Я очень люблю и много пользуюсь системой trac. У меня появилась необходимость обновлять вики страницы трака из внешних программ. Я написал крохотную процедуру на perl, чтобы это делать (и впервые воспользовался pod для ведения документации =):

PERL:
  1. #! /usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use DBI;
  6.  
  7. =head2 Структура таблицы wiki в траке
  8.  
  9.  CREATE TABLE wiki (
  10.     name text,
  11.     version integer,
  12.     time integer,
  13.     author text,
  14.     ipnr text,
  15.     text text,
  16.     comment text,
  17.     readonly integer,
  18.     UNIQUE (name,version)
  19. );
  20. CREATE INDEX wiki_time_idx ON wiki ( time);
  21.  
  22. =cut
  23.  
  24. =head2 sub write_wiki_trac
  25.  Процедуре передаются параметры:
  26.  
  27.   file - файл с базой данных trac
  28.   name - название страницы
  29.   author - кто будет автором редакции страницы
  30.   text - текст, который будет размещен на странице
  31.  
  32.  Процедура создает страницу, если страницы с таким именем нет.
  33.  Время создания страницы выставляется текущее время.
  34.  Процедура записывает новую редакцию страницы, если text не соответствует последней радакчии.
  35.  Если текст полностью идентичен последней редакции, то процедура ничего не изменяет в базе.
  36.  
  37. =cut
  38.  
  39.  
  40. sub write_wiki_trac {
  41.     my ($file, $name, $author, $text) = @_;
  42.    
  43.     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;
  44.  
  45.     $dbh->{unicode} = 1;
  46.  
  47.     # Нахожу последнюю версию страницы
  48.     my $sth = $dbh->prepare("SELECT * FROM wiki WHERE name='$name' ORDER BY version DESC LIMIT 1");
  49.  
  50.     $sth->execute();
  51.  
  52.     my $result = $sth->fetchrow_hashref;
  53.  
  54.     # Несколько дурацких строк ниже, чтобы избавится от warning "Use of uninitialized value in concatenation"
  55.     my $text_db;
  56.     if ( $result->{text} ) {
  57.         $text_db = $result->{text};
  58.     } else {
  59.         $text_db = "";
  60.     }
  61.  
  62.     # Записываем только если текст отличается от того, который сейчас в бд
  63.     if ( $text_db ne $text ) {
  64.  
  65.         my $version;
  66.        
  67.         unless ( $result->{version} ) {
  68.             $version = 1;
  69.         } else {
  70.             $version = $result->{version}+1;
  71.         }
  72.  
  73.         my $time = time();
  74.         $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, '')");
  75.         $sth->execute();
  76.     }
  77.  
  78.     return 1;
  79. }
  80.  
  81.  
  82. # проверка работы процедуры:
  83. my $file = "/var/trac/test/db/trac.db";
  84. &write_wiki_trac($file, "SandBox", "tester", "New page content");

Tags: ,

Friday, December 19th, 2008 Uncategorized Comments Off