|
@@ -370,78 +370,6 @@ if ($sql =~ /^insert/i) {
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
-# Внутренняя функция для выполнения параметризованных запросов
|
|
|
|
|
-sub _execute_param {
|
|
|
|
|
- my ($db, $sql, $params, $options) = @_;
|
|
|
|
|
-
|
|
|
|
|
- return unless $db && $sql;
|
|
|
|
|
-
|
|
|
|
|
- # Логируем не-SELECT-запросы
|
|
|
|
|
- unless ($sql =~ /^\s*SELECT/i) {
|
|
|
|
|
- log_debug( $sql . ($params ? ' | params: [' . join(', ', map { defined $_ ? $_ : 'undef' } @$params) . ']' : ''));
|
|
|
|
|
- }
|
|
|
|
|
- # Переподключение
|
|
|
|
|
- unless (reconnect_db(\$db)) {
|
|
|
|
|
- log_error("No database connection available");
|
|
|
|
|
- return wantarray ? () : undef;
|
|
|
|
|
- }
|
|
|
|
|
- my $mode = $options->{mode} || 'execute';
|
|
|
|
|
- eval {
|
|
|
|
|
- my $sth = $db->prepare($sql) or die "Unable to prepare SQL [$sql]: " . $db->errstr;
|
|
|
|
|
- my $rv = $params ? $sth->execute(@$params) : $sth->execute();
|
|
|
|
|
- unless ($rv) {
|
|
|
|
|
- die "Unable to execute SQL [$sql]" . ($params ? " with params: [" . join(', ', @$params) . "]" : "") . ": " . $sth->errstr;
|
|
|
|
|
- }
|
|
|
|
|
- if ($mode eq 'single') {
|
|
|
|
|
- my $row = $sth->fetchrow_hashref();
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return $row;
|
|
|
|
|
- }
|
|
|
|
|
- elsif ($mode eq 'array') {
|
|
|
|
|
- my @rows;
|
|
|
|
|
- while (my $row = $sth->fetchrow_hashref()) {
|
|
|
|
|
- push @rows, $row;
|
|
|
|
|
- }
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return @rows;
|
|
|
|
|
- }
|
|
|
|
|
- elsif ($mode eq 'arrayref') {
|
|
|
|
|
- my $rows = $sth->fetchall_arrayref({});
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return $rows;
|
|
|
|
|
- }
|
|
|
|
|
- elsif ($mode eq 'scalar') {
|
|
|
|
|
- my $row = $sth->fetchrow_arrayref();
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return $row ? $row->[0] : undef;
|
|
|
|
|
- }
|
|
|
|
|
- elsif ($mode eq 'id') {
|
|
|
|
|
- if ($sql =~ /^\s*INSERT/i) {
|
|
|
|
|
- my $id;
|
|
|
|
|
- if ($config_ref{DBTYPE} and $config_ref{DBTYPE} eq 'mysql') {
|
|
|
|
|
- $id = $sth->{mysql_insertid};
|
|
|
|
|
- } else {
|
|
|
|
|
- ($id) = $db->selectrow_array("SELECT lastval()");
|
|
|
|
|
- }
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return $id || 0;
|
|
|
|
|
- }
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return 1;
|
|
|
|
|
- }
|
|
|
|
|
- else {
|
|
|
|
|
- $sth->finish();
|
|
|
|
|
- return 1;
|
|
|
|
|
- }
|
|
|
|
|
- };
|
|
|
|
|
- if ($@) {
|
|
|
|
|
- log_error("Error executing SQL [$sql]: " . $@);
|
|
|
|
|
- return wantarray ? () : undef;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
-
|
|
|
|
|
# Обновленная функция get_option с параметризованными запросами
|
|
# Обновленная функция get_option с параметризованными запросами
|
|
|
sub get_option {
|
|
sub get_option {
|
|
|
my $db = shift;
|
|
my $db = shift;
|
|
@@ -476,30 +404,81 @@ sub get_option {
|
|
|
return $result;
|
|
return $result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
-
|
|
|
|
|
-sub get_count_records {
|
|
|
|
|
-my ($db, $table, $filter, @params) = @_;
|
|
|
|
|
-my $result = 0;
|
|
|
|
|
-return $result if (!$db);
|
|
|
|
|
-return $result if (!$table);
|
|
|
|
|
-my $sSQL='SELECT COUNT(*) as rec_cnt FROM '.$table;
|
|
|
|
|
-if ($filter) { $sSQL=$sSQL." WHERE ".$filter; }
|
|
|
|
|
-my $record = get_record_sql($db,$sSQL, @params);
|
|
|
|
|
-if ($record->{rec_cnt}) { $result = $record->{rec_cnt}; }
|
|
|
|
|
-return $result;
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
-sub get_id_record {
|
|
|
|
|
-my ($db, $table, $filter, @params) = @_;
|
|
|
|
|
-my $result = 0;
|
|
|
|
|
-return $result if (!$db);
|
|
|
|
|
-return $result if (!$table);
|
|
|
|
|
-my $record = get_record_sql($db,"SELECT id FROM $table WHERE $filter", @params);
|
|
|
|
|
-if ($record->{id}) { $result = $record->{id}; }
|
|
|
|
|
-return $result;
|
|
|
|
|
|
|
+# Внутренняя функция для выполнения параметризованных запросов
|
|
|
|
|
+sub _execute_param {
|
|
|
|
|
+ my ($db, $sql, $params, $options) = @_;
|
|
|
|
|
+ return unless $db && $sql;
|
|
|
|
|
+
|
|
|
|
|
+ # Логируем не-SELECT-запросы
|
|
|
|
|
+ unless ($sql =~ /^\s*SELECT/i) {
|
|
|
|
|
+ log_debug( $sql . ($params ? ' | params: [' . join(', ', map { defined $_ ? $_ : 'undef' } @$params) . ']' : ''));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ # Переподключение
|
|
|
|
|
+ unless (reconnect_db(\$db)) {
|
|
|
|
|
+ log_error("No database connection available");
|
|
|
|
|
+ return wantarray ? () : undef;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ my $mode = $options->{mode} || 'execute';
|
|
|
|
|
+
|
|
|
|
|
+ my $sth = $db->prepare($sql) or do {
|
|
|
|
|
+ log_error("Unable to prepare SQL [$sql]: " . $db->errstr);
|
|
|
|
|
+ return wantarray ? () : undef;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ my $rv = $params ? $sth->execute(@$params) : $sth->execute();
|
|
|
|
|
+
|
|
|
|
|
+ unless ($rv) {
|
|
|
|
|
+ log_error("Unable to execute SQL [$sql]" . ($params ? " with params: [" . join(', ', @$params) . "]" : "") . ": " . $sth->errstr);
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return wantarray ? () : undef;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($mode eq 'single') {
|
|
|
|
|
+ my $row = $sth->fetchrow_hashref();
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return $row;
|
|
|
|
|
+ }
|
|
|
|
|
+ elsif ($mode eq 'array') {
|
|
|
|
|
+ my @rows;
|
|
|
|
|
+ while (my $row = $sth->fetchrow_hashref()) {
|
|
|
|
|
+ push @rows, $row;
|
|
|
|
|
+ }
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return \@rows;
|
|
|
|
|
+ }
|
|
|
|
|
+ elsif ($mode eq 'arrayref') {
|
|
|
|
|
+ my $rows = $sth->fetchall_arrayref({});
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return $rows;
|
|
|
|
|
+ }
|
|
|
|
|
+ elsif ($mode eq 'scalar') {
|
|
|
|
|
+ my $row = $sth->fetchrow_arrayref();
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return $row ? $row->[0] : undef;
|
|
|
|
|
+ }
|
|
|
|
|
+ elsif ($mode eq 'id') {
|
|
|
|
|
+ if ($sql =~ /^\s*INSERT/i) {
|
|
|
|
|
+ my $id;
|
|
|
|
|
+ if ($config_ref{DBTYPE} and $config_ref{DBTYPE} eq 'mysql') {
|
|
|
|
|
+ $id = $sth->{mysql_insertid};
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ($id) = $db->selectrow_array("SELECT lastval()");
|
|
|
|
|
+ }
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return $id || 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ else {
|
|
|
|
|
+ $sth->finish();
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
@@ -513,7 +492,11 @@ unless (reconnect_db(\$db)) {
|
|
|
log_error("No database connection available");
|
|
log_error("No database connection available");
|
|
|
return @result;
|
|
return @result;
|
|
|
}
|
|
}
|
|
|
-return _execute_param($db, $sql, \@params, { mode => 'array' });
|
|
|
|
|
|
|
+my $result_ref = _execute_param($db, $sql, \@params, { mode => 'array' });
|
|
|
|
|
+if (ref($result_ref) eq 'ARRAY') {
|
|
|
|
|
+ @result = @$result_ref;
|
|
|
|
|
+ }
|
|
|
|
|
+return @result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
@@ -537,6 +520,34 @@ return _execute_param($db, $sql, \@params, { mode => 'single' });
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
+sub get_count_records {
|
|
|
|
|
+my ($db, $table, $filter, @params) = @_;
|
|
|
|
|
+my $result = 0;
|
|
|
|
|
+return $result if (!$db);
|
|
|
|
|
+return $result if (!$table);
|
|
|
|
|
+my $sSQL='SELECT COUNT(*) as rec_cnt FROM '.$table;
|
|
|
|
|
+if ($filter) { $sSQL=$sSQL." WHERE ".$filter; }
|
|
|
|
|
+my $record = get_record_sql($db,$sSQL, @params);
|
|
|
|
|
+if ($record->{rec_cnt}) { $result = $record->{rec_cnt}; }
|
|
|
|
|
+return $result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
|
|
+sub get_id_record {
|
|
|
|
|
+my ($db, $table, $filter, @params) = @_;
|
|
|
|
|
+my $result = 0;
|
|
|
|
|
+return $result if (!$db);
|
|
|
|
|
+return $result if (!$table);
|
|
|
|
|
+my $record = get_record_sql($db,"SELECT id FROM $table WHERE $filter", @params);
|
|
|
|
|
+if ($record->{id}) { $result = $record->{id}; }
|
|
|
|
|
+return $result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
|
|
+#---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
sub get_diff_rec {
|
|
sub get_diff_rec {
|
|
|
my ($db, $table, $record, $filter_sql, @filter_params) = @_;
|
|
my ($db, $table, $record, $filter_sql, @filter_params) = @_;
|
|
|
return unless $db && $table && $filter_sql;
|
|
return unless $db && $table && $filter_sql;
|
|
@@ -791,7 +802,7 @@ my $rec_id = 0;
|
|
|
|
|
|
|
|
my $diff='';
|
|
my $diff='';
|
|
|
foreach my $field (keys %$old_record) {
|
|
foreach my $field (keys %$old_record) {
|
|
|
- if (!$old_record->{$field}) { $old_record->{$field}=''; }
|
|
|
|
|
|
|
+ next if (!$old_record->{$field});
|
|
|
$diff = $diff." $field => $old_record->{$field},";
|
|
$diff = $diff." $field => $old_record->{$field},";
|
|
|
}
|
|
}
|
|
|
$diff=~s/,\s*$//;
|
|
$diff=~s/,\s*$//;
|