Showing 3 changed files with 56 additions and 31 deletions
+1 -1
Changes
... ...
@@ -1,5 +1,5 @@
1 1
 0.1744
2
-    - improved performance
2
+    - added EXPERIMENTAL reuse_sth option to execute method
3 3
     - moved DBIx::Custom::Guide to wiki
4 4
 0.1733
5 5
     - select method join option can receive string.
+39 -25
lib/DBIx/Custom.pm
... ...
@@ -363,9 +363,9 @@ sub execute {
363 363
     $sql .= $opt{append} if defined $opt{append} && !ref $sql;
364 364
     
365 365
     # Query
366
-    my $query = ref $sql
367
-              ? $sql
368
-              : $self->_create_query($sql,$opt{after_build_sql} || $opt{sqlfilter});
366
+    my $query = ref $sql ? $sql
367
+      : $self->_create_query($sql,$opt{after_build_sql} || $opt{sqlfilter},
368
+          $opt{reuse_sth});
369 369
     
370 370
     # Save query
371 371
     $self->last_sql($query->sql);
... ...
@@ -1096,7 +1096,7 @@ sub where { DBIx::Custom::Where->new(dbi => shift, @_) }
1096 1096
 
1097 1097
 sub _create_query {
1098 1098
     
1099
-    my ($self, $source, $after_build_sql) = @_;
1099
+    my ($self, $source, $after_build_sql, $reuse_sth) = @_;
1100 1100
     
1101 1101
     # Cache
1102 1102
     my $cache = $self->cache;
... ...
@@ -1153,7 +1153,9 @@ sub _create_query {
1153 1153
     
1154 1154
     # Prepare statement handle
1155 1155
     my $sth;
1156
-    eval { $sth = $self->dbh->prepare($query->{sql})};
1156
+    $sth = $reuse_sth->{$query->{sql}} if $reuse_sth;
1157
+    eval { $sth = $self->dbh->prepare($query->{sql}) } unless $sth;
1158
+    $reuse_sth->{$query->{sql}} = $sth if $reuse_sth;
1157 1159
     
1158 1160
     if ($@) {
1159 1161
         $self->_croak($@, qq{. Following SQL is executed.\n}
... ...
@@ -2429,6 +2431,26 @@ The following opitons are available.
2429 2431
 
2430 2432
 =over 4
2431 2433
 
2434
+=item C<after_build_sql> 
2435
+
2436
+You can filter sql after the sql is build.
2437
+
2438
+    after_build_sql => $code_ref
2439
+
2440
+The following one is one example.
2441
+
2442
+    $dbi->select(
2443
+        table => 'book',
2444
+        column => 'distinct(name)',
2445
+        after_build_sql => sub {
2446
+            "select count(*) from ($_[0]) as t1"
2447
+        }
2448
+    );
2449
+
2450
+The following SQL is executed.
2451
+
2452
+    select count(*) from (select distinct(name) from book) as t1;
2453
+
2432 2454
 =item C<append>
2433 2455
 
2434 2456
     append => 'order by name'
... ...
@@ -2535,26 +2557,6 @@ and don't forget to sort $row values by $row key asc order.
2535 2557
 
2536 2558
 Priamry key. This is used when C<id> option find primary key.
2537 2559
 
2538
-=item C<after_build_sql> 
2539
-
2540
-You can filter sql after the sql is build.
2541
-
2542
-    after_build_sql => $code_ref
2543
-
2544
-The following one is one example.
2545
-
2546
-    $dbi->select(
2547
-        table => 'book',
2548
-        column => 'distinct(name)',
2549
-        after_build_sql => sub {
2550
-            "select count(*) from ($_[0]) as t1"
2551
-        }
2552
-    );
2553
-
2554
-The following SQL is executed.
2555
-
2556
-    select count(*) from (select distinct(name) from book) as t1;
2557
-
2558 2560
 =item C<table>
2559 2561
     
2560 2562
     table => 'author'
... ...
@@ -2579,6 +2581,18 @@ Table alias. Key is real table name, value is alias table name.
2579 2581
 If you set C<table_alias>, you can enable C<into1> and C<into2> type rule
2580 2582
 on alias table name.
2581 2583
 
2584
+=item C<reuse_sth EXPERIMENTAL>
2585
+    
2586
+    reuse_sth => $has_ref
2587
+
2588
+Reuse statament handle if the hash reference variable is set.
2589
+    
2590
+    my $sth = {};
2591
+    $dbi->execute($sql, $param, sth => $sth);
2592
+
2593
+This will improved performance when same sql is executed repeatedly
2594
+because generally creating statement handle is slow.
2595
+
2582 2596
 =item C<type_rule_off>
2583 2597
 
2584 2598
     type_rule_off => 1
+16 -5
t/common.t
... ...
@@ -80,6 +80,7 @@ my $user_table_info;
80 80
 my $user_column_info;
81 81
 my $values_clause;
82 82
 my $assign_clause;
83
+my $reuse_sth;
83 84
 
84 85
 require MyDBI1;
85 86
 {
... ...
@@ -237,6 +238,16 @@ require MyDBI1;
237 238
     }
238 239
 }
239 240
 
241
+test 'execute reuse_sth option';
242
+eval { $dbi->execute("drop table $table1") };
243
+$dbi->execute($create_table1);
244
+$reuse_sth = {};
245
+for my $i (1 .. 2) {
246
+  $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}, reuse_sth => $reuse_sth);
247
+}
248
+$rows = $dbi->select(table => $table1)->all;
249
+is_deeply($rows, [{$key1 => 1, $key2 => 2}, {$key1 => 1, $key2 => 2}]);
250
+
240 251
 # Get user table info
241 252
 $dbi = DBIx::Custom->connect;
242 253
 eval { $dbi->execute("drop table $table1") };
... ...
@@ -324,7 +335,7 @@ $rows = $result->all;
324 335
 is_deeply($rows, [{$key1 => 2, $key2 => 4}], "filter");
325 336
 
326 337
 test 'DBIx::Custom::SQLTemplate basic tag';
327
-$dbi->execute("drop table $table1");
338
+eval { $dbi->execute("drop table $table1") };
328 339
 $dbi->execute($create_table1_2);
329 340
 $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5});
