Anzeige der Rechnungstypen: Aufteilung der Stornorechnung in die ursprüngliche Rechnu...
[kivitendo-erp.git] / SL / User.pm
index c992012..93c8883 100644 (file)
 
 package User;
 
 
 package User;
 
+use IO::File;
+use Fcntl qw(:seek);
+
 use SL::DBUpgrade2;
 use SL::DBUpgrade2;
+use SL::DBUtils;
+use SL::Iconv;
 
 sub new {
   $main::lxdebug->enter_sub();
 
 sub new {
   $main::lxdebug->enter_sub();
@@ -87,9 +92,9 @@ sub country_codes {
   my @language = ();
 
   # scan the locale directory and read in the LANGUAGE files
   my @language = ();
 
   # scan the locale directory and read in the LANGUAGE files
-  opendir DIR, "locale";
+  opendir(DIR, "locale");
 
 
-  my @dir = grep !/(^\.\.?$|\..*)/, readdir DIR;
+  my @dir = grep(!/(^\.\.?$|\..*)/, readdir(DIR));
 
   foreach my $dir (@dir) {
     next unless open(FH, "locale/$dir/LANGUAGE");
 
   foreach my $dir (@dir) {
     next unless open(FH, "locale/$dir/LANGUAGE");
@@ -133,7 +138,7 @@ sub login {
     }
 
     do "$userspath/$self->{login}.conf";
     }
 
     do "$userspath/$self->{login}.conf";
-    $myconfig{dbpasswd} = unpack 'u', $myconfig{dbpasswd};
+    $myconfig{dbpasswd} = unpack('u', $myconfig{dbpasswd});
 
     # check if database is down
     my $dbh =
 
     # check if database is down
     my $dbh =
@@ -151,18 +156,14 @@ sub login {
 
     # add login to employee table if it does not exist
     # no error check for employee table, ignore if it does not exist
 
     # add login to employee table if it does not exist
     # no error check for employee table, ignore if it does not exist
-    $query = qq|SELECT e.id FROM employee e WHERE e.login = '$self->{login}'|;
-    $sth   = $dbh->prepare($query);
-    $sth->execute;
-
-    my ($login) = $sth->fetchrow_array;
-    $sth->finish;
+    $query = qq|SELECT id FROM employee WHERE login = ?|;
+    my ($login) = selectrow_query($form, $dbh, $query, $self->{login});
 
     if (!$login) {
 
     if (!$login) {
-      $query = qq|INSERT INTO employee (login, name, workphone, role)
-                  VALUES ('$self->{login}', '$myconfig{name}',
-                 '$myconfig{tel}', 'user')|;
-      $dbh->do($query);
+      $query = qq|INSERT INTO employee (login, name, workphone, role)| .
+               qq|VALUES (?, ?, ?, ?)|;
+      my @values = ($self->{login}, $myconfig{name}, $myconfig{tel}, "user");
+      do_query($form, $dbh, $query, @values);
     }
 
     $self->create_schema_info_table($form, $dbh);
     }
 
     $self->create_schema_info_table($form, $dbh);
@@ -298,10 +299,11 @@ sub dbsources {
     or $form->dberror;
 
   if ($form->{dbdriver} eq 'Pg') {
     or $form->dberror;
 
   if ($form->{dbdriver} eq 'Pg') {
-
-    $query = qq|SELECT datname FROM pg_database WHERE NOT ((datname = 'template0') OR (datname = 'template1'))|;
-    $sth   = $dbh->prepare($query);
-    $sth->execute || $form->dberror($query);
+    $query =
+      qq|SELECT datname FROM pg_database | .
+      qq|WHERE NOT datname IN ('template0', 'template1')|;
+    $sth = $dbh->prepare($query);
+    $sth->execute() || $form->dberror($query);
 
     while (my ($db) = $sth->fetchrow_array) {
 
 
     while (my ($db) = $sth->fetchrow_array) {
 
@@ -314,28 +316,29 @@ sub dbsources {
           DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
           or $form->dberror;
 
           DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
           or $form->dberror;
 
-        $query = qq|SELECT p.tablename FROM pg_tables p
-                   WHERE p.tablename = 'defaults'
-                   AND p.tableowner = '$form->{dbuser}'|;
+        $query =
+          qq|SELECT tablename FROM pg_tables | .
+          qq|WHERE (tablename = 'defaults') AND (tableowner = ?)|;
         my $sth = $dbh->prepare($query);
         my $sth = $dbh->prepare($query);
-        $sth->execute || $form->dberror($query);
+        $sth->execute($form->{dbuser}) ||
+          $form->dberror($query . " ($form->{dbuser})");
 
         if ($sth->fetchrow_array) {
 
         if ($sth->fetchrow_array) {
-          push @dbsources, $db;
+          push(@dbsources, $db);
         }
         $sth->finish;
         $dbh->disconnect;
         next;
       }
         }
         $sth->finish;
         $dbh->disconnect;
         next;
       }
-      push @dbsources, $db;
+      push(@dbsources, $db);
     }
   }
 
   if ($form->{dbdriver} eq 'Oracle') {
     if ($form->{only_acc_db}) {
     }
   }
 
   if ($form->{dbdriver} eq 'Oracle') {
     if ($form->{only_acc_db}) {
-      $query = qq|SELECT o.owner FROM dba_objects o
-                 WHERE o.object_name = 'DEFAULTS'
-                 AND o.object_type = 'TABLE'|;
+      $query =
+        qq|SELECT owner FROM dba_objects | .
+        qq|WHERE object_name = 'DEFAULTS' AND object_type = 'TABLE'|;
     } else {
       $query = qq|SELECT username FROM dba_users|;
     }
     } else {
       $query = qq|SELECT username FROM dba_users|;
     }
@@ -344,7 +347,7 @@ sub dbsources {
     $sth->execute || $form->dberror($query);
 
     while (my ($db) = $sth->fetchrow_array) {
     $sth->execute || $form->dberror($query);
 
     while (my ($db) = $sth->fetchrow_array) {
-      push @dbsources, $db;
+      push(@dbsources, $db);
     }
   }
 
     }
   }
 
@@ -366,11 +369,12 @@ sub dbcreate {
   my $dbh =
     DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
     or $form->dberror;
   my $dbh =
     DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
     or $form->dberror;
-
+  $form->{db} =~ s/\"//g;
   my %dbcreate = (
     'Pg'     => qq|CREATE DATABASE "$form->{db}"|,
     'Oracle' =>
   my %dbcreate = (
     'Pg'     => qq|CREATE DATABASE "$form->{db}"|,
     'Oracle' =>
-      qq|CREATE USER "$form->{db}" DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP IDENTIFIED BY "$form->{db}"|
+    qq|CREATE USER "$form->{db}" DEFAULT TABLESPACE USERS | .
+    qq|TEMPORARY TABLESPACE TEMP IDENTIFIED BY "$form->{db}"|
   );
 
   my %dboptions = (
   );
 
   my %dboptions = (
@@ -385,14 +389,14 @@ sub dbcreate {
     push(@{$dboptions{"Pg"}}, "TEMPLATE = $dbdefault");
   }
 
     push(@{$dboptions{"Pg"}}, "TEMPLATE = $dbdefault");
   }
 
-  my $query = qq|$dbcreate{$form->{dbdriver}}|;
+  my $query = $dbcreate{$form->{dbdriver}};
   $query .= " WITH " . join(" ", @{$dboptions{"Pg"}}) if (@{$dboptions{"Pg"}});
 
   $query .= " WITH " . join(" ", @{$dboptions{"Pg"}}) if (@{$dboptions{"Pg"}});
 
-  $dbh->do($query) || $form->dberror($query);
+  do_query($form, $dbh, $query);
 
   if ($form->{dbdriver} eq 'Oracle') {
 
   if ($form->{dbdriver} eq 'Oracle') {
-    $query = qq|GRANT CONNECT,RESOURCE TO "$form->{db}"|;
-    $dbh->do($query) || $form->dberror($query);
+    $query = qq|GRANT CONNECT, RESOURCE TO "$form->{db}"|;
+    do_query($form, $dbh, $query);
   }
   $dbh->disconnect;
 
   }
   $dbh->disconnect;
 
@@ -407,21 +411,17 @@ sub dbcreate {
   $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
     or $form->dberror;
 
   $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
     or $form->dberror;
 
-  # create the tables
-  my $filename = qq|sql/lx-office.sql|;
-  $self->process_query($form, $dbh, $filename);
+  my $db_charset = $Common::db_encoding_to_charset{$form->{encoding}};
+  $db_charset ||= Common::DEFAULT_CHARSET;
 
 
-  # load gifi
-  ($filename) = split /_/, $form->{chart};
-  $filename =~ s/_//;
-  $self->process_query($form, $dbh, "sql/${filename}-gifi.sql");
+  # create the tables
+  $self->process_query($form, $dbh, "sql/lx-office.sql", undef, $db_charset);
 
   # load chart of accounts
 
   # load chart of accounts
-  $filename = qq|sql/$form->{chart}-chart.sql|;
-  $self->process_query($form, $dbh, $filename);
+  $self->process_query($form, $dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset);
 
 
-  $query = "UPDATE defaults SET coa = " . $dbh->quote($form->{"chart"});
-  $dbh->do($query) || $form->dberror($query);
+  $query = "UPDATE defaults SET coa = ?";
+  do_query($form, $dbh, $query, $form->{chart});
 
   $dbh->disconnect;
 
 
   $dbh->disconnect;
 
@@ -436,11 +436,31 @@ sub dbcreate {
 sub process_perl_script {
   $main::lxdebug->enter_sub();
 
 sub process_perl_script {
   $main::lxdebug->enter_sub();
 
-  my ($self, $form, $dbh, $filename, $version_or_control) = @_;
+  my ($self, $form, $dbh, $filename, $version_or_control, $db_charset) = @_;
 
 
-  open(FH, "$filename") or $form->error("$filename : $!\n");
-  my $contents = join("", <FH>);
-  close(FH);
+  my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n");
+
+  my $file_charset = Common::DEFAULT_CHARSET;
+
+  if (ref($version_or_control) eq "HASH") {
+    $file_charset = $version_or_control->{charset};
+
+  } else {
+    while (<$fh>) {
+      last if !/^--/;
+      next if !/^--\s*\@charset:\s*(.+)/;
+      $file_charset = $1;
+      last;
+    }
+    $fh->seek(0, SEEK_SET);
+  }
+
+  my $contents = join "", <$fh>;
+  $fh->close();
+
+  $db_charset ||= Common::DEFAULT_CHARSET;
+
+  my $iconv = SL::Iconv::get_converter($file_charset, $db_charset);
 
   $dbh->begin_work();
 
 
   $dbh->begin_work();
 
@@ -486,18 +506,28 @@ sub process_perl_script {
 sub process_query {
   $main::lxdebug->enter_sub();
 
 sub process_query {
   $main::lxdebug->enter_sub();
 
-  my ($self, $form, $dbh, $filename, $version_or_control) = @_;
+  my ($self, $form, $dbh, $filename, $version_or_control, $db_charset) = @_;
 
 
-  #  return unless (-f $filename);
-
-  open(FH, "$filename") or $form->error("$filename : $!\n");
+  my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n");
   my $query = "";
   my $sth;
   my @quote_chars;
 
   my $query = "";
   my $sth;
   my @quote_chars;
 
+  my $file_charset = Common::DEFAULT_CHARSET;
+  while (<$fh>) {
+    last if !/^--/;
+    next if !/^--\s*\@charset:\s*(.+)/;
+    $file_charset = $1;
+    last;
+  }
+  $fh->seek(0, SEEK_SET);
+
+  $db_charset ||= Common::DEFAULT_CHARSET;
+
   $dbh->begin_work();
 
   $dbh->begin_work();
 
-  while (<FH>) {
+  while (<$fh>) {
+    $_ = SL::Iconv::convert($file_charset, $db_charset, $_);
 
     # Remove DOS and Unix style line endings.
     chomp;
 
     # Remove DOS and Unix style line endings.
     chomp;
@@ -528,7 +558,9 @@ sub process_query {
             my $errstr = $dbh->errstr;
             $sth->finish();
             $dbh->rollback();
             my $errstr = $dbh->errstr;
             $sth->finish();
             $dbh->rollback();
-            $form->dberror("The database update/creation did not succeed. The file ${filename} containing the following query failed:<br>${query}<br>" .
+            $form->dberror("The database update/creation did not succeed. " .
+                           "The file ${filename} containing the following " .
+                           "query failed:<br>${query}<br>" .
                            "The error message was: ${errstr}<br>" .
                            "All changes in that file have been reverted.");
           }
                            "The error message was: ${errstr}<br>" .
                            "All changes in that file have been reverted.");
           }
@@ -553,7 +585,7 @@ sub process_query {
   }
   $dbh->commit();
 
   }
   $dbh->commit();
 
-  close FH;
+  $fh->close();
 
   $main::lxdebug->leave_sub();
 }
 
   $main::lxdebug->leave_sub();
 }
@@ -562,17 +594,17 @@ sub dbdelete {
   $main::lxdebug->enter_sub();
 
   my ($self, $form) = @_;
   $main::lxdebug->enter_sub();
 
   my ($self, $form) = @_;
-
+  $form->{db} =~ s/\"//g;
   my %dbdelete = ('Pg'     => qq|DROP DATABASE "$form->{db}"|,
   my %dbdelete = ('Pg'     => qq|DROP DATABASE "$form->{db}"|,
-                  'Oracle' => qq|DROP USER $form->{db} CASCADE|);
+                  'Oracle' => qq|DROP USER "$form->{db}" CASCADE|);
 
   $form->{sid} = $form->{dbdefault};
   &dbconnect_vars($form, $form->{dbdefault});
   my $dbh =
     DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
     or $form->dberror;
 
   $form->{sid} = $form->{dbdefault};
   &dbconnect_vars($form, $form->{dbdefault});
   my $dbh =
     DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
     or $form->dberror;
-  my $query = qq|$dbdelete{$form->{dbdriver}}|;
-  $dbh->do($query) || $form->dberror($query);
+  my $query = $dbdelete{$form->{dbdriver}};
+  do_query($form, $dbh, $query);
 
   $dbh->disconnect;
 
 
   $dbh->disconnect;
 
@@ -634,11 +666,10 @@ sub dbneedsupdate {
 
   if ($form->{dbdriver} eq 'Pg') {
 
 
   if ($form->{dbdriver} eq 'Pg') {
 
-    $query = qq|SELECT d.datname FROM pg_database d, pg_user u
-                WHERE d.datdba = u.usesysid
-               AND u.usename = '$form->{dbuser}'|;
-    my $sth = $dbh->prepare($query);
-    $sth->execute || $form->dberror($query);
+    $query =
+      qq|SELECT d.datname FROM pg_database d, pg_user u | .
+      qq|WHERE d.datdba = u.usesysid AND u.usename = ?|;
+    my $sth = prepare_execute_query($form, $dbh, $query, $form->{dbuser});
 
     while (my ($db) = $sth->fetchrow_array) {
 
 
     while (my ($db) = $sth->fetchrow_array) {
 
@@ -646,35 +677,30 @@ sub dbneedsupdate {
 
       &dbconnect_vars($form, $db);
 
 
       &dbconnect_vars($form, $db);
 
-      my $dbh =
+      my $dbh2 =
         DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
         or $form->dberror;
 
         DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
         or $form->dberror;
 
-      $query = qq|SELECT t.tablename FROM pg_tables t
-                 WHERE t.tablename = 'defaults'|;
-      my $sth = $dbh->prepare($query);
-      $sth->execute || $form->dberror($query);
+      $query =
+        qq|SELECT tablename FROM pg_tables | .
+        qq|WHERE tablename = 'defaults'|;
+      my $sth2 = prepare_execute_query($form, $dbh, $query);
 
 
-      if ($sth->fetchrow_array) {
+      if ($sth2->fetchrow_array) {
         $query = qq|SELECT version FROM defaults|;
         $query = qq|SELECT version FROM defaults|;
-        my $sth = $dbh->prepare($query);
-        $sth->execute;
-
-        if (my ($version) = $sth->fetchrow_array) {
-          $dbsources{$db} = $version;
-        }
-        $sth->finish;
+        my ($version) = selectrow_query($form, $dbh2, $query);
+        $dbsources{$db} = $version;
       }
       }
-      $sth->finish;
-      $dbh->disconnect;
+      $sth2->finish;
+      $dbh2->disconnect;
     }
     $sth->finish;
   }
 
   if ($form->{dbdriver} eq 'Oracle') {
     }
     $sth->finish;
   }
 
   if ($form->{dbdriver} eq 'Oracle') {
-    $query = qq|SELECT o.owner FROM dba_objects o
-               WHERE o.object_name = 'DEFAULTS'
-               AND o.object_type = 'TABLE'|;
+    $query =
+      qq|SELECT owner FROM dba_objects |.
+      qq|WHERE object_name = 'DEFAULTS' AND object_type = 'TABLE'|;
 
     $sth = $dbh->prepare($query);
     $sth->execute || $form->dberror($query);
 
     $sth = $dbh->prepare($query);
     $sth->execute || $form->dberror($query);
@@ -708,7 +734,6 @@ sub dbneedsupdate {
   return %dbsources;
 }
 
   return %dbsources;
 }
 
-## LINET
 sub calc_version {
   $main::lxdebug->enter_sub(2);
 
 sub calc_version {
   $main::lxdebug->enter_sub(2);
 
@@ -750,15 +775,16 @@ sub cmp_script_version {
 
   return $res_a <=> $res_b;
 }
 
   return $res_a <=> $res_b;
 }
-## /LINET
 
 sub update_available {
   my ($dbdriver, $cur_version) = @_;
 
 
 sub update_available {
   my ($dbdriver, $cur_version) = @_;
 
-  opendir SQLDIR, "sql/${dbdriver}-upgrade" or &error("", "sql/${dbdriver}-upgrade: $!");
+  opendir(SQLDIR, "sql/${dbdriver}-upgrade")
+    or &error("", "sql/${dbdriver}-upgrade: $!");
   my @upgradescripts =
   my @upgradescripts =
-    grep(/$form->{dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, readdir(SQLDIR));
-  closedir SQLDIR;
+    grep(/$form->{dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/,
+         readdir(SQLDIR));
+  closedir(SQLDIR);
 
   return ($#upgradescripts > -1);
 }
 
   return ($#upgradescripts > -1);
 }
@@ -770,12 +796,13 @@ sub create_schema_info_table {
 
   my $query = "SELECT tag FROM schema_info LIMIT 1";
   if (!$dbh->do($query)) {
 
   my $query = "SELECT tag FROM schema_info LIMIT 1";
   if (!$dbh->do($query)) {
+    $dbh->rollback();
     $query =
     $query =
-      "CREATE TABLE schema_info (" .
-      "  tag text, " .
-      "  login text, " .
-      "  itime timestamp DEFAULT now(), " .
-      "  PRIMARY KEY (tag))";
+      qq|CREATE TABLE schema_info (| .
+      qq|  tag text, | .
+      qq|  login text, | .
+      qq|  itime timestamp DEFAULT now(), | .
+      qq|  PRIMARY KEY (tag))|;
     $dbh->do($query) || $form->dberror($query);
   }
 
     $dbh->do($query) || $form->dberror($query);
   }
 
@@ -796,16 +823,19 @@ sub dbupdate {
   if ($form->{dbupdate}) {
 
     # read update scripts into memory
   if ($form->{dbupdate}) {
 
     # read update scripts into memory
-    opendir SQLDIR, "sql/" . $form->{dbdriver} . "-upgrade" or &error("", "sql/" . $form->{dbdriver} . "-upgrade : $!");
-    ## LINET
+    opendir(SQLDIR, "sql/" . $form->{dbdriver} . "-upgrade")
+      or &error("", "sql/" . $form->{dbdriver} . "-upgrade : $!");
     @upgradescripts =
       sort(cmp_script_version
     @upgradescripts =
       sort(cmp_script_version
-           grep(/$form->{dbdriver}-upgrade-.*?\.(sql|pl)$/, readdir(SQLDIR)));
-    ## /LINET
-    closedir SQLDIR;
+           grep(/$form->{dbdriver}-upgrade-.*?\.(sql|pl)$/,
+                readdir(SQLDIR)));
+    closedir(SQLDIR);
   }
 
   }
 
-  foreach my $db (split / /, $form->{dbupdate}) {
+  my $db_charset = $main::dbcharset;
+  $db_charset ||= Common::DEFAULT_CHARSET;
+
+  foreach my $db (split(/ /, $form->{dbupdate})) {
 
     next unless $form->{$db};
 
 
     next unless $form->{$db};
 
@@ -819,19 +849,11 @@ sub dbupdate {
 
     # check version
     $query = qq|SELECT version FROM defaults|;
 
     # check version
     $query = qq|SELECT version FROM defaults|;
-    my $sth = $dbh->prepare($query);
-
-    # no error check, let it fall through
-    $sth->execute;
-
-    my $version = $sth->fetchrow_array;
-    $sth->finish;
+    my ($version) = selectrow_query($form, $dbh, $query);
 
     next unless $version;
 
 
     next unless $version;
 
-    ## LINET
     $version = calc_version($version);
     $version = calc_version($version);
-    ## /LINET
 
     foreach my $upgradescript (@upgradescripts) {
       my $a = $upgradescript;
 
     foreach my $upgradescript (@upgradescripts) {
       my $a = $upgradescript;
@@ -840,10 +862,8 @@ sub dbupdate {
 
       my ($mindb, $maxdb) = split /-/, $a;
       my $str_maxdb = $maxdb;
 
       my ($mindb, $maxdb) = split /-/, $a;
       my $str_maxdb = $maxdb;
-      ## LINET
       $mindb = calc_version($mindb);
       $maxdb = calc_version($maxdb);
       $mindb = calc_version($mindb);
       $maxdb = calc_version($maxdb);
-      ## /LINET
 
       next if ($version >= $maxdb);
 
 
       next if ($version >= $maxdb);
 
@@ -853,9 +873,11 @@ sub dbupdate {
       # apply upgrade
       $main::lxdebug->message(DEBUG2, "Applying Update $upgradescript");
       if ($file_type eq "sql") {
       # apply upgrade
       $main::lxdebug->message(DEBUG2, "Applying Update $upgradescript");
       if ($file_type eq "sql") {
-        $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb);
+        $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} .
+                             "-upgrade/$upgradescript", $str_maxdb, $db_charset);
       } else {
       } else {
-        $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb);
+        $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} .
+                                   "-upgrade/$upgradescript", $str_maxdb, $db_charset);
       }
 
       $version = $maxdb;
       }
 
       $version = $maxdb;
@@ -885,6 +907,9 @@ sub dbupdate2 {
 
   @upgradescripts = sort_dbupdate_controls($controls);
 
 
   @upgradescripts = sort_dbupdate_controls($controls);
 
+  my $db_charset = $main::dbcharset;
+  $db_charset ||= Common::DEFAULT_CHARSET;
+
   foreach my $db (split / /, $form->{dbupdate}) {
 
     next unless $form->{$db};
   foreach my $db (split / /, $form->{dbupdate}) {
 
     next unless $form->{$db};
@@ -899,7 +924,7 @@ sub dbupdate2 {
 
     map({ $_->{"applied"} = 0; } @upgradescripts);
 
 
     map({ $_->{"applied"} = 0; } @upgradescripts);
 
-    $query = "SELECT tag FROM schema_info";
+    $query = qq|SELECT tag FROM schema_info|;
     $sth = $dbh->prepare($query);
     $sth->execute() || $form->dberror($query);
     while (($tag) = $sth->fetchrow_array()) {
     $sth = $dbh->prepare($query);
     $sth->execute() || $form->dberror($query);
     while (($tag) = $sth->fetchrow_array()) {
@@ -920,6 +945,8 @@ sub dbupdate2 {
     foreach my $control (@upgradescripts) {
       next if ($control->{"applied"});
 
     foreach my $control (@upgradescripts) {
       next if ($control->{"applied"});
 
+      $control->{description} = SL::Iconv::convert($control->{charset}, $db_charset, $control->{description});
+
       $control->{"file"} =~ /\.(sql|pl)$/;
       my $file_type = $1;
 
       $control->{"file"} =~ /\.(sql|pl)$/;
       my $file_type = $1;
 
@@ -930,10 +957,10 @@ sub dbupdate2 {
 
       if ($file_type eq "sql") {
         $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} .
 
       if ($file_type eq "sql") {
         $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} .
-                             "-upgrade2/$control->{file}", $control);
+                             "-upgrade2/$control->{file}", $control, $db_charset);
       } else {
         $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} .
       } else {
         $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} .
-                                   "-upgrade2/$control->{file}", $control);
+                                   "-upgrade2/$control->{file}", $control, $db_charset);
       }
     }
 
       }
     }
 
@@ -962,7 +989,7 @@ sub update2_available {
 
   my ($query, $tag, $sth);
 
 
   my ($query, $tag, $sth);
 
-  $query = "SELECT tag FROM schema_info";
+  $query = qq|SELECT tag FROM schema_info|;
   $sth = $dbh->prepare($query);
   $sth->execute() || $form->dberror($query);
   while (($tag) = $sth->fetchrow_array()) {
   $sth = $dbh->prepare($query);
   $sth->execute() || $form->dberror($query);
   while (($tag) = $sth->fetchrow_array()) {
@@ -1092,12 +1119,13 @@ sub save_member {
 sub config_vars {
   $main::lxdebug->enter_sub();
 
 sub config_vars {
   $main::lxdebug->enter_sub();
 
-  my @conf = qw(acs address admin businessnumber charset company countrycode
+  my @conf = qw(acs address admin businessnumber company countrycode
     currency dateformat dbconnect dbdriver dbhost dbport dboptions
     dbname dbuser dbpasswd email fax name numberformat password
     currency dateformat dbconnect dbdriver dbhost dbport dboptions
     dbname dbuser dbpasswd email fax name numberformat password
-    printer role sid signature stylesheet tel templates vclimit angebote bestellungen rechnungen
-    anfragen lieferantenbestellungen einkaufsrechnungen taxnumber co_ustid duns menustyle
-    template_format default_media default_printer_id copies show_form_details);
+    printer role sid signature stylesheet tel templates vclimit angebote
+    bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen
+    taxnumber co_ustid duns menustyle template_format default_media
+    default_printer_id copies show_form_details);
 
   $main::lxdebug->leave_sub();
 
 
   $main::lxdebug->leave_sub();