2013-03-12 4 views
0

Я пишу приложение perl, которое использует Rose :: DB для абстракции настойчивости, но я столкнулся с проблемой инициализации моего подкласса Rose :: DB со значениями из Файл конфигурации.Perl Rose :: DB нестационарная регистрация источника данных

документация всегда представляет жёстко прописанные примеры, как:

# Register your lone data source using the default type and domain 
__PACKAGE__->register_db(
    driver => 'pg', 
    database => 'my_db', 
    host  => 'localhost', 
    username => 'joeuser', 
    password => 'mysecret', 
); 

Однако, ради ремонтопригодность, я хотел бы, чтобы заполнить эти значения из отдельного файла конфигурации во время выполнения.

раздел файла конфигурации (Config :: Общий формат) используется:

<database> 
    active_domain  development 

    <db_domain development> 
     db_driver  mysql 
     db_name   stats_dev 
     db_host   localhost 
     db_user   stats_dev 
     db_password  stats_dev 
    </db_domain> 
    <db_domain production> 
     db_driver  mysql 
     db_name   stats_prd 
     db_host   localhost 
     db_user   stats_prd 
     db_password  stats_prd 
    </db_domain> 
</database> 

Моя Rose :: DB подкласс, с помощью метода инициализации:

package Utils::DBUtils; 

use strict; 
use base qw(Rose::DB); 

__PACKAGE__->use_private_registry; 

sub registerAllDBs { 
    my ($self,$config_obj) = @_; 
    my $db_config = $config_obj->getDatabaseSection(); ## subconfig starts here 
    my $def_domain = $db_config->{"active_domain"}; 

    __PACKAGE__->default_domain($def_domain); 
    __PACKAGE__->default_type('main'); 

    my $db_domains = $db_config->{'db_domain'}; 
    foreach my $domain (keys %$db_domains) { 
     my $domain_conf = $db_domains->{$domain}; 

     __PACKAGE__->register_db(
      domain => $domain, 
      type => __PACKAGE__->default_type(), 
      driver => $domain_conf->{'db_driver'}, 
      database => $domain_conf->{'db_name'}, 
      host  => $domain_conf->{'db_host'}, 
      username => $domain_conf->{'db_user'}, 
      password => $domain_conf->{'db_password'} 
     );   
    } 
} 
1; 

Тогда на моей основной сценарий я называю метод один раз для регистрации всех источников данных:

Utils::DBUtils->registerAllDBs($conf); 

Мои постоянные объекты, все наследуемые от Pe rsistentObject пакет, который инициализирует объект БД с:

sub init_db { Utils::DBUtils->new() } 

Однако, это не работает, как я ожидал. Я получаю ошибку компиляции, указав:

No database information found for domain 'default' and type 'default' and no driver type specified in call to Utils::DBUtils->new(...) at PersistentObject.pm line 9 

Проблема, по-видимому, является то, что Rose :: DB ожидает получить полные данные о конфигурации во время компиляции, которые были бы невозможно обеспечить, поскольку она исходит от файл конфигурации.

Я что-то упустил? Невозможно ли динамически инициализировать объект Rose :: DB?

ответ

0

Мне удалось заставить его работать, кажется, что подкласс Rose :: DB требует, по крайней мере, одного оператора register_db во время компиляции.

The (некрасиво) раствор добавить

__PACKAGE__->register_db(
    driver => 'mysql', 
    database => 'fake', 
    host  => 'localhost', 
    username => 'fake', 
    password => 'fake' 
); 

в определении пакета.