adding XML::RSS as mandatory package (to have RSS working)
[koha-ffzg.git] / installer / install.pl
index 2954ea3..e28ec61 100755 (executable)
@@ -5,7 +5,7 @@
 # use Install;
 use InstallAuth;
 use C4::Context;
-use C4::Interface::CGI::Output;
+use C4::Output;
 use C4::Languages;
 
 use strict; # please develop with the strict pragma
@@ -118,6 +118,8 @@ if ($step && $step==1){
   unless (eval {require Digest::MD5})      { push @missing,{name=>"Digest::MD5"} };
   unless (eval {require MARC::Record})     { push @missing,{name=>"MARC::Record"} };
   unless (eval {require Mail::Sendmail})   { push @missing,{name=>"Mail::Sendmail",usagemail=>1} };
+  unless (eval {require List::MoreUtils})  { push @missing,{name=>"List::MoreUtils"} };
+  unless (eval {require XML::RSS})         { push @missing,{name=>"XML::RSS"} };
 # The following modules are not mandatory, depends on how the library want to use Koha
   unless (eval {require PDF::API2})   { 
           if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
@@ -202,6 +204,15 @@ if ($step && $step==1){
 } elsif ($step && $step==3){
   my $op=$query->param('op');
   if ($op && $op eq 'finish'){
+    if (C4::Context->preference('Version')) {
+        warn "UPDATE Version";
+      my $finish=$dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='Version'");
+      $finish->execute(C4::Context->config("kohaversion"));
+    } else {
+        warn "INSERT Version";
+      my $finish=$dbh->prepare("INSERT into systempreferences (variable,value,explanation) values ('Version',?,'The Koha database version. Don t change this value manually, it s holded by the webinstaller')");
+      $finish->execute(C4::Context->config("kohaversion"));
+    }
     # Installation is finished.
     # We just deny anybody acess to install
     # And we redirect people to mainpage.
@@ -215,19 +226,27 @@ if ($step && $step==1){
     my $lang;
     my %hashlevel;
    # sort by filename -> prepend with numbers to specify order of insertion. 
-    
-    my @fnames = sort { my @aa = split /\/|\\/, ($a); my @bb = split /\/|\\/, ($b); $aa[-1] <=> $bb[-1] } $query->param('framework')  ;
+    my @fnames = sort { my @aa = split /\/|\\/, ($a); my @bb = split /\/|\\/, ($b); $aa[-1] lt $bb[-1] } $query->param('framework')  ;
+       $dbh->do('SET FOREIGN_KEY_CHECKS=0');
+    my $request=$dbh->prepare("SELECT value FROM systempreferences WHERE variable='FrameworksLoaded'");
+    $request->execute;
+    my ($systempreference)=$request->fetchrow;
     foreach my $file (@fnames){
 #      warn $file;
       undef $/;
-      my $strcmd="mysql ".($info{hostname}?"-h $info{hostname} ":"").($info{port}?"-P $info{port} ":"").($info{user}?"-u $info{user} ":"").($info{password}?"-p$info{password}":"")." $info{dbname} ";
-      my $str = qx($strcmd < $file 2>&1);
+      my $strcmd="mysql ".($info{hostname}?" -h $info{hostname} ":"").($info{port}?" -P $info{port} ":"").($info{user}?" -u $info{user} ":"").($info{password}?" -p$info{password}":"")." $info{dbname} ";
+      my $error = qx($strcmd < $file 2>&1);
       my @file = split qr(\/|\\),$file;
       $lang=$file[scalar(@file)-3] unless ($lang);
       my $level=$file[scalar(@file)-2];
+      unless ($error){
+        $systempreference.="$file[scalar(@file)-1]|" unless(index($systempreference,$file[scalar(@file)-1])>=0);
+      }
       #Bulding here a hierarchy to display files by level.
-      push @{$hashlevel{$level}},{"fwkname"=>$file[scalar(@file)-1],"error"=>$str};
+      push @{$hashlevel{$level}},{"fwkname"=>$file[scalar(@file)-1],"error"=>$error};
     }
+    #systempreference contains an ending |
+    chop $systempreference;
     my @list;
     map {push @list,{"level"=>$_,"fwklist"=>$hashlevel{$_}}} keys %hashlevel;
     my $fwk_language;
@@ -238,9 +257,16 @@ if ($step && $step==1){
               $fwk_language = $each_language->{language_locale_name};
       }
     }
+    my $updateflag=$dbh->do("UPDATE systempreferences set value=\"$systempreference\" where variable='FrameworksLoaded'");
+    unless ($updateflag==1){
+      my $string="INSERT INTO systempreferences (value, variable, explanation, type) VALUES (\"$systempreference\",'FrameworksLoaded','Frameworks loaded through webinstaller','choice')";
+      my $rq=$dbh->prepare($string);
+      $rq->execute;
+    }
     $template->param("fwklanguage"=>$fwk_language,
                      "list"=>\@list);
     $template->param("$op"=>1);
+       $dbh->do('SET FOREIGN_KEY_CHECKS=1');
   } elsif ( $op && $op eq 'selectframeworks'){
     #Framework Selection
     #sql data for import are supposed to be located in misc/sql-datas/<language>/<level>
@@ -270,7 +296,14 @@ if ($step && $step==1){
     @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
     closedir MYDIR;
     my @levellist;
-       foreach my $requirelevel (@listdir){
+    my $request=$dbh->prepare("SELECT value FROM systempreferences WHERE variable='FrameworksLoaded'");
+    $request->execute;
+    my ($frameworksloaded)=$request->fetchrow;
+    my %frameworksloaded;
+    foreach (split(/\|/,$frameworksloaded)){
+      $frameworksloaded{$_}=1;
+    }
+    foreach my $requirelevel (@listdir){
       $dir =C4::Context->config('intranetdir')."/misc/sql-datas/$langchoice/$requirelevel";
       opendir (MYDIR,$dir);
       my @listname = grep { !/^\.|CVS/ && -f "$dir/$_" && $_=~m/\.sql$/} readdir(MYDIR);
@@ -284,10 +317,15 @@ if ($step && $step==1){
         $lines=~s/\n|\r/<br \/>/g;
         use utf8;
         utf8::encode($lines) unless (utf8::is_utf8($lines));
-        push @frameworklist,{'fwkname'=>$name, 'fwkfile'=>"$dir/$_",'fwkdescription'=>$lines};
+        push @frameworklist,
+          {'fwkname'=>$name, 
+           'fwkfile'=>"$dir/$_",
+           'fwkdescription'=>$lines,
+           'checked'=>(($frameworksloaded{$_}||($requirelevel=~/(mandatory|requi|oblig|necess)/i))?1:0)
+          };
       } @listname;
-         my @fwks = sort { $a->{'fwkname'} <=> $b->{'fwkname'} } @frameworklist;
-      $cell{"mandatory"}=($requirelevel=~/(mandatory|requi|oblig|necess)/i);
+      my @fwks = sort { $a->{'fwkname'} lt $b->{'fwkname'} } @frameworklist;
+      $cell{"mandatory"}=($requirelevel=~/(mandatory|requi|oblig|necess)/i);
       $cell{"frameworks"}=\@fwks;
       $cell{"label"}=ucfirst($requirelevel);
       $cell{"code"}=lc($requirelevel);
@@ -308,12 +346,17 @@ if ($step && $step==1){
     $template->param($op=>1)
   }elsif ($op && $op eq 'importdatastructure'){
     #Import data structure and show errors if any
-    my $filename="kohastructure.sql";
-    undef $/;
-       my $str = qx(mysql -h $info{hostname} -P $info{port} -u $info{user} -p$info{password} $info{dbname} <$filename 2>&1);
-       $str=~s/\n|\r/<br \/>/g;
-       $template->param("error"=>$str ,
+       #Uses DBI to read the file [MJR 2007-07-01]
+    my $dbh= DBI->connect("DBI:$info{dbms}:$info{dbname}:$info{hostname}".($info{port}?":$info{port}":""),$info{'user'}, $info{'password'});
+      open(INPUT,"<kohastructure.sql");
+      my $file=do{ local $/=undef; <INPUT>};
+      my @commands=split(/;/,$file);
+      pop @commands;   
+      map { $dbh->do($_)} @commands;
+      close(INPUT);
+       $template->param("error"=>$dbh->errstr ,
                         "$op"=> 1, );
+    $dbh->disconnect;
   } else {
     #Check if there are enough tables.
     # Version 2_2 was 74 tables, so we check if there is more than 75
@@ -343,11 +386,12 @@ if ($step && $step==1){
   $template->param(languages=>\@languages);
   if ($dbh){
     my $rq=$dbh->prepare("SELECT * from systempreferences WHERE variable='Version'");
-    $rq->execute;
-    my ($version)=$rq->fetchrow;
-    if ($version){
-      $query->redirect("install.pl?step=3");
-    }
+    if ($rq->execute){
+      my ($version)=$rq->fetchrow;
+      if ($version){
+        $query->redirect("install.pl?step=3");
+      }
+    }  
   }
 }
 output_html_with_http_headers $query, $cookie, $template->output;