AddressBook
view release on metacpan or search on metacpan
lib/AddressBook/Config.pm view on Meta::CPAN
names of other attributes by "$<attr_name>".
Backend databases may also be named and then tied to a source type by using the 'driver'
attribute. This technique is useful for defining multiple backends of the same type.
For example,
<AddressBook_config>
<fields>
<field name="firstname" >
<db type="ldap_server_1" name="givenname" />
<db type="ldap_server_2" name="givenname" />
</field>
<field name="lastname" >
<db type="ldap_server_1" name="sn" />
<db type="ldap_server_2" name="sn" />
</field>
</fields>
<databases>
<ldap_server_1 driver="LDAP"
hostname="server_1"
objectclass="inetOrgPerson"
base="o=abook"
dn_calculate="'cn='.$cn"
username="cn=Manager,o=abook"
password="secret"
key_fields="cn"
/>
<ldap_server_2 driver="LDAP"
hostname="server_2"
objectclass="inetOrgPerson"
base="o=abook"
dn_calculate="'cn='.$cn"
username="cn=Manager,o=abook"
password="secret"
key_fields="cn"
/>
</databases>
</AddressBook_config>
See the various backend man pages for information on the <database> configuration
attributes. See also the sample configuration files in the 'examples' directory.
=cut
use AddressBook;
use strict;
use Carp;
use XML::DOM;
use vars qw($VERSION);
$VERSION = '0.13';
$AddressBook::Config::config_file = "/etc/AddressBook.conf";
#----------------------------------------------------------------
sub new {
my $class=shift;
my %args = @_;
my $self = {};
bless ($self,$class);
my ($parser,$config,$field,$field_name,$attr,$db_type,$db_field_name,$db,$select,$option,$value);
$self->{config_file} = $args{config_file} || $AddressBook::Config::config_file;
eval {
$parser = XML::DOM::Parser->new(ErrorContext=>1,
ParseParamEnt=>1,
ProtocolEncoding=>'UTF-8');
$config = $parser->parsefile($self->{config_file});
};
if ($@ || ! $config) {
$self->configError("Error reading config file: $@");
}
foreach $field ($config->getElementsByTagName("field")){
$field_name=$field->getAttribute("name");
foreach $attr ($field->getAttributes->getValues) {
$self->{meta}->{$field_name}->{$attr->getName} = $attr->getValue;
}
foreach $db ($field->getElementsByTagName("db")) {
$db_type=$db->getAttribute("type");
$db_field_name=$db->getAttribute("name");
$self->{generic2db}->{$field_name}->{$db_type} = $db_field_name;
$self->{db2generic}->{$db_type}->{$db_field_name} = $field_name;
foreach $attr ($db->getAttributes->getValues) {
if ($attr->getName !~ /^type|name$/) {
$self->{dbmeta}->{$db_type}->{$field_name}->{$attr->getName} = $attr->getValue;
}
}
}
}
my ($n) = $config->getElementsByTagName("databases");
my ($db_name);
if ($n) {
foreach $db ($n->getElementsByTagName("*")) {
$db_name=$db->getTagName;
foreach $attr ($db->getAttributes->getValues) {
$self->{db}->{$db_name}->{$attr->getName} = $attr->getValue;
}
}
}
foreach (keys %{$self->{db2generic}}) {
if (! exists $self->{db}->{$_}->{driver}) {
$self->{db}->{$_}->{driver} = $_;
}
}
$self->validate();
return $self;
}
#----------------------------------------------------------------
sub validate {
my $self=shift;
my $class = ref $self || croak "Not a method call.";
my ($db);
foreach $db (keys %{$self->{db}}) {
next unless ($self->{db}->{$db}->{key_fields});
foreach (split ",", $self->{db}->{$db}->{key_fields}) {
if (! exists $self->{db2generic}->{$db}->{$_}) {
$self->configError("key field \"$_\" is not a valid attribute for backend $db");
}
}
}
}
( run in 1.041 second using v1.01-cache-2.11-cpan-39bf76dae61 )