... | ... |
@@ -170,14 +170,23 @@ sub do{ |
170 | 170 |
# Create query |
171 | 171 |
sub create_query { |
172 | 172 |
my ($self, $template) = @_; |
173 |
+ my $class = ref $self; |
|
173 | 174 |
|
174 | 175 |
# Create query from SQL template |
175 | 176 |
my $sql_template = $self->sql_template; |
176 |
- my $query = eval{$sql_template->create_query($template)}; |
|
177 |
- croak($@) if $@; |
|
178 | 177 |
|
179 |
- # Create Query object; |
|
180 |
- $query = DBI::Custom::Query->new($query); |
|
178 |
+ # Try to get cached query |
|
179 |
+ my $query = $class->_query_caches->{$template}; |
|
180 |
+ |
|
181 |
+ # Create query |
|
182 |
+ unless ($query) { |
|
183 |
+ $query = eval{$sql_template->create_query($template)}; |
|
184 |
+ croak($@) if $@; |
|
185 |
+ |
|
186 |
+ $query = DBI::Custom::Query->new($query); |
|
187 |
+ |
|
188 |
+ $class->_add_query_cache($template, $query); |
|
189 |
+ } |
|
181 | 190 |
|
182 | 191 |
# Connect if not |
183 | 192 |
$self->connect unless $self->connected; |
... | ... |
@@ -556,6 +565,34 @@ sub delete_all { |
556 | 565 |
return $self->delete($table, {}, $edit_query_cb, {allow_delete_all => 1}); |
557 | 566 |
} |
558 | 567 |
|
568 |
+sub _query_caches : ClassAttr { type => 'hash', |
|
569 |
+ auto_build => sub {shift->_query_caches({}) } } |
|
570 |
+ |
|
571 |
+sub _query_cache_keys : ClassAttr { type => 'array', |
|
572 |
+ auto_build => sub {shift->_query_cache_keys([])} } |
|
573 |
+ |
|
574 |
+sub query_cache_max : ClassAttr { auto_build => sub {shift->query_cache_max(50)} } |
|
575 |
+ |
|
576 |
+# Add query cahce |
|
577 |
+sub _add_query_cache { |
|
578 |
+ my ($class, $template, $query) = @_; |
|
579 |
+ my $query_cache_keys = $class->_query_cache_keys; |
|
580 |
+ my $query_caches = $class->_query_caches; |
|
581 |
+ |
|
582 |
+ return $class if $query_caches->{$template}; |
|
583 |
+ |
|
584 |
+ $query_caches->{$template} = $query; |
|
585 |
+ push @$query_cache_keys, $template; |
|
586 |
+ |
|
587 |
+ my $overflow = @$query_cache_keys - $class->query_cache_max; |
|
588 |
+ |
|
589 |
+ for (my $i = 0; $i < $overflow; $i++) { |
|
590 |
+ my $template = shift @$query_cache_keys; |
|
591 |
+ delete $query_caches->{$template}; |
|
592 |
+ } |
|
593 |
+ |
|
594 |
+ return $class; |
|
595 |
+} |
|
559 | 596 |
|
560 | 597 |
Object::Simple->build_class; |
561 | 598 |
|
... | ... |
@@ -857,6 +894,17 @@ If tranzation is died, rollback is execute. |
857 | 894 |
|
858 | 895 |
This method is same as DBI last_insert_id; |
859 | 896 |
|
897 |
+=head1 Class Accessors |
|
898 |
+ |
|
899 |
+=head2 query_cache_max |
|
900 |
+ |
|
901 |
+ # Max query cache count |
|
902 |
+ $class = $class->query_cache_max($query_cache_max); |
|
903 |
+ $query_cache_max = $class->query_cache_max; |
|
904 |
+ |
|
905 |
+ # Sample |
|
906 |
+ DBI::Custom->query_cache_max(50); |
|
907 |
+ |
|
860 | 908 |
=head1 CAUTION |
861 | 909 |
|
862 | 910 |
DBI::Custom have DIB object internal. |