selectall_hashref_query umgestellt auf die DBI funktion selectall_arrayref.
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 13 Aug 2010 14:23:09 +0000 (16:23 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 13 Aug 2010 14:23:09 +0000 (16:23 +0200)
Mit einem bestimmten Parameter tut diese genau das gleiche wie die
selectall_hashref, was zur Folge hat, das ein Großteil des Overheads der
Datenbankkommunikation gespart oder nach XS ausgelagert wird. Grosse Requests
mit sehr viel Datenbankzugriff (Schwalfenberg Fall) sind gut 25% schneller
damit.

Der Slice Parameter sollte mindestens auf Debian Sarge und darauf basierenden
Distributionen funktionieren, davor habe ich nicht nachgeschaut.

SL/DBUtils.pm

index e041e10..e0a362f 100644 (file)
@@ -147,12 +147,11 @@ sub selectall_hashref_query {
 
   my ($form, $dbh, $query) = splice(@_, 0, 3);
 
-  my $sth = prepare_execute_query($form, $dbh, $query, @_);
-  my $result = [];
-  while (my $ref = $sth->fetchrow_hashref()) {
-    push(@{ $result }, $ref);
-  }
-  $sth->finish();
+  dump_query(LXDebug->QUERY(), '', $query, @_);
+
+  # this works back 'til at least DBI 1.46 on perl 5.8.4 on Debian Sarge (2004)
+  my $result = $dbh->selectall_arrayref($query, { Slice => {} }, @_)
+    or $form->dberror($query . (@_ ? " (" . join(", ", @_) . ")" : ''));
 
   $main::lxdebug->leave_sub(2);