[Koha-patches] [PATCH] Performance enhancing

Henri-Damien LAURENT henridamien.laurent at biblibre.com
Wed Apr 7 15:01:25 CEST 2010


C4::Context.pm
Loads all systempreferences at once
And uses Memcached to cache them

C4::Languages
Using List::MoreUtils
Memcaching get_langage_description

Signed-off-by: Henri-Damien LAURENT <henridamien.laurent at biblibre.com>
---
 C4/Context.pm   |   27 ++++++++++++++++++++++-----
 C4/Languages.pm |   39 ++++++++++++++++++++-------------------
 2 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/C4/Context.pm b/C4/Context.pm
index 926c1a5..5bd16d5 100644
--- a/C4/Context.pm
+++ b/C4/Context.pm
@@ -20,6 +20,21 @@ use strict;
 use warnings;
 use vars qw($VERSION $AUTOLOAD $context @context_stack);
 
+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',
+        };
+
+        memoize_memcached('preference', memcached => $memcached, expire_time => 600000); #cache for 10 minutes
+    }
+};
+
 BEGIN {
 	if ($ENV{'HTTP_USER_AGENT'})	{
 		require CGI::Carp;
@@ -79,7 +94,8 @@ BEGIN {
 		}
     }  	# else there is no browser to send fatals to!
 	$VERSION = '3.00.00.036';
-}
+};
+
 
 use DBI;
 use ZOOM;
@@ -88,6 +104,7 @@ use C4::Boolean;
 use C4::Debug;
 use POSIX ();
 
+
 =head1 NAME
 
 C4::Context - Maintain and manipulate the context of a Koha script
@@ -477,12 +494,12 @@ sub preference {
 
     # Look up systempreferences.variable==$var
     my $sql = <<'END_SQL';
-        SELECT    value
+        SELECT    variable, value
         FROM    systempreferences
-        WHERE    variable=?
-        LIMIT    1
 END_SQL
-    $sysprefs{$var} = $dbh->selectrow_array( $sql, {}, $var );
+    my $sysprefs_arrayref;
+    $sysprefs_arrayref = $dbh->selectcol_arrayref( $sql, { Columns=>[1,2] });
+    %sysprefs= @$sysprefs_arrayref;
     return $sysprefs{$var};
 }
 
diff --git a/C4/Languages.pm b/C4/Languages.pm
index 21dd6e8..c09f37b 100644
--- a/C4/Languages.pm
+++ b/C4/Languages.pm
@@ -20,9 +20,10 @@ package C4::Languages;
 
 
 use strict; 
-#use warnings;   #FIXME: turn off warnings before release
+#use warnings;   #FIXME: turn on warnings before release
 use Carp;
 use C4::Context;
+use List::MoreUtils qw/any/;
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
 
 eval {
@@ -36,9 +37,10 @@ eval {
             key_prefix => C4::Context->config('memcached_namespace') || 'koha',
         };
 
-        memoize_memcached('getTranslatedLanguages', memcached => $memcached, expire_time => 600); #cache for 10 minutes
-        memoize_memcached('getFrameworkLanguages' , memcached => $memcached, expire_time => 600);
-        memoize_memcached('getAllLanguages',        memcached => $memcached, expire_time => 600);
+        memoize_memcached('getTranslatedLanguages', memcached => $memcached, expire_time => 600000); #cache for 10 minutes
+        memoize_memcached('getFrameworkLanguages' , memcached => $memcached, expire_time => 600000);
+        memoize_memcached('getAllLanguages',        memcached => $memcached, expire_time => 600000);
+        memoize_memcached('language_get_description',        memcached => $memcached, expire_time => 600000);
     }
 };
 
@@ -92,17 +94,11 @@ sub getFrameworkLanguages {
     closedir MYDIR;
 
     # pull out all data for the dir names that exist
-    for my $dirname (@listdir) {
-        for my $language_set (@$all_languages) {
-
-            if ($dirname eq $language_set->{language_code}) {
-                push @languages, {
-                    'language_code'=>$dirname, 
-                    'language_description'=>$language_set->{language_description}, 
-                    'native_descrition'=>$language_set->{language_native_description} }
-            }
-        }
-    }
+    my @languages=grep {
+                    my $language=$_; 
+                    any {$language->{languagecode} eq $_
+                        } @listdir
+                  } @$all_languages;
     return \@languages;
 }
 
@@ -128,7 +124,8 @@ sub getTranslatedLanguages {
     my @enabled_languages;
  
     if ($interface && $interface eq 'opac' ) {
-        @enabled_languages = split ",", C4::Context->preference('opaclanguages');
+        my $languages= C4::Context->preference('opaclanguage') ||'en';
+        @enabled_languages = split ",", $languages;
         $htdocs = C4::Context->config('opachtdocs');
         if ( $theme and -d "$htdocs/$theme" ) {
             (@languages) = _get_language_dirs($htdocs,$theme);
@@ -140,7 +137,8 @@ sub getTranslatedLanguages {
         }
     }
     elsif ($interface && $interface eq 'intranet' ) {
-        @enabled_languages = split ",", C4::Context->preference('language');
+        my $languages= C4::Context->preference('language') ||'en';
+        @enabled_languages = split ",", $languages;
         $htdocs = C4::Context->config('intrahtdocs');
         if ( $theme and -d "$htdocs/$theme" ) {
             @languages = _get_language_dirs($htdocs,$theme);
@@ -152,7 +150,8 @@ sub getTranslatedLanguages {
         }
     }
     else {
-        @enabled_languages = split ",", C4::Context->preference('opaclanguages');
+        my $languages= C4::Context->preference('opaclanguage') ||'en';
+        @enabled_languages = split ",", $languages;
         my $htdocs = C4::Context->config('intrahtdocs');
         foreach my $theme ( _get_themes('intranet') ) {
             push @languages, _get_language_dirs($htdocs,$theme);
@@ -182,8 +181,10 @@ Returns a reference to an array of hashes:
 
 =cut
 
+my @languages_loop;
+
 sub getAllLanguages {
-    my @languages_loop;
+    return   \@languages_loop if scalar(@languages_loop);
     my $dbh=C4::Context->dbh;
     my $current_language = shift || 'en';
     my $sth = $dbh->prepare('SELECT * FROM language_subtag_registry WHERE type=\'language\'');
-- 
1.6.3.3




More information about the Koha-patches mailing list