X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FUser.pm;h=2da621694603dc969e6352343bce13d04a4e6bb6;hb=311a645bc3b3a74052c7c0565afaad77961102a8;hp=bf649c8cd432664ad3b827d2b727cfb8fe260ae6;hpb=58fcb69f65a255c0db6741ca7aed0a695cae68c8;p=kivitendo-erp.git diff --git a/SL/User.pm b/SL/User.pm index bf649c8cd..2da621694 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -162,7 +162,7 @@ sub login { $rc = 0; - if ($form->{dbversion} ne $dbversion) { + if (&update_available($myconfig{"dbdriver"}, $dbversion)) { # update the tables open FH, ">$userspath/nologin" or die " @@ -393,7 +393,7 @@ sub dbcreate { sub process_query { $main::lxdebug->enter_sub(); - my ($self, $form, $dbh, $filename) = @_; + my ($self, $form, $dbh, $filename, $version) = @_; # return unless (-f $filename); @@ -402,13 +402,15 @@ sub process_query { my $sth; my @quote_chars; + $dbh->begin_work(); + while () { # Remove DOS and Unix style line endings. - s/[\r\n]//g; + chomp; - # don't add comments or empty lines - next if /^(--.*|\s+)$/; + # remove comments + s/--.*$//; for (my $i = 0; $i < length($_); $i++) { my $char = substr($_, $i, 1); @@ -429,8 +431,15 @@ sub process_query { # Query is complete. Send it. $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - $sth->finish; + if (!$sth->execute()) { + 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:
${query}
" . + "The error message was: ${errstr}
" . + "All changes in that file have been reverted."); + } + $sth->finish(); $char = ""; $query = ""; @@ -441,6 +450,11 @@ sub process_query { } } + if ($version) { + $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version)); + } + $dbh->commit(); + close FH; $main::lxdebug->leave_sub(); @@ -598,7 +612,7 @@ sub dbneedsupdate { ## LINET sub calc_version { - $main::lxdebug->enter_sub(); + $main::lxdebug->enter_sub(2); my (@v, $version, $i); @@ -612,7 +626,7 @@ sub calc_version { $version += $v[$i]; } - $main::lxdebug->leave_sub(); + $main::lxdebug->leave_sub(2); return $version; } @@ -640,6 +654,17 @@ sub cmp_script_version { } ## /LINET +sub update_available { + my ($dbdriver, $cur_version) = @_; + + opendir SQLDIR, "sql/${dbdriver}-upgrade" or &error("", "sql/${dbdriver}-upgrade: $!"); + my @upgradescripts = + grep(/$form->{dbdriver}-upgrade-\Q$cur_version\E.*\.sql/, readdir(SQLDIR)); + closedir SQLDIR; + + return ($#upgradescripts > -1); +} + sub dbupdate { $main::lxdebug->enter_sub(); @@ -654,7 +679,7 @@ sub dbupdate { if ($form->{dbupdate}) { # read update scripts into memory - opendir SQLDIR, "sql/." or $form - error($!); + opendir SQLDIR, "sql/" . $form->{dbdriver} . "-upgrade" or &error("", "sql/" . $form->{dbdriver} . "-upgrade : $!"); ## LINET @upgradescripts = sort(cmp_script_version @@ -696,6 +721,7 @@ sub dbupdate { $a =~ s/^$form->{dbdriver}-upgrade-|\.sql$//g; my ($mindb, $maxdb) = split /-/, $a; + my $str_maxdb = $maxdb; ## LINET $mindb = calc_version($mindb); $maxdb = calc_version($maxdb); @@ -707,7 +733,8 @@ sub dbupdate { last if ($version < $mindb); # apply upgrade - $self->process_query($form, $dbh, "sql/$upgradescript"); + $main::lxdebug->message(DEBUG2, "Appliying Update $upgradescript"); + $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb); $version = $maxdb; @@ -841,7 +868,7 @@ sub config_vars { currency dateformat dbconnect dbdriver dbhost dbport dboptions dbname dbuser dbpasswd email fax name numberformat in_numberformat password printer role sid signature stylesheet tel templates vclimit angebote bestellungen rechnungen - anfragen lieferantenbestellungen einkaufsrechnungen steuernummer ustid duns menustyle); + anfragen lieferantenbestellungen einkaufsrechnungen steuernummer co_ustid duns menustyle); $main::lxdebug->leave_sub();