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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модуль работы с Mysql, нужна критика ;) 
:(
    Опции темы
comtat
Дата 16.9.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

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



Оцените плиз
Код

package DAAL_mysql;

use vars qw{$VERSION};
$VERSION = 1.00;

=head1 NAME

DAAL_mysql - The interface for work to MySql through DBI for Perl

=head1 VERSION

This documentation refers to DAAL_mysql version 1.0.0.

=head1 SYNOPSIS

   use DAAL_mysql;

   $mysql_obj = new DAAL_mysql();
   
   $mysql_obj->DAAL_mysql(\%dbConfig);

   $dbh = $mysql_obj->Connect();
  
   $sth = $mysql_obj->DoQuery($statement);
   $sth = $mysql_obj->DoQuery($statement, $noparse);
   
   $sth = $mysql_obj->DoQueryLimit($statement);
   $sth = $mysql_obj->DoQueryLimit($statement, $start);
   $sth = $mysql_obj->DoQueryLimit($statement, $start, $count);
   $sth = $mysql_obj->DoQueryLimit($statement, $start, $count, $noparse);
   
   $value = $mysql_obj->GetValueFromDB($statement);
   $value = $mysql_obj->GetValueFromDB($statement, $noparse);
   
   @row_ary = $mysql_obj->GetRecordFromDB($statement);
   @row_ary = $mysql_obj->GetRecordFromDB($statement, $noparse);

   $rv  = $mysql_obj->DoDelete($statement);

   $rv  = $mysql_obj->DoDeleteQuery($table);
   $rv  = $mysql_obj->DoDeleteQuery($table, $where);
   $rv  = $mysql_obj->DoDeleteQuery($table, $where, $quote);
   $rv  = $mysql_obj->DoDeleteQuery($table, \%where);
   $rv  = $mysql_obj->DoDeleteQuery($table, \%where, $quote);

   $mysql_obj->DoUpdateQuery($table, $fields, \%data); 
   $mysql_obj->DoUpdateQuery($table, $fields, \%data, $where); 
   $mysql_obj->DoUpdateQuery($table, $fields, \%data, $where, $quote); 

   $mysql_obj->DoInsertQuery($table, $fields, \%data);
   $mysql_obj->DoInsertQuery($table, $fields, \%data, $quote);
   $mysql_obj->DoInsertQuery($table, $fields, \%data, $quote, $noparse);
   
   $rc  = $mysql_obj->Disconnect();
   
=head1 AUTHOR

Lyvin Ivan ([email protected])

=cut

use DBI;
use Carp();

sub new {
  my $class = shift;
  
  my %hash; 
  my $self = bless {
       dbh => "",
       connected => 0,  
       serverName => "",  
       database => "",
       login => "", 
       password => "",
       serverLink => "",
       debugMode => 0,
       transactions => %hash,
       tranIdx => 0,
       tranCount => 0,
       core => "",
       queryCount => 0,
       limits => %hash,
       type => "",
       lastError => ""    
       }, $class;  
  return $self;
}


sub DAAL_mysql {
  my $self = shift;
  
  my $dbConfig = shift;
  
  $self->{connected} = 0;
  $self->{serverName} = $$dbConfig{SERVER};
  $self->{database} = $$dbConfig{DATABASE};
  $self->{login} = $$dbConfig{LOGIN};
  $self->{password} = $$dbConfig{PASSWORD};
  $self->{type} = "MySql";
  $self->{debugMode} = 0;
}#DAAL_mysql

sub Connect {
  my $self = shift;

  if ($self->{connected}) {
    return;
  } elsif (!($self->{dbh} = DBI->connect("DBI:mysql:$self->{database}:$self->{serverName}", $self->{login}, $self->{password}))) {
     print "error> DBI->connect";
  } else {
    $self->{connected} = 1;
  }
  return $self->{dbh};
}#Connect

sub Disconnect {
  my $self = shift;
  
  $self->{connected} = 0;
  return $self->{dbh}->disconnect;
}#Disconnect

sub IsError {
  my $self = shift;
  
  return $self->{lastError} ne "";
}

sub DoQuery {
  my $self = shift;

  my $query = shift;
  my $noparse = shift;
  
  $noparse = 0 unless ($noparse);
  $self->{lastError} = "";
  my $sth = $self->{dbh}->prepare($query);
  if (!$sth && $noparse == 0){
    Carp::croak($sth->err." ".$sth->errstr);
  } else {
    $self->{lastError} = $sth->err;
  }
  
  $sth->execute();
  $self->{queryCount}++;
  return $sth;
}#DoQuery

sub GetRecord {
  my $self = shift;
  
  my $sqlsth = shift;
  my $type   = shift;
  
  $type = "HASHREF" unless $type;
  if ($type eq "HASHREF") {
    return $sqlsth->fetchrow_hashref()
  } elsif ($type eq "ARRAYREF") {
    return $sqlsth->fetchrow_arrayref();
  } else {
    return $sqlsth->fetchrow_array();
  }
}

sub FreeResult {
  my $self = shift;
  
  my $sqlres = shift;
  return $sqlres->finish;
}#FreeResult

sub GetValueFromDB {
  my $self = shift;
  
  my $query = shift;
  my $noparse = shift;
  
  $noparse = 0 unless ($noparse);
  my $sqlsth = $self->DoQuery($query, $noparse);
  my $first = $sqlsth->fetchrow_array();
  $self->FreeResult($sqlsth);
  return $first;
}#GetValueFromDB

sub GetRecordFromDB {
  my $self = shift;
    
  my $query = shift;
  my $noparse = shift;
  
  $noparse = 0 unless ($noparse);  
  my @result;
  my $sqlsth = $self->DoQuery($query, $noparse);
  @result = $self->GetRecord($sqlsth, "ARRAY");
  $self->FreeResult($sqlsth);
  return @result;
}#GetRecordFromDB

sub DoQueryLimit {
  my $self = shift;

  my $query = shift;
  my $start = shift;
  my $count = shift;
  my $noparse = shift;
  
  $start = 0 unless ($start);   
  $count = 0 unless ($count);
  $noparse = 0 unless ($noparse);        
  unless ($start && $count) {
    return $self->DoQuery($query, $noparse);
  }
  $query = $query." LIMIT ".$start.", ".$count;
  my $sqlsth = $self->DoQuery($query, $noparse);
  $self->{limits}{"$sqlsth"} = $start;
  return $sqlsth;
}#DoQueryLimit

=head
--- Выполняет запрос на вставку записи ---
* @param string $table Название таблицы в которую необходимо вставить запись
* @param string $fields Cтрока в котрой через запятую должны быть перечислены 
названия полей используемые в запросе. Если строка пустая, то названия 
полей извлекаются из массива с данными
* @param array $data Ассоциативный массив (имя поля => значение поля) 
со значениями полей для новой записи
* @param boolean $quote
* @return int Ид-р новой записи
=cut
sub DoInsertQuery {
  my $self = shift;
  
  my $table   = shift;
  my $fields  = shift;
  my $data    = shift;
  my $quote   = shift;
  my $noparse = shift;
  
  $quote   = 1 unless ($quote);  
  $noparse = 0 unless ($noparse);    
  my $q = $quote?"'":"";
    
  my @fields_array;    
  my $field_list;

  if ($fields eq ""){
    @fields_array = keys %{$data};
    $field_list = join(',', @fields_array);
  } else {
    $fields =~ s/ //g;
    @fields_array = split(",", $fields);
    $field_list = $fields;
  }

  my $sql = "INSERT INTO $table ($field_list) \nVALUES (";
  my $i = 0;
  foreach my $val (@fields_array) {
    if($$data{$val} eq "NULL") {
     $sql .= ($i++>0?", ":"").'NULL';
    } elsif($$data{$val} eq "") { 
     Carp::croak("Not valid value in ".$val);
     exit 0;
    } else {
     $sql .= ($i++>0?", ":"").$q.($$data{$val}).$q;
    }
  }
  $sql .= ");";
  my $sqlsth = $self->DoQuery($sql, $noparse);
  $self->FreeResult($sqlsth);
}#DoInsertQuery 

=head
* Выполняет запрос на обновление записи
*
* @param string $table Название таблицы в которую необходимо обновить запись
* @param string $fields Cтрока в котрой через запятую должны быть перечислены 
названия полей используемые в запросе. Если строка пустая, то названия полей 
извлекаются из массива с данными
* @param array $data Ассоциативный массив (имя поля => значение поля) со 
новыми значениями полей для обновляемой записи
* @param string $where Условие отбора обновляемой записи
* @param boolean $quote
*/
=cut
sub DoUpdateQuery {
  my $self = shift;
  
  my $table   = shift;
  my $fields  = shift;
  my $data    = shift;
  my $where   = shift;
  my $quote   = shift;
  
  $quote = 1 unless ($quote);  
  $where = "" unless ($where);  
  
  my $q = $quote?"'":"";
  my @filds_array = ();
  
  if($fields eq ""){
    @fields_array = keys %{$data};
  } else {
    $fields =~ s/ //g;
    @fields_array = split(",", $fields);
  }
  my $sql = "UPDATE $table \nSET ";
  my $i = 0;
  foreach my $val (@fields_array) {
    if($$data{$val} eq "NULL") {
     $sql .= ($i++>0?", ":"")." $val = NULL";
    } elsif($$data{$val} eq "") { 
     Carp::croak("Not valid value in ".$val);
     exit 0;
    } else {
     $sql .= ($i++>0?", ":"")."$val = ".$q.($$data{$val}).$q;
    }
  }
  if ($where ne "") {
    $sql .= " \nWHERE $where";
  }
  my $sqlsth = $self->DoQuery($sql);
  $self->FreeResult($sqlsth);
}#DoUpdateQuery 

=head
* Выполняет запрос на удаление записи
*
* @param string $table Название таблицы в которой необходимо удалить запись
* @param array $where 
1) Ассоциативный массив (имя поля => значение поля) со 
новыми значениями полей для обновляемой записи
2) Строка (условие отбора удаляемой записи)
=cut

