CGI-Wiki-Store-Mediawiki
view release on metacpan or search on metacpan
lib/CGI/Wiki/Store/Mediawiki.pm view on Meta::CPAN
my $ok = $self->verify_checksum ($node, $checksum);
unless ($ok)
{
$self->_unlock_node ($node) or carp "Can't unlock node";
return 0;
}
eval {$self->write_node_post_locking (%args)};
my $saverr = $@;
$self->_unlock_node ($node) or carp "Can't unlock node";
croak $saverr if $saverr;
return 1;
}
=head2 new
Like the C<new> function from C<CGI::Wiki::Store::MySQL>, but also requires a
`wikiname' argument.
=cut
sub new {
my ($class, %args) = @_;
my $self = {};
bless $self, $class;
# wikiname is required
croak "missing required `wikiname' argument" unless $args{wikiname};
$self->{wikiname} = $args{wikiname};
# Set defaults for these arguments.
if (exists $args{convert_spaces}) {
$self->{convert_spaces} = $args{convert_spaces};
} else {
$self->{convert_spaces} = 1;
}
$self->{default_date_format} = $args{default_date_format}
if $args{default_date_format};
if (exists $args{ignore_case}) {
$self->{ignore_case} = $args{ignore_case};
} else {
$self->{ignore_case} = 1;
}
# Call the parent initializer.
return $self->_init (%args);
}
# Returns 1 if we can get a lock, 0 if we can't, croaks on error.
sub _lock_node
{
my ($self, $node) = @_;
my $dbh = $self->{_dbh};
$node = $dbh->quote ($node);
my $sql = "SELECT GET_LOCK($node, 10)";
my $sth = $dbh->prepare($sql);
$sth->execute or croak $dbh->errstr;
my $locked = $sth->fetchrow_array;
$sth->finish;
return $locked;
}
# Returns 1 if we can unlock, 0 if we can't, croaks on error.
sub _unlock_node {
my ($self, $node) = @_;
my $dbh = $self->{_dbh};
$node = $dbh->quote($node);
my $sql = "SELECT RELEASE_LOCK($node)";
my $sth = $dbh->prepare($sql);
$sth->execute or croak $dbh->errstr;
my $unlocked = $sth->fetchrow_array;
$sth->finish;
return $unlocked;
}
our @namespaces = qw{Talk User User_talk Project Project_talk Image Image_talk
MediaWiki MediaWiki_talk Template Template_talk Help
Help_talk Category Category_talk};
# $store->__namespace_to_num ($node_name);
#
# Translate a node name containing a `:' into a Mediawiki namespace number.
sub __namespace_to_num
{
my ($self, $name) = @_;
$name =~ s/ /_/g if $self->{convert_spaces};
return 0, $name unless $name =~ /^([^:]+):(.*)$/;
return -2, $2 if $1 eq 'Media';
return -1, $2 if $1 eq 'Special';
return 4, $2 if $1 eq $self->{wikiname};
for (0 .. $#namespaces)
{
return $_ + 1, $2 if $1 eq $namespaces[$_];
}
return 0, $name;
}
# $store->__num_to_namespace ($namespace_code, $node_name);
#
# Translate a Mediawiki namespace number into a node name containing a `:'.
sub __num_to_namespace
{
my ($self, $num, $name) = @_;
$name =~ s/_/ /g if $self->{convert_spaces};
return $name unless $num;
return "Media:$name" if $num == -2;
return "Special:$name" if $num == -1;
return $self->{wikiname} . ":$name" if $num == 4;
die "no such namespace $num"
unless $num > 0 && $num < @namespaces;
return "$namespaces[$num - 1]:$name";
}
# turn the CGI::Wiki metadata fields of a search into a metadata hash
# substructure.
my @metadata_fields = qw{comment edit_type patrolled username};
sub _make_metadata
{
my $data = shift;
my %metadata;
@metadata{@metadata_fields} = map { [$_] } @$data{@metadata_fields};
$data->{metadata} = \%metadata;
}
sub _make_date
( run in 2.027 seconds using v1.01-cache-2.11-cpan-98e64b0badf )