Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование 
:(
    Опции темы
SkoobyDoo
Дата 7.2.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.10.2007

Репутация: нет
Всего: нет



Доброго времени суток! 
Есть вопрос. Каким образом можно в классе DB.pm наследовать функции из дочерних 
классов в зависимости от параметра конфига "dbtype", т.е. как они переопределяются?

Например имееться скрипт main.pl: 
Код

#!/usr/bin/perl
use strict;
use warnings;
use DB;

my $db = DB->new();
my @data = $db->get_data();


Файл конфига config.yml с содержимым:
Код

dbname: test
dbuser: john
dbpass: qwerty
dbhost: localhost
dbport: 3333

# MySQL, PgSQL, SQLite
dbtype: SQLite

# Если dbtype равно SQLite, то используем параметр dbfile
dbfile: /path/to/db.sqlite


Далее идут три класса DB::SQLite, DB::MySQL и DB::PgSQL:

Код

package DB::SQLite;
use DBI;
sub get_data {
    # выборка из бд SQLite
}
1;


Код

package DB::MySQL;
use DBI;
sub get_data {
    # выборка из бд MySQL
}
1;


Код

package DB::PgSQL;
use DBI;
sub get_data {
    # выборка из бд PgSQL
}
1;




Это сообщение отредактировал(а) SkoobyDoo - 7.2.2011, 11:55
PM MAIL   Вверх
arto
Дата 7.2.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



поманипулируйте @ISA.
perldoc perlboot
PM MAIL ICQ   Вверх
SkoobyDoo
Дата 7.2.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.10.2007

Репутация: нет
Всего: нет



Написал так:
Код

package DB;

use strict;
use warnings;
use base qw(DB::MySQL DB::SQLite DB::PgSQL);
use DBI;
    
sub new {
    my ($proto, $param) = @_;
    my $class = ref($proto)||$proto;
    my $self = {};
    $self->{DBTYPE} = $param->{'dbtype'};    
    $self->{dbh} = DBI->connect("dbi:" ... ); # соединяемся
    
    return bless $self, "DB::" . $self->{DBTYPE};
}

1;

работает!

Конечно хотелось бы услышать ваше мнение. Может есть более удобные способы.

Это сообщение отредактировал(а) SkoobyDoo - 7.2.2011, 13:05
PM MAIL   Вверх
arto
Дата 7.2.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



имхо проще все скрыть от пользователя, и не выносить наружу потроха работы с базой.
DBI может сам подгрузить нужный DBD, в зависимостки от DSN.
если не уверены в наличии нужного модуля, используйте require и ловите $@.
PM MAIL ICQ   Вверх
SkoobyDoo
Дата 7.2.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.10.2007

Репутация: нет
Всего: нет



Хочеться, чтобы в качестве БД можно было использовать SQLite/MySQL/Pg/XML/YAML/текстовик/etc. А что там происходит было не видно. Набрав
Код

my $db = DB->new();
$db->get_data();
$db->run_sql();


не заботило, что там, да и как.

Это сообщение отредактировал(а) SkoobyDoo - 7.2.2011, 15:11
PM MAIL   Вверх
arto
Дата 7.2.2011, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



ну и определяйте базу через dsn, обычно этого должно хватить.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.