sub DoDeleteQuery {
  my $self = shift;
  
  my $table = shift;
  my $where = shift;
  my $quote = shift;

  $quote = 1 unless ($quote);  
  $where = "" unless ($where);  
  
  my $q = $quote?"'":"";
  my $sql = "DELETE FROM $table ";
  
  if ($where ne "") {
    $sql .= " \nWHERE ";
    if (ref $where ne "HASH") {
      $sql .= $where;
    } else {
      my $i = 0;
      foreach my $key (keys %{$where}) {
         $sql .= ($i++>0?" AND ":"")."$key = ".$q.($$where{$key}).$q;
      }
    }
  }
  $self->DoDelete($sql);
}#DoDeleteQuery

sub DoDelete {
  my $self = shift;
  
  my $query = shift;
  return $self->{dbh}->do($query);
}#DoDelete

sub GetNumRows {
  my $self = shift;
  
  my $sqlsth = shift;
  my $count = ($sqlsth->rows == -1)?0:$sqlsth->rows;
  if($self->{limits}{$sqlsth}) {
    return $count - $self->{limits}{$sqlsth};
  } else {
    return $count;
  }
}

sub GetNumFields {
  my $self = shift;
  
  my $sqlsth = shift;
  return $sqlsth->{NUM_OF_FIELDS};
}

1;


Вот все, что пока есть.. в ближайшие дни будет еще и работа с транзакциями 

Это сообщение отредактировал(а) comtat - 22.9.2007, 13:28


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
biophreak
Дата 1.10.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как оно работает с SQL Stored procedures ?
Не замерял производительность, по сравнению с аналогами?
PM MAIL ICQ Jabber   Вверх
comtat
Дата 1.10.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

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



Извиняюсь за сабж он малость неверен скорее совсем неверен 
это оболочка на DBI
котороя позволяет работать более удобно  smile 


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
nitr
Дата 2.10.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



comtat, да - теперь верно сказано, но вроде до этого уже вас поправили (поэтому поводу) ;)

Есть аналоги, с ними сравнивалось? Преимущества вашего модуля опишите, простой пример используя ваш и "не используя" smile Это можно будет включить в описание, потом выложите (вроде форум позволяет и такое) ;)


--------------------
PM   Вверх
comtat
Дата 2.10.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

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



Ну например самый простое выборка.
Стандарно делается примерно так
Код

..
my $sql = "SELECT * FROM pr_fields WHERE id = 48";
$sth = $dbh->prepare($sql);
$sth->execute();
while (my $r = $sth->fetchrow_hashref){
   # Тут что делаем
}
$sth->finish();


а вот как тоже самое можно сделать через оболочку
Код

..
my $sth = getDBH()->DoQuery("SELECT * FROM pr_fields WHERE id = 48");
while (my @row = getDBH()->GetRecord($sth)){
   # Тут что делаем
}


Если нам необходимо получить одну запись то можно сделать так
Код

my $sql = "SELECT time, ip FROM `session` WHERE userID = ".$userID." LIMIT 1";
my ($time, $ipDB) = getDBH()->GetRecordFromDB($sql);


Или например вставка записи. Делается так
Код

my %data = (session => $sid, userID => $userID, 'time' => time(), ip =>$ip, host => $host);
# В данном варианте значения будут вставляться в поля, которые  
# указанны во втором входном параметре. 
getDBH()->DoInsertQuery("session", "session, userID, time, ip, host", \%data);
  или так
Код

# При таком использовании именами полей будут считаться ключи хэша
getDBH()->DoInsertQuery("session", "", \%data);

В то время как при стандартном использовании будет выглядеть примерно так
Код

my $sql = "INSERT INTO session SET  session='".$sid."'";
$sql .= ", time = "'.time()."', userID='".$userID."', ip='".$ip."'";
$sql .= ", host='".$host."'";
$dbh->do($sql);

 
Т.е. не нужно писать лишнего кода и собирать Insert запросы самому 
можно сформировать хэш-массив (Имя_поля => Значение) и указать таблицу в которую вставлять запись

Цитата(nitr @  2.10.2007,  11:03 Найти цитируемый пост)
Есть аналоги, с ними сравнивалось? 

Какие например ?? Если можно линк 


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
nitr
Дата 3.10.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



comtat, я понял... Но вот как раз и просил показать - удобство в твоей оболочке ;)
Тоже самое можно было и обычными ф-циями упростить.

comtat, и ты кстати на верном пути, только надо ещё попрактиковаться и доков прочесть.
А так мне нравится smile

Такие наработки есть на "сборниках скриптов".

На CPAN есть
http://search.cpan.org/~rogerhall/DBIx-MyS...BIx/MySperql.pm
http://search.cpan.org/~nige/Goo-0.09/lib/Goo/Database.pm
http://search.cpan.org/~landman/DBIx-Simpl...x/SimplePerl.pm

В POE http://search.cpan.org/~xantus/POE-Compone...nent/EasyDBI.pm

Это сообщение отредактировал(а) nitr - 3.10.2007, 09:22


--------------------
PM   Вверх
nitr
Дата 3.10.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



похоже даже в самом DBI есть Simple smile
http://search.cpan.org/~linnin/DBD-mysql-S.../SimpleMySQL.pm


--------------------
PM   Вверх
comtat
Дата 3.10.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

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



А чего все таки не хватает ??  smile 
Просто для моих текущих целей вроде функционала достаточно 
Что еще может быть необходимо 

nitr  на досуге поиграюсь с аналогами smile Спасибо за ссылки !!!

Это сообщение отредактировал(а) comtat - 3.10.2007, 21:39


--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
biophreak
Дата 9.10.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не хвататет...ммм...
Как раз работы с SQL Stored Procedures...хотя если у тебя прослойка над DBI, то ничего тут не сделаешь, ибо сам DBI очень криво работает с этим, у меня, по-крайней мере, не получилось его заставить выполнять эти самые stored procedures ;))

ЗЫЖ А почему тема в CGI программировании? smile))

Это сообщение отредактировал(а) biophreak - 9.10.2007, 13:14
PM MAIL ICQ Jabber   Вверх
MoXxX
Дата 9.10.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Что-то туплю, подключил модуль, как задать данные доступа БД?  smile 
PM   Вверх
comtat
Дата 10.10.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

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



MoXxX  делай так
Код

# Database get connected
my $mysql_connect = new DAAL_mysql();
$mysql_connect->DAAL_mysql($sys);
my $dbh = $mysql_connect->Connect();




--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
MoXxX
Дата 10.10.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это я понял, спасибо =))
но что должна содержать переменная $sys ?

Это сообщение отредактировал(а) MoXxX - 10.10.2007, 15:08
PM   Вверх
comtat
Дата 10.10.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1310
Регистрация: 2.5.2006
Где: Россия, Казань

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



Код

my $mysql_connect = new DAAL_mysql();
my %dbConfig = ("SERVER" => "myServer", "DATABASE" => "myDB", "LOGIN" => "логин", "PASSWORD" => "пароль");
$mysql_connect->DAAL_mysql(\%dbConfig);
my $dbh = $mysql_connect->Connect();



--------------------
Рожденный в СССР !!!
ExtJS - мой фреймворк 
PM   Вверх
nitr
Дата 11.10.2007, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



MoXxX, т.е. если верно его понимать ;) то вот что $sys
Код

my $sys = {"SERVER" => "myServer", "DATABASE" => "myDB", "LOGIN" => "логин", "PASSWORD" => "пароль"};




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


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

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


 




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


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

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