#
# 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; FIXME - Bug 2505
-our $VERSION = 3.00;
+use Encode qw( encode is_utf8 );
+our $VERSION = 3.07.00.049;
use C4::Context;
-use C4::Installer::PerlModules 1.000000;
+use C4::Installer::PerlModules;
+use DBI;
+use Koha;
=head1 NAME
my $installer = C4::Installer->new();
my $all_languages = getAllLanguages();
my $error = $installer->load_db_schema();
- my $list = $installer->sql_file_list('en', 'marc21', { optional => 1, mandatory => 1 });
+ my $list;
+ #fill $list with list of sql files
my ($fwk_language, $error_list) = $installer->load_sql_in_order($all_languages, @$list);
$installer->set_version_syspref();
$installer->set_marcflavour_syspref('MARC21');
- $installer->set_indexing_engine(0);
=head1 DESCRIPTION
return $self;
}
-=head2 marcflavour_list
-
- my ($marcflavours) = $installer->marcflavour_list($lang);
-
-Return a arrayref of the MARC flavour sets available for the
-specified language C<$lang>. Returns 'undef' if a directory
-for the language does not exist.
-
-=cut
-
-sub marcflavour_list {
- my $self = shift;
- my $lang = shift;
-
- my $dir = C4::Context->config('intranetdir') . "/installer/data/$self->{dbms}/$lang/marcflavour";
- opendir(MYDIR, $dir) or return;
- my @list = grep { !/^\.|CVS/ && -d "$dir/$_" } readdir(MYDIR);
- closedir MYDIR;
- return \@list;
-}
-
=head2 marc_framework_sql_list
my ($defaulted_to_en, $list) =
my @frameworklist;
map {
my $name = substr( $_, 0, -4 );
- open FILE, "<:utf8","$dir/$requirelevel/$name.txt";
- my $lines = <FILE>;
+ open my $fh, "<:encoding(UTF-8)", "$dir/$requirelevel/$name.txt";
+ my $lines = <$fh>;
$lines =~ s/\n|\r/<br \/>/g;
- use utf8;
- utf8::encode($lines) unless ( utf8::is_utf8($lines) );
+ $lines = Encode::encode('UTF-8', $lines) unless ( Encode::is_utf8($lines) );
my $mandatory = ($requirelevel =~ /(mandatory|requi|oblig|necess)/i);
push @frameworklist,
{
my @frameworklist;
map {
my $name = substr( $_, 0, -4 );
- open FILE, "<:utf8","$dir/$requirelevel/$name.txt";
- my $lines = <FILE>;
+ open my $fh , "<:encoding(UTF-8)", "$dir/$requirelevel/$name.txt";
+ my $lines = <$fh>;
$lines =~ s/\n|\r/<br \/>/g;
- use utf8;
- utf8::encode($lines) unless ( utf8::is_utf8($lines) );
+ $lines = Encode::encode('UTF-8', $lines) unless ( Encode::is_utf8($lines) );
my $mandatory = ($requirelevel =~ /(mandatory|requi|oblig|necess)/i);
push @frameworklist,
{
return ($defaulted_to_en, \@levellist);
}
-=head2 sql_file_list
-
- my $list = $installer->sql_file_list($lang, $marcflavour, $subset_wanted);
-
-Returns an arrayref containing the filepaths of installer SQL scripts
-available for laod. The C<$lang> and C<$marcflavour> arguments
-specify the desired language and MARC flavour. while C<$subset_wanted>
-is a hashref containing possible named parameters 'mandatory' and 'optional'.
-
-=cut
-
-sub sql_file_list {
- my $self = shift;
- my $lang = shift;
- my $marcflavour = shift;
- my $subset_wanted = shift;
-
- my ($marc_defaulted_to_en, $marc_sql) = $self->marc_framework_sql_list($lang, $marcflavour);
- my ($sample_defaulted_to_en, $sample_sql) = $self->sample_data_sql_list($lang);
-
- my @sql_list = ();
- map {
- map {
- if ($subset_wanted->{'mandatory'}) {
- push @sql_list, $_->{'fwkfile'} if $_->{'mandatory'};
- }
- if ($subset_wanted->{'optional'}) {
- push @sql_list, $_->{'fwkfile'} unless $_->{'mandatory'};
- }
- } @{ $_->{'frameworks'} }
- } (@$marc_sql, @$sample_sql);
-
- return \@sql_list
-}
-
=head2 load_db_schema
my $error = $installer->load_db_schema();
$request->execute;
my ($systempreference) = $request->fetchrow;
$systempreference = '' unless defined $systempreference; # avoid warning
+ # Make sure subtag_registry.sql is loaded second
+ my $subtag_registry = C4::Context->config('intranetdir') . "/installer/data/$self->{dbms}/mandatory/subtag_registry.sql";
+ unshift(@fnames, $subtag_registry);
# Make sure the global sysprefs.sql file is loaded first
my $globalsysprefs = C4::Context->config('intranetdir') . "/installer/data/$self->{dbms}/sysprefs.sql";
unshift(@fnames, $globalsysprefs);
+ push @fnames, C4::Context->config('intranetdir') . "/installer/data/mysql/userflags.sql";
+ push @fnames, C4::Context->config('intranetdir') . "/installer/data/mysql/userpermissions.sql";
+ push @fnames, C4::Context->config('intranetdir') . "/installer/data/mysql/audio_alerts.sql";
foreach my $file (@fnames) {
# warn $file;
undef $/;
Set the 'marcflavour' system preference. The incoming
C<$marcflavour> references to a subdirectory of
installer/data/$dbms/$lang/marcflavour, and is
-normalized to MARC21 or UNIMARC.
+normalized to MARC21, UNIMARC or NORMARC.
FIXME: this method assumes that the MARC flavour will be either
-MARC21 or UNIMARC.
+MARC21, UNIMARC or NORMARC.
=cut
# marc_cleaned finds the marcflavour, without the variant.
my $marc_cleaned = 'MARC21';
$marc_cleaned = 'UNIMARC' if $marcflavour =~ /unimarc/i;
+ $marc_cleaned = 'NORMARC' if $marcflavour =~ /normarc/i;
my $request =
$self->{'dbh'}->prepare(
- "INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('marcflavour','$marc_cleaned','Define global MARC flavor (MARC21 or UNIMARC) used for character encoding','MARC21|UNIMARC','Choice');"
+ "INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('marcflavour','$marc_cleaned','Define global MARC flavor (MARC21, UNIMARC or NORMARC) used for character encoding','MARC21|UNIMARC|NORMARC','Choice');"
);
$request->execute;
}
-=head2 set_indexing_engine
-
- $installer->set_indexing_engine($nozebra);
-
-Sets system preferences related to the indexing
-engine. The C<$nozebra> argument is a boolean;
-if true, turn on NoZebra mode and turn off QueryFuzzy,
-QueryWeightFields, and QueryStemming. If false, turn
-off NoZebra mode (i.e., use the Zebra search engine).
-
-=cut
-
-sub set_indexing_engine {
- my $self = shift;
- my $nozebra = shift;
-
- if ($nozebra) {
- $self->{'dbh'}->do("UPDATE systempreferences SET value=1 WHERE variable='NoZebra'");
- $self->{'dbh'}->do("UPDATE systempreferences SET value=0 WHERE variable in ('QueryFuzzy','QueryWeightFields','QueryStemming')");
- } else {
- $self->{'dbh'}->do("UPDATE systempreferences SET value=0 WHERE variable='NoZebra'");
- }
-
-}
-
=head2 set_version_syspref
$installer->set_version_syspref();
sub set_version_syspref {
my $self = shift;
- my $kohaversion=C4::Context::KOHAVERSION;
+ my $kohaversion = Koha::version();
# remove the 3 last . to have a Perl number
$kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/;
if (C4::Context->preference('Version')) {
my $datadir = C4::Context->config('intranetdir') . "/installer/data/$self->{dbms}";
my $error;
my $strcmd;
+ my $cmd;
if ( $self->{dbms} eq 'mysql' ) {
- $strcmd = "mysql "
+ $cmd = qx(which mysql 2>/dev/null || whereis mysql 2>/dev/null);
+ chomp $cmd;
+ $cmd = $1 if ($cmd && $cmd =~ /^(.+?)[\r\n]+$/);
+ $cmd = 'mysql' if (!$cmd || !-x $cmd);
+ $strcmd = "$cmd "
. ( $self->{hostname} ? " -h $self->{hostname} " : "" )
. ( $self->{port} ? " -P $self->{port} " : "" )
. ( $self->{user} ? " -u $self->{user} " : "" )
. " $self->{dbname} ";
$error = qx($strcmd --default-character-set=utf8 <$filename 2>&1 1>/dev/null);
} elsif ( $self->{dbms} eq 'Pg' ) {
- $strcmd = "psql "
+ $cmd = qx(which psql 2>/dev/null || whereis psql 2>/dev/null);
+ chomp $cmd;
+ $cmd = $1 if ($cmd && $cmd =~ /^(.+?)[\r\n]+$/);
+ $cmd = 'psql' if (!$cmd || !-x $cmd);
+ $strcmd = "$cmd "
. ( $self->{hostname} ? " -h $self->{hostname} " : "" )
. ( $self->{port} ? " -p $self->{port} " : "" )
. ( $self->{user} ? " -U $self->{user} " : "" )
$error = qx($strcmd -f $filename 2>&1 1>/dev/null);
# Be sure to set 'client_min_messages = error' in postgresql.conf
# so that only true errors are returned to stderr or else the installer will
- # report the import a failure although it really succeded -fbcit
+ # report the import as a failure although it really succeeded -fbcit
}
# errors thrown while loading installer data should be logged
- warn "C4::Installer::load_sql returned the following errors while attempting to load $filename:\n";
- warn $error;
+ if($error) {
+ warn "C4::Installer::load_sql returned the following errors while attempting to load $filename:\n";
+ warn "$error";
+ }
return $error;
}