9 |
9 |
selectall_hashref_query selectall_array_query
|
10 |
10 |
selectall_as_map
|
11 |
11 |
prepare_execute_query prepare_query
|
12 |
|
create_sort_spec does_table_exist);
|
|
12 |
create_sort_spec does_table_exist
|
|
13 |
add_token);
|
13 |
14 |
|
14 |
15 |
sub conv_i {
|
15 |
16 |
my ($value, $default) = @_;
|
... | ... | |
280 |
281 |
return $result;
|
281 |
282 |
}
|
282 |
283 |
|
|
284 |
# add token to values.
|
|
285 |
# usage:
|
|
286 |
# add_token(
|
|
287 |
# \@where_tokens,
|
|
288 |
# \@where_values,
|
|
289 |
# col => 'id',
|
|
290 |
# val => [ 23, 34, 17 ]
|
|
291 |
# esc => \&conf_i
|
|
292 |
# )
|
|
293 |
# will append to the given arrays:
|
|
294 |
# -> 'id IN (?, ?, ?)'
|
|
295 |
# -> (conv_i(23), conv_i(34), conv_i(17))
|
|
296 |
#
|
|
297 |
# features:
|
|
298 |
# - don't care if one or multiple values are given. singlewill result in 'col = ?'
|
|
299 |
# - pass escape routines
|
|
300 |
# - expand for future method
|
|
301 |
# - no need to type "push @where_tokens, 'id = ?'" over and over again
|
|
302 |
sub add_token {
|
|
303 |
my $tokens = shift() || [];
|
|
304 |
my $values = shift() || [];
|
|
305 |
my %params = @_;
|
|
306 |
my $col = $params{col};
|
|
307 |
my $val = $params{val};
|
|
308 |
my $method = $params{method} || '=';
|
|
309 |
my $escape = $params{esc} || sub { $_ };
|
|
310 |
|
|
311 |
$val = [ $val ] unless ref $val eq 'ARRAY';
|
|
312 |
|
|
313 |
my %escapes = (
|
|
314 |
id => \&conv_i,
|
|
315 |
date => \&conv_date,
|
|
316 |
);
|
|
317 |
|
|
318 |
my %methods = (
|
|
319 |
'=' => sub {
|
|
320 |
my $col = shift;
|
|
321 |
return scalar @_ > 1 ? sprintf '%s IN (%s)', $col, join ', ', ("?") x scalar @_
|
|
322 |
: scalar @_ == 1 ? sprintf '%s = ?', $col
|
|
323 |
: undef;
|
|
324 |
},
|
|
325 |
);
|
|
326 |
|
|
327 |
$method = $methods{$method} || $method;
|
|
328 |
$escape = $escapes{$escape} || $escape;
|
|
329 |
|
|
330 |
my $token = $method->($col, @{ $val });
|
|
331 |
my @vals = map { $escape->($_) } @{ $val };
|
|
332 |
|
|
333 |
return unless $token;
|
|
334 |
|
|
335 |
push @{ $tokens }, $token;
|
|
336 |
push @{ $values }, @vals;
|
|
337 |
|
|
338 |
return ($token, @vals);
|
|
339 |
}
|
283 |
340 |
|
284 |
341 |
1;
|
285 |
342 |
|
... | ... | |
293 |
350 |
=head1 SYNOPSIS
|
294 |
351 |
|
295 |
352 |
use DBUtils;
|
296 |
|
|
|
353 |
|
297 |
354 |
conv_i($str, $default)
|
298 |
355 |
conv_date($str)
|
299 |
356 |
conv_dateq($str)
|
... | ... | |
307 |
364 |
|
308 |
365 |
my $all_results_ref = selectall_hashref_query($form, $dbh, $query)
|
309 |
366 |
my $first_result_hash_ref = selectfirst_hashref_query($form, $dbh, $query);
|
310 |
|
|
|
367 |
|
311 |
368 |
my @first_result = selectfirst_array_query($form, $dbh, $query); # ==
|
312 |
369 |
my @first_result = selectrow_query($form, $dbh, $query);
|
313 |
|
|
|
370 |
|
314 |
371 |
my %sort_spec = create_sort_spec(%params);
|
315 |
372 |
|
316 |
373 |
=head1 DESCRIPTION
|
... | ... | |
329 |
386 |
- Safe value binding. Although DBI is far from perfect in terms of binding, the rest of the bindings should happen here.
|
330 |
387 |
- Error handling. Should a query fail, an error message will be generated here instead of in the backend code invoking DBUtils.
|
331 |
388 |
|
332 |
|
Note that binding is not perfect here either...
|
333 |
|
|
|
389 |
Note that binding is not perfect here either...
|
|
390 |
|
334 |
391 |
=head2 QUOTING FUNCTIONS
|
335 |
392 |
|
336 |
393 |
=over 4
|
... | ... | |
386 |
443 |
|
387 |
444 |
=item selectrow_query FORM,DBH,QUERY,ARRAY
|
388 |
445 |
|
389 |
|
Prepares and executes a query using DBUtils functions, retireves the first row from the database, and returns it as an arrayref of the first row.
|
|
446 |
Prepares and executes a query using DBUtils functions, retireves the first row from the database, and returns it as an arrayref of the first row.
|
390 |
447 |
|
391 |
448 |
=item selectfirst_hashref_query FORM,DBH,QUERY,ARRAY
|
392 |
449 |
|
393 |
|
Prepares and executes a query using DBUtils functions, retireves the first row from the database, and returns it as a hashref of the first row.
|
|
450 |
Prepares and executes a query using DBUtils functions, retireves the first row from the database, and returns it as a hashref of the first row.
|
394 |
451 |
|
395 |
452 |
=item selectall_hashref_query FORM,DBH,QUERY,ARRAY
|
396 |
453 |
|
... | ... | |
484 |
541 |
=item A more complicated example, using dynamic binding values:
|
485 |
542 |
|
486 |
543 |
my @values;
|
487 |
|
|
|
544 |
|
488 |
545 |
if ($form->{language_values} ne "") {
|
489 |
546 |
$query = qq|SELECT l.id, l.description, tr.translation, tr.longdescription
|
490 |
547 |
FROM language l
|
... | ... | |
493 |
550 |
} else {
|
494 |
551 |
$query = qq|SELECT id, description FROM language|;
|
495 |
552 |
}
|
496 |
|
|
|
553 |
|
497 |
554 |
my $languages = selectall_hashref_query($form, $dbh, $query, @values);
|
498 |
555 |
|
499 |
556 |
=back
|
... | ... | |
504 |
561 |
|
505 |
562 |
Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
|
506 |
563 |
Sven Schoeling E<lt>s.schoeling@linet-services.deE<gt>
|
507 |
|
|
|
564 |
|
508 |
565 |
=head1 DOCUMENTATION AUTHORS
|
509 |
566 |
|
510 |
567 |
Udo Spallek E<lt>udono@gmx.netE<gt>
|
... | ... | |
526 |
583 |
You should have received a copy of the GNU General Public License
|
527 |
584 |
along with this program; if not, write to the Free Software
|
528 |
585 |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
529 |
|
=cut
|
|
586 |
=cut
|
Löschen von RecordLinks