From: Sven Schöling Date: Thu, 30 Dec 2010 14:39:54 +0000 (+0100) Subject: Merge branch 'master' of ssh://lx-office/~/lx-office-erp X-Git-Tag: release-2.6.2beta1~28 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/9f8a3ead2d89585f1e19422e016e7bbc9fa1efe0?hp=812fdc0574f1fd2d17414f74d7a0298d984dc2f8 Merge branch 'master' of ssh://lx-office/~/lx-office-erp --- diff --git a/SL/Auth.pm b/SL/Auth.pm index 71a333f94..a11fbafb0 100644 --- a/SL/Auth.pm +++ b/SL/Auth.pm @@ -6,6 +6,7 @@ use Digest::MD5 qw(md5_hex); use IO::File; use Time::HiRes qw(gettimeofday); use List::MoreUtils qw(uniq); +use YAML; use SL::Auth::Constants qw(:all); use SL::Auth::DB; @@ -186,7 +187,7 @@ sub dbconnect { $main::form->error($main::locale->text('The connection to the authentication database failed:') . "\n" . $DBI::errstr); } - $main::lxdebug->leave_sub(); + $main::lxdebug->leave_sub(2); return $self->{dbh}; } @@ -496,7 +497,7 @@ sub restore_session { while (my $ref = $sth->fetchrow_hashref()) { $self->{SESSION}->{$ref->{sess_key}} = $ref->{sess_value}; - $form->{$ref->{sess_key}} = $ref->{sess_value} if (!defined $form->{$ref->{sess_key}}); + $form->{$ref->{sess_key}} = $self->_load_value($ref->{sess_value}) if (!defined $form->{$ref->{sess_key}}); } $sth->finish(); @@ -506,6 +507,18 @@ sub restore_session { return SESSION_OK; } +sub _load_value { + return $_[1] if $_[1] !~ m/^---/; + + my $value; + eval { + $value = YAML::Load($_[1]); + 1; + } or return $_[1]; + + return $value; +} + sub destroy_session { $main::lxdebug->enter_sub(); @@ -583,41 +596,80 @@ sub create_or_refresh_session { if ($id) { do_query($form, $dbh, qq|UPDATE auth.session SET mtime = now() WHERE id = ?|, $session_id); - do_query($form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id); } else { do_query($form, $dbh, qq|INSERT INTO auth.session (id, ip_address, mtime) VALUES (?, ?, now())|, $session_id, $ENV{REMOTE_ADDR}); } - $query = qq|INSERT INTO auth.session_content (session_id, sess_key, sess_value) VALUES (?, ?, ?)|; - $sth = prepare_query($form, $dbh, $query); - - foreach my $key (sort keys %{ $self->{SESSION} }) { - do_statement($form, $sth, $query, $session_id, $key, $self->{SESSION}->{$key}); - } + $self->save_session($dbh); - $sth->finish(); $dbh->commit(); $main::lxdebug->leave_sub(); } +sub save_session { + my $self = shift; + my $provided_dbh = shift; + + my $dbh = $provided_dbh || $self->dbconnect(); + + do_query($::form, $dbh, qq|DELETE FROM auth.session_content WHERE session_id = ?|, $session_id); + + if (%{ $self->{SESSION} }) { + my $query = qq|INSERT INTO auth.session_content (session_id, sess_key, sess_value) VALUES (?, ?, ?)|; + my $sth = prepare_query($::form, $dbh, $query); + + foreach my $key (sort keys %{ $self->{SESSION} }) { + do_statement($::form, $sth, $query, $session_id, $key, $self->{SESSION}->{$key}); + } + + $sth->finish(); + } + + $dbh->commit() unless $provided_dbh; +} + sub set_session_value { $main::lxdebug->enter_sub(); - my $self = shift; + my $self = shift; + my %params = @_; $self->{SESSION} ||= { }; - while (2 <= scalar @_) { - my $key = shift; - my $value = shift; - - $self->{SESSION}->{$key} = $value; + while (my ($key, $value) = each %params) { + $self->{SESSION}->{ $key } = YAML::Dump($value); } $main::lxdebug->leave_sub(); + + return $self; +} + +sub delete_session_value { + $main::lxdebug->enter_sub(); + + my $self = shift; + + $self->{SESSION} ||= { }; + delete @{ $self->{SESSION} }{ @_ }; + + $main::lxdebug->leave_sub(); + + return $self; +} + +sub get_session_value { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $value = $self->{SESSION} ? $self->_load_value($self->{SESSION}->{ $_[0] }) : undef; + + $main::lxdebug->leave_sub(); + + return $value; } sub set_cookie_environment_variable { diff --git a/SL/DBUpgrade2.pm b/SL/DBUpgrade2.pm index ae07d1c08..8e61f222f 100644 --- a/SL/DBUpgrade2.pm +++ b/SL/DBUpgrade2.pm @@ -1,25 +1,47 @@ package SL::DBUpgrade2; +use IO::File; +use List::MoreUtils qw(any); + use SL::Common; +use SL::Iconv; -require Exporter; -our @ISA = qw(Exporter); +use strict; -our @EXPORT = qw(parse_dbupdate_controls sort_dbupdate_controls); +sub new { + my $package = shift; -use strict; + return bless({}, $package)->init(@_); +} + +sub init { + my ($self, %params) = @_; + + if ($params{auth}) { + $params{path_suffix} = "-auth"; + $params{schema} = "auth."; + } + + $params{path_suffix} ||= ''; + $params{schame} ||= ''; + + map { $self->{$_} = $params{$_} } keys %params; + + return $self; +} sub parse_dbupdate_controls { - $main::lxdebug->enter_sub(); + $::lxdebug->enter_sub(); - my ($form, $dbdriver) = @_; + my ($self) = @_; - my $locale = $main::locale; + my $form = $self->{form}; + my $locale = $::locale; local *IN; my %all_controls; - my $path = "sql/${dbdriver}-upgrade2"; + my $path = "sql/" . $self->{dbdriver} . "-upgrade2" . $self->{path_suffix}; foreach my $file_name (<$path/*.sql>, <$path/*.pl>) { next unless (open(IN, $file_name)); @@ -92,9 +114,266 @@ sub parse_dbupdate_controls { map({ _dbupdate2_calculate_depth(\%all_controls, $_->{"tag"}) } values(%all_controls)); - $main::lxdebug->leave_sub(); + $self->{all_controls} = \%all_controls; + + $::lxdebug->leave_sub(); + + return $self; +} + +sub process_query { + $::lxdebug->enter_sub(); + + my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_; + + my $form = $self->{form}; + my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n"); + 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(); + + while (<$fh>) { + $_ = SL::Iconv::convert($file_charset, $db_charset, $_); + + # Remove DOS and Unix style line endings. + chomp; + + # remove comments + s/--.*$//; + + for (my $i = 0; $i < length($_); $i++) { + my $char = substr($_, $i, 1); + + # Are we inside a string? + if (@quote_chars) { + if ($char eq $quote_chars[-1]) { + pop(@quote_chars); + } + $query .= $char; + + } else { + if (($char eq "'") || ($char eq "\"")) { + push(@quote_chars, $char); + + } elsif ($char eq ";") { + + # Query is complete. Send it. + + $sth = $dbh->prepare($query); + 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 = ""; + } + + $query .= $char; + } + } + + # Insert a space at the end of each line so that queries split + # over multiple lines work properly. + if ($query ne '') { + $query .= @quote_chars ? "\n" : ' '; + } + } + + if (ref($version_or_control) eq "HASH") { + $dbh->do("INSERT INTO " . $self->{schema} . "schema_info (tag, login) VALUES (" . $dbh->quote($version_or_control->{"tag"}) . ", " . $dbh->quote($form->{"login"}) . ")"); + } elsif ($version_or_control) { + $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version_or_control)); + } + $dbh->commit(); + + $fh->close(); + + $::lxdebug->leave_sub(); +} + +# Process a Perl script which updates the database. +# If the script returns 1 then the update was successful. +# Return code "2" means "needs more interaction; remove +# users/nologin and end current request". +# All other return codes are fatal errors. +sub process_perl_script { + $::lxdebug->enter_sub(); + + my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_; + + my $form = $self->{form}; + 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(); + + # setup dbup_ export vars + my %dbup_myconfig = (); + map({ $dbup_myconfig{$_} = $form->{$_}; } qw(dbname dbuser dbpasswd dbhost dbport dbconnect)); + + my $dbup_locale = $::locale; + + my $result = eval($contents); - return \%all_controls; + if (1 != $result) { + $dbh->rollback(); + $dbh->disconnect(); + } + + if (!defined($result)) { + print $form->parse_html_template("dbupgrade/error", + { "file" => $filename, + "error" => $@ }); + ::end_of_request(); + } elsif (1 != $result) { + unlink("users/nologin") if (2 == $result); + ::end_of_request(); + } + + if (ref($version_or_control) eq "HASH") { + $dbh->do("INSERT INTO " . $self->{schema} . "schema_info (tag, login) VALUES (" . $dbh->quote($version_or_control->{"tag"}) . ", " . $dbh->quote($form->{"login"}) . ")"); + } elsif ($version_or_control) { + $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version_or_control)); + } + $dbh->commit(); + + $::lxdebug->leave_sub(); +} + +sub process_file { + my ($self, $dbh, $filename, $version_or_control, $db_charset) = @_; + + if ($filename =~ m/sql$/) { + $self->process_query($dbh, $filename, $version_or_control, $db_charset); + } else { + $self->process_perl_script($dbh, $filename, $version_or_control, $db_charset); + } +} + +sub update_available { + my ($self, $cur_version) = @_; + + local *SQLDIR; + + my $dbdriver = $self->{dbdriver}; + opendir SQLDIR, "sql/${dbdriver}-upgrade" || error("", "sql/${dbdriver}-upgrade: $!"); + my @upgradescripts = grep /${dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, readdir SQLDIR; + closedir SQLDIR; + + return ($#upgradescripts > -1); +} + +sub update2_available { + $::lxdebug->enter_sub(); + + my ($self, $dbh) = @_; + + map { $_->{applied} = 0; } values %{ $self->{all_controls} }; + + my $sth = $dbh->prepare(qq|SELECT tag FROM | . $self->{schema} . qq|schema_info|); + if ($sth->execute) { + while (my ($tag) = $sth->fetchrow_array) { + $self->{all_controls}->{$tag}->{applied} = 1 if defined $self->{all_controls}->{$tag}; + } + } + $sth->finish(); + + my $needs_update = any { !$_->{applied} } values %{ $self->{all_controls} }; + + $::lxdebug->leave_sub(); + + return $needs_update; +} + +sub unapplied_upgrade_scripts { + my ($self, $dbh) = @_; + + my @all_scripts = map { $_->{applied} = 0; $_ } $self->sort_dbupdate_controls; + + my $query = qq|SELECT tag FROM | . $self->{schema} . qq|schema_info|; + my $sth = $dbh->prepare($query); + $sth->execute || $self->{form}->dberror($query); + while (my ($tag) = $sth->fetchrow_array()) { + $self->{all_controls}->{$tag}->{applied} = 1 if defined $self->{all_controls}->{$tag}; + } + $sth->finish; + + return grep { !$_->{applied} } @all_scripts; +} + +sub apply_admin_dbupgrade_scripts { + my ($self, $called_from_admin) = @_; + + return 0 if !$self->{auth}; + + my $dbh = $::auth->dbconnect; + my @unapplied_scripts = $self->unapplied_upgrade_scripts($dbh); + + return 0 if !@unapplied_scripts; + + my $db_charset = $main::dbcharset || Common::DEFAULT_CHARSET; + $self->{form}->{login} ||= 'admin'; + + map { $_->{description} = SL::Iconv::convert($_->{charset}, $db_charset, $_->{description}) } values %{ $self->{all_controls} }; + + if ($called_from_admin) { + $self->{form}->{title} = $::locale->text('Dataset upgrade'); + $self->{form}->header; + } + + print $self->{form}->parse_html_template("dbupgrade/header", { dbname => $::auth->{DB_config}->{db} }); + + foreach my $control (@unapplied_scripts) { + $::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}"); + print $self->{form}->parse_html_template("dbupgrade/upgrade_message2", $control); + + $self->process_file($dbh, "sql/$self->{dbdriver}-upgrade2-auth/$control->{file}", $control, $db_charset); + } + + print $self->{form}->parse_html_template("dbupgrade/footer", { is_admin => 1 }) if $called_from_admin; + + return 1; } sub _check_for_loops { @@ -106,7 +385,7 @@ sub _check_for_loops { if ($ctrl->{"loop"} == 1) { # Not done yet. - _control_error($form, $file_name, $main::locale->text("Dependency loop detected:") . " " . join(" -> ", @path)) + _control_error($form, $file_name, $::locale->text("Dependency loop detected:") . " " . join(" -> ", @path)) } elsif ($ctrl->{"loop"} == 0) { # Not checked yet. @@ -119,20 +398,20 @@ sub _check_for_loops { sub _control_error { my ($form, $file_name, $message) = @_; - $form = $main::form; - my $locale = $main::locale; + $form = $::form; + my $locale = $::locale; $form->error(sprintf($locale->text("Error in database control file '%s': %s"), $file_name, $message)); } sub _dbupdate2_calculate_depth { - $main::lxdebug->enter_sub(2); + $::lxdebug->enter_sub(2); my ($tree, $tag) = @_; my $node = $tree->{$tag}; - return $main::lxdebug->leave_sub(2) if (defined($node->{"depth"})); + return $::lxdebug->leave_sub(2) if (defined($node->{"depth"})); my $max_depth = 0; @@ -144,13 +423,15 @@ sub _dbupdate2_calculate_depth { $node->{"depth"} = $max_depth + 1; - $main::lxdebug->leave_sub(2); + $::lxdebug->leave_sub(2); } sub sort_dbupdate_controls { - return sort({ $a->{"depth"} != $b->{"depth"} ? $a->{"depth"} <=> $b->{"depth"} - : $a->{"priority"} != $b->{"priority"} ? $a->{"priority"} <=> $b->{"priority"} - : $a->{"tag"} cmp $b->{"tag"} } values(%{$_[0]})); + my $self = shift; + + $self->parse_dbupdate_controls unless $self->{all_controls}; + + return sort { ($a->{depth} <=> $b->{depth}) || ($a->{priority} <=> $b->{priority}) || ($a->{tag} cmp $b->{tag}) } values %{ $self->{all_controls} }; } 1; diff --git a/SL/User.pm b/SL/User.pm index b1a904afd..024a683db 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -121,19 +121,16 @@ sub login { $self->create_schema_info_table($form, $dbh); - $dbh->disconnect; - $rc = 0; - my $controls = - parse_dbupdate_controls($form, $myconfig{"dbdriver"}); + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $myconfig{dbdriver})->parse_dbupdate_controls; - map({ $form->{$_} = $myconfig{$_} } - qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect dateformat)); - - if (update_available($myconfig{"dbdriver"}, $dbversion) || - update2_available($form, $controls)) { + map({ $form->{$_} = $myconfig{$_} } qw(dbname dbhost dbport dbdriver dbuser dbpasswd dbconnect dateformat)); + dbconnect_vars($form, $form->{dbname}); + my $update_available = $dbupdater->update_available($dbversion) || $dbupdater->update2_available($dbh); + $dbh->disconnect; + if ($update_available) { $form->{"stylesheet"} = "lx-office-erp.css"; $form->{"title"} = $main::locale->text("Dataset upgrade"); $form->header(); @@ -163,7 +160,8 @@ sub login { $SIG{QUIT} = 'IGNORE'; $self->dbupdate($form); - $self->dbupdate2($form, $controls); + $self->dbupdate2($form, $dbupdater); + SL::DBUpgrade2->new(form => $::form, dbdriver => 'Pg', auth => 1)->apply_admin_dbupgrade_scripts(0); close(FH); @@ -180,7 +178,6 @@ sub login { print $form->parse_html_template("dbupgrade/footer", { "menufile" => $menufile }); $rc = -2; - } } @@ -395,11 +392,12 @@ sub dbcreate { my $db_charset = $Common::db_encoding_to_charset{$form->{encoding}}; $db_charset ||= Common::DEFAULT_CHARSET; + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver}); # create the tables - $self->process_query($form, $dbh, "sql/lx-office.sql", undef, $db_charset); + $dbupdater->process_query($dbh, "sql/lx-office.sql", undef, $db_charset); # load chart of accounts - $self->process_query($form, $dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset); + $dbupdater->process_query($dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset); $query = "UPDATE defaults SET coa = ?"; do_query($form, $dbh, $query, $form->{chart}); @@ -409,172 +407,6 @@ sub dbcreate { $main::lxdebug->leave_sub(); } -# Process a Perl script which updates the database. -# If the script returns 1 then the update was successful. -# Return code "2" means "needs more interaction; remove -# users/nologin and end current request". -# All other return codes are fatal errors. -sub process_perl_script { - $main::lxdebug->enter_sub(); - - my ($self, $form, $dbh, $filename, $version_or_control, $db_charset) = @_; - - 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(); - - # setup dbup_ export vars - my %dbup_myconfig = (); - map({ $dbup_myconfig{$_} = $form->{$_}; } - qw(dbname dbuser dbpasswd dbhost dbport dbconnect)); - - my $dbup_locale = $::locale; - - my $result = eval($contents); - - if (1 != $result) { - $dbh->rollback(); - $dbh->disconnect(); - } - - if (!defined($result)) { - print $form->parse_html_template("dbupgrade/error", - { "file" => $filename, - "error" => $@ }); - ::end_of_request(); - } elsif (1 != $result) { - unlink("users/nologin") if (2 == $result); - ::end_of_request(); - } - - if (ref($version_or_control) eq "HASH") { - $dbh->do("INSERT INTO schema_info (tag, login) VALUES (" . - $dbh->quote($version_or_control->{"tag"}) . ", " . - $dbh->quote($form->{"login"}) . ")"); - } elsif ($version_or_control) { - $dbh->do("UPDATE defaults SET version = " . - $dbh->quote($version_or_control)); - } - $dbh->commit(); - - $main::lxdebug->leave_sub(); -} - -sub process_query { - $main::lxdebug->enter_sub(); - - my ($self, $form, $dbh, $filename, $version_or_control, $db_charset) = @_; - - my $fh = IO::File->new($filename, "r") or $form->error("$filename : $!\n"); - 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(); - - while (<$fh>) { - $_ = SL::Iconv::convert($file_charset, $db_charset, $_); - - # Remove DOS and Unix style line endings. - chomp; - - # remove comments - s/--.*$//; - - for (my $i = 0; $i < length($_); $i++) { - my $char = substr($_, $i, 1); - - # Are we inside a string? - if (@quote_chars) { - if ($char eq $quote_chars[-1]) { - pop(@quote_chars); - } - $query .= $char; - - } else { - if (($char eq "'") || ($char eq "\"")) { - push(@quote_chars, $char); - - } elsif ($char eq ";") { - - # Query is complete. Send it. - - $sth = $dbh->prepare($query); - 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 = ""; - } - - $query .= $char; - } - } - - # Insert a space at the end of each line so that queries split - # over multiple lines work properly. - if ($query ne '') { - $query .= @quote_chars ? "\n" : ' '; - } - } - - if (ref($version_or_control) eq "HASH") { - $dbh->do("INSERT INTO schema_info (tag, login) VALUES (" . - $dbh->quote($version_or_control->{"tag"}) . ", " . - $dbh->quote($form->{"login"}) . ")"); - } elsif ($version_or_control) { - $dbh->do("UPDATE defaults SET version = " . - $dbh->quote($version_or_control)); - } - $dbh->commit(); - - $fh->close(); - - $main::lxdebug->leave_sub(); -} - sub dbdelete { $main::lxdebug->enter_sub(); @@ -621,8 +453,8 @@ sub dbneedsupdate { my ($self, $form) = @_; - my %members = $main::auth->read_all_users(); - my $controls = parse_dbupdate_controls($form, $form->{dbdriver}); + my %members = $main::auth->read_all_users(); + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver})->parse_dbupdate_controls; my ($query, $sth, %dbs_needing_updates); @@ -644,11 +476,13 @@ sub dbneedsupdate { ($version) = $sth->fetchrow_array(); } $sth->finish(); - $dbh->disconnect(); - next unless $version; + $dbh->disconnect and next unless $version; + + my $update_available = $dbupdater->update_available($version) || $dbupdater->update2_available($dbh); + $dbh->disconnect; - if (update_available($form->{dbdriver}, $version) || update2_available($form, $controls)) { + if ($update_available) { my $dbinfo = {}; map { $dbinfo->{$_} = $member->{$_} } grep /^db/, keys %{ $member }; $dbs_needing_updates{$member->{dbhost} . "::" . $member->{dbname}} = $dbinfo; @@ -702,18 +536,6 @@ sub cmp_script_version { return $res_a <=> $res_b; } -sub update_available { - my ($dbdriver, $cur_version) = @_; - - local *SQLDIR; - - opendir SQLDIR, "sql/${dbdriver}-upgrade" || error("", "sql/${dbdriver}-upgrade: $!"); - my @upgradescripts = grep /${dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, readdir SQLDIR; - closedir SQLDIR; - - return ($#upgradescripts > -1); -} - sub create_schema_info_table { $main::lxdebug->enter_sub(); @@ -762,6 +584,8 @@ sub dbupdate { my $db_charset = $main::dbcharset; $db_charset ||= Common::DEFAULT_CHARSET; + my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver}); + foreach my $db (split(/ /, $form->{dbupdate})) { next unless $form->{$db}; @@ -787,7 +611,6 @@ sub dbupdate { foreach my $upgradescript (@upgradescripts) { my $a = $upgradescript; $a =~ s/^\Q$form->{dbdriver}\E-upgrade-|\.(sql|pl)$//g; - my $file_type = $1; my ($mindb, $maxdb) = split /-/, $a; my $str_maxdb = $maxdb; @@ -801,13 +624,7 @@ sub dbupdate { # apply upgrade $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $upgradescript"); - if ($file_type eq "sql") { - $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade/$upgradescript", $str_maxdb, $db_charset); - } else { - $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade/$upgradescript", $str_maxdb, $db_charset); - } + $dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb, $db_charset); $version = $maxdb; @@ -826,74 +643,38 @@ sub dbupdate { sub dbupdate2 { $main::lxdebug->enter_sub(); - my ($self, $form, $controls) = @_; + my ($self, $form, $dbupdater) = @_; $form->{sid} = $form->{dbdefault}; - my @upgradescripts = (); - my ($query, $sth, $tag); - my $rc = -2; - - @upgradescripts = sort_dbupdate_controls($controls); + my $rc = -2; + my $db_charset = $main::dbcharset || Common::DEFAULT_CHARSET; - my $db_charset = $main::dbcharset; - $db_charset ||= Common::DEFAULT_CHARSET; + map { $_->{description} = SL::Iconv::convert($_->{charset}, $db_charset, $_->{description}) } values %{ $dbupdater->{all_controls} }; foreach my $db (split / /, $form->{dbupdate}) { - next unless $form->{$db}; # strip db from dataset $db =~ s/^db//; &dbconnect_vars($form, $db); - 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; $dbh->do($form->{dboptions}) if ($form->{dboptions}); - map({ $_->{"applied"} = 0; } @upgradescripts); - $self->create_schema_info_table($form, $dbh); - $query = qq|SELECT tag FROM schema_info|; - $sth = $dbh->prepare($query); - $sth->execute() || $form->dberror($query); - while (($tag) = $sth->fetchrow_array()) { - $controls->{$tag}->{"applied"} = 1 if (defined($controls->{$tag})); - } - $sth->finish(); - - my $all_applied = 1; - foreach (@upgradescripts) { - if (!$_->{"applied"}) { - $all_applied = 0; - last; - } - } + my @upgradescripts = $dbupdater->unapplied_upgrade_scripts($dbh); - next if ($all_applied); + $dbh->disconnect and next if !@upgradescripts; 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; - # apply upgrade $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}"); print $form->parse_html_template("dbupgrade/upgrade_message2", $control); - if ($file_type eq "sql") { - $self->process_query($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade2/$control->{file}", $control, $db_charset); - } else { - $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . - "-upgrade2/$control->{file}", $control, $db_charset); - } + $dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade2/$control->{file}", $control, $db_charset); } $rc = 0; @@ -906,38 +687,6 @@ sub dbupdate2 { return $rc; } -sub update2_available { - $main::lxdebug->enter_sub(); - - my ($form, $controls) = @_; - - map({ $_->{"applied"} = 0; } values(%{$controls})); - - dbconnect_vars($form, $form->{"dbname"}); - - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) || - $form->dberror; - - my ($query, $tag, $sth); - - $query = qq|SELECT tag FROM schema_info|; - $sth = $dbh->prepare($query); - if ($sth->execute()) { - while (($tag) = $sth->fetchrow_array()) { - $controls->{$tag}->{"applied"} = 1 if (defined($controls->{$tag})); - } - } - $sth->finish(); - $dbh->disconnect(); - - map({ $main::lxdebug->leave_sub() and return 1 if (!$_->{"applied"}) } - values(%{$controls})); - - $main::lxdebug->leave_sub(); - return 0; -} - sub save_member { $main::lxdebug->enter_sub(); diff --git a/bin/mozilla/admin.pl b/bin/mozilla/admin.pl index c5c97cd89..2819da00e 100755 --- a/bin/mozilla/admin.pl +++ b/bin/mozilla/admin.pl @@ -43,6 +43,7 @@ use Sys::Hostname; use SL::Auth; use SL::Form; +use SL::Iconv; use SL::Mailer; use SL::User; use SL::Common; @@ -84,6 +85,9 @@ sub run { $::auth->set_session_value('rpw', $::form->{rpw}); $::auth->create_or_refresh_session(); } + + _apply_dbupgrade_scripts(); + call_sub($locale->findsub($form->{action})); } } else { @@ -719,15 +723,13 @@ sub dbupdate { map { $form->{$_} = $form->{"${_}_${i}"} } qw(dbname dbdriver dbhost dbport dbuser dbpasswd); - my $controls = parse_dbupdate_controls($form, $form->{dbdriver}); - print $form->parse_html_template("admin/dbupgrade_header"); $form->{dbupdate} = $form->{dbname}; $form->{$form->{dbname}} = 1; User->dbupdate($form); - User->dbupdate2($form, $controls); + User->dbupdate2($form, SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver})->parse_dbupdate_controls); print $form->parse_html_template("admin/dbupgrade_footer"); } @@ -1164,4 +1166,8 @@ sub dispatcher { $form->error($locale->text('No action defined.')); } +sub _apply_dbupgrade_scripts { + ::end_of_request() if SL::DBUpgrade2->new(form => $::form, dbdriver => 'Pg', auth => 1)->apply_admin_dbupgrade_scripts(1); +} + 1; diff --git a/bin/mozilla/io.pl b/bin/mozilla/io.pl index 6377fa6d9..03ca70854 100644 --- a/bin/mozilla/io.pl +++ b/bin/mozilla/io.pl @@ -1263,6 +1263,7 @@ sub print { &save(); $form->{formname} = $formname; &edit(); + $::lxdebug->leave_sub(); ::end_of_request(); } diff --git a/lxo-import/import_lib.php b/lxo-import/import_lib.php index 996d21e64..6d9dd879b 100644 --- a/lxo-import/import_lib.php +++ b/lxo-import/import_lib.php @@ -351,7 +351,7 @@ function authuser($dbhost,$dbport,$dbuser,$dbpasswd,$dbname,$cookie,$login,$pwd) $db=new myDB($dbhost,$dbuser,$dbpasswd,$dbname,$dbport,true); if ($cookie) { $sql="select sc.session_id,u.id from auth.session_content sc left join auth.user u on "; - $sql.="u.login=sc.sess_value left join auth.session s on s.id=sc.session_id "; + $sql.="('--- ' || u.login || E'\\n')=sc.sess_value left join auth.session s on s.id=sc.session_id "; $sql.="where session_id = '$cookie' and sc.sess_key='login'";// order by s.mtime desc"; $rs=$db->getAll($sql,"authuser_1"); if (!$rs) return false; diff --git a/sql/Pg-upgrade2-auth/auth_schema_normalization_1.pl b/sql/Pg-upgrade2-auth/auth_schema_normalization_1.pl new file mode 100644 index 000000000..78726cc67 --- /dev/null +++ b/sql/Pg-upgrade2-auth/auth_schema_normalization_1.pl @@ -0,0 +1,30 @@ +#!/usr/bin/perl +# @tag: auth_schema_normalization_1 +# @description: Auth-Datenbankschema Normalisierungen Teil 1 +# @depends: + +use strict; + +sub do_one { + my ($dbh, $query) = @_; + + if ($dbh->do($query)) { + $dbh->commit(); + } else { + $dbh->rollback(); + } +} + +sub do_all { + my $dbh = $::auth->dbconnect(); + + my @queries = ( qq|ALTER TABLE auth.group_rights ADD PRIMARY KEY (group_id, "right");|, + qq|ALTER TABLE auth.user_config ADD PRIMARY KEY (user_id, cfg_key);|, + qq|ALTER TABLE auth.user_group ADD PRIMARY KEY (user_id, group_id);|); + + do_one($dbh, $_) for @queries; +} + +do_all(); + +1; diff --git a/templates/webpages/dbupgrade/footer.html b/templates/webpages/dbupgrade/footer.html index e4c312ab4..f9dba7052 100644 --- a/templates/webpages/dbupgrade/footer.html +++ b/templates/webpages/dbupgrade/footer.html @@ -1,9 +1,9 @@ [%- USE T8 %] [% USE HTML %]

[% '...done' | $T8 %]

-
+ - +