NAME Tie::MLDBM - Multi-Level Storage and Locking Class SYNOPSIS use Tie::MLDBM; my $obj = tie my %hash, 'Tie::MLDBM', { 'Lock' => 'File', 'Serialise' => 'Storable', 'Store' => 'DB_File' } [.. other DBM arguments..] or die $!; DESCRIPTION This module provides the means to store arbitrary perl data, including nested references, in a serialised form within persistent data back-ends. This module builds upon the storage and locking mechanisms of MLDBM and MLDBM::Sync by incorporating a more expandible framework that allows for a much wider variety of component modules for serialisation, storage and resource locking. Indeed, all storage components of this framework exist as a direct IS-A inherited class of their parent storage module such that almost any module employing a tied-interface can now store multi-level nested data structures and incorporate locking synchronisation. The Tie::MLDBM framework consists of four components: the interface, the locking component, the serialisation component and the storage component. The interface is implemented as a TIEHASH by the Tie::MLDBM module which in turn depends upon the functions provided by component modules. The locking or synchronisation component implements shared and exclusive access to the underlying storage component by means of semaphores. The serialisation component is that which serialises the nested data structure into a flat form ready for storage in the underlying storage component. The storage component can be any new or existing module which implements a TIEHASH interface to a persistent store. All storage modules of this framework inherit directly from the storage mechanism which they represent. INTERFACE The interface to the Tie::MLDBM module is intended to be simple and impose little in the way of a learning curve in its usage. The mandatory first argument of the TIEHASH interface of this module is a hash reference which contains configuration parameters for the Tie::MLDBM framework. These configuration parameters define the behaviour and component modules of the Tie::MLDBM. The following configuration parameters are mandatory: Lock The Lock parameter defines the Tie::MLDBM::Lock::* component module to be employed by the Tie::MLDBM framework for locking and synchronisation. If left unspecified, this parameter defaults to "Null" which calls upon the Tie::MLDBM::Lock::Null module for locking and synchronisation - This module fulfills the locking component of the Tie::MLDBM framework, without actually implementing any resource synchronisation or locking. The available locking and synchronisation mechanisms are dictated by those modules installed in the Tie::MLDBM::Lock::* namespace. Serialisation The Serialisation parameter defines the Tie::MLDBM::Serialisation::* component module to be employed by the Tie::MLDBM framework for the serialisation of nested data structures into flat forms ready for persistent storage. The available serialisation mechanisms are dictated by those modules installed in the Tie::MLDBM::Serialisation::* namespace. Store The Store parameter defines the Tie::MLDBM::Store::* component module to be employed by the Tie::MLDBM framework for the persistent storage of serialised data. The available serialisation mechanisms are dictated by those modules installed in the Tie::MLDBM::Store::* namespace. In addition to these configuration parameters, component modules may require additional configuration parameters to be defined in order to change their behaviour. For example, the Tie::MLDBM::Lock::File module allows for the filename and directory location of the semaphore file employed to be defined via a "Lockfile" configuration argument. The remaining arguments to the TIEHASH interface of the Tie::MLDBM module are passed directly onto the underlying storage TIEHASH, as defined by the "Store" configuration parameter. This arrangement allows for any module employing a TIEHASH interface to a persistent store to be used by the Tie::MLDBM framework, for the persistent storage of serialised data. Example Using DB_File An example of the TIEHASH interface of Tie::MLDBM, employing the DB_File TIEHASH interface for persistent storage: use Tie::MLDBM; tie my %test, 'Tie::MLDBM', { 'Serialise' => 'Storable', 'Store' => 'DB_File' }, 'testdb.dbm', O_CREAT|O_RDWR, 0640 or die $!; The above example creates a persistent store for the hash "%test" called "testdb.dbm" with DB_File in which data is serialised using Storable. Example Using DBI An example of the TIEHASH interface of Tie::MLDBM, employing the TIEHASH interface of Tie::DBI (by means of Tie::MLDBM::Store::DBI for persistent storage: use Tie::MLDBM; tie my %db, 'Tie::MLDBM', { 'Lock' => 'File', 'Serialise' => 'Storable', 'Store' => 'DBI' }, { 'db' => "Pg:dbname=@{[ DATABASE ]}", 'table' => 'sessions', 'key' => 'id', 'user' => USERNAME, 'password' => PASSWORD, 'CLOBBER' => 0 } or die $!; The above example creates a persistent store for the hash "%db" which employs the "sessions" table of a PostgreSQL database for the storage of data serialised by Storable. WARNINGS The addition or alteration of elements to nested data structures is not entirely transparent in Perl. As such, in order to store a reference or modify an existing reference value within a tied hash, the value must first be retrieved and stored in a temporary variable before modification. For example, the following will not work: $hash{'key'}{'subkey'} = 'value'; # Will not work Instead, this operation should be performed in a two-step process, like thus: $temp = $hash{'key'}; # Retrieve element $temp->{'subkey'} = 'value'; $hash{'key'} = $temp; # Store element This limitation exists because the perl TIEHASH interface currently has no support for multidimensional ties. AUTHOR Rob Casey COPYRIGHT Copyright 2002 Rob Casey, robau@cpan.org SEE ALSO the MLDBM manpage, the MLDBM::Sync manpage