| Apache2-Translation documentation | view source | Contained in the Apache2-Translation distribution. |
Apache2::Translation::MMapDB - A provider for Apache2::Translation
<TranslationProvider MMapDB>
FileName /path/to/file
ReadOnly 1
BaseKey transdb
</TranslationProvider>
or
$provider=Apache2::Translation::MMapDB->new(FileName=>..., ...);
$provider->start;
$provider->stop;
The MMapDB provider implements the Apache2::Translation provider
interface as documented in Apache2::Translation::_base. All optional
functions are implemented.
It uses the MMapDB module that maps the whole database into the calling process's address space. So, all subsequent operations are simple RAM accesses.
The database structure is chosen so that it leaves room for additional information stored alongside the translation information. So all this information can be changed as a transaction.
A MMapDB database can be interpreted as hash of hashes of hashes ...
of arrays. Within this structure the translation database is addressed
by a list of keys. This list is called the basekey.
Think of something like this:
$transdb=$root->{basekey1}->{basekey2}->...->{basekeyN}
The basekey points to a hash with only 2 elements, actn and note.
The actn hash stores the block lists. The block and order fields
are joined to derive an order field suitable for MMapDB by
pack('N2', $block, $order). This means block and order must be
32-bit integer numbers.
$transdb->{'actn'}->{$key}->{$uri}=
[[pack('N2', $block1, $order1), $action1],
[pack('N2', $block2, $order2), $action2],
...,
[pack('N2', $blockN, $orderN), $actionN]]
The note branch of the database is similar organized but instead of
actions notes are stored.
$transdb->{'note'}->{$key}->{$uri}=
[[pack('N2', $block1, $order1), $note1],
[pack('N2', $block2, $order2), $note2],
...,
[pack('N2', $blockN, $orderN), $noteN]]
It would have been simpler to join notes and actions into one field and avoid
thus having 2 branches. But the performance relevant operation of this module
is fetching block lists without notes. When looking up the database it is
probably faster to decide only once to dive into the actn branch than to
dissemble action and note from the joined field for each block list element.
All parameters can be passed to the constructor method new() as well
as be specified as configuration directives in a
<TranslationProvider MMapDB> container in the httpd.conf.
Parameter names are case insensitive.
Filename specifies the name of the database file. Alongside a file with
the same name but .lock appended is used as lock file.
If filename is ommitted and another MMapDB provider has been created within
the same perl interpreter its database object is inherited. Otherwise an
error is thrown.
Thus, multiple databases can reside in one database file using different base keys. The database file is still mapped only once into the processes address space.
specifies if write access to the database should be denied. Default is off.
If the passed filename is relative the root parameter is prepended.
Here a string or array can be passed that specified the basekey, the
root of the translation database within the MMapDB object.
If a string is passed and if it starts with an arbitrary amount of spaces
followed by an open bracket ([) and ends with a closing bracket (])
followed by an arbitrary amount of spaces it is assumed to be the
string representation of an array and passed through perl's eval.
The resulting array is then taken as base key.
So a multi-level base key can be specified in the httpd.conf as well.
Any other string is taken as a one-level base key.
Examples:
These 2 are equivalent. The translation database is accessed as
$root->{my}->{trans}->{db}.
<TranslationProvider MMapDB>
BaseKey [qw/my trans db/]
</TranslationProvider>
$provider=Apache2::Translation::MMapDB->new(BaseKey=>[qw/my trans db/]);
But these use a one-level key ($root->{'qw/my trans db/'}):
<TranslationProvider MMapDB>
BaseKey qw/my trans db/
</TranslationProvider>
$provider=Apache2::Translation::MMapDB->new(BaseKey=>'qw/my trans db/');
If set to true no lockfile is used to serialize access to the underlying MMapDB object.
Torsten Foertsch, <torsten.foertsch@gmx.net>
Copyright (C) 2009 by Torsten Foertsch
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Apache2-Translation documentation | view source | Contained in the Apache2-Translation distribution. |