(PERL) передача ссылки на объект

just a n00b
Дата: 07.08.2006 23:44:08
Я недавно начал програмировать на перле и у меня возникла следующая проблема: существует несколько перловских скриптов, работающих с базой данных на Postgre. Вопрос в следующем - как лучше реализовать функцию подключения к базе данных:
- при каждом вызове скрипта, в его теле;
- в отдельном packag`е, из которого будет вызываться функция подключения к базе данных;
- при логине в проект.
Сейчас эта функция реализована первым способом, но, имхо, это не рационально. Второй и третий способ подразумевают передачу хэндла на базу данных. Так вот, хотелось бы узнать, как именно его передавать в скрипты.
just a n00b
Дата: 08.08.2006 21:16:01
Видимо, я криво выразил свою мысль. Вот кусок кода:
один из скриптов
require "Functions.pl";

my $dbname="test_db";
my $username="postgres";
my $password="";
my $dbhost="192.168.0.1";
my $dbport="5432";
my $dbh=DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport","$username","$password",{PrintError=>0});
if ($DBI::err != 0) {print $DBI::errstr . "\n"; exit($DBI::err);}

....
хотелось бы запихнуть это всё внутрь функции DbConnect() внутри файла Functions.pl, что бы этот же скрипт выглядил следующим образом:
require "Functions.pl";

my $dbh=Functions::DbConnect();

....

так вот, что именно надо написать в return функции DbConnect()?
LeXa NalBat
Дата: 09.08.2006 10:11:36
just a n00b
так вот, что именно надо написать в return функции DbConnect()?
return $dbh; # $dbh - это ссылка на объект класса DBI

Но если в одном процессе будет два раза вызвана функция DbConnect() (из одного скрипта или модуля, или из разных модулей), то физически будут созданы два разных соединения с БД. Могу прислать модуль, который внутри себя кэширует орткрытые коннекты к БД, и, если два раза из процесса будет запрошен один и тот же коннект, то он вернет одну и ту же переменную $dbh.
Yevgen
Дата: 10.08.2006 14:18:29
just a n00b
Видимо, я криво выразил свою мысль. Вот кусок кода:
один из скриптов
require "Functions.pl";

my $dbname="test_db";
my $username="postgres";
my $password="";
my $dbhost="192.168.0.1";
my $dbport="5432";
my $dbh=DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport","$username","$password",{PrintError=>0});
if ($DBI::err != 0) {print $DBI::errstr . "\n"; exit($DBI::err);}

....
хотелось бы запихнуть это всё внутрь функции DbConnect() внутри файла Functions.pl, что бы этот же скрипт выглядил следующим образом:
require "Functions.pl";

my $dbh=Functions::DbConnect();

....

так вот, что именно надо написать в return функции DbConnect()?


Все просто. Если ты верно работаешь с БД, то твоя функция будет выглядеть следующим образом:

sub DbConnect
{
#Определяем БД, с которой работаем
my $dbname="test_db";
my $username="postgres";
my $password="";
my $dbhost="192.168.0.1";
my $dbport="5432";

#Коннектимся к БД
my $dbh=DBI->connect
("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport","$username","$password",{PrintError=>0});

#Проверяем, не возникло ли ошибки соединения с сервером БД
if ($DBI::err != 0) {print $DBI::errstr . "\n"; exit($DBI::err);}

#Возвращаем соединение
return $dbh;
}

Всего-то делов. :)
just a n00b
Дата: 10.08.2006 22:08:45
Спасибо за ответы...я даже не думал, что это так просто реализовывается Q_Q