[Koha-cvs] koha installer/externalmodules.pl installer/Ins... [rel_2_2]

Henri-Damien LAURENT laurenthdl at alinto.com
Fri Feb 16 13:53:31 CET 2007


CVSROOT:	/sources/koha
Module name:	koha
Branch:		rel_2_2
Changes by:	Henri-Damien LAURENT <hdl>	07/02/16 12:53:31

Added files:
	installer      : externalmodules.pl InstallAuth.pm install.pl 
	                 koha.mysql 
	koha-tmpl/intranet-tmpl/default/en/installer: step1.tmpl 
	                                              step2.tmpl 
	                                              step3.tmpl 

Log message:
	Backporting installer.
	InstallAuth.pm had to be changed.
	install default template directory is set to default and not prog.
	sql file for structure. was copied into installer.
	check of table counts was changed according to rel2_2
	
	TODO :
	Need to change sql-datas structure.
	to provide multiple language && multiple levels.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/installer/externalmodules.pl?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.4.1
http://cvs.savannah.gnu.org/viewcvs/koha/installer/InstallAuth.pm?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.4.1
http://cvs.savannah.gnu.org/viewcvs/koha/installer/install.pl?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.4.1
http://cvs.savannah.gnu.org/viewcvs/koha/installer/koha.mysql?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/default/en/installer/step1.tmpl?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/default/en/installer/step2.tmpl?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/koha/koha-tmpl/intranet-tmpl/default/en/installer/step3.tmpl?cvsroot=koha&only_with_tag=rel_2_2&rev=1.1.2.1

Patches:
Index: installer/externalmodules.pl
===================================================================
RCS file: installer/externalmodules.pl
diff -N installer/externalmodules.pl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ installer/externalmodules.pl	16 Feb 2007 12:53:31 -0000	1.1.4.1
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -w
+
+# This Script can be used to provide a list of ALL external modules ***used*** (uncommented) in Koha.
+# It provides you not only the list of modules BUT ALSO the files that uses those modules.
+# utf8 or warnings or other lib use are not taken into account at the moment.
+
+
+use strict;
+use C4::Context;
+my $dir=C4::Context->config('intranetdir');
+qx(grep -r "^ *use" $dir | grep -v "C4\|strict\|vars" >/tmp/modulesKoha.log);
+$dir=C4::Context->config('opacdir');
+qx(grep -r "^ *use" $dir | grep -v "C4\|strict\|vars" >>/tmp/modulesKoha.log);
+
+open FILE, "< /tmp/modulesKoha.log" ||die "unable to open file /tmp/modulesKoha.log";
+my %modulehash;
+while (my $line=<FILE>){
+  if ( $line=~m#(.*)\:\s*use\s+([A-Z][^\s;]+)# ){
+    my ($file,$module)=($1,$2);
+    my @filename = split /\//, $file;
+    push @{$modulehash{$module}},$filename[scalar(@filename) - 1];
+  }
+}
+print "external modules used in Koha ARE :\n";
+map {print "* $_ \t in files ",join (",",@{$modulehash{$_}}),"\n" } sort keys %modulehash;
+close FILE;
+unlink "/tmp/modulesKoha.log";