330 341
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
... ...
@@ -348,7 +359,7 @@ $rows = $result->all;
348 359
 is_deeply($rows, [{$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5}], "basic tag2");
349 360
 
350 361
 test 'DIB::Custom::SQLTemplate in tag';
351
-$dbi->execute("drop table $table1");
362
+eval { $dbi->execute("drop table $table1") };
352 363
 $dbi->execute($create_table1_2);
353 364
 $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5});
354 365
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
... ...
@@ -383,7 +394,7 @@ is_deeply($rows, [{$key1 => 1, $key2 => 1, $key3 => 1, $key4 => 1, $key5 => 5},
383 394
                   {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10}], "basic");
384 395
 
385 396
 test 'Named placeholder';
386
-$dbi->execute("drop table $table1");
397
+eval { $dbi->execute("drop table $table1") };
387 398
 $dbi->execute($create_table1_2);
388 399
 $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5});
389 400
 $dbi->insert(table => $table1, param => {$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10});
... ...
@@ -412,7 +423,7 @@ $result = $dbi->execute(
412 423
 $rows = $result->all;
413 424
 is_deeply($rows, [{$key1 => 1, $key2 => 2, $key3 => 3, $key4 => 4, $key5 => 5}]);
414 425
 
415
-$dbi->execute("drop table $table1");
426
+eval { $dbi->execute("drop table $table1") };
416 427
 $dbi->execute($create_table1);
417 428
 $dbi->insert(table => $table1, param => {$key1 => '2011-10-14 12:19:18', $key2 => 2});
418 429
 $source = "select * from $table1 where $key1 = '2011-10-14 12:19:18' and $key2 = :$key2";
... ...
@@ -463,7 +474,7 @@ $rows   = $result->all;
463 474
 is_deeply($rows, [{$key1 => 3, $key2 => 4}], "filter");
464 475
 $dbi->default_bind_filter(undef);
465 476
 
466
-$dbi->execute("drop table $table1");
477
+eval { $dbi->execute("drop table $table1") };
467 478
 $dbi->execute($create_table1);
468 479
 $dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}, append => '   ');
469 480
 $rows = $dbi->select(table => $table1)->all;