package User;
+use IO::File;
+use Fcntl qw(:seek);
+
+#use SL::Auth;
+use SL::DBConnect;
use SL::DBUpgrade2;
+use SL::DBUtils;
+use SL::Iconv;
+use SL::Inifile;
+
+use strict;
sub new {
$main::lxdebug->enter_sub();
- my ($type, $memfile, $login) = @_;
+ my ($type, $login) = @_;
+
my $self = {};
if ($login ne "") {
- &error("", "$memfile locked!") if (-f "${memfile}.LCK");
-
- open(MEMBER, "$memfile") or &error("", "$memfile : $!");
-
- while (<MEMBER>) {
- if (/^\[$login\]/) {
- while (<MEMBER>) {
- last if /^\[/;
- next if /^(#|\s)/;
-
- # remove comments
- s/\s#.*//g;
-
- # remove any trailing whitespace
- s/^\s*(.*?)\s*$/$1/;
-
- ($key, $value) = split(/=/, $_, 2);
-
- if (($key eq "stylesheet") && ($value eq "sql-ledger.css")) {
- $value = "lx-office-erp.css";
- }
-
- $self->{$key} = $value;
- }
-
- $self->{login} = $login;
-
- last;
- }
- }
- close MEMBER;
+ my %user_data = $main::auth->read_user($login);
+ map { $self->{$_} = $user_data{$_} } keys %user_data;
}
$main::lxdebug->leave_sub();
+
bless $self, $type;
}
sub country_codes {
$main::lxdebug->enter_sub();
+ local *DIR;
+
my %cc = ();
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");
sub login {
$main::lxdebug->enter_sub();
- my ($self, $form, $userspath) = @_;
+ my ($self, $form) = @_;
+ our $sid;
+
+ local *FH;
my $rc = -3;
if ($self->{login}) {
-
- if ($self->{password}) {
- if ($form->{hashed_password}) {
- $form->{password} = $form->{hashed_password};
- } else {
- $form->{password} = crypt($form->{password},
- substr($self->{login}, 0, 2));
- }
- if ($self->{password} ne $form->{password}) {
- $main::lxdebug->leave_sub();
- return -1;
- }
- }
-
- unless (-e "$userspath/$self->{login}.conf") {
- $self->create_config("$userspath/$self->{login}.conf");
- }
-
- do "$userspath/$self->{login}.conf";
- $myconfig{dbpasswd} = unpack 'u', $myconfig{dbpasswd};
+ my %myconfig = $main::auth->read_user($self->{login});
# check if database is down
- my $dbh =
- DBI->connect($myconfig{dbconnect}, $myconfig{dbuser},
- $myconfig{dbpasswd})
- or $self->error(DBI::errstr);
+ my $dbh = SL::DBConnect->connect($myconfig{dbconnect}, $myconfig{dbuser}, $myconfig{dbpasswd})
+ or $self->error($DBI::errstr);
# we got a connection, check the version
my $query = qq|SELECT version FROM defaults|;
my ($dbversion) = $sth->fetchrow_array;
$sth->finish;
- # 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;
-
- if (!$login) {
- $query = qq|INSERT INTO employee (login, name, workphone, role)
- VALUES ('$self->{login}', '$myconfig{name}',
- '$myconfig{tel}', 'user')|;
- $dbh->do($query);
- }
+ $self->create_employee_entry($form, $dbh, \%myconfig);
$self->create_schema_info_table($form, $dbh);
- $dbh->disconnect;
+ my $dbupdater_auth = SL::DBUpgrade2->new(form => $form, dbdriver => 'Pg', auth => 1)->parse_dbupdate_controls;
+ if ($dbupdater_auth->unapplied_upgrade_scripts($::auth->dbconnect)) {
+ $::lxdebug->leave_sub;
+ return -3;
+ }
$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));
-
- 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();
- print($form->parse_html_template("dbupgrade/header"));
+ print $form->parse_html_template("dbupgrade/header");
$form->{dbupdate} = "db$myconfig{dbname}";
$form->{ $form->{dbupdate} } = 1;
if ($form->{"show_dbupdate_warning"}) {
- print($form->parse_html_template("dbupgrade/warning"));
- exit(0);
+ print $form->parse_html_template("dbupgrade/warning");
+ ::end_of_request();
}
# update the tables
- open(FH, ">$userspath/nologin") or die("$!");
+ if (!open(FH, ">", $::lx_office_conf{paths}->{userspath} . "/nologin")) {
+ $form->show_generic_error($main::locale->text('A temporary file could not be created. ' .
+ 'Please verify that the directory "#1" is writeable by the webserver.',
+ $::lx_office_conf{paths}->{userspath}),
+ 'back_button' => 1);
+ }
# required for Oracle
$form->{dbdefault} = $sid;
$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);
# remove lock file
- unlink("$userspath/nologin");
+ unlink($::lx_office_conf{paths}->{userspath} . "/nologin");
- print($form->parse_html_template("dbupgrade/footer"));
+ my $menufile =
+ $self->{"menustyle"} eq "v3" ? "menuv3.pl" :
+ $self->{"menustyle"} eq "neu" ? "menunew.pl" :
+ $self->{"menustyle"} eq "js" ? "menujs.pl" :
+ $self->{"menustyle"} eq "xml" ? "menuXML.pl" :
+ "menu.pl";
- $rc = -2;
+ print $form->parse_html_template("dbupgrade/footer", { "menufile" => $menufile });
+ $rc = -2;
}
}
$form->{sid} = $form->{dbdefault};
&dbconnect_vars($form, $form->{dbdefault});
- my $dbh =
- DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
+ my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
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) {
next if ($db =~ /^template/);
&dbconnect_vars($form, $db);
- my $dbh =
- DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
+ my $dbh = SL::DBConnect->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);
- $sth->execute || $form->dberror($query);
+ $sth->execute($form->{dbuser}) ||
+ $form->dberror($query . " ($form->{dbuser})");
if ($sth->fetchrow_array) {
- push @dbsources, $db;
+ push(@dbsources, $db);
}
$sth->finish;
$dbh->disconnect;
next;
}
- push @dbsources, $db;
+ push(@dbsources, $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|;
}
$sth->execute || $form->dberror($query);
while (my ($db) = $sth->fetchrow_array) {
- push @dbsources, $db;
+ push(@dbsources, $db);
}
}
return @dbsources;
}
+sub dbclusterencoding {
+ $main::lxdebug->enter_sub();
+
+ my ($self, $form) = @_;
+
+ $form->{dbdefault} ||= $form->{dbuser};
+
+ dbconnect_vars($form, $form->{dbdefault});
+
+ my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) || $form->dberror();
+ my $query = qq|SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = 'template0'|;
+ my ($cluster_encoding) = $dbh->selectrow_array($query);
+ $dbh->disconnect();
+
+ $main::lxdebug->leave_sub();
+
+ return $cluster_encoding;
+}
+
sub dbcreate {
$main::lxdebug->enter_sub();
my ($self, $form) = @_;
+ $form->{sid} = $form->{dbdefault};
+ &dbconnect_vars($form, $form->{dbdefault});
+ my $dbh =
+ SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
+ or $form->dberror;
+ $form->{db} =~ s/\"//g;
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}"|
);
- $dbcreate{Pg} .= " WITH ENCODING = '$form->{encoding}'" if $form->{encoding};
+ my %dboptions = (
+ 'Pg' => [],
+ );
- $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|$dbcreate{$form->{dbdriver}}|;
- $dbh->do($query) || $form->dberror($query);
+ push(@{$dboptions{"Pg"}}, "ENCODING = " . $dbh->quote($form->{"encoding"}))
+ if ($form->{"encoding"});
+ if ($form->{"dbdefault"}) {
+ my $dbdefault = $form->{"dbdefault"};
+ $dbdefault =~ s/[^a-zA-Z0-9_\-]//g;
+ push(@{$dboptions{"Pg"}}, "TEMPLATE = $dbdefault");
+ }
+
+ my $query = $dbcreate{$form->{dbdriver}};
+ $query .= " WITH " . join(" ", @{$dboptions{"Pg"}}) if (@{$dboptions{"Pg"}});
+
+ # Ignore errors if the database exists.
+ $dbh->do($query);
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;
&dbconnect_vars($form, $form->{db});
- $dbh = DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
+ $dbh = SL::DBConnect->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");
+ my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver});
+ # create the tables
+ $dbupdater->process_query($dbh, "sql/lx-office.sql", undef, $db_charset);
# load chart of accounts
- $filename = qq|sql/$form->{chart}-chart.sql|;
- $self->process_query($form, $dbh, $filename);
+ $dbupdater->process_query($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});
+ $query = "UPDATE defaults SET accounting_method = ?";
+ do_query($form, $dbh, $query, $form->{accounting_method});
+ $query = "UPDATE defaults SET profit_determination = ?";
+ do_query($form, $dbh, $query, $form->{profit_determination});
+ $query = "UPDATE defaults SET inventory_system = ?";
+ do_query($form, $dbh, $query, $form->{inventory_system});
$dbh->disconnect;
$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 exit".
-# All other return codes are fatal errors.
-sub process_perl_script {
- $main::lxdebug->enter_sub();
-
- my ($self, $form, $dbh, $filename, $version) = @_;
-
- open(FH, "$filename") or $form->error("$filename : $!\n");
- my $contents = join("", <FH>);
- close(FH);
-
- $dbh->begin_work();
-
- my %dbup_myconfig = ();
- map({ $dbup_myconfig{$_} = $form->{$_}; }
- qw(dbname dbuser dbpasswd dbhost dbport dbconnect));
-
- my $nls_file = $filename;
- $nls_file =~ s|.*/||;
- $nls_file =~ s|.pl$||;
- my $dbup_locale = Locale->new($main::language, $nls_file);
-
- my $result = eval($contents);
-
- if (1 != $result) {
- $dbh->rollback();
- $dbh->disconnect();
- }
-
- if (!defined($result)) {
- print($form->parse_html_template("dbupgrade/error",
- { "file" => $filename,
- "error" => $@ }));
- exit(0);
- } elsif (1 != $result) {
- unlink("users/nologin") if (2 == $result);
- exit(0);
- }
-
- if ($version) {
- $dbh->do("UPDATE defaults SET version = " . $dbh->quote($version));
- }
- $dbh->commit();
-
- $main::lxdebug->leave_sub();
-}
-
-sub process_query {
- $main::lxdebug->enter_sub();
-
- my ($self, $form, $dbh, $filename, $version_or_control) = @_;
-
- # return unless (-f $filename);
-
- open(FH, "$filename") or $form->error("$filename : $!\n");
- my $query = "";
- my $sth;
- my @quote_chars;
-
- $dbh->begin_work();
-
- while (<FH>) {
-
- # 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:<br>${query}<br>" .
- "The error message was: ${errstr}<br>" .
- "All changes in that file have been reverted.");
- }
- $sth->finish();
-
- $char = "";
- $query = "";
- }
-
- $query .= $char;
- }
- }
- }
-
- 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));
- }
- $dbh->commit();
-
- close FH;
-
- $main::lxdebug->leave_sub();
-}
-
sub dbdelete {
$main::lxdebug->enter_sub();
my ($self, $form) = @_;
-
+ $form->{db} =~ s/\"//g;
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})
+ my $dbh = SL::DBConnect->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;
sub dbsources_unused {
$main::lxdebug->enter_sub();
- my ($self, $form, $memfile) = @_;
-
- my @dbexcl = ();
- my @dbsources = ();
-
- $form->error('File locked!') if (-f "${memfile}.LCK");
-
- # open members file
- open(FH, "$memfile") or $form->error("$memfile : $!");
-
- while (<FH>) {
- if (/^dbname=/) {
- my ($null, $item) = split(/=/);
- push @dbexcl, $item;
- }
- }
-
- close FH;
+ my ($self, $form) = @_;
$form->{only_acc_db} = 1;
- my @db = &dbsources("", $form);
- push @dbexcl, $form->{dbdefault};
+ my %members = $main::auth->read_all_users();
+ my %dbexcl = map { $_ => 1 } grep { $_ } map { $_->{dbname} } values %members;
- foreach $item (@db) {
- unless (grep /$item$/, @dbexcl) {
- push @dbsources, $item;
- }
- }
+ $dbexcl{$form->{dbdefault}} = 1;
+ $dbexcl{$main::auth->{DB_config}->{db}} = 1;
+
+ my @dbunused = grep { !$dbexcl{$_} } dbsources("", $form);
$main::lxdebug->leave_sub();
- return @dbsources;
+ return @dbunused;
}
sub dbneedsupdate {
my ($self, $form) = @_;
- my %dbsources = ();
- my $query;
-
- $form->{sid} = $form->{dbdefault};
- &dbconnect_vars($form, $form->{dbdefault});
+ my %members = $main::auth->read_all_users();
+ my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver})->parse_dbupdate_controls;
- my $dbh =
- DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
- or $form->dberror;
+ my ($query, $sth, %dbs_needing_updates);
- if ($form->{dbdriver} eq 'Pg') {
+ foreach my $login (grep /[a-z]/, keys %members) {
+ my $member = $members{$login};
- $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);
+ map { $form->{$_} = $member->{$_} } qw(dbname dbuser dbpasswd dbhost dbport);
+ dbconnect_vars($form, $form->{dbname});
- while (my ($db) = $sth->fetchrow_array) {
+ my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd});
- next if ($db =~ /^template/);
+ next unless $dbh;
- &dbconnect_vars($form, $db);
+ my $version;
- my $dbh =
- 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);
-
- if ($sth->fetchrow_array) {
- $query = qq|SELECT version FROM defaults|;
- my $sth = $dbh->prepare($query);
- $sth->execute;
-
- if (my ($version) = $sth->fetchrow_array) {
- $dbsources{$db} = $version;
- }
- $sth->finish;
- }
- $sth->finish;
- $dbh->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 o.owner FROM dba_objects o
- WHERE o.object_name = 'DEFAULTS'
- AND o.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);
+ $sth->finish();
- my $dbh =
- DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
- or $form->dberror;
+ $dbh->disconnect and next unless $version;
- $query = qq|SELECT version FROM defaults|;
- my $sth = $dbh->prepare($query);
- $sth->execute;
+ my $update_available = $dbupdater->update_available($version) || $dbupdater->update2_available($dbh);
+ $dbh->disconnect;
- if (my ($version) = $sth->fetchrow_array) {
- $dbsources{$db} = $version;
- }
- $sth->finish;
- $dbh->disconnect;
+ if ($update_available) {
+ 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;
}
-## LINET
sub calc_version {
$main::lxdebug->enter_sub(2);
$my_a =~ s/.sql$//;
$my_b =~ s/.*-upgrade-//;
$my_b =~ s/.sql$//;
- ($my_a_from, $my_a_to) = split(/-/, $my_a);
- ($my_b_from, $my_b_to) = split(/-/, $my_b);
+ my ($my_a_from, $my_a_to) = split(/-/, $my_a);
+ my ($my_b_from, $my_b_to) = split(/-/, $my_b);
$res_a = calc_version($my_a_from);
$res_b = calc_version($my_b_from);
return $res_a <=> $res_b;
}
-## /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|pl)/, readdir(SQLDIR));
- closedir SQLDIR;
-
- return ($#upgradescripts > -1);
-}
sub create_schema_info_table {
$main::lxdebug->enter_sub();
my $query = "SELECT tag FROM schema_info LIMIT 1";
if (!$dbh->do($query)) {
+ $dbh->rollback();
$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);
}
my ($self, $form) = @_;
+ local *SQLDIR;
+
$form->{sid} = $form->{dbdefault};
my @upgradescripts = ();
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
- 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 = $::lx_office_conf{system}->{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};
$db =~ s/^db//;
&dbconnect_vars($form, $db);
- my $dbh =
- DBI->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
+ my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
or $form->dberror;
+ $dbh->do($form->{dboptions}) if ($form->{dboptions});
+
# 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;
- ## LINET
$version = calc_version($version);
- ## /LINET
foreach my $upgradescript (@upgradescripts) {
my $a = $upgradescript;
- $a =~ s/^$form->{dbdriver}-upgrade-|\.(sql|pl)$//g;
- my $file_type = $1;
+ $a =~ s/^\Q$form->{dbdriver}\E-upgrade-|\.(sql|pl)$//g;
my ($mindb, $maxdb) = split /-/, $a;
my $str_maxdb = $maxdb;
- ## LINET
$mindb = calc_version($mindb);
$maxdb = calc_version($maxdb);
- ## /LINET
next if ($version >= $maxdb);
last if ($version < $mindb);
# 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);
- } else {
- $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb);
- }
+ $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $upgradescript");
+ $dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb, $db_charset);
$version = $maxdb;
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;
+ my $rc = -2;
+ my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
- @upgradescripts = sort_dbupdate_controls($controls);
+ 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 = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror;
- map({ $_->{"applied"} = 0; } @upgradescripts);
+ $dbh->do($form->{dboptions}) if ($form->{dboptions});
- $query = "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();
+ $self->create_schema_info_table($form, $dbh);
- 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->{"file"} =~ /\.(sql|pl)$/;
- my $file_type = $1;
-
# apply upgrade
- $main::lxdebug->message(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);
- } else {
- $self->process_perl_script($form, $dbh, "sql/" . $form->{"dbdriver"} .
- "-upgrade2/$control->{file}", $control);
- }
+ $main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}");
+ print $form->parse_html_template("dbupgrade/upgrade_message2", $control);
+
+ $dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade2/$control->{file}", $control, $db_charset);
}
$rc = 0;
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 = "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();
- $dbh->disconnect();
-
- map({ $main::lxdebug->leave_sub() and return 1 if (!$_->{"applied"}) }
- values(%{$controls}));
-
- $main::lxdebug->leave_sub();
- return 0;
-}
-
-sub create_config {
+sub save_member {
$main::lxdebug->enter_sub();
- my ($self, $filename) = @_;
+ my ($self) = @_;
+ my $form = \%main::form;
- @config = &config_vars;
-
- open(CONF, ">$filename") or $self->error("$filename : $!");
+ # format dbconnect and dboptions string
+ dbconnect_vars($self, $self->{dbname});
- # create the config file
- print CONF qq|# configuration file for $self->{login}
+ map { $self->{$_} =~ s/\r//g; } qw(address signature);
-\%myconfig = (
-|;
+ $main::auth->save_user($self->{login}, map { $_, $self->{$_} } config_vars());
- foreach $key (sort @config) {
- $self->{$key} =~ s/\'/\\\'/g;
- print CONF qq| $key => '$self->{$key}',\n|;
+ my $dbh = SL::DBConnect->connect($self->{dbconnect}, $self->{dbuser}, $self->{dbpasswd});
+ if ($dbh) {
+ $self->create_employee_entry($form, $dbh, $self, 1);
+ $dbh->disconnect();
}
- print CONF qq|);\n\n|;
-
- close CONF;
-
$main::lxdebug->leave_sub();
}
-sub save_member {
+sub create_employee_entry {
$main::lxdebug->enter_sub();
- my ($self, $memberfile, $userspath) = @_;
-
- my $newmember = 1;
-
- # format dbconnect and dboptions string
- &dbconnect_vars($self, $self->{dbname});
-
- $self->error('File locked!') if (-f "${memberfile}.LCK");
- open(FH, ">${memberfile}.LCK") or $self->error("${memberfile}.LCK : $!");
- close(FH);
-
- open(CONF, "+<$memberfile") or $self->error("$memberfile : $!");
-
- @config = <CONF>;
-
- seek(CONF, 0, 0);
- truncate(CONF, 0);
+ my $self = shift;
+ my $form = shift;
+ my $dbh = shift;
+ my $myconfig = shift;
+ my $update_existing = shift;
- while ($line = shift @config) {
- if ($line =~ /^\[$self->{login}\]/) {
- $newmember = 0;
- last;
- }
- print CONF $line;
- }
-
- # remove everything up to next login or EOF
- while ($line = shift @config) {
- last if ($line =~ /^\[/);
+ if (!does_table_exist($dbh, 'employee')) {
+ $main::lxdebug->leave_sub();
+ return;
}
- # this one is either the next login or EOF
- print CONF $line;
-
- while ($line = shift @config) {
- print CONF $line;
- }
+ # add login to employee table if it does not exist
+ # no error check for employee table, ignore if it does not exist
+ my ($id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $self->{login});
- print CONF qq|[$self->{login}]\n|;
+ if (!$id) {
+ my $query = qq|INSERT INTO employee (login, name, workphone, role) VALUES (?, ?, ?, ?)|;
+ do_query($form, $dbh, $query, ($self->{login}, $myconfig->{name}, $myconfig->{tel}, "user"));
- if ((($self->{dbpasswd} ne $self->{old_dbpasswd}) || $newmember)
- && $self->{root}) {
- $self->{dbpasswd} = pack 'u', $self->{dbpasswd};
- chop $self->{dbpasswd};
- }
- if (defined($self->{new_password})) {
- if ($self->{new_password} ne $self->{old_password}) {
- $self->{password} = crypt $self->{new_password},
- substr($self->{login}, 0, 2)
- if $self->{new_password};
- }
- } else {
- if ($self->{password} ne $self->{old_password}) {
- $self->{password} = crypt $self->{password}, substr($self->{login}, 0, 2)
- if $self->{password};
- }
+ } elsif ($update_existing) {
+ my $query = qq|UPDATE employee SET name = ?, workphone = ?, role = 'user' WHERE id = ?|;
+ do_query($form, $dbh, $query, $myconfig->{name}, $myconfig->{tel}, $id);
}
- if ($self->{'root login'}) {
- @config = ("password");
- } else {
- @config = &config_vars;
- }
-
- # replace \r\n with \n
- map { $self->{$_} =~ s/\r\n/\\n/g } qw(address signature);
- foreach $key (sort @config) {
- print CONF qq|$key=$self->{$key}\n|;
- }
-
- print CONF "\n";
- close CONF;
- unlink "${memberfile}.LCK";
-
- # create conf file
- $self->create_config("$userspath/$self->{login}.conf")
- unless $self->{'root login'};
-
$main::lxdebug->leave_sub();
}
sub config_vars {
$main::lxdebug->enter_sub();
- my @conf = qw(acs address admin businessnumber charset company countrycode
+ my @conf = qw(address admin businessnumber company countrycode
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 co_ustid duns menustyle);
+ dbname dbuser dbpasswd email fax name numberformat password
+ printer 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 favorites
+ pdonumber sdonumber hide_cvar_search_options mandatory_departments
+ sepa_creditor_id);
$main::lxdebug->leave_sub();
my ($self, $msg) = @_;
+ $main::lxdebug->show_backtrace();
+
if ($ENV{HTTP_USER_AGENT}) {
print qq|Content-Type: text/html