#use SL::Auth;
use SL::DB::AuthClient;
+use SL::DB::Employee;
use SL::DBConnect;
use SL::DBUpgrade2;
use SL::DBUtils;
use strict;
+use constant LOGIN_OK => 0;
+use constant LOGIN_BASIC_TABLES_MISSING => -1;
+use constant LOGIN_DBUPDATE_AVAILABLE => -2;
+use constant LOGIN_AUTH_DBUPDATE_AVAILABLE => -3;
+use constant LOGIN_GENERAL_ERROR => -4;
+
sub new {
$main::lxdebug->enter_sub();
sub login {
my ($self, $form) = @_;
- return -3 if !$self->{login} || !$::auth->client;
+ return LOGIN_GENERAL_ERROR() if !$self->{login} || !$::auth->client;
my %myconfig = $main::auth->read_user(login => $self->{login});
+ # Auth DB upgrades available?
+ my $dbupdater_auth = SL::DBUpgrade2->new(form => $form, auth => 1)->parse_dbupdate_controls;
+ return LOGIN_AUTH_DBUPDATE_AVAILABLE() if $dbupdater_auth->unapplied_upgrade_scripts($::auth->dbconnect);
+
# check if database is down
my $dbh = $form->dbconnect_noauto;
# we got a connection, check the version
my ($dbversion) = $dbh->selectrow_array(qq|SELECT version FROM defaults|);
+ if (!$dbversion) {
+ $dbh->disconnect;
+ return LOGIN_BASIC_TABLES_MISSING();
+ }
$self->create_schema_info_table($form, $dbh);
- # Auth DB upgrades available?
- my $dbupdater_auth = SL::DBUpgrade2->new(form => $form, auth => 1)->parse_dbupdate_controls;
- return -3 if $dbupdater_auth->unapplied_upgrade_scripts($::auth->dbconnect);
-
- my $dbupdater = SL::DBUpgrade2->new(form => $form)->parse_dbupdate_controls;
-
+ my $dbupdater = SL::DBUpgrade2->new(form => $form)->parse_dbupdate_controls;
my $update_available = $dbupdater->update2_available($dbh);
$dbh->disconnect;
- return 0 if !$update_available;
+ if (!$update_available) {
+ SL::DB::Manager::Employee->update_entries_for_authorized_users;
+ return LOGIN_OK();
+ }
$form->{$_} = $::auth->client->{$_} for qw(dbname dbhost dbport dbuser dbpasswd);
$form->{$_} = $myconfig{$_} for qw(datestyle);
$SIG{QUIT} = 'IGNORE';
$self->dbupdate2(form => $form, updater => $dbupdater, database => $::auth->client->{dbname});
- SL::DBUpgrade2->new(form => $::form, auth => 1)->apply_admin_dbupgrade_scripts(0);
+
+ # If $self->dbupdate2 returns than this means all upgrade scripts
+ # have been applied successfully, none required user
+ # interaction. Otherwise the deeper layers would have called
+ # ::end_of_request() already, and return would not have returned to
+ # us. Therefore we can now use RDBO instances because their supposed
+ # table structures do match the actual structures. So let's ensure
+ # that the "employee" table contains the appropriate entries for all
+ # users authorized for the current client.
+ SL::DB::Manager::Employee->update_entries_for_authorized_users;
SL::System::InstallationLock->unlock;
print $form->parse_html_template("dbupgrade/footer");
- return -2;
+ return LOGIN_DBUPDATE_AVAILABLE();
}
sub dbconnect_vars {
# load chart of accounts
$dbupdater->process_query($dbh, "sql/$form->{chart}-chart.sql");
- my $query = qq|UPDATE defaults SET coa = ?, accounting_method = ?, profit_determination = ?, inventory_system = ?, curr = ?|;
+ $query = qq|UPDATE defaults SET coa = ?, accounting_method = ?, profit_determination = ?, inventory_system = ?, curr = ?|;
do_query($form, $dbh, $query, map { $form->{$_} } qw(chart accounting_method profit_determination inventory_system defaultcurrency));
$dbh->disconnect;
$main::lxdebug->leave_sub();
}
-sub dbsources_unused {
- $main::lxdebug->enter_sub();
-
- my ($self, $form) = @_;
-
- my %dbexcl = map { $_->dbname => 1 }
- grep { ($_->dbhost eq $form->{dbhost}) && ($_->dbport eq $form->{dbport}) }
- @{ SL::DB::Manager::AuthClient->get_all };
-
- $form->{only_acc_db} = 1;
-
- $dbexcl{$form->{dbdefault}} = 1;
- $dbexcl{$main::auth->{DB_config}->{db}} = 1;
-
- my @dbunused = grep { !$dbexcl{$_} } dbsources("", $form);
-
- $main::lxdebug->leave_sub();
-
- return @dbunused;
-}
-
sub calc_version {
$main::lxdebug->enter_sub(2);
sub cmp_script_version {
my ($a_from, $a_to, $b_from, $b_to);
my ($i, $res_a, $res_b);
- my ($my_a, $my_b) = ($a, $b);
+ my ($my_a, $my_b) = do { no warnings 'once'; ($a, $b) };
$my_a =~ s/.*-upgrade-//;
$my_a =~ s/.sql$//;
}
sub dbupdate2 {
- $main::lxdebug->enter_sub();
-
my ($self, %params) = @_;
my $form = $params{form};
my $dbupdater = $params{updater};
my $db = $params{database};
- my $rc = -2;
map { $_->{description} = SL::Iconv::convert($_->{charset}, 'UTF-8', $_->{description}) } values %{ $dbupdater->{all_controls} };
my @upgradescripts = $dbupdater->unapplied_upgrade_scripts($dbh);
- $dbh->disconnect and next if !@upgradescripts;
-
foreach my $control (@upgradescripts) {
- # apply upgrade
+ # Apply upgrade. Control will only return to us if the upgrade has
+ # been applied correctly and if the update has not requested user
+ # interaction.
$main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}");
print $form->parse_html_template("dbupgrade/upgrade_message2", $control);
$dbupdater->process_file($dbh, "sql/Pg-upgrade2/$control->{file}", $control);
}
- $rc = 0;
$dbh->disconnect;
-
- $main::lxdebug->leave_sub();
-
- return $rc;
}
sub data {