Index: installer/InstallAuth.pm
===================================================================
RCS file: installer/InstallAuth.pm
diff -N installer/InstallAuth.pm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ installer/InstallAuth.pm	16 Feb 2007 12:53:31 -0000	1.1.4.1
@@ -0,0 +1,423 @@
+# -*- tab-width: 8 -*-
+# NOTE: This file uses 8-character tabs; do not change the tab size!
+
+package InstallAuth;
+
+# Copyright 2000-2002 Katipo Communications
+#
+# 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 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., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use strict;
+use Digest::MD5 qw(md5_base64);
+
+require Exporter;
+use HTML::Template::Pro;
+use C4::Context;
+use C4::Output;    # to get the template
+use C4::Interface::CGI::Output;
+use C4::Koha;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+# set the version for version checking
+$VERSION = do { my @v = '$Revision: 1.1.4.1 $' =~ /\d+/g;
+    shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v );
+};
+
+=head1 NAME
+
+InstallAuth - Authenticates Koha users for Install process
+
+=head1 SYNOPSIS
+
+  use CGI;
+  use InstallAuth;
+
+  my $query = new CGI;
+
+  my ($template, $borrowernumber, $cookie) 
+    = get_template_and_user({template_name   => "opac-main.tmpl",
+                             query           => $query,
+			     type            => "opac",
+			     authnotrequired => 1,
+			     flagsrequired   => {borrow => 1},
+			  });
+
+  print $query->header(
+    -type => guesstype($template->output),
+    -cookie => $cookie
+  ), $template->output;
+
+
+=head1 DESCRIPTION
+
+    The main function of this module is to provide
+    authentification. However the get_template_and_user function has
+    been provided so that a users login information is passed along
+    automatically. This gets loaded into the template.
+    This package is different from C4::Auth in so far as 
+    C4::Auth uses many preferences which are supposed NOT to be obtainable when installing the database.
+    
+    As in C4::Auth, Authentication is based on cookies.
+
+=head1 FUNCTIONS
+
+=over 2
+
+=cut
+
+ at ISA    = qw(Exporter);
+ at EXPORT = qw(
+  &checkauth
+  &get_template_and_user
+  &setlanguagecookie
+);
+
+=item get_template_and_user
+
+  my ($template, $borrowernumber, $cookie)
+    = get_template_and_user({template_name   => "opac-main.tmpl",
+                             query           => $query,
+			     type            => "opac",
+			     authnotrequired => 1,
+			     flagsrequired   => {borrow => 1},
+			  });
+
+    This call passes the C<query>, C<flagsrequired> and C<authnotrequired>
+    to C<&checkauth> (in this module) to perform authentification.
+    See C<&checkauth> for an explanation of these parameters.
+
+    The C<template_name> is then used to find the correct template for
+    the page. The authenticated users details are loaded onto the
+    template in the HTML::Template LOOP variable C<USER_INFO>. Also the
+    C<sessionID> is passed to the template. This can be used in templates
+    if cookies are disabled. It needs to be put as and input to every
+    authenticated page.
+
+    More information on the C<gettemplate> sub can be found in the
+    Output.pm module.
+
+=cut
+
+sub get_template_and_user {
+    my $in       = shift;
+    my $query=$in->{'query'};
+    my $language=$query->cookie('KohaOpacLanguage');
+    my $path=C4::Context->config('intrahtdocs')."/default/".($language?$language:"en");
+    my $template       = HTML::Template::Pro->new(
+        filename          => "$path/".$in->{template_name},
+        die_on_bad_params => 1,
+        global_vars       => 1,
+        case_sensitive    => 1,
+        path              => ["$path/includes"]
+    );
+    
+    my ( $user, $cookie, $sessionID, $flags ) = checkauth(
+        $in->{'query'},
+        $in->{'authnotrequired'},
+        $in->{'flagsrequired'},
+        $in->{'type'}
+    );
+#     use Data::Dumper;warn "utilisateur $user cookie : ".Dumper($cookie);
+
+    my $borrowernumber;
+    if ($user) {
+        $template->param( loggedinusername => $user );
+        $template->param( sessionID        => $sessionID );
+
+
+        # We are going to use the $flags returned by checkauth
+        # to create the template's parameters that will indicate
+        # which menus the user can access.
+        if (( $flags && $flags->{superlibrarian}==1)) {
+            $template->param( CAN_user_circulate        => 1 );
+            $template->param( CAN_user_catalogue        => 1 );
+            $template->param( CAN_user_parameters       => 1 );
+            $template->param( CAN_user_borrowers        => 1 );
+            $template->param( CAN_user_permission       => 1 );
+            $template->param( CAN_user_reserveforothers => 1 );
+            $template->param( CAN_user_borrow           => 1 );
+            $template->param( CAN_user_editcatalogue    => 1 );
+            $template->param( CAN_user_updatecharge     => 1 );
+            $template->param( CAN_user_acquisition      => 1 );
+            $template->param( CAN_user_management       => 1 );
+            $template->param( CAN_user_tools            => 1 );	
+            $template->param( CAN_user_editauthorities  => 1 );
+            $template->param( CAN_user_serials          => 1 );
+            $template->param( CAN_user_reports          => 1 );
+        }
+    }
+    return ( $template, $borrowernumber, $cookie );
+}
+
+=item checkauth
+
+  ($userid, $cookie, $sessionID) = &checkauth($query, $noauth, $flagsrequired, $type);
+
+Verifies that the user is authorized to run this script.  If
+the user is authorized, a (userid, cookie, session-id, flags)
+quadruple is returned.  If the user is not authorized but does
+not have the required privilege (see $flagsrequired below), it
+displays an error page and exits.  Otherwise, it displays the
+login page and exits.
+
+Note that C<&checkauth> will return if and only if the user
+is authorized, so it should be called early on, before any
+unfinished operations (e.g., if you've opened a file, then
+C<&checkauth> won't close it for you).
+
+C<$query> is the CGI object for the script calling C<&checkauth>.
+
+The C<$noauth> argument is optional. If it is set, then no
+authorization is required for the script.
+
+C<&checkauth> fetches user and session information from C<$query> and
+ensures that the user is authorized to run scripts that require
+authorization.
+
+The C<$flagsrequired> argument specifies the required privileges
+the user must have if the username and password are correct.
+It should be specified as a reference-to-hash; keys in the hash
+should be the "flags" for the user, as specified in the Members
+intranet module. Any key specified must correspond to a "flag"
+in the userflags table. E.g., { circulate => 1 } would specify
+that the user must have the "circulate" privilege in order to
+proceed. To make sure that access control is correct, the
+C<$flagsrequired> parameter must be specified correctly.
+
+The C<$type> argument specifies whether the template should be
+retrieved from the opac or intranet directory tree.  "opac" is
+assumed if it is not specified; however, if C<$type> is specified,
+"intranet" is assumed if it is not "opac".
+
+If C<$query> does not have a valid session ID associated with it
+(i.e., the user has not logged in) or if the session has expired,
+C<&checkauth> presents the user with a login page (from the point of
+view of the original script, C<&checkauth> does not return). Once the
+user has authenticated, C<&checkauth> restarts the original script
+(this time, C<&checkauth> returns).
+
+The login page is provided using a HTML::Template, which is set in the
+systempreferences table or at the top of this file. The variable C<$type>
+selects which template to use, either the opac or the intranet 
+authentification template.
+
+C<&checkauth> returns a user ID, a cookie, and a session ID. The
+cookie should be sent back to the browser; it verifies that the user
+has authenticated.
+
+=cut
+
+sub checkauth {
+    my $query = shift;
+
+# $authnotrequired will be set for scripts which will run without authentication
+    my $authnotrequired = shift;
+    my $flagsrequired   = shift;
+    my $type            = shift;
+    $type = 'intranet' unless $type;
+
+
+    my $template_name;
+    $template_name = "auth.tmpl";
+
+    # state variables
+    my $loggedin = 0;
+    my %info;
+    my ( $userid, $cookie, $sessionID, $flags, $envcookie );
+    my $logout = $query->param('logout.x');
+    if ( $sessionID = $query->cookie('sessionID') ) {
+        C4::Context->_new_userenv($sessionID);
+        if ( my %hash = $query->cookie('userenv') ) {
+            C4::Context::set_userenv(
+                $hash{number},       $hash{id},
+                $hash{cardnumber},   $hash{firstname},
+                $hash{surname},      $hash{branch},
+                $hash{branchname},   $hash{flags},
+                $hash{emailaddress}, $hash{branchprinter}
+            );
+            $cookie = $query->cookie(
+                -name    => 'sessionID',
+                -value   => $sessionID,
+                -expires => ''
+            );
+            $loggedin=1;
+            $userid = $hash{cardnumber};
+        }
+        my ( $ip, $lasttime );
+
+        if ($logout) {
+
+            # voluntary logout the user
+            C4::Context->_unset_userenv($sessionID);
+            $sessionID = undef;
+            $userid    = undef;
+            open L, ">>/tmp/sessionlog";
+            my $time = localtime( time() );
+            printf L "%20s from %16s logged out at %30s (manually).\n", $userid,
+              $ip, $time;
+            close L;
+        }
+    }
+    unless ($userid) {
+        $sessionID = int( rand() * 100000 ) . '-' . time();
+        $userid    = $query->param('userid');
+        C4::Context->_new_userenv($sessionID);
+        my $password = $query->param('password');
+        C4::Context->_new_userenv($sessionID);
+        my ( $return, $cardnumber ) = checkpw( $userid, $password );
+        if ($return) {
+            $loggedin=1;
+            open L, ">>/tmp/sessionlog";
+            my $time = localtime( time() );
+            printf L "%20s from %16s logged in  at %30s.\n", $userid,
+              $ENV{'REMOTE_ADDR'}, $time;
+            close L;
+            $cookie = $query->cookie(
+                -name    => 'sessionID',
+                -value   => $sessionID,
+                -expires => ''
+            );
+            if ( $return == 2 ) {
+                #Only superlibrarian should have access to this page.
+                #Since if it is a user, it is supposed that there is a borrower table
+                #And thus that data structure is loaded.
+                my $hash = C4::Context::set_userenv(
+                    0,
+                    0,
+                    C4::Context->config('user'),
+                    C4::Context->config('user'),
+                    C4::Context->config('user'),
+                    "",
+                    "SUPER",
+                    1,""
+                );
+                $envcookie = $query->cookie(
+                    -name    => 'userenv',
+                    -value   => $hash,
+                    -expires => ''
+                );
+                $userid=C4::Context->config('user');
+            }
+        }
+        else {
+            if ($userid) {
+                $info{'invalid_username_or_password'} = 1;
+                C4::Context->_unset_userenv($sessionID);
+            }
+        }
+    }
+
+    # finished authentification, now respond
+    if ( $loggedin )
+    {
+
+        # successful login
+        unless ($cookie) {
+            $cookie = $query->cookie(
+                -name    => 'sessionID',
+                -value   => '',
+                -expires => ''
+            );
+        }
+        if ($envcookie) {
+            return ( $userid, [ $cookie, $envcookie ], $sessionID, $flags );
+        }
+        else {
+            return ( $userid, $cookie, $sessionID, $flags );
+        }
+    }
+
+    # else we have a problem...
+    # get the inputs from the incoming query
+    my @inputs = ();
+    foreach my $name ( param $query) {
+        (next) if ( $name eq 'userid' || $name eq 'password' );
+        my $value = $query->param($name);
+        push @inputs, { name => $name, value => $value };
+    }
+
+    my $path=C4::Context->config('intrahtdocs')."/default/".($query->param('language')?$query->param('language'):"en");
+    my $template       = HTML::Template::Pro->new(
+        filename          => "$path/$template_name",
+        die_on_bad_params => 1,
+        global_vars       => 1,
+        case_sensitive    => 1,
+        path              => ["$path/includes"]
+    );
+    $template->param(
+        INPUTS               => \@inputs,
+
+    );
+    $template->param( loginprompt => 1 ) unless $info{'nopermission'};
+
+    my $self_url = $query->url( -absolute => 1 );
+    $template->param(
+        url         => $self_url,
+    );
+    $template->param( \%info );
+    $cookie = $query->cookie(
+        -name    => 'sessionID',
+        -value   => $sessionID,
+        -expires => ''
+    );
+    print $query->header(
+        -type   => guesstype( $template->output ),
+        -cookie => $cookie
+      ),
+      $template->output;
+    exit;
+}
+
+sub checkpw {
+
+    my ( $userid, $password ) = @_;
+
+    if (   $userid && $userid eq C4::Context->config('user')
+        && "$password" eq C4::Context->config('pass') )
+    {
+# Koha superuser account
+ 		C4::Context->set_userenv(0,0,C4::Context->config('user'),C4::Context->config('user'),C4::Context->config('user'),"",1);
+        return 2;
+    }
+    if (   $userid && $userid eq 'demo'
+        && "$password" eq 'demo'
+        && C4::Context->config('demo') )
+    {
+
+# DEMO => the demo user is allowed to do everything (if demo set to 1 in koha.conf
+# some features won't be effective : modify systempref, modify MARC structure,
+        return 2;
+    }
+    return 0;
+}
+
+
+END { }    # module clean-up code here (global destructor)
+1;
+__END__
+
+=back
+
+=head1 SEE ALSO
+
+CGI(3)
+
+C4::Output(3)
+
+Digest::MD5(3)
+
+=cut

Index: installer/install.pl
===================================================================
RCS file: installer/install.pl
diff -N installer/install.pl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ installer/install.pl	16 Feb 2007 12:53:31 -0000	1.1.4.1
@@ -0,0 +1,323 @@
+#!/usr/bin/perl -w # please develop with -w
+
+#use diagnostics;
+
+# use Install;
+use InstallAuth;
+use C4::Context;
+use C4::Interface::CGI::Output;
+
+use strict; # please develop with the strict pragma
+
+use CGI;
+
+my $query=new CGI;
+my $step=$query->param('step');
+
+my $language=$query->param('language');
+my ($template, $loggedinuser, $cookie);
+
+
+my %language=(
+'en'=>'English',
+'zh'=>'Chinese',
+'pt'=>'Portuguese',
+'fr'=>'French',
+'sp'=>'Spanish',
+'pl'=>'Polish',
+'hu'=>'Hungarian');
+
+if (defined($language) ){
+  setlanguagecookie($query,$language,"install.pl?step=1");
+}
+($template, $loggedinuser, $cookie)
+        = get_template_and_user({template_name => "installer/step".($step?$step:1).".tmpl",
+                query => $query,
+                type => "intranet",
+                authnotrequired => 0,
+                debug => 1,
+                });
+
+if ($step && $step==1){
+  #First Step
+  #Checking ALL perl Modules and services needed are installed.
+  #Whenever there is an error, adding a report to the page
+  # I suppose here that Apache user can access /usr/bin/
+  # If mysql or zebra are in some fancy directory not in PATH
+  # Performing a disk search.
+  $template->param(language=>1);
+  my $problem;
+  
+  unless ($] >= 5.006001) {			# Bug 179
+      $template->param("problems"=>1,"perlversion"=>1);
+      $problem=1;
+  }
+  unless (-x "/usr/bin/perl") {
+    my $realperl=`which perl`;
+    $realperl=`find / -name perl` unless ($realperl);
+    chomp $realperl;
+    $template->param("problems"=>1,'perllocation'=>1) unless ($realperl);
+    $problem=1 unless($realperl);
+  }
+  unless (-x "/usr/local/bin/mysql") {
+    my $mysql=`which mysql`;
+    $mysql=`find / -name mysql` unless ($mysql);
+    chomp $mysql;
+    $template->param("problems"=>1,'mysql'=>1) unless ($mysql);
+    $problem=1 unless($mysql);
+  }
+  # We could here use a special find 
+  my @missing = ();
+  unless (eval {require ZOOM})       {
+          push @missing, {name=>"ZOOM"};
+  }
+  unless (eval {require LWP::Simple})       {
+          push @missing, {name=>"LWP::Simple"};
+  }
+  unless (eval {require XML::Simple})       {
+          push @missing, {name=>"XML::Simple"};
+  }
+  unless (eval {require MARC::File::XML})       {
+          push @missing, {name=>"MARC::File::XML"};
+  }
+  unless (eval {require MARC::File::USMARC})       {
+          push @missing, {name=>"MARC::File::USMARC"};
+  }
+  unless (eval {require DBI})              { push @missing,{name=>"DBI"} };
+  unless (eval {require Date::Manip})      { push @missing,{name=>"Date::Manip"} };
+  unless (eval {require DBD::mysql})       { push @missing,{name=>"DBD::mysql"} };
+  unless (eval {require HTML::Template})   { push @missing,{name=>"HTML::Template"} };
+  unless (eval {require HTML::Template})   { push @missing,{name=>"Date::Calc"} };
+  unless (eval {require HTML::Template})   { push @missing,{name=>"Date::Manip"} };
+  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} };
+# 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
+              push @missing,{name=>"PDF::API2",usagebarcode=>1};
+          }
+  }
+  unless (eval {require GD::Barcorde})   { 
+    if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+      push @missing,{name=>"GD::Barcode",usagebarcode=>1,usagespine=>1};
+    }
+  }
+  unless (eval {require Data::Random})   { 
+    if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+      push @missing,{name=>"Data::Random",usagebarcode=>1};
+    }
+  }
+  unless (eval {require PDF::Reuse::Barcode})   {
+    if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+      push @missing,{name=>"PDF::Reuse::Barcode",usagebarcode=>1};
+    }
+  }
+  unless (eval {require PDF::Report})   {
+    if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+      push @missing,{name=>"PDF::Report",usagebarcode=>1};
+    }
+  }
+  unless (eval {require GD::Barcode::UPCE})   {
+    if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+      push @missing,{name=>"GD::Barcode::UPCE",usagepine=>1};
+    }
+  }
+  unless (eval {require Net::LDAP})       {
+    if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
+      push @missing,{name=>"Net::LDAP",usageLDAP=>1};
+    }
+  }
+
+  $template->param(missings=>\@missing) if (scalar(@missing)>0);
+  $template->param('checkmodule'=>1) unless (scalar(@missing) && $problem);
+  
+} elsif ($step && $step==2){
+  # Check Database connection and access
+  my %info;
+  $info{'dbname'}=C4::Context->config("database");
+  $info{'dbms'}=(C4::Context->config("db_scheme")?C4::Context->config("db_scheme"):"mysql");
+  $info{'hostname'}=C4::Context->config("hostname");
+  ($info{'hostname'},$info{'port'})=($1,$2) if $info{'hostname'}=~/([^:]*):([0-9]+)/;
+  $info{'user'}=C4::Context->config("user");
+  $info{'password'}=C4::Context->config("pass");
+  $template->param(%info);
+  my $checkmysql=$query->param("checkmysql");
+  $template->param('mysqlconnection'=>$checkmysql);
+  if ($checkmysql){
+    my $dbh= DBI->connect("DBI:$info{dbms}:$info{dbname}:$info{hostname}".($info{port}?":$info{port}":""),$info{'user'}, $info{'password'});
+    if ($dbh){
+      # Can connect to the mysql
+      $template->param("checkdatabaseaccess"=>1);
+      if ($info{dbms} eq "mysql"){
+        #Check if database created
+        my $rv=$dbh->do("SHOW DATABASES LIKE \'$info{dbname}\'");
+        if ($rv==1){$template->param('checkdatabasecreated'=>1);}
+        #Check if user have all necessary grants on this database.
+        my $rq=$dbh->prepare("SHOW GRANTS FOR \'$info{user}\'\@'$info{hostname}'");
+        $rq->execute;
+        my $grantaccess;
+        while (my ($line)=$rq->fetchrow){
+	  warn "user\@host : $line";
+          my $dbname=$info{dbname};
+          if ($line=~m/$dbname/ || index($line,'*.*')>0){
+            $grantaccess=1 if (index($line,'ALL PRIVILEGES')>0 ||
+            ((index($line,'SELECT')>0)&&(index($line,'INSERT')>0)&&(index($line,'UPDATE')>0)&&(index($line,'DELETE')>0)&&(index($line,'CREATE')>0)&&(index($line,'DROP')>0)));
+          }
+        }
+        unless ($grantaccess){
+		$rq=$dbh->prepare("SHOW GRANTS FOR \'$info{user}\'\@'\%'");
+        	$rq->execute;
+        	while (my ($line)=$rq->fetchrow){
+	  		warn "user\@\% : $line";
+          		my $dbname=$info{dbname};
+          		if ($line=~m/$dbname/ || index($line,'*.*')>0){
+            			$grantaccess=1 if (index($line,'ALL PRIVILEGES')>0 ||
+            				((index($line,'SELECT')>0)&&(index($line,'INSERT')>0)&&(index($line,'UPDATE')>0)&&(index($line,'DELETE')>0)&&(index($line,'CREATE')>0)&&(index($line,'DROP')>0)));
+          		}
+  		}
+        }
+        $template->param("checkgrantaccess"=>$grantaccess);
+      }
+    } else {
+      $template->param("error"=>DBI::err,"message"=>DBI::errstr);
+    }
+  }
+} elsif ($step && $step==3){
+  my %info;
+  $info{'dbname'}=C4::Context->config("database");
+  $info{'dbms'}=(C4::Context->config("db_scheme")?C4::Context->config("db_scheme"):"mysql");
+  $info{'hostname'}=C4::Context->config("hostname");
+  ($info{'hostname'},$info{'port'})=($1,$2) if $info{'hostname'}=~/([^:]*):([0-9]+)/;
+  $info{'user'}=C4::Context->config("user");
+  $info{'password'}=C4::Context->config("pass");
+  my $op=$query->param('op');
+  if ($op && $op eq 'finish'){
+    # Installation is finished.
+    # We just deny anybody acess to install
+    # And we redirect people to mainpage.
+    # The installer wil have to relogin since we donot pass cookie to redirection.
+    my $dir=C4::Context->config('intranetdir');
+    qx(chmod -R uog-xw $dir/installer);
+    print $query->redirect("/cgi-bin/koha/mainpage.pl");
+    exit 1;
+  } elsif ($op && $op eq 'addframeworks'){
+    #Framework importing and reports
+    my $lang;
+    my %hashlevel;
+    foreach my $file ($query->param('framework')){
+      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 @file = split qr(\/|\\),$file;
+      $lang=$file[scalar(@file)-3] unless ($lang);
+      my $level=$file[scalar(@file)-2];
+      #Bulding here a hierarchy to display files by level.
+      push @{$hashlevel{$level}},{"fwkname"=>$file[scalar(@file)-1],"error"=>$str};
+    }
+    my @list;
+    map {push @list,{"level"=>$_,"fwklist"=>$hashlevel{$_}}} keys %hashlevel;
+    $template->param("fwklanguage"=>$language{$lang},
+                     "list"=>\@list);
+    $template->param("$op"=>1);
+  } elsif ( $op && $op eq 'selectframeworks'){
+    #Framework Selection
+    #sql data for import are supposed to be located in misc/sql-datas/<language>/<level>
+    # Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
+    # Where <level> is a category of requirement : required, recommended optional
+    # level should contain : 
+    #   SQL File for import With a readable name.
+    #   txt File taht explains what this SQL File is meant for.
+    # Could be VERY useful to have A Big file for a kind of library.
+    # But could also be useful to have some Authorised values data set prepared here.
+    # Framework Selection is achieved through checking boxes.
+    my $langchoice=$query->param('fwklanguage');
+    $langchoice=$query->cookie('KohaOpacLanguage') unless ($langchoice);
+    my $dir=C4::Context->config('intranetdir')."/misc/sql-datas/";
+    opendir (MYDIR,$dir);
+    my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
+    closedir MYDIR;
+    my @languages;
+    map{
+      push @languages,{'dirname'=>$_, 'languagedescription'=>$language{$_},'checked'=>($_ eq $langchoice)} if ($language{$_});
+    } @listdir;
+    $template->param("languagelist"=>\@languages);
+    undef $/;
+    my $dir=C4::Context->config('intranetdir')."/misc/sql-datas/$langchoice";
+    opendir (MYDIR,$dir);
+    my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
+    closedir MYDIR;
+    my @levellist;
+    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);
+      closedir MYDIR;
+      my %cell;
+      my @frameworklist;
+      map{
+        my $name=substr($_,0,-4);
+        open FILE, "< $dir/$name.txt";
+        my $lines = <FILE>; 
+        $lines=~s/\n|\r/<br \/>/g;
+        use utf8;
+        utf8::encode($lines) unless (utf8::is_utf8($lines));
+        push @frameworklist,{'fwkname'=>$name, 'fwkfile'=>"$dir/$_",'fwkdescription'=>$lines};
+      } @listname;
+      $cell{"mandatory"}=($requirelevel=~/(mandatory|requi|oblig|necess)/i);
+      $cell{"frameworks"}=\@frameworklist;
+      $cell{"label"}=ucfirst($requirelevel);
+      $cell{"code"}=lc($requirelevel);
+      push @levellist,\%cell;
+    }
+    $template->param("levelloop"=>\@levellist);
+    $template->param("$op"=>1);
+  } elsif ($op && $op eq 'updatestructure'){
+    #Do updatedatabase And report
+    my $execstring=C4::Context->config("intranetdir")."/updater/updatedatabase";
+    undef $/;
+    my $string= qx|$execstring 2>&1|;
+    if ($string){
+      $string=~s/\n|\r/<br \/>/g;
+      $string=~s/(DBD::mysql.*? failed: .*? line [0-9]*.|=================.*?====================)/<font color=red>$1<\/font>/g;
+      $template->param("updatereport"=>$string) ;
+    }
+    $template->param($op=>1)
+  }elsif ($op && $op eq 'importdatastructure'){
+    #Import data structure and show errors if any
+    my $filename="koha.mysql";
+    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);
+  } else {
+    #Check if there are enough tables.
+    # Version 2_2 was 74 tables, so we check if there is more than 75
+    # Maybe could be in step 2
+    #I put it there because it implied a data import if condition was not satisfied.
+    my $dbh= DBI->connect("DBI:$info{dbms}:$info{dbname}:$info{hostname}".($info{port}?":$info{port}":""),$info{'user'}, $info{'password'});
+    my $rq=$dbh->prepare("SHOW TABLES FROM ".$info{'dbname'});
+    $rq->execute;
+    my $data=$rq->fetchall_arrayref({});
+    my $count=scalar(@$data);
+    if ($count < 73){
+      $template->param("count"=>$count,"proposeimport"=>1);
+    } else {
+      $template->param("count"=>$count,"default"=>1);
+    }
+    $dbh->disconnect;
+  }
+}else {
+  # LANGUAGE SELECTION page by default
+  # using opendir + language Hash
+  
+  my $dir=C4::Context->config('intrahtdocs')."/default/";
+  opendir (MYDIR,$dir);
+  my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
+  my @languages;
+  foreach (@listdir){
+    push @languages,{'value'=>$_, 'description'=>$language{$_}} if ($language{$_});
+  }
+  $template->param(languages=>\@languages);
+}
+output_html_with_http_headers $query, $cookie, $template->output;

Index: installer/koha.mysql
===================================================================
RCS file: installer/koha.mysql
diff -N installer/koha.mysql
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ installer/koha.mysql	16 Feb 2007 12:53:31 -0000	1.1.2.1
@@ -0,0 +1,1357 @@
+#
+# Structure de la table `accountlines`
+#
+
+CREATE TABLE accountlines (
+  borrowernumber int(11) NOT NULL default '0',
+  accountno smallint(6) NOT NULL default '0',
+  itemnumber int(11) default NULL,
+  date date default NULL,
+  amount decimal(28,6) default NULL,
+  description text,
+  dispute text,
+  accounttype varchar(5) default NULL,
+  amountoutstanding decimal(28,6) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  KEY acctsborridx (borrowernumber),
+  KEY timeidx (timestamp)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `accountoffsets`
+#
+
+CREATE TABLE accountoffsets (
+  borrowernumber int(11) NOT NULL default '0',
+  accountno smallint(6) NOT NULL default '0',
+  offsetaccount smallint(6) NOT NULL default '0',
+  offsetamount decimal(28,6) default NULL,
+  timestamp timestamp(14) NOT NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `additionalauthors`
+#
+
+CREATE TABLE additionalauthors (
+  author text NOT NULL,
+  biblionumber int(11) NOT NULL default '0',
+  KEY bibidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqbasket`
+#
+
+CREATE TABLE aqbasket (
+  basketno int(11) NOT NULL auto_increment,
+  creationdate date default NULL,
+  closedate date default NULL,
+  booksellerid varchar(10) default NULL,
+  authorisedby varchar(10) default NULL,
+  booksellerinvoicenumber text,
+  PRIMARY KEY  (basketno)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqbookfund`
+#
+
+CREATE TABLE aqbookfund (
+  bookfundid varchar(5) NOT NULL default '''''',
+  bookfundname text,
+  bookfundgroup varchar(5) default NULL,
+  PRIMARY KEY  (bookfundid)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqbooksellers`
+#
+
+CREATE TABLE aqbooksellers (
+  id int(11) default NULL,
+  name text,
+  address1 text,
+  address2 text,
+  address3 text,
+  address4 text,
+  phone varchar(30) default NULL,
+  accountnumber text,
+  othersupplier text,
+  currency char(3) NOT NULL default '',
+  deliverydays smallint(6) default NULL,
+  followupdays smallint(6) default NULL,
+  followupscancel smallint(6) default NULL,
+  specialty text,
+  booksellerfax text,
+  notes text,
+  bookselleremail text,
+  booksellerurl text,
+  contact varchar(100) default NULL,
+  postal text,
+  url varchar(255) default NULL,
+  contpos varchar(100) default NULL,
+  contphone varchar(100) default NULL,
+  contfax varchar(100) default NULL,
+  contaltphone varchar(100) default NULL,
+  contemail varchar(100) default NULL,
+  contnotes text,
+  active tinyint(4) default NULL,
+  listprice varchar(5) default NULL,
+  invoiceprice varchar(5) default NULL,
+  gstreg tinyint(4) default NULL,
+  listincgst tinyint(4) default NULL,
+  invoiceincgst tinyint(4) default NULL,
+  discount float(6,4) default NULL,
+  fax varchar(50) default NULL,
+  nocalc int(11) default NULL,
+  invoicedisc float(6,4) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqbudget`
+#
+
+CREATE TABLE aqbudget (
+  bookfundid char(5) NOT NULL default '',
+  startdate date NOT NULL default '0000-00-00',
+  enddate date default NULL,
+  budgetamount decimal(13,2) default NULL,
+  aqbudgetid tinyint(4) NOT NULL auto_increment,
+  PRIMARY KEY  (aqbudgetid)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqorderbreakdown`
+#
+
+CREATE TABLE aqorderbreakdown (
+  ordernumber int(11) default NULL,
+  linenumber int(11) default NULL,
+  branchcode char(4) default NULL,
+  bookfundid char(5) NOT NULL default '',
+  allocation smallint(6) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqorderdelivery`
+#
+
+CREATE TABLE aqorderdelivery (
+  ordernumber date NOT NULL default '0000-00-00',
+  deliverynumber smallint(6) NOT NULL default '0',
+  deliverydate varchar(18) default NULL,
+  qtydelivered smallint(6) default NULL,
+  deliverycomments text
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `aqorders`
+#
+
+CREATE TABLE aqorders (
+  ordernumber int(11) NOT NULL auto_increment,
+  biblionumber int(11) default NULL,
+  title text,
+  entrydate date default NULL,
+  quantity smallint(6) default NULL,
+  currency char(3) default NULL,
+  listprice decimal(28,6) default NULL,
+  totalamount decimal(28,6) default NULL,
+  datereceived date default NULL,
+  booksellerinvoicenumber text,
+  freight decimal(28,6) default NULL,
+  unitprice decimal(28,6) default NULL,
+  quantityreceived smallint(6) default NULL,
+  cancelledby varchar(10) default NULL,
+  datecancellationprinted date default NULL,
+  notes text,
+  supplierreference text,
+  purchaseordernumber text,
+  subscription tinyint(1) default NULL,
+  serialid varchar(30) default NULL,
+  basketno int(11) default NULL,
+  biblioitemnumber int(11) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  rrp decimal(13,2) default NULL,
+  ecost decimal(13,2) default NULL,
+  gst decimal(13,2) default NULL,
+  budgetdate date default NULL,
+  sort1 varchar(80) default NULL,
+  sort2 varchar(80) default NULL,
+  PRIMARY KEY  (ordernumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `auth_header`
+#
+
+CREATE TABLE auth_header (
+  authid bigint(20) unsigned NOT NULL auto_increment,
+  authtypecode char(10) NOT NULL default '',
+  datecreated date NOT NULL default '0000-00-00',
+  datemodified date default NULL,
+  origincode char(20) default NULL,
+  PRIMARY KEY  (authid),
+  KEY origincode (origincode)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `auth_subfield_structure`
+#
+
+CREATE TABLE auth_subfield_structure (
+  authtypecode char(10) NOT NULL default '',
+  tagfield char(3) NOT NULL default '',
+  tagsubfield char(1) NOT NULL default '',
+  liblibrarian char(255) NOT NULL default '',
+  libopac char(255) NOT NULL default '',
+  repeatable tinyint(4) NOT NULL default '0',
+  mandatory tinyint(4) NOT NULL default '0',
+  tab tinyint(1) default NULL,
+  authorised_value char(10) default NULL,
+  value_builder char(80) default NULL,
+  seealso char(255) default NULL,
+  PRIMARY KEY  (authtypecode,tagfield,tagsubfield),
+  KEY tab (authtypecode,tab)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `auth_subfield_table`
+#
+
+CREATE TABLE auth_subfield_table (
+  subfieldid bigint(20) unsigned NOT NULL auto_increment,
+  authid bigint(20) unsigned NOT NULL default '0',
+  tag char(3) NOT NULL default '',
+  tagorder tinyint(4) NOT NULL default '1',
+  tag_indicator char(2) NOT NULL default '',
+  subfieldcode char(1) NOT NULL default '',
+  subfieldorder tinyint(4) NOT NULL default '1',
+  subfieldvalue varchar(255) default NULL,
+  PRIMARY KEY  (subfieldid),
+  KEY authid (authid),
+  KEY tag (tag),
+  KEY subfieldcode (subfieldcode),
+  KEY subfieldvalue (subfieldvalue)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `auth_tag_structure`
+#
+
+CREATE TABLE auth_tag_structure (
+  authtypecode char(10) NOT NULL default '',
+  tagfield char(3) NOT NULL default '',
+  liblibrarian char(255) NOT NULL default '',
+  libopac char(255) NOT NULL default '',
+  repeatable tinyint(4) NOT NULL default '0',
+  mandatory tinyint(4) NOT NULL default '0',
+  authorised_value char(10) default NULL,
+  PRIMARY KEY  (authtypecode,tagfield)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `auth_types`
+#
+
+CREATE TABLE auth_types (
+  authtypecode varchar(10) NOT NULL default '',
+  authtypetext varchar(255) NOT NULL default '',
+  auth_tag_to_report char(3) NOT NULL default '',
+  summary text NOT NULL,
+  PRIMARY KEY  (authtypecode)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `auth_word`
+#
+
+CREATE TABLE auth_word (
+  authid bigint(20) NOT NULL default '0',
+  tagsubfield varchar(4) NOT NULL default '',
+  tagorder tinyint(4) NOT NULL default '1',
+  subfieldorder tinyint(4) NOT NULL default '1',
+  word varchar(255) NOT NULL default '',
+  sndx_word varchar(255) NOT NULL default '',
+  KEY authid (authid),
+  KEY marc_search (tagsubfield,word),
+  KEY word (word),
+  KEY sndx_word (sndx_word)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `authorised_values`
+#
+
+CREATE TABLE authorised_values (
+  id int(11) NOT NULL auto_increment,
+  category char(10) NOT NULL default '',
+  authorised_value char(80) NOT NULL default '',
+  lib char(80) default NULL,
+  PRIMARY KEY  (id),
+  KEY name (category)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `biblio`
+#
+
+CREATE TABLE biblio (
+  biblionumber int(11) NOT NULL default '0',
+  author text,
+  title text,
+  unititle text,
+  notes text,
+  serial tinyint(1) default NULL,
+  seriestitle text,
+  copyrightdate smallint(6) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  abstract text,
+  PRIMARY KEY  (biblionumber),
+  KEY blbnoidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `biblio_framework`
+#
+
+CREATE TABLE biblio_framework (
+  frameworkcode char(4) NOT NULL default '',
+  frameworktext char(255) NOT NULL default '',
+  PRIMARY KEY  (frameworkcode)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `biblioanalysis`
+#
+
+CREATE TABLE biblioanalysis (
+  analyticaltitle text,
+  biblionumber int(11) NOT NULL default '0',
+  analyticalauthor text
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `biblioitems`
+#
+
+CREATE TABLE biblioitems (
+  biblioitemnumber int(11) NOT NULL default '0',
+  biblionumber int(11) NOT NULL default '0',
+  volume text,
+  number text,
+  classification varchar(25) default NULL,
+  itemtype varchar(4) default NULL,
+  isbn varchar(14) default NULL,
+  issn varchar(9) default NULL,
+  dewey varchar(50) default NULL,
+  subclass char(3) default NULL,
+  publicationyear smallint(6) default NULL,
+  publishercode varchar(255) default NULL,
+  volumedate date default NULL,
+  volumeddesc varchar(255) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  illus varchar(255) default NULL,
+  pages varchar(255) default NULL,
+  notes text,
+  size varchar(255) default NULL,
+  place varchar(255) default NULL,
+  lccn varchar(25) default NULL,
+  marc text,
+  url varchar(255) default NULL,
+  PRIMARY KEY  (biblioitemnumber),
+  KEY bibinoidx (biblioitemnumber),
+  KEY bibnoidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `bibliosubject`
+#
+
+CREATE TABLE bibliosubject (
+  subject text NOT NULL,
+  biblionumber int(11) NOT NULL default '0'
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `bibliosubtitle`
+#
+
+CREATE TABLE bibliosubtitle (
+  subtitle text NOT NULL,
+  biblionumber int(11) NOT NULL default '0',
+  KEY bibsubidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `bibliothesaurus`
+#
+
+CREATE TABLE bibliothesaurus (
+  id bigint(20) NOT NULL auto_increment,
+  freelib char(255) NOT NULL default '',
+  stdlib char(255) NOT NULL default '',
+  category char(10) NOT NULL default '',
+  level tinyint(4) NOT NULL default '1',
+  hierarchy char(80) NOT NULL default '',
+  father char(80) NOT NULL default '',
+  PRIMARY KEY  (id),
+  KEY freelib (freelib),
+  KEY stdlib (stdlib),
+  KEY category (category),
+  KEY hierarchy (hierarchy),
+  FULLTEXT KEY category_2 (category,freelib)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `bookshelf`
+#
+
+CREATE TABLE bookshelf (
+  shelfnumber int(11) NOT NULL auto_increment,
+  shelfname char(255) default NULL,
+  owner char(80) default NULL,
+  category char(1) default NULL,
+  PRIMARY KEY  (shelfnumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `borexp`
+#
+
+CREATE TABLE borexp (
+  borrowernumber int(11) default NULL,
+  newexp date default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `borrowers`
+#
+
+CREATE TABLE borrowers (
+  borrowernumber int(11) NOT NULL auto_increment,
+  cardnumber varchar(16) NOT NULL default '',
+  surname text NOT NULL,
+  firstname text NOT NULL,
+  title text,
+  othernames text,
+  initials text NOT NULL,
+  streetaddress text NOT NULL,
+  suburb text,
+  city text NOT NULL,
+  phone text NOT NULL,
+  emailaddress text,
+  faxnumber text,
+  textmessaging text,
+  altstreetaddress text,
+  altsuburb text,
+  altcity text,
+  altphone text,
+  dateofbirth date default NULL,
+  branchcode varchar(4) NOT NULL default '',
+  categorycode char(2) default NULL,
+  dateenrolled date default NULL,
+  gonenoaddress tinyint(1) default NULL,
+  lost tinyint(1) default NULL,
+  debarred tinyint(1) default NULL,
+  studentnumber text,
+  school text,
+  contactname text,
+  borrowernotes text,
+  guarantor int(11) default NULL,
+  area char(2) default NULL,
+  ethnicity varchar(50) default NULL,
+  ethnotes varchar(255) default NULL,
+  sex char(1) default NULL,
+  expiry date default NULL,
+  altnotes varchar(255) default NULL,
+  altrelationship varchar(100) default NULL,
+  streetcity text,
+  phoneday varchar(50) default NULL,
+  preferredcont char(1) default NULL,
+  physstreet varchar(100) default NULL,
+  password varchar(30) default NULL,
+  flags int(11) default NULL,
+  userid varchar(30) default NULL,
+  homezipcode varchar(25) default NULL,
+  zipcode varchar(25) default NULL,
+  sort1 varchar(80) default NULL,
+  sort2 varchar(80) default NULL,
+  UNIQUE KEY cardnumber (cardnumber),
+  KEY borrowernumber (borrowernumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `branchcategories`
+#
+
+CREATE TABLE branchcategories (
+  categorycode varchar(4) NOT NULL default '',
+  categoryname text,
+  codedescription text,
+  PRIMARY KEY  (categorycode)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `branches`
+#
+
+CREATE TABLE branches (
+  branchcode varchar(4) NOT NULL default '',
+  branchname text NOT NULL,
+  branchaddress1 text,
+  branchaddress2 text,
+  branchaddress3 text,
+  branchphone text,
+  branchfax text,
+  branchemail text,
+  issuing tinyint(4) default NULL,
+  UNIQUE KEY branchcode (branchcode)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `branchrelations`
+#
+
+CREATE TABLE branchrelations (
+  branchcode varchar(4) default NULL,
+  categorycode varchar(4) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `branchtransfers`
+#
+
+CREATE TABLE branchtransfers (
+  itemnumber int(11) NOT NULL default '0',
+  datesent datetime default NULL,
+  frombranch varchar(4) default NULL,
+  datearrived datetime default NULL,
+  tobranch varchar(4) default NULL,
+  comments text
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `catalogueentry`
+#
+
+CREATE TABLE catalogueentry (
+  catalogueentry text NOT NULL,
+  entrytype char(2) default NULL,
+  see text,
+  seealso text,
+  seeinstead text,
+  biblionumber int(11) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `categories`
+#
+
+CREATE TABLE categories (
+  categorycode char(2) NOT NULL default '',
+  description text,
+  enrolmentperiod smallint(6) default NULL,
+  upperagelimit smallint(6) default NULL,
+  dateofbirthrequired tinyint(1) default NULL,
+  finetype varchar(30) default NULL,
+  bulk tinyint(1) default NULL,
+  enrolmentfee decimal(28,6) default NULL,
+  overduenoticerequired tinyint(1) default NULL,
+  issuelimit smallint(6) default NULL,
+  reservefee decimal(28,6) default NULL,
+  UNIQUE KEY categorycode (categorycode)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `currency`
+#
+
+CREATE TABLE currency (
+  currency varchar(10) default NULL,
+  rate float(7,5) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `deletedbiblio`
+#
+
+CREATE TABLE deletedbiblio (
+  biblionumber int(11) NOT NULL default '0',
+  author text,
+  title text,
+  unititle text,
+  notes text,
+  serial tinyint(1) default NULL,
+  seriestitle text,
+  copyrightdate smallint(6) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  marc blob,
+  abstract text,
+  PRIMARY KEY  (biblionumber),
+  KEY blbnoidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `deletedbiblioitems`
+#
+
+CREATE TABLE deletedbiblioitems (
+  biblioitemnumber int(11) NOT NULL default '0',
+  biblionumber int(11) NOT NULL default '0',
+  volume text,
+  number text,
+  classification varchar(25) default NULL,
+  itemtype varchar(4) default NULL,
+  isbn varchar(14) default NULL,
+  issn varchar(9) default NULL,
+  dewey varchar(50) default NULL,
+  subclass char(3) default NULL,
+  publicationyear smallint(6) default NULL,
+  publishercode varchar(255) default NULL,
+  volumedate date default NULL,
+  volumeddesc varchar(255) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  illus varchar(255) default NULL,
+  pages varchar(255) default NULL,
+  notes text,
+  size varchar(255) default NULL,
+  lccn varchar(25) default NULL,
+  marc text,
+  url varchar(255) default NULL,
+  PRIMARY KEY  (biblioitemnumber),
+  KEY bibinoidx (biblioitemnumber),
+  KEY bibnoidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `deletedborrowers`
+#
+
+CREATE TABLE deletedborrowers (
+  borrowernumber int(11) NOT NULL default '0',
+  cardnumber varchar(9) NOT NULL default '',
+  surname text NOT NULL,
+  firstname text NOT NULL,
+  title text,
+  othernames text,
+  initials text NOT NULL,
+  streetaddress text NOT NULL,
+  suburb text,
+  city text NOT NULL,
+  phone text NOT NULL,
+  emailaddress text,
+  faxnumber text,
+  altstreetaddress text,
+  altsuburb text,
+  altcity text,
+  altphone text,
+  dateofbirth date default NULL,
+  branchcode varchar(4) NOT NULL default '',
+  categorycode char(2) default NULL,
+  dateenrolled date default NULL,
+  gonenoaddress tinyint(1) default NULL,
+  lost tinyint(1) default NULL,
+  debarred tinyint(1) default NULL,
+  studentnumber text,
+  school text,
+  contactname text,
+  borrowernotes text,
+  guarantor int(11) default NULL,
+  area char(2) default NULL,
+  ethnicity varchar(50) default NULL,
+  ethnotes varchar(255) default NULL,
+  sex char(1) default NULL,
+  expiry date default NULL,
+  altnotes varchar(255) default NULL,
+  altrelationship varchar(100) default NULL,
+  streetcity text,
+  phoneday varchar(50) default NULL,
+  preferredcont varchar(100) default NULL,
+  physstreet varchar(100) default NULL,
+  KEY borrowernumber (borrowernumber),
+  KEY cardnumber (cardnumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `deleteditems`
+#
+
+CREATE TABLE deleteditems (
+  itemnumber int(11) NOT NULL default '0',
+  biblionumber int(11) NOT NULL default '0',
+  multivolumepart varchar(30) default NULL,
+  biblioitemnumber int(11) NOT NULL default '0',
+  barcode varchar(9) NOT NULL default '',
+  dateaccessioned date default NULL,
+  booksellerid varchar(10) default NULL,
+  homebranch varchar(4) default NULL,
+  price decimal(28,6) default NULL,
+  replacementprice decimal(28,6) default NULL,
+  replacementpricedate date default NULL,
+  datelastborrowed date default NULL,
+  datelastseen date default NULL,
+  multivolume tinyint(1) default NULL,
+  stack tinyint(1) default NULL,
+  notforloan tinyint(1) default NULL,
+  itemlost tinyint(1) default NULL,
+  wthdrawn tinyint(1) default NULL,
+  bulk varchar(30) default NULL,
+  issues smallint(6) default NULL,
+  renewals smallint(6) default NULL,
+  reserves smallint(6) default NULL,
+  restricted tinyint(1) default NULL,
+  binding decimal(28,6) default NULL,
+  itemnotes text,
+  holdingbranch varchar(4) default NULL,
+  interim tinyint(1) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  marc blob,
+  paidfor text,
+  PRIMARY KEY  (itemnumber),
+  UNIQUE KEY barcode (barcode),
+  KEY itembarcodeidx (barcode),
+  KEY itembinoidx (biblioitemnumber),
+  KEY itembibnoidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `ethnicity`
+#
+
+CREATE TABLE ethnicity (
+  code varchar(10) NOT NULL default '',
+  name varchar(255) default NULL,
+  PRIMARY KEY  (code)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `issues`
+#
+
+CREATE TABLE issues (
+  borrowernumber int(11) NOT NULL default '0',
+  itemnumber int(11) NOT NULL default '0',
+  date_due date default NULL,
+  branchcode char(4) default NULL,
+  issuingbranch char(18) default NULL,
+  returndate date default NULL,
+  lastreneweddate date default NULL,
+  return char(4) default NULL,
+  renewals tinyint(4) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  KEY issuesborridx (borrowernumber),
+  KEY issuesitemidx (itemnumber),
+  KEY bordate (borrowernumber,timestamp)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `issuingrules`
+#
+
+CREATE TABLE issuingrules (
+  categorycode char(2) NOT NULL default '',
+  itemtype varchar(4) NOT NULL default '',
+  restrictedtype tinyint(1) default NULL,
+  rentaldiscount decimal(28,6) default NULL,
+  reservecharge decimal(28,6) default NULL,
+  fine decimal(28,6) default NULL,
+  firstremind int(11) default NULL,
+  chargeperiod int(11) default NULL,
+  accountsent int(11) default NULL,
+  chargename varchar(100) default NULL,
+  maxissueqty int(4) default NULL,
+  issuelength int(4) default NULL,
+  branchcode varchar(4) NOT NULL default '',
+  PRIMARY KEY  (branchcode,categorycode,itemtype)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `items`
+#
+
+CREATE TABLE items (
+  itemnumber int(11) NOT NULL default '0',
+  biblionumber int(11) NOT NULL default '0',
+  multivolumepart varchar(30) default NULL,
+  biblioitemnumber int(11) NOT NULL default '0',
+  barcode varchar(20) default NULL,
+  dateaccessioned date default NULL,
+  booksellerid varchar(10) default NULL,
+  homebranch varchar(4) default NULL,
+  price decimal(8,2) default NULL,
+  replacementprice decimal(8,2) default NULL,
+  replacementpricedate date default NULL,
+  datelastborrowed date default NULL,
+  datelastseen date default NULL,
+  multivolume tinyint(1) default NULL,
+  stack tinyint(1) default NULL,
+  notforloan tinyint(1) default NULL,
+  itemlost tinyint(1) default NULL,
+  wthdrawn tinyint(1) default NULL,
+  itemcallnumber varchar(30) default NULL,
+  issues smallint(6) default NULL,
+  renewals smallint(6) default NULL,
+  reserves smallint(6) default NULL,
+  restricted tinyint(1) default NULL,
+  binding decimal(28,6) default NULL,
+  itemnotes text,
+  holdingbranch varchar(4) default NULL,
+  paidfor text,
+  timestamp timestamp(14) NOT NULL,
+  location varchar(80) default NULL,
+  PRIMARY KEY  (itemnumber),
+  KEY itembarcodeidx (barcode),
+  KEY itembinoidx (biblioitemnumber),
+  KEY itembibnoidx (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `itemsprices`
+#
+
+CREATE TABLE itemsprices (
+  itemnumber int(11) default NULL,
+  price1 decimal(28,6) default NULL,
+  price2 decimal(28,6) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `itemtypes`
+#
+
+CREATE TABLE itemtypes (
+  itemtype varchar(4) NOT NULL default '',
+  description text,
+  renewalsallowed smallint(6) default NULL,
+  rentalcharge double(16,4) default NULL,
+  notforloan smallint(6) default NULL,
+  UNIQUE KEY itemtype (itemtype)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_biblio`
+#
+
+CREATE TABLE marc_biblio (
+  bibid bigint(20) unsigned NOT NULL auto_increment,
+  biblionumber int(11) NOT NULL default '0',
+  datecreated date NOT NULL default '0000-00-00',
+  datemodified date default NULL,
+  origincode char(20) default NULL,
+  frameworkcode char(4) NOT NULL default '',
+  PRIMARY KEY  (bibid),
+  KEY origincode (origincode),
+  KEY biblionumber (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_blob_subfield`
+#
+
+CREATE TABLE marc_blob_subfield (
+  blobidlink bigint(20) NOT NULL auto_increment,
+  subfieldvalue longtext NOT NULL,
+  PRIMARY KEY  (blobidlink)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_breeding`
+#
+
+CREATE TABLE marc_breeding (
+  id bigint(20) NOT NULL auto_increment,
+  file varchar(80) NOT NULL default '',
+  isbn varchar(10) NOT NULL default '',
+  title varchar(128) default NULL,
+  author varchar(80) default NULL,
+  marc text NOT NULL,
+  encoding varchar(40) NOT NULL default '''''',
+  z3950random varchar(40) default NULL,
+  PRIMARY KEY  (id),
+  KEY title (title),
+  KEY isbn (isbn)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_subfield_structure`
+#
+CREATE TABLE marc_subfield_structure (
+  tagfield char(3) NOT NULL default '',
+  tagsubfield char(1) NOT NULL default '',
+  liblibrarian varchar(255) NOT NULL default '',
+  libopac varchar(255) NOT NULL default '',
+  repeatable tinyint(4) NOT NULL default '0',
+  mandatory tinyint(4) NOT NULL default '0',
+  kohafield varchar(40) default NULL,
+  tab tinyint(1) default NULL,
+  authorised_value varchar(10) default NULL,
+  authtypecode varchar(10) default NULL,
+  value_builder varchar(80) default NULL,
+  isurl tinyint(1) default NULL,
+  hidden tinyint(1) default NULL,
+  frameworkcode varchar(4) NOT NULL default '',
+  seealso text default NULL,
+  link varchar(80) default NULL,
+  PRIMARY KEY  (frameworkcode,tagfield,tagsubfield),
+  KEY tab (frameworkcode,tab),
+  KEY kohafield (frameworkcode,kohafield),
+  KEY kohafield_2 (kohafield)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_subfield_table`
+#
+
+CREATE TABLE marc_subfield_table (
+  subfieldid bigint(20) unsigned NOT NULL auto_increment,
+  bibid bigint(20) unsigned NOT NULL default '0',
+  tag char(3) NOT NULL default '',
+  tagorder tinyint(4) NOT NULL default '1',
+  tag_indicator char(2) NOT NULL default '',
+  subfieldcode char(1) NOT NULL default '',
+  subfieldorder tinyint(4) NOT NULL default '1',
+  subfieldvalue varchar(255) default NULL,
+  valuebloblink bigint(20) default NULL,
+  PRIMARY KEY  (subfieldid),
+  KEY bibid (bibid),
+  KEY tag (tag),
+  KEY tag_indicator (tag_indicator),
+  KEY subfieldorder (subfieldorder),
+  KEY subfieldcode (subfieldcode),
+  KEY subfieldvalue (subfieldvalue),
+  KEY tagorder (tagorder)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_tag_structure`
+#
+
+CREATE TABLE marc_tag_structure (
+  tagfield char(3) NOT NULL default '',
+  liblibrarian char(255) NOT NULL default '',
+  libopac char(255) NOT NULL default '',
+  repeatable tinyint(4) NOT NULL default '0',
+  mandatory tinyint(4) NOT NULL default '0',
+  authorised_value char(10) default NULL,
+  frameworkcode char(4) NOT NULL default '',
+  PRIMARY KEY  (frameworkcode,tagfield)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marc_word`
+#
+
+CREATE TABLE marc_word (
+  bibid bigint(20) NOT NULL default '0',
+  tagsubfield varchar(4) NOT NULL default '',
+  tagorder tinyint(4) NOT NULL default '1',
+  subfieldorder tinyint(4) NOT NULL default '1',
+  word varchar(255) NOT NULL default '',
+  sndx_word varchar(255) NOT NULL default '',
+  KEY bibid (bibid),
+  KEY tagorder (tagorder),
+  KEY subfieldorder (subfieldorder),
+  KEY word (word),
+  KEY sndx_word (sndx_word),
+  KEY Search_Marc (tagsubfield,word)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `marcrecorddone`
+#
+
+CREATE TABLE marcrecorddone (
+  isbn char(40) default NULL,
+  issn char(40) default NULL,
+  lccn char(40) default NULL,
+  controlnumber char(40) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `printers`
+#
+
+CREATE TABLE printers (
+  printername char(40) NOT NULL default '''''',
+  printqueue char(20) default NULL,
+  printtype char(20) default NULL,
+  PRIMARY KEY  (printername)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `reserveconstraints`
+#
+
+CREATE TABLE reserveconstraints (
+  borrowernumber int(11) NOT NULL default '0',
+  reservedate date NOT NULL default '0000-00-00',
+  biblionumber int(11) NOT NULL default '0',
+  biblioitemnumber int(11) default NULL,
+  timestamp timestamp(14) NOT NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `reserves`
+#
+
+CREATE TABLE reserves (
+  borrowernumber int(11) NOT NULL default '0',
+  reservedate date NOT NULL default '0000-00-00',
+  biblionumber int(11) NOT NULL default '0',
+  constrainttype char(1) default NULL,
+  branchcode varchar(4) default NULL,
+  notificationdate date default NULL,
+  reminderdate date default NULL,
+  cancellationdate date default NULL,
+  reservenotes text,
+  priority smallint(6) default NULL,
+  found char(1) default NULL,
+  timestamp timestamp(14) NOT NULL,
+  itemnumber int(11) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `serial`
+#
+
+CREATE TABLE serial (
+  serialid int(11) NOT NULL auto_increment,
+  biblionumber varchar(100) NOT NULL default '',
+  subscriptionid varchar(100) NOT NULL default '',
+  serialseq varchar(100) NOT NULL default '',
+  status tinyint(4) NOT NULL default '0',
+  planneddate date NOT NULL default '0000-00-00',
+  PRIMARY KEY  (serialid)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `sessionqueries`
+#
+
+CREATE TABLE sessionqueries (
+  sessionID varchar(255) NOT NULL default '',
+  userid varchar(100) NOT NULL default '',
+  ip varchar(18) NOT NULL default '',
+  url text NOT NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `sessions`
+#
+
+CREATE TABLE sessions (
+  sessionID varchar(255) NOT NULL default '',
+  userid varchar(255) default NULL,
+  ip varchar(16) default NULL,
+  lasttime int(11) default NULL,
+  PRIMARY KEY  (sessionID)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `shelfcontents`
+#
+
+CREATE TABLE shelfcontents (
+  shelfnumber int(11) NOT NULL default '0',
+  itemnumber int(11) NOT NULL default '0',
+  flags int(11) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `statistics`
+#
+
+CREATE TABLE statistics (
+  datetime datetime NOT NULL default '0000-00-00 00:00:00',
+  branch varchar(4) default NULL,
+  proccode varchar(4) default NULL,
+  value double(16,4) default NULL,
+  type varchar(16) default NULL,
+  other text,
+  usercode varchar(10) default NULL,
+  itemnumber int(11) default NULL,
+  itemtype varchar(4) default NULL,
+  borrowernumber int(11) default NULL,
+  KEY timeidx (datetime)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `stopwords`
+#
+
+CREATE TABLE stopwords (
+  word varchar(255) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `subscription`
+#
+
+CREATE TABLE subscription (
+  biblionumber int(11) NOT NULL default '0',
+  subscriptionid int(11) NOT NULL auto_increment,
+  librarian varchar(100) default '',
+  startdate date default '0000-00-00',
+  aqbooksellerid int(11) default '0',
+  cost int(11) default '0',
+  aqbudgetid int(11) default '0',
+  weeklength tinyint(4) default '0',
+  monthlength tinyint(4) default '0',
+  numberlength tinyint(4) default '0',
+  periodicity tinyint(4) default '0',
+  dow varchar(100) default '',
+  numberingmethod varchar(100) default '',
+  notes text,
+  status varchar(100) NOT NULL default '',
+  add1 int(11) default '0',
+  every1 int(11) default '0',
+  whenmorethan1 int(11) default '0',
+  setto1 int(11) default NULL,
+  lastvalue1 int(11) default NULL,
+  add2 int(11) default '0',
+  every2 int(11) default '0',
+  whenmorethan2 int(11) default '0',
+  setto2 int(11) default NULL,
+  lastvalue2 int(11) default NULL,
+  add3 int(11) default '0',
+  every3 int(11) default '0',
+  innerloop1 int(11) default '0',
+  innerloop2 int(11) default '0',
+  innerloop3 int(11) default '0',
+  whenmorethan3 int(11) default '0',
+  setto3 int(11) default NULL,
+  lastvalue3 int(11) default NULL,
+  PRIMARY KEY  (subscriptionid)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `subscriptionhistory`
+#
+
+CREATE TABLE subscriptionhistory (
+  biblionumber int(11) NOT NULL default '0',
+  subscriptionid int(11) NOT NULL default '0',
+  histstartdate date NOT NULL default '0000-00-00',
+  enddate date default '0000-00-00',
+  missinglist longtext NOT NULL,
+  recievedlist longtext NOT NULL,
+  opacnote varchar(150) NOT NULL default '',
+  librariannote varchar(150) NOT NULL default '',
+  PRIMARY KEY  (subscriptionid),
+  KEY biblionumber (biblionumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `suggestions`
+#
+
+CREATE TABLE suggestions (
+  suggestionid int(8) NOT NULL auto_increment,
+  suggestedby int(11) NOT NULL default '0',
+  managedby int(11) default NULL,
+  STATUS varchar(10) NOT NULL default '',
+  note text,
+  author varchar(80) default NULL,
+  title varchar(80) default NULL,
+  copyrightdate smallint(6) default NULL,
+  publishercode varchar(255) default NULL,
+  date timestamp(8) NOT NULL,
+  volumedesc varchar(255) default NULL,
+  publicationyear smallint(6) default '0',
+  place varchar(255) default NULL,
+  isbn varchar(10) default NULL,
+  mailoverseeing smallint(1) default '0',
+  biblionumber int(11) default NULL,
+  PRIMARY KEY  (suggestionid),
+  KEY suggestedby (suggestedby),
+  KEY managedby (managedby)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `systempreferences`
+#
+
+CREATE TABLE systempreferences (
+  variable varchar(50) NOT NULL default '',
+  value text,
+  options text,
+  explanation varchar(80) default NULL,
+  type varchar(20) default NULL,
+  PRIMARY KEY  (variable)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `uploadedmarc`
+#
+
+CREATE TABLE uploadedmarc (
+  id int(11) NOT NULL auto_increment,
+  marc longblob,
+  hidden smallint(6) default NULL,
+  name varchar(255) default NULL,
+  PRIMARY KEY  (id)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `userflags`
+#
+
+CREATE TABLE userflags (
+  bit int(11) NOT NULL default '0',
+  flag char(30) default NULL,
+  flagdesc char(255) default NULL,
+  defaulton int(11) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `users`
+#
+
+CREATE TABLE users (
+  usercode varchar(10) default NULL,
+  username text,
+  password text,
+  level smallint(6) default NULL
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `websites`
+#
+
+CREATE TABLE websites (
+  websitenumber int(11) NOT NULL auto_increment,
+  biblionumber int(11) NOT NULL default '0',
+  title text,
+  description text,
+  url varchar(255) default NULL,
+  PRIMARY KEY  (websitenumber)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `z3950queue`
+#
+
+CREATE TABLE z3950queue (
+  id int(11) NOT NULL auto_increment,
+  term text,
+  type varchar(10) default NULL,
+  startdate int(11) default NULL,
+  enddate int(11) default NULL,
+  done smallint(6) default NULL,
+  results longblob,
+  numrecords int(11) default NULL,
+  servers text,
+  identifier varchar(30) default NULL,
+  PRIMARY KEY  (id)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `z3950results`
+#
+
+CREATE TABLE z3950results (
+  id int(11) NOT NULL auto_increment,
+  queryid int(11) default NULL,
+  server varchar(255) default NULL,
+  startdate int(11) default NULL,
+  enddate int(11) default NULL,
+  results longblob,
+  numrecords int(11) default NULL,
+  numdownloaded int(11) default NULL,
+  highestseen int(11) default NULL,
+  active smallint(6) default NULL,
+  PRIMARY KEY  (id),
+  UNIQUE KEY query_server (queryid,server)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Structure de la table `z3950servers`
+#
+
+CREATE TABLE z3950servers (
+  host varchar(255) default NULL,
+  port int(11) default NULL,
+  db varchar(255) default NULL,
+  userid varchar(255) default NULL,
+  password varchar(255) default NULL,
+  name text,
+  id int(11) NOT NULL auto_increment,
+  checked smallint(6) default NULL,
+  rank int(11) default NULL,
+  syntax varchar(80) default NULL,
+  PRIMARY KEY  (id)
+) TYPE=MyISAM;
+

Index: koha-tmpl/intranet-tmpl/default/en/installer/step1.tmpl
===================================================================
RCS file: koha-tmpl/intranet-tmpl/default/en/installer/step1.tmpl
diff -N koha-tmpl/intranet-tmpl/default/en/installer/step1.tmpl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ koha-tmpl/intranet-tmpl/default/en/installer/step1.tmpl	16 Feb 2007 12:53:31 -0000	1.1.2.1
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+
+  <meta content="text/html; charset=UTF-8" http-equiv="content-type">
+  <title>Koha Installer</title>
+
+
+</head>
+<body>
+
+<h1>Welcome to Koha Installer</h1>
+
+<!--TMPL_UNLESS Name="language"-->
+<p>You are about to install Koha.</p>
+<form name="language" method="POST">
+<p>Pick up your language :<br />
+
+<select name="language">
+  <!--TMPL_LOOP Name="languages"-->
+  <option value="<!--TMPL_VAR Name="value" -->""><!--TMPL_VAR Name="description"-->
+<!--   </option> -->
+  <!--/TMPL_LOOP -->
+</select>
+</p>
+
+<p> And click Next to continue <input value="Next &gt;&gt;" type="submit"></p>
+</form>
+<!--/TMPL_UNLESS-->
+<!--TMPL_IF Name="language"-->
+  <!--TMPL_UNLESS Name="checkmodule"-->
+  <!--TMPL_IF Name="missing"-->
+  <p>Some perl modules are missing.<br />
+  <ul>
+  <!--TMPL_LOOP Name="missing"-->
+    <li><!--TMPL_VAR Name="name"-->
+    <!--TMPL_IF Name="usagemail"-->
+      <br/> This module is used whenever Koha has to send a mail.
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="usagebarcode"-->
+      <br/> This module is needed if you intend to print barcodes.
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="usagespine"-->
+      <br/> This module is needed if you intend to print spine labels.
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="usageLDAP"-->
+      <br/> This module is needed if you intend to use LDAP connexions.
+    <!--/TMPL_IF-->
+    </li>
+  <!--/TMPL_LOOP-->
+  Please consider installing them using these commands before getting further.
+  <pre>
+  <!--TMPL_LOOP Name="missing"-->
+    perl -MCPAN -e "install <!--TMPL_VAR Name="name"-->";
+  <!--/TMPL_LOOP-->
+  </pre>
+  <!--/TMPL_IF-->
+  <!--TMPL_IF Name="problems"-->
+  <p>Some problems occured.<br />
+    <!--TMPL_IF Name="perlversion"-->
+      <p>Your perl version seems to be obsolete.<br />
+      Consider upgrading</p>
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="perllocation"-->
+      <p>Your perl installation is not in /usr/bin/.<br />
+      You may have problems.</p>
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="zebra"-->
+      <p>Zebra server doesnot seem to be installed.<br />
+      Please consider installing it before getting further.</p>
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="mysql"-->
+      <p>Mysql server doesnot seem to be installed.<br />
+      Please consider installing it before getting further.</p>
+    <!--/TMPL_IF-->
+    <!--TMPL_IF Name="yaz"-->
+      <p>YAZ doesnot seem to be installed.<br />
+      It is required for research.<br />
+      Please consider installing it before getting further.</p>
+    <!--/TMPL_IF-->
+  <!--/TMPL_IF-->
+  <!--/TMPL_UNLESS-->
+  <!--TMPL_IF Name="checkmodule"-->
+<form name="checkmodules" action="install.pl">
+<p> All Modules and third-party softwares installed OK
+</p>
+<input type="hidden" name="step" value="2" />
+<p> Click next to continue<input value="Next &gt;&gt;" type="submit"></p>
+</form>
+  <!--/TMPL_IF-->
+<!--/TMPL_IF-->
+</body>
+</html>

Index: koha-tmpl/intranet-tmpl/default/en/installer/step2.tmpl
===================================================================
RCS file: koha-tmpl/intranet-tmpl/default/en/installer/step2.tmpl
diff -N koha-tmpl/intranet-tmpl/default/en/installer/step2.tmpl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ koha-tmpl/intranet-tmpl/default/en/installer/step2.tmpl	16 Feb 2007 12:53:31 -0000	1.1.2.1
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+
+  <meta content="text/html; charset=UTF-8" http-equiv="content-type">
+  <title>Koha Installer</title>
+
+
+</head>
+<body>
+<style type="text/css">
+#bloc25, .bloc25 {
+	float:left;
+	border:1px solid #000000;
+	margin:0px;
+	padding:0px;
+}
+</style>
+<h1>Welcome to Koha Installer</h1>
+
+<div id="bloc25"><h2 align="center">Mysql connection information</h2>
+<p>
+<em>database name : </em><!--TMPL_VAR Name="dbname"-->
+</p>
+<p>
+<em>database host : </em><!--TMPL_VAR Name="hostname"-->
+</p>
+<p>
+<em>database port : </em><!--TMPL_VAR Name="port"-->
+</p>
+<p>
+<em>database user : </em><!--TMPL_VAR Name="user"-->
+</p>
+</div>
+<div id="bloc25">
+<!--TMPL_IF Name="mysqlconnection"-->
+<form name="checkmysqlparameters" type="POST" action="install.pl">
+  <!--TMPL_IF Name="checkdatabaseaccess"-->
+  <p>Can Connect OK</p>
+     <!--TMPL_IF Name="checkdatabasecreated"-->
+  <p>database <!--TMPL_VAR Name="dbname"--> created OK</p>
+        <!--TMPL_IF Name="checkgrantaccess"-->
+  <p>user <!--TMPL_VAR Name="user"--> has all required privileges on database <!--TMPL_VAR Name="dbname"--> OK</p>
+        <!--TMPL_ELSE-->
+  <p class="error">user <!--TMPL_VAR Name="user"--> doesnot have enough privilege on database <!--TMPL_VAR Name="dbname"--> </p>
+  <p class="tip"> Ask for or make a change in user privileges <br />see <a href=http://dev.mysql.com/doc/refman/4.1/en/grant.html>this page</a> and ask for usage insert update delete drop and create access for user <!--TMPL_VAR Name="user"-->  on <!--TMPL_VAR Name="dbname"--></p>
+        <!--/TMPL_IF-->
+      <!--TMPL_ELSE-->
+  <p class="error">No database <!--TMPL_VAR Name="dbname"--> detected on system</p>
+  <p class="tip">Ask for or create Database in mysql database management system</p>
+      <!--/TMPL_IF-->
+   <!--TMPL_ELSE-->
+    <div class="error"><!--TMPL_VAR name="error"--> : <!--TMPL_VAR Name="message"-->
+    </div>
+    <div class="tip">Problem can come out from various reasons :
+      <ul><li> Check mysql server is up and running.</li>
+      <li>Check data entered in koha.xml </li>
+      <li>Check hostname in koha.xml.<br /> Some Linux mysql servers donot use localhost but ip adress :127.0.0.1</li>
+      </div>
+  <!--/TMPL_IF-->
+<input type="hidden" name="step" value="3" />
+<p> Click Next to continue <input value="Next &gt;&gt;" type="submit"></p>
+</form>
+<!--TMPL_ELSE-->
+<form name="checkinformation" type="POST" action="install.pl">
+<input type="hidden" name="step" value="2" />
+<input type="hidden" name="checkmysql" value="1" />
+<p> Click Next to continue if information are valid <input value="Next &gt;&gt;" type="submit"></p>
+</form>
+<!--/TMPL_IF-->
+</div>
+</body>
+</html>

Index: koha-tmpl/intranet-tmpl/default/en/installer/step3.tmpl
===================================================================
RCS file: koha-tmpl/intranet-tmpl/default/en/installer/step3.tmpl
diff -N koha-tmpl/intranet-tmpl/default/en/installer/step3.tmpl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ koha-tmpl/intranet-tmpl/default/en/installer/step3.tmpl	16 Feb 2007 12:53:31 -0000	1.1.2.1
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+
+  <meta content="text/html; charset=UTF-8" http-equiv="content-type">
+  <title>Koha Installer</title>
+
+
+<!--TMPL_IF Name="selectframeworks"-->
+<script language="JavaScript">
+<!--
+
+var sURL = unescape(window.location.pathname);
+
+function doLoad()
+{
+    // the timeout value should be the same as in the "refresh" meta-tag
+    setTimeout( "refresh()", 2*1000 );
+}
+
+function refresh(value)
+{
+    //  This version of the refresh function will cause a new
+    //  entry in the visitor's history.  It is provided for
+    //  those browsers that only support JavaScript 1.0.
+    //
+    sURL=sURL+'?step=3&op=selectframeworks&fwklanguage='+value;
+    window.location.href = sURL;
+}
+
+//-->
+</script>
+
+<script language="JavaScript1.1">
+<!--
+function refresh(value)
+{
+    //  This version does NOT cause an entry in the browser's
+    //  page view history.  Most browsers will always retrieve
+    //  the document from the web-server whether it is already
+    //  in the browsers page-cache or not.
+    //  
+    sURL=sURL+'?step=3&op=selectframeworks&fwklanguage='+value;
+    window.location.replace( sURL );
+}
+//-->
+</script>
+
+<script language="JavaScript1.2">
+<!--
+function refresh(value)
+{
+    //  This version of the refresh function will be invoked
+    //  for browsers that support JavaScript version 1.2
+    //
+    
+    //  The argument to the location.reload function determines
+    //  if the browser should retrieve the document from the
+    //  web-server.  In our example all we need to do is cause
+    //  the JavaScript block in the document body to be
+    //  re-evaluated.  If we needed to pull the document from
+    //  the web-server again (such as where the document contents
+    //  change dynamically) we would pass the argument as 'true'.
+    //  
+    sURL=sURL+'?step=3&op=selectframeworks&fwklanguage='+value;
+    window.location.replace( sURL );
+}
+//-->
+</script>
+</head>
+<body>
+<script language="JavaScript">
+function Hide(link) {
+	subfield = document.getElementById('bloc'+link);
+    var initstyle=subfield.style.display;
+	if (initstyle == 'block') subfield.style.display = 'none' ;
+	if (initstyle == 'none') subfield.style.display = 'block' ;
+}
+</script>
+<!--/TMPL_IF-->
+<style type="text/css">
+#bloc25, .bloc25 {
+	float:left;
+	border:1px solid #000000;
+	margin:0px;
+	padding:0px;
+}
+</style>
+<h1>Welcome to Koha Installer</h1>
+
+<!--TMPL_IF Name="selectframeworks"-->
+  <h2 align="center">Select Dataset</h2>
+  <form name="frameworkselection" method="POST" action="install.pl">
+  <input type="hidden" name="step" value="3" />
+  <input type="hidden" name="op" value="addframeworks" />
+  <p>Select Language first :</p>
+  <p><select name="fwklanguage" onchange="javascript:refresh(this.value)">
+  <!--TMPL_LOOP Name="languagelist" -->
+  <!--TMPL_IF Name="checked"--><option value="<!--TMPL_VAR Name="dirname"-->" selected ><!--TMPL_VAR Name="languagedescription"--></option>
+  <!--TMPL_ELSE--><option value="<!--TMPL_VAR Name="dirname"-->"><!--TMPL_VAR Name="languagedescription"--></option>
+  <!--/TMPL_IF-->
+  <!--/TMPL_LOOP-->
+  </select>
+  </p>
+  <p><!--TMPL_LOOP Name="levelloop"-->
+  <a id="link<!--TMPL_VAR Name="code"-->" style="color: grey; font-size: 80%; cursor: se-resize;"  onclick="Hide('<!--TMPL_VAR Name="code"-->')">
+  <!--TMPL_VAR Name="label"--></a>
+  <!--/TMPL_LOOP-->
+  </p>
+  <p>
+  <!--TMPL_LOOP Name="levelloop"-->
+  <div id="bloc<!--TMPL_VAR Name="code"-->" style="display:none" class="bloc25">
+  <h3><!--TMPL_VAR Name="label"--></h3>
+  <!--TMPL_LOOP Name="frameworks"-->
+    <p><em><!--TMPL_VAR Name="fwkname"--></em>
+    <!--TMPL_IF Name="mandatory"--><input type="checkbox" Name="framework" value="<!--TMPL_VAR Name="fwkfile"-->" checked />
+    <!--TMPl_ELSE--><input type="checkbox" Name="framework" value="<!--TMPL_VAR Name="fwkfile"-->" />
+    <!--/TMPL_IF--><br />
+    <!--TMPL_VAR Name="fwkdescription"-->
+    </p>
+  <!--/TMPL_LOOP-->
+  </div>
+  </p>
+  <!--/TMPL_LOOP-->
+  <p><input type="submit" value="import" />
+  </p>
+  </form>
+  </p>
+<!--/TMPL_IF-->
+<!--TMPL_IF Name="addframeworks"-->
+  <h2 align="center">Data added</h2>
+  <p>Language :<!--TMPL_VAR Name="fwklanguage"--></p>
+  <!--TMPL_LOOP Name="list"-->
+  <h3> <!--TMPL_VAR Name="level"--></h3>
+  <p>
+  <ul>
+  <!--TMPL_LOOP Name="fwklist"-->
+    <li><!--TMPL_VAR Name="fwkname"--><!--TMPL_IF Name="error"--><br /><font color="red"><b></b><!--TMPL_VAR Name="error"--></font><!--/TMPL_IF--> </li>
+  <!--/TMPL_LOOP-->
+  </ul>
+  </p>
+  <!--/TMPL_LOOP-->
+  <p>Installation complete.<br/>
+    <p>Click on Finish to close the process, change access lists so that these operations are unreachable, and get to Koha Interface.
+    <form name="finish">
+    <input type="hidden" name="step" value="3" />
+    <input type="hidden" name="op" value="finish" />
+    <input type="submit" value="Finish" /></form>
+    </p>
+  </p>
+<!--/TMPL_IF-->
+<!--TMPL_IF Name="proposeimport"-->
+  <div id="bloc25"><h2 align="center">Import the database structure ?</h2>
+<a href="install.pl?step=3&amp;op=importdatastructure" class="button">Import</a>
+  </div>
+<!--/TMPL_IF-->
+<!--TMPL_IF Name="default"-->
+  <div id="bloc25"><h2 align="center">Update</h2>
+  <p>Database structure OK</p>
+<a href="install.pl?step=3&amp;op=updatestructure" class="button">update</a>  <a href="install.pl?step=3&amp;op=selectframeworks" class="button">Skip to datasets Import</a>
+  </div>
+<!--/TMPL_IF-->
+<!--TMPL_IF Name="updatestructure"-->
+  <div id="bloc25"><h2 align="center">Updating Mysql database</h2>
+  <!--TMPL_IF Name="updatereport"-->
+    <p>Update report :</p>
+    <p>
+    <!--TMPL_VAR Name="updatereport"-->
+    </p>
+  <!--TMPL_ELSE-->
+    <p>Everything went OK.</p>
+  <!--/TMPL_IF-->
+<a href="install.pl?step=3&amp;op=selectframeworks" class="button">Nex Step is Framework Selection</a>
+  </div>
+<!--/TMPL_IF-->
+</body>
+</html>





More information about the Koha-cvs mailing list