X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FUser.pm;h=830544b8ce9436ccb0c1960a33270c821a292434;hb=ee3ab257a5a8f5d4d20ffcf5f3b8259b822037f2;hp=44c7686e27114c985a865de52e53e51ff35af819;hpb=8e6eda056a583934c9c5b46f667a429e423dce75;p=kivitendo-erp.git diff --git a/SL/User.pm b/SL/User.pm index 44c7686e2..830544b8c 100644 --- a/SL/User.pm +++ b/SL/User.pm @@ -40,6 +40,7 @@ use Fcntl qw(:seek); use SL::DBUpgrade2; use SL::DBUtils; use SL::Iconv; +use SL::Inifile; sub new { $main::lxdebug->enter_sub(); @@ -666,84 +667,43 @@ sub dbneedsupdate { my ($self, $form) = @_; - my %dbsources = (); - my $query; + my $members = Inifile->new($main::memberfile); + my $controls = parse_dbupdate_controls($form, $form->{dbdriver}); - $form->{sid} = $form->{dbdefault}; - &dbconnect_vars($form, $form->{dbdefault}); + my ($query, $sth, %dbs_needing_updates); - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; + foreach my $login (grep /[a-z]/, keys %{ $members }) { + my $member = $members->{$login}; - if ($form->{dbdriver} eq 'Pg') { - - $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) { + map { $form->{$_} = $member->{$_} } qw(dbname dbuser dbpasswd dbhost dbport); + dbconnect_vars($form, $form->{dbname}); + $main::lxdebug->dump(0, "form", $form); + my $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}); - next if ($db =~ /^template/); + next unless $dbh; - &dbconnect_vars($form, $db); + my $version; - my $dbh2 = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; - - $query = - qq|SELECT tablename FROM pg_tables | . - qq|WHERE tablename = 'defaults'|; - my $sth2 = prepare_execute_query($form, $dbh, $query); - - if ($sth2->fetchrow_array) { - $query = qq|SELECT version FROM defaults|; - my ($version) = selectrow_query($form, $dbh2, $query); - $dbsources{$db} = $version; - } - $sth2->finish; - $dbh2->disconnect; + $query = qq|SELECT version FROM defaults|; + $sth = prepare_query($form, $dbh, $query); + if ($sth->execute()) { + ($version) = $sth->fetchrow_array(); } - $sth->finish; - } - - if ($form->{dbdriver} eq 'Oracle') { - $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); - - while (my ($db) = $sth->fetchrow_array) { - - $form->{dbuser} = $db; - &dbconnect_vars($form, $db); - - my $dbh = - DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) - or $form->dberror; + $sth->finish(); + $dbh->disconnect(); - $query = qq|SELECT version FROM defaults|; - my $sth = $dbh->prepare($query); - $sth->execute; + next unless $version; - if (my ($version) = $sth->fetchrow_array) { - $dbsources{$db} = $version; - } - $sth->finish; - $dbh->disconnect; + if (update_available($form->{dbdriver}, $version) || update2_available($form, $controls)) { + my $dbinfo = {}; + map { $dbinfo->{$_} = $member->{$_} } grep /^db/, keys %{ $member }; + $dbs_needing_updates{$member->{dbhost} . "::" . $member->{dbname}} = $dbinfo; } - $sth->finish; } - $dbh->disconnect; - $main::lxdebug->leave_sub(); - return %dbsources; + return values %dbs_needing_updates; } sub calc_version { @@ -793,12 +753,9 @@ sub update_available { local *SQLDIR; - opendir(SQLDIR, "sql/${dbdriver}-upgrade") - or &error("", "sql/${dbdriver}-upgrade: $!"); - my @upgradescripts = - grep(/$form->{dbdriver}-upgrade-\Q$cur_version\E.*\.(sql|pl)$/, - readdir(SQLDIR)); - closedir(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); } @@ -940,6 +897,8 @@ sub dbupdate2 { 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); @@ -1007,9 +966,10 @@ sub update2_available { $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})); + if ($sth->execute()) { + while (($tag) = $sth->fetchrow_array()) { + $controls->{$tag}->{"applied"} = 1 if (defined($controls->{$tag})); + } } $sth->finish(); $dbh->disconnect(); @@ -1030,6 +990,8 @@ sub create_config { @config = config_vars(); + my $userspath = $main::userspath; + open(CONF, ">", "$userspath/$self->{login}.conf") || $self->error("$userspath/$self->{login}.conf : $!"); # create the config file @@ -1156,6 +1118,8 @@ sub error { my ($self, $msg) = @_; + $main::lxdebug->show_backtrace(); + if ($ENV{HTTP_USER_AGENT}) { print qq|Content-Type: text/html