Bug 18736: (follow-up) cast as UNSIGNED instead of INTEGER
[koha.git] / C4 / Tags.pm
index d74dbf8..1db7acc 100644 (file)
@@ -5,18 +5,18 @@ package C4::Tags;
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use strict;
 use warnings;
@@ -25,13 +25,14 @@ use Exporter;
 
 use C4::Context;
 use C4::Debug;
+use Module::Load::Conditional qw/check_install/;
 #use Data::Dumper;
+use constant TAG_FIELDS => qw(tag_id borrowernumber biblionumber term language date_created);
+use constant TAG_SELECT => "SELECT " . join(',', TAG_FIELDS) . "\n FROM   tags_all\n";
 
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-use vars qw($ext_dict $select_all @fields);
+use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
 BEGIN {
-    $VERSION = 3.07.00.049;
        @ISA = qw(Exporter);
     @EXPORT_OK = qw(
       &get_tag &get_tags &get_tag_rows
@@ -49,7 +50,11 @@ BEGIN {
       stratify_tags
     );
        # %EXPORT_TAGS = ();
-       $ext_dict = C4::Context->preference('TagsExternalDictionary');
+    my $ext_dict = C4::Context->preference('TagsExternalDictionary');
+    if ( $ext_dict && ! check_install( module => 'Lingua::Ispell' ) ) {
+        warn "Ignoring TagsExternalDictionary, because Lingua::Ispell is not installed.";
+        $ext_dict = q{};
+    }
        if ($debug) {
                require Data::Dumper;
                import Data::Dumper qw(:DEFAULT);
@@ -57,7 +62,9 @@ BEGIN {
        }
        if ($ext_dict) {
                require Lingua::Ispell;
-               import Lingua::Ispell qw(spellcheck add_word_lc save_dictionary);
+        import Lingua::Ispell qw(spellcheck add_word_lc);
+        $Lingua::Ispell::path = $ext_dict;
+        $debug and print STDERR "\$Lingua::Ispell::path = $Lingua::Ispell::path\n";
        }
 }
 
@@ -67,13 +74,6 @@ More verose debugging messages are sent in the presence of non-zero $ENV{"DEBUG"
 
 =cut
 
-INIT {
-    $ext_dict and $Lingua::Ispell::path = $ext_dict;
-    $debug and print STDERR "\$Lingua::Ispell::path = $Lingua::Ispell::path\n";
-       @fields = qw(tag_id borrowernumber biblionumber term language date_created);
-       $select_all = "SELECT " . join(',',@fields) . "\n FROM   tags_all\n";
-}
-
 sub get_filters {
        my $query = "SELECT * FROM tags_filters ";
        my ($sth);
@@ -181,7 +181,7 @@ sub delete_tag_rows_by_ids {
 
 sub get_tag_rows {
        my $hash = shift || {};
-       my @ok_fields = @fields;
+    my @ok_fields = TAG_FIELDS;
        push @ok_fields, 'limit';       # push the limit! :)
        my $wheres;
        my $limit  = "";
@@ -208,7 +208,7 @@ sub get_tag_rows {
                        push @exe_args, $hash->{$key};
                }
        }
-       my $query = $select_all . ($wheres||'') . $limit;
+    my $query = TAG_SELECT . ($wheres||'') . $limit;
        $debug and print STDERR "get_tag_rows query:\n $query\n",
                                                        "get_tag_rows query args: ", join(',', @exe_args), "\n";
        my $sth = C4::Context->dbh->prepare($query);
@@ -368,6 +368,7 @@ sub is_approved {
        my $term = shift or return;
        my $sth = C4::Context->dbh->prepare("SELECT approved FROM tags_approval WHERE term = ?");
        $sth->execute($term);
+    my $ext_dict = C4::Context->preference('TagsExternalDictionary');
        unless ($sth->rows) {
                $ext_dict and return (spellcheck($term) ? 0 : 1);       # spellcheck returns empty on OK word
                return 0;
@@ -391,6 +392,7 @@ sub get_tag_index {
 sub whitelist {
        my $operator = shift;
        defined $operator or return; # have to test defined to allow =0 (kohaadmin)
+    my $ext_dict = C4::Context->preference('TagsExternalDictionary');
        if ($ext_dict) {
                foreach (@_) {
                        spellcheck($_) or next;
@@ -491,7 +493,7 @@ sub add_tag_index {
 
 sub get_tag {          # by tag_id
        (@_) or return;
-       my $sth = C4::Context->dbh->prepare("$select_all WHERE tag_id = ?");
+    my $sth = C4::Context->dbh->prepare(TAG_SELECT . "WHERE tag_id = ?");
        $sth->execute(shift);
        return $sth->fetchrow_hashref;
 }
@@ -581,14 +583,14 @@ sub add_tag {     # biblionumber,term,[borrowernumber,approvernumber]
 #   ($min, $max) = stratify_tags($strata, $tags);
 # $stratum: the number of divisions you want
 # $tags: the tags, as provided by get_approval_rows
-# $min: the minumum stratum value
+# $min: the minimum stratum value
 # $max: the maximum stratum value. This may be the same as $min if there
 # is only one weight. Beware of divide by zeros.
 # This will add a field to the tag called "stratum" containing the calculated
 # value.
 sub stratify_tags {
     my ( $strata, $tags ) = @_;
-
+    return (0,0) if !@$tags;
     my ( $min, $max );
     foreach (@$tags) {
         my $w = $_->{weight_total};
@@ -666,7 +668,7 @@ This could be called an "approved terms" table.  See above regarding the Externa
        approved       - Negative, 0 or positive if tag is rejected, pending or approved.
        date_approved  - date of last action
        approved_by    - staffer performing the last action
-       weight_total   - total occurance of term in any biblio by any users
+    weight_total   - total occurrence of term in any biblio by any users
 
 tags_index - This table is for performance, because by far the most common operation will 
 be fetching tags for a list of search results.  We will have a set of biblios, and we will