Name

ConfigDatabase — specify database holding definitions usually found in catalog.cfg

SYNOPSIS

name source_file type

DESCRIPTION

The directive allows one to keep the usual catalog.cfg definitions in a database table.

By using the special option LOAD, it is also possible to instruct Interchange to fill the database with initial data found in your catalog.cfg — just make sure to remove that option on subsequent restarts.

DIRECTIVE TYPE AND DEFAULT VALUE

Global directive,
Catalog directive

EXAMPLES

Example: Defining ConfigDatabase

You first need to create the table in an SQL database that you will use to store config directives. Here's the SQL code needed:

create table config (
  code  varchar(32) NOT NULL PRIMARY KEY,
	directive varchar(64) NOT NULL,
	value varchar(255),
	extended text
);     

Just for the record, once you have the above database table, sample database contents of:

code|directive|value|extended
C0001|VariableDatabase|variable
C0002|SessionExpire|2 hours|
C0003|Variable|foo|   bar          

will correspond to the usual catalog.cfg definitions:

VariableDatabase variable
SessionExpire  2 hours
Variable foo <<EOF
   bar
EOF  

Example: Automatically populating ConfigDatabase with initial data from catalog.cfg

ConfigDatabase config config.txt dbi:mysql:config
ConfigDatabase config LOAD 1

NOTES

Even though this appears to be both global and catalog configuration directive, it is only implemented on catalog level.

AVAILABILITY

ConfigDatabase is available in Interchange versions:

4.6.0-5.9.0 (git-head)

SOURCE

Interchange 5.9.0:

Source: lib/Vend/Config.pm
Line 398

['ConfigDatabase',   'config_db',       ''],

Source: lib/Vend/Config.pm
Line 552

['ConfigDatabase',   'config_db',       ''],

Source: lib/Vend/Config.pm
Line 4284 (context shows lines 4284-4427)

sub parse_config_db {
my($name, $value) = @_;
my ($d, $new);
unless (defined $value && $value) { 
  $d = {};
  return $d;
}

if($C) {
  $d = $C->{ConfigDatabase};
}
else {
  $d = $Global::ConfigDatabase;
}

my($database,$remain) = split /[\s,]+/, $value, 2;

$d->{'name'} = $database;

if(!defined $d->{'file'}) {
  my($file, $type) = split /[\s,]+/, $remain, 2;
  $d->{'file'} = $file;
  if(    $type =~ /^\d+$/  ) {
    $d->{'type'} = $type;
  }
  elsif(  $type =~ /^(dbi|sql)\b/i  ) {
    $d->{'type'} = 8;
    if($type =~ /^dbi:/) {
      $d->{DSN} = $type;
    }
  }
# LDAP
  elsif(  $type =~ /^ldap\b/i) {
    $d->{'type'} = 9;
    if($type =~ /^ldap:(.*)/i) {
      $d->{LDAP_HOST} = $1;
    }
  }
# END LDAP
  elsif(  "\U$type" eq 'TAB'  ) {
    $d->{'type'} = 6;
  }
  elsif(  "\U$type" eq 'PIPE'  ) {
    $d->{'type'} = 5;
  }
  elsif(  "\U$type" eq 'CSV'  ) {
    $d->{'type'} = 4;
  }
  elsif(  "\U$type" eq 'DEFAULT'  ) {
    $d->{'type'} = 1;
  }
  elsif(  $type =~ /[%]{1,3}|percent/i  ) {
    $d->{'type'} = 3;
  }
  elsif(  $type =~ /line/i  ) {
    $d->{'type'} = 2;
  }
  else {
    $d->{'type'} = 1;
    $d->{DELIMITER} = $type;
  }
}
else {
  my($p, $val) = split /\s+/, $remain, 2;
  $p = uc $p;

  if(defined $Explode_ref{$p}) {
    my($ak, $v);
    my(@v) = Text::ParseWords::shellwords($val);
    @v = grep defined $_, @v;
    $d->{$p} = {} unless defined $d->{$p};
    for(@v) {
      my ($sk,$v) = split /\s*=\s*/, $_;
      my (@k) = grep /\w/, split /\s*,\s*/, $sk;
      for my $k (@k) {
        if($d->{$p}->{$k}) {
          config_warn(
            qq{Database %s explode parameter %s redefined to "%s", was "%s".},
            $d->{name},
            "$p --> $k",
            $v,
            $d->{$p}->{$k},
          );
        }
        $d->{$p}->{$k} = $v;
      }
    }
  }
  elsif(defined $Hash_ref{$p}) {
    my($k, $v);
    my(@v) = Vend::Util::quoted_comma_string($val);
    @v = grep defined $_, @v;
    $d->{$p} = {} unless defined $d->{$p};
    for(@v) {
      ($k,$v) = split /\s*=\s*/, $_;
      if($d->{$p}->{$k}) {
        config_warn(
          qq{Database %s hash parameter %s redefined to "%s", was "%s".},
          $d->{name},
          "$p --> $k",
          $v,
          $d->{$p}->{$k},
        );
      }
      $d->{$p}->{$k} = $v;
    }
  }
  elsif(defined $Ary_ref{$p}) {
    my(@v) = Text::ParseWords::shellwords($val);
    $d->{$p} = [] unless defined $d->{$p};
    push @{$d->{$p}}, @v;
  }
  else {
    defined $d->{$p}
    and ! defined $C->{DatabaseDefault}{$p}
      and config_warn(
          qq{Database %s scalar parameter %s redefined to "%s", was "%s".},
          $d->{name},
          $p,
          $val,
          $d->{$p},
        );
    $d->{$p} = $val;
  }
}

#::logDebug("d object: " . uneval_it($d));
if($d->{ACTIVE} and ! $d->{OBJECT}) {
  my $name = $d->{'name'};
  $d->{OBJECT} = Vend::Data::import_database($d)
    or config_error("Config database $name failed import.\n");
}
elsif($d->{LOAD} and ! $d->{OBJECT}) {
  my $name = $d->{'name'};
  $d->{OBJECT} = Vend::Data::import_database($d)
    or config_error("Config database $name failed import.\n");
  if( $d->{type} == 8 ) {
    $d->{OBJECT}->set_query("delete from $name where 1 = 1");
  }
}

return $d;

}

AUTHORS

Mike Heins

SEE ALSO

Catalog(7ic)

DocBook! Interchange!