Bug 6831 follow-up: add support for UNIMARC and NORMARC
[koha_gimpoz] / C4 / Installer.pm
old mode 100644 (file)
new mode 100755 (executable)
index b3d798e..43fd724
@@ -22,6 +22,7 @@ use strict;
 
 our $VERSION = 3.00;
 use C4::Context;
 
 our $VERSION = 3.00;
 use C4::Context;
+use C4::Installer::PerlModules 1.000000;
 
 =head1 NAME
 
 
 =head1 NAME
 
@@ -29,35 +30,25 @@ C4::Installer
 
 =head1 SYNOPSIS
 
 
 =head1 SYNOPSIS
 
-use C4::Installer;
-
-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 ($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);
+ use C4::Installer;
+ 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 ($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
 
 
 =head1 DESCRIPTION
 
+=cut
+
 =head1 METHODS
 
 =head2 new
 
 =head1 METHODS
 
 =head2 new
 
-=over 4
-
-my $installer = C4::Installer->new();
-
-=back
+  my $installer = C4::Installer->new();
 
 Creates a new installer.
 
 
 Creates a new installer.
 
@@ -89,11 +80,7 @@ sub new {
 
 =head2 marcflavour_list
 
 
 =head2 marcflavour_list
 
-=over 4
-
-my ($marcflavours) = $installer->marcflavour_list($lang);
-
-=back
+  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
 
 Return a arrayref of the MARC flavour sets available for the
 specified language C<$lang>.  Returns 'undef' if a directory
@@ -114,11 +101,8 @@ sub marcflavour_list {
 
 =head2 marc_framework_sql_list
 
 
 =head2 marc_framework_sql_list
 
-=over 4
-
-my ($defaulted_to_en, $list) = $installer->marc_framework_sql_list($lang, $marcflavour);
-
-=back
+  my ($defaulted_to_en, $list) = 
+     $installer->marc_framework_sql_list($lang, $marcflavour);
 
 Returns in C<$list> a structure listing the filename, description, section,
 and mandatory/optional status of MARC framework scripts available for C<$lang>
 
 Returns in C<$list> a structure listing the filename, description, section,
 and mandatory/optional status of MARC framework scripts available for C<$lang>
@@ -199,11 +183,7 @@ sub marc_framework_sql_list {
 
 =head2 sample_data_sql_list
 
 
 =head2 sample_data_sql_list
 
-=over 4
-
-my ($defaulted_to_en, $list) = $installer->sample_data_sql_list($lang);
-
-=back
+  my ($defaulted_to_en, $list) = $installer->sample_data_sql_list($lang);
 
 Returns in C<$list> a structure listing the filename, description, section,
 and mandatory/optional status of sample data scripts available for C<$lang>.
 
 Returns in C<$list> a structure listing the filename, description, section,
 and mandatory/optional status of sample data scripts available for C<$lang>.
@@ -280,11 +260,7 @@ sub sample_data_sql_list {
 
 =head2 sql_file_list
 
 
 =head2 sql_file_list
 
-=over 4
-
-my $list = $installer->sql_file_list($lang, $marcflavour, $subset_wanted);
-
-=back
+  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
 
 Returns an arrayref containing the filepaths of installer SQL scripts
 available for laod.  The C<$lang> and C<$marcflavour> arguments
@@ -319,11 +295,7 @@ sub sql_file_list {
 
 =head2 load_db_schema
 
 
 =head2 load_db_schema
 
-=over 4
-
-my $error = $installer->load_db_schema();
-
-=back
+  my $error = $installer->load_db_schema();
 
 Loads the SQL script that creates Koha's tables and indexes.  The
 return value is a string containing error messages reported by the
 
 Loads the SQL script that creates Koha's tables and indexes.  The
 return value is a string containing error messages reported by the
@@ -342,11 +314,7 @@ sub load_db_schema {
 
 =head2 load_sql_in_order
 
 
 =head2 load_sql_in_order
 
-=over 4
-
-my ($fwk_language, $list) = $installer->load_sql_in_order($all_languages, @sql_list);
-
-=back
+  my ($fwk_language, $list) = $installer->load_sql_in_order($all_languages, @sql_list);
 
 Given a list of SQL scripts supplied in C<@sql_list>, loads each of them
 into the database and sets the FrameworksLoaded system preference to names
 
 Given a list of SQL scripts supplied in C<@sql_list>, loads each of them
 into the database and sets the FrameworksLoaded system preference to names
@@ -357,15 +325,15 @@ directory path).  This means that dependencies among the scripts are to
 be resolved by carefully naming them, keeping in mind that the directory name
 does *not* currently count.
 
 be resolved by carefully naming them, keeping in mind that the directory name
 does *not* currently count.
 
-FIXME: this is a rather delicate way of dealing with dependencies between
-       the install scripts.
+B<FIXME:> this is a rather delicate way of dealing with dependencies between
+the install scripts.
 
 The return value C<$list> is an arrayref containing a hashref for each
 "level" or directory containing SQL scripts; the hashref in turns contains
 a list of hashrefs containing a list of each script load and any error
 messages associated with the loading of each script.
 
 
 The return value C<$list> is an arrayref containing a hashref for each
 "level" or directory containing SQL scripts; the hashref in turns contains
 a list of hashrefs containing a list of each script load and any error
 messages associated with the loading of each script.
 
-FIXME: The C<$fwk_language> code probably doesn't belong and needs to be
+B<FIXME:> The C<$fwk_language> code probably doesn't belong and needs to be
 moved to a different method.
 
 =cut
 moved to a different method.
 
 =cut
@@ -386,6 +354,9 @@ sub load_sql_in_order {
     $request->execute;
     my ($systempreference) = $request->fetchrow;
     $systempreference = '' unless defined $systempreference; # avoid warning
     $request->execute;
     my ($systempreference) = $request->fetchrow;
     $systempreference = '' unless defined $systempreference; # avoid warning
+    # 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);
     foreach my $file (@fnames) {
         #      warn $file;
         undef $/;
     foreach my $file (@fnames) {
         #      warn $file;
         undef $/;
@@ -432,11 +403,7 @@ sub load_sql_in_order {
 
 =head2 set_marcflavour_syspref
 
 
 =head2 set_marcflavour_syspref
 
-=over 4
-
-$installer->set_marcflavour_syspref($marcflavour);
-
-=back
+  $installer->set_marcflavour_syspref($marcflavour);
 
 Set the 'marcflavour' system preference.  The incoming
 C<$marcflavour> references to a subdirectory of
 
 Set the 'marcflavour' system preference.  The incoming
 C<$marcflavour> references to a subdirectory of
@@ -465,11 +432,7 @@ sub set_marcflavour_syspref {
 
 =head2 set_indexing_engine
 
 
 =head2 set_indexing_engine
 
-=over 4
-
-$installer->set_indexing_engine($nozebra);
-
-=back
+  $installer->set_indexing_engine($nozebra);
 
 Sets system preferences related to the indexing
 engine.  The C<$nozebra> argument is a boolean;
 
 Sets system preferences related to the indexing
 engine.  The C<$nozebra> argument is a boolean;
@@ -494,11 +457,7 @@ sub set_indexing_engine {
 
 =head2 set_version_syspref
 
 
 =head2 set_version_syspref
 
-=over 4
-
-$installer->set_version_syspref();
-
-=back
+  $installer->set_version_syspref();
 
 Set or update the 'Version' system preference to the current
 Koha software version.
 
 Set or update the 'Version' system preference to the current
 Koha software version.
@@ -525,24 +484,20 @@ sub set_version_syspref {
 
 =head2 load_sql
 
 
 =head2 load_sql
 
-=over 4
-
-my $error = $installer->load_sql($filename);
-
-=back
+  my $error = $installer->load_sql($filename);
 
 Runs a the specified SQL using the DB's command-line
 SQL tool, and returns any strings sent to STDERR
 by the command-line tool.
 
 
 Runs a the specified SQL using the DB's command-line
 SQL tool, and returns any strings sent to STDERR
 by the command-line tool.
 
-FIXME: there has been a long-standing desire to
-       replace this with an SQL loader that goes
-       through DBI; partly for portability issues
-       and partly to improve error handling.
+B<FIXME:> there has been a long-standing desire to
+replace this with an SQL loader that goes
+through DBI; partly for portability issues
+and partly to improve error handling.
 
 
-FIXME: even using the command-line loader, some more
-       basic error handling should be added - deal
-       with missing files, e.g.
+B<FIXME:> even using the command-line loader, some more
+basic error handling should be added - deal
+with missing files, e.g.
 
 =cut
 
 
 =cut
 
@@ -553,8 +508,13 @@ sub load_sql {
     my $datadir = C4::Context->config('intranetdir') . "/installer/data/$self->{dbms}";
     my $error;
     my $strcmd;
     my $datadir = C4::Context->config('intranetdir') . "/installer/data/$self->{dbms}";
     my $error;
     my $strcmd;
+    my $cmd;
     if ( $self->{dbms} eq 'mysql' ) {
     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->{hostname} ? " -h $self->{hostname} " : "" )
             . ( $self->{port}     ? " -P $self->{port} "     : "" )
             . ( $self->{user}     ? " -u $self->{user} "     : "" )
@@ -562,7 +522,11 @@ sub load_sql {
             . " $self->{dbname} ";
         $error = qx($strcmd --default-character-set=utf8 <$filename 2>&1 1>/dev/null);
     } elsif ( $self->{dbms} eq 'Pg' ) {
             . " $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} "     : "" )
             . ( $self->{hostname} ? " -h $self->{hostname} " : "" )
             . ( $self->{port}     ? " -p $self->{port} "     : "" )
             . ( $self->{user}     ? " -U $self->{user} "     : "" )
@@ -574,18 +538,16 @@ sub load_sql {
         # report the import a failure although it really succeded -fbcit
     }
 #   errors thrown while loading installer data should be logged
         # report the import a failure although it really succeded -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;
 }
 
 =head2 get_file_path_from_name
 
     return $error;
 }
 
 =head2 get_file_path_from_name
 
-=over 4
-
-my $filename = $installer->get_file_path_from_name('script_name');
-
-=back
+  my $filename = $installer->get_file_path_from_name('script_name');
 
 searches through the set of known SQL scripts and finds the fully
 qualified path name for the script that mathches the input.
 
 searches through the set of known SQL scripts and finds the fully
 qualified path name for the script that mathches the input.
@@ -627,7 +589,7 @@ sub get_file_path_from_name {
 C4::Installer is a refactoring of logic originally from installer/installer.pl, which was
 originally written by Henri-Damien Laurant.
 
 C4::Installer is a refactoring of logic originally from installer/installer.pl, which was
 originally written by Henri-Damien Laurant.
 
-Koha Developement team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
 
 Galen Charlton <galen.charlton@liblime.com>
 
 
 Galen Charlton <galen.charlton@liblime.com>