require Exporter;
use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS);
+eval {
+ my $servers = C4::Context->config('memcached_servers');
+ if ($servers) {
+ require Memoize::Memcached;
+ import Memoize::Memcached qw(memoize_memcached);
+
+ my $memcached = {
+ servers => [$servers],
+ key_prefix => C4::Context->config('memcached_namespace') || 'koha',
+ expire_time => 600
+ }; # cache for 10 mins
+
+ memoize_memcached( '_get_columns', memcached => $memcached );
+ memoize_memcached( 'GetPrimaryKeys', memcached => $memcached );
+ }
+};
+
BEGIN {
# set the version for version checking
- $VERSION = 0.5;
+ $VERSION = 3.07.00.049;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK=qw(
SearchInTable
UpdateInTable
GetPrimaryKeys
+ clear_columns_cache
);
%EXPORT_TAGS = ( all =>[qw( InsertInTable DeleteInTable SearchInTable UpdateInTable GetPrimaryKeys)]
);
}
my $tablename;
-my $hash;
+my $hashref;
=head1 NAME
=cut
-sub GetPrimaryKeys($) {
+sub GetPrimaryKeys {
my $tablename=shift;
my $hash_columns=_get_columns($tablename);
return grep { $hash_columns->{$_}->{'Key'} =~/PRI/i} keys %$hash_columns;
}
+
+=head2 clear_columns_cache
+
+ C4::SQLHelper->clear_columns_cache();
+
+cleans the internal cache of sysprefs. Please call this method if
+you update a tables structure. Otherwise, your new changes
+will not be seen by this process.
+
+=cut
+
+sub clear_columns_cache {
+ %$hashref = ();
+}
+
+
+
=head2 _get_columns
_get_columns($tablename)
=cut
-sub _get_columns($) {
- my ($tablename)=@_;
- my $dbh=C4::Context->dbh;
- my $sth=$dbh->prepare_cached(qq{SHOW COLUMNS FROM $tablename });
- $sth->execute;
- my $columns= $sth->fetchall_hashref(qw(Field));
+sub _get_columns {
+ my ($tablename) = @_;
+ unless ( exists( $hashref->{$tablename} ) ) {
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare_cached(qq{SHOW COLUMNS FROM $tablename });
+ $sth->execute;
+ my $columns = $sth->fetchall_hashref(qw(Field));
+ $hashref->{$tablename} = $columns;
+ }
+ return $hashref->{$tablename};
}
=head2 _filter_columns
- _filter_columns($tablename,$research, $filtercolumns)
+=over 4
+
+_filter_columns($tablename,$research, $filtercolumns)
+
+=back
Given
- a tablename
=cut
-sub _filter_columns ($$;$) {
+sub _filter_columns {
my ($tablename,$research, $filtercolumns)=@_;
if ($filtercolumns){
return (@$filtercolumns);
my $elements=join "|",@columns_filtered;
foreach my $field (grep {/\b($elements)\b/} keys %$filter_input){
## supposed to be a hash of simple values, hashes of arrays could be implemented
- $filter_input->{$field}=format_date_in_iso($filter_input->{$field})
- if $columns->{$field}{Type}=~/date/ &&
- $filter_input->{$field} && $filter_input->{$field} !~C4::Dates->regexp("iso");
+ if ( $columns->{$field}{Type}=~/date/ ) {
+ if ( defined $filter_input->{$field} ) {
+ if ( $filter_input->{$field} eq q{} ) {
+ $filter_input->{$field} = undef;
+ } elsif ( $filter_input->{$field} !~ C4::Dates->regexp("iso") ) {
+ $filter_input->{$field} = format_date_in_iso($filter_input->{$field});
+ }
+ }
+ }
my ($tmpkeys, $localvalues)=_Process_Operands($filter_input->{$field},"$tablename.$field",$searchtype,$columns);
if (@$tmpkeys){
push @values, @$localvalues;