Projekt

Allgemein

Profil

Herunterladen (21,1 KB) Statistiken
| Zweig: | Markierung: | Revision:
d319704a Moritz Bunkus
#=====================================================================
# LX-Office ERP
# Copyright (C) 2004
# Based on SQL-Ledger Version 2.1.9
# Web http://www.lx-office.org
#
#=====================================================================
# SQL-Ledger Accounting
# Copyright (C) 2001
#
# Author: Dieter Simader
# Email: dsimader@sql-ledger.org
# Web: http://www.sql-ledger.org
#
# Contributors:
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#=====================================================================
#
# user related functions
#
#=====================================================================

package User;

faef45c2 Moritz Bunkus
use IO::File;
use Fcntl qw(:seek);

684e84d8 Sven Schöling
#use SL::Auth;
22c02125 Moritz Bunkus
use SL::DBConnect;
4fd8bdbf Moritz Bunkus
use SL::DBUpgrade2;
f7057756 Moritz Bunkus
use SL::DBUtils;
a200453a Moritz Bunkus
use SL::Iconv;
0b280f98 Moritz Bunkus
use SL::Inifile;
4fd8bdbf Moritz Bunkus
3d967be3 Sven Schöling
use strict;

d319704a Moritz Bunkus
sub new {
$main::lxdebug->enter_sub();

8c7e4493 Moritz Bunkus
my ($type, $login) = @_;

d319704a Moritz Bunkus
my $self = {};

if ($login ne "") {
8c7e4493 Moritz Bunkus
my %user_data = $main::auth->read_user($login);
map { $self->{$_} = $user_data{$_} } keys %user_data;
d319704a Moritz Bunkus
}

$main::lxdebug->leave_sub();
8c7e4493 Moritz Bunkus
d319704a Moritz Bunkus
bless $self, $type;
}

sub country_codes {
$main::lxdebug->enter_sub();

8e6eda05 Moritz Bunkus
local *DIR;

d319704a Moritz Bunkus
my %cc = ();
my @language = ();

# scan the locale directory and read in the LANGUAGE files
f7057756 Moritz Bunkus
opendir(DIR, "locale");
d319704a Moritz Bunkus
f7057756 Moritz Bunkus
my @dir = grep(!/(^\.\.?$|\..*)/, readdir(DIR));
d319704a Moritz Bunkus
foreach my $dir (@dir) {
next unless open(FH, "locale/$dir/LANGUAGE");
@language = <FH>;
close FH;

$cc{$dir} = "@language";
}

closedir(DIR);

$main::lxdebug->leave_sub();

return %cc;
}

sub login {
$main::lxdebug->enter_sub();

8c7e4493 Moritz Bunkus
my ($self, $form) = @_;
b8da8785 Sven Schöling
our $sid;
d319704a Moritz Bunkus
8e6eda05 Moritz Bunkus
local *FH;

d319704a Moritz Bunkus
my $rc = -3;

if ($self->{login}) {
8c7e4493 Moritz Bunkus
my %myconfig = $main::auth->read_user($self->{login});
d319704a Moritz Bunkus
# check if database is down
22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($myconfig{dbconnect}, $myconfig{dbuser}, $myconfig{dbpasswd})
3d967be3 Sven Schöling
or $self->error($DBI::errstr);
d319704a Moritz Bunkus
# we got a connection, check the version
my $query = qq|SELECT version FROM defaults|;
my $sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);

my ($dbversion) = $sth->fetchrow_array;
$sth->finish;

8c7e4493 Moritz Bunkus
$self->create_employee_entry($form, $dbh, \%myconfig);
4fd8bdbf Moritz Bunkus
$self->create_schema_info_table($form, $dbh);

be3db7d1 Moritz Bunkus
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;
}

d319704a Moritz Bunkus
$rc = 0;

38a2e789 Moritz Bunkus
my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $myconfig{dbdriver})->parse_dbupdate_controls;
d319704a Moritz Bunkus
38a2e789 Moritz Bunkus
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;
d319704a Moritz Bunkus
38a2e789 Moritz Bunkus
if ($update_available) {
d69fdcda Moritz Bunkus
$form->{"stylesheet"} = "lx-office-erp.css";
$form->{"title"} = $main::locale->text("Dataset upgrade");
$form->header();
9aaca433 Moritz Bunkus
print $form->parse_html_template("dbupgrade/header");
aa6ce434 Moritz Bunkus
$form->{dbupdate} = "db$myconfig{dbname}";
$form->{ $form->{dbupdate} } = 1;

a7ae494b Moritz Bunkus
if ($form->{"show_dbupdate_warning"}) {
9aaca433 Moritz Bunkus
print $form->parse_html_template("dbupgrade/warning");
b2945bf6 Sven Schöling
::end_of_request();
aa6ce434 Moritz Bunkus
}

# update the tables
7274f9c8 Sven Schöling
if (!open(FH, ">", $::lx_office_conf{paths}->{userspath} . "/nologin")) {
52cd76db Moritz Bunkus
$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.',
8cd05ad6 Moritz Bunkus
$::lx_office_conf{paths}->{userspath}),
52cd76db Moritz Bunkus
'back_button' => 1);
}
d319704a Moritz Bunkus
# required for Oracle
$form->{dbdefault} = $sid;

# ignore HUP, QUIT in case the webserver times out
$SIG{HUP} = 'IGNORE';
$SIG{QUIT} = 'IGNORE';

$self->dbupdate($form);
7e0ad798 Moritz Bunkus
$self->dbupdate2($form, $dbupdater);
2da6fbfb Moritz Bunkus
SL::DBUpgrade2->new(form => $::form, dbdriver => 'Pg', auth => 1)->apply_admin_dbupgrade_scripts(0);
d319704a Moritz Bunkus
8e6eda05 Moritz Bunkus
close(FH);

d319704a Moritz Bunkus
# remove lock file
8cd05ad6 Moritz Bunkus
unlink($::lx_office_conf{paths}->{userspath} . "/nologin");
d319704a Moritz Bunkus
e9b15b28 Moritz Bunkus
my $menufile =
$self->{"menustyle"} eq "v3" ? "menuv3.pl" :
$self->{"menustyle"} eq "neu" ? "menunew.pl" :
ee356ccc Holger Lindemann
$self->{"menustyle"} eq "js" ? "menujs.pl" :
e9b15b28 Moritz Bunkus
"menu.pl";

9aaca433 Moritz Bunkus
print $form->parse_html_template("dbupgrade/footer", { "menufile" => $menufile });
d319704a Moritz Bunkus
$rc = -2;
}
}

$main::lxdebug->leave_sub();

return $rc;
}

sub dbconnect_vars {
$main::lxdebug->enter_sub();

my ($form, $db) = @_;

my %dboptions = (
'Pg' => { 'yy-mm-dd' => 'set DateStyle to \'ISO\'',
'yyyy-mm-dd' => 'set DateStyle to \'ISO\'',
'mm/dd/yy' => 'set DateStyle to \'SQL, US\'',
'mm-dd-yy' => 'set DateStyle to \'POSTGRES, US\'',
'dd/mm/yy' => 'set DateStyle to \'SQL, EUROPEAN\'',
'dd-mm-yy' => 'set DateStyle to \'POSTGRES, EUROPEAN\'',
'dd.mm.yy' => 'set DateStyle to \'GERMAN\''
},
'Oracle' => {
'yy-mm-dd' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'YY-MM-DD\'',
'yyyy-mm-dd' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'YYYY-MM-DD\'',
'mm/dd/yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'MM/DD/YY\'',
'mm-dd-yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'MM-DD-YY\'',
'dd/mm/yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD/MM/YY\'',
'dd-mm-yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD-MM-YY\'',
'dd.mm.yy' => 'ALTER SESSION SET NLS_DATE_FORMAT = \'DD.MM.YY\'',
});

$form->{dboptions} = $dboptions{ $form->{dbdriver} }{ $form->{dateformat} };

if ($form->{dbdriver} eq 'Pg') {
$form->{dbconnect} = "dbi:Pg:dbname=$db";
}

if ($form->{dbdriver} eq 'Oracle') {
$form->{dbconnect} = "dbi:Oracle:sid=$form->{sid}";
}

if ($form->{dbhost}) {
$form->{dbconnect} .= ";host=$form->{dbhost}";
}
if ($form->{dbport}) {
$form->{dbconnect} .= ";port=$form->{dbport}";
}

$main::lxdebug->leave_sub();
}

sub dbdrivers {
$main::lxdebug->enter_sub();

my @drivers = DBI->available_drivers();

$main::lxdebug->leave_sub();

return (grep { /(Pg|Oracle)/ } @drivers);
}

sub dbsources {
$main::lxdebug->enter_sub();

my ($self, $form) = @_;

my @dbsources = ();
my ($sth, $query);

$form->{dbdefault} = $form->{dbuser} unless $form->{dbdefault};
$form->{sid} = $form->{dbdefault};
&dbconnect_vars($form, $form->{dbdefault});

22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
d319704a Moritz Bunkus
or $form->dberror;

if ($form->{dbdriver} eq 'Pg') {
f7057756 Moritz Bunkus
$query =
qq|SELECT datname FROM pg_database | .
qq|WHERE NOT datname IN ('template0', 'template1')|;
$sth = $dbh->prepare($query);
$sth->execute() || $form->dberror($query);
d319704a Moritz Bunkus
while (my ($db) = $sth->fetchrow_array) {

if ($form->{only_acc_db}) {

next if ($db =~ /^template/);

&dbconnect_vars($form, $db);
22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
d319704a Moritz Bunkus
or $form->dberror;

f7057756 Moritz Bunkus
$query =
qq|SELECT tablename FROM pg_tables | .
qq|WHERE (tablename = 'defaults') AND (tableowner = ?)|;
d319704a Moritz Bunkus
my $sth = $dbh->prepare($query);
f7057756 Moritz Bunkus
$sth->execute($form->{dbuser}) ||
$form->dberror($query . " ($form->{dbuser})");
d319704a Moritz Bunkus
if ($sth->fetchrow_array) {
f7057756 Moritz Bunkus
push(@dbsources, $db);
d319704a Moritz Bunkus
}
$sth->finish;
$dbh->disconnect;
next;
}
f7057756 Moritz Bunkus
push(@dbsources, $db);
d319704a Moritz Bunkus
}
}

if ($form->{dbdriver} eq 'Oracle') {
if ($form->{only_acc_db}) {
f7057756 Moritz Bunkus
$query =
qq|SELECT owner FROM dba_objects | .
qq|WHERE object_name = 'DEFAULTS' AND object_type = 'TABLE'|;
d319704a Moritz Bunkus
} else {
$query = qq|SELECT username FROM dba_users|;
}

$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);

while (my ($db) = $sth->fetchrow_array) {
f7057756 Moritz Bunkus
push(@dbsources, $db);
d319704a Moritz Bunkus
}
}

$sth->finish;
$dbh->disconnect;

$main::lxdebug->leave_sub();

return @dbsources;
}

c87608ab Moritz Bunkus
sub dbclusterencoding {
$main::lxdebug->enter_sub();

my ($self, $form) = @_;

$form->{dbdefault} ||= $form->{dbuser};

dbconnect_vars($form, $form->{dbdefault});

22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) || $form->dberror();
c87608ab Moritz Bunkus
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;
}

d319704a Moritz Bunkus
sub dbcreate {
$main::lxdebug->enter_sub();

my ($self, $form) = @_;

61bd0898 Moritz Bunkus
$form->{sid} = $form->{dbdefault};
&dbconnect_vars($form, $form->{dbdefault});
my $dbh =
22c02125 Moritz Bunkus
SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
61bd0898 Moritz Bunkus
or $form->dberror;
f7057756 Moritz Bunkus
$form->{db} =~ s/\"//g;
d319704a Moritz Bunkus
my %dbcreate = (
'Pg' => qq|CREATE DATABASE "$form->{db}"|,
'Oracle' =>
f7057756 Moritz Bunkus
qq|CREATE USER "$form->{db}" DEFAULT TABLESPACE USERS | .
qq|TEMPORARY TABLESPACE TEMP IDENTIFIED BY "$form->{db}"|
d319704a Moritz Bunkus
);

61bd0898 Moritz Bunkus
my %dboptions = (
'Pg' => [],
);

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");
}
d319704a Moritz Bunkus
f7057756 Moritz Bunkus
my $query = $dbcreate{$form->{dbdriver}};
61bd0898 Moritz Bunkus
$query .= " WITH " . join(" ", @{$dboptions{"Pg"}}) if (@{$dboptions{"Pg"}});

6b7624a4 Moritz Bunkus
# Ignore errors if the database exists.
$dbh->do($query);
d319704a Moritz Bunkus
if ($form->{dbdriver} eq 'Oracle') {
f7057756 Moritz Bunkus
$query = qq|GRANT CONNECT, RESOURCE TO "$form->{db}"|;
do_query($form, $dbh, $query);
d319704a Moritz Bunkus
}
$dbh->disconnect;

# setup variables for the new database
if ($form->{dbdriver} eq 'Oracle') {
$form->{dbuser} = $form->{db};
$form->{dbpasswd} = $form->{db};
}

&dbconnect_vars($form, $form->{db});

22c02125 Moritz Bunkus
$dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
d319704a Moritz Bunkus
or $form->dberror;

faef45c2 Moritz Bunkus
my $db_charset = $Common::db_encoding_to_charset{$form->{encoding}};
$db_charset ||= Common::DEFAULT_CHARSET;

0b6cb3b8 Moritz Bunkus
my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver});
d319704a Moritz Bunkus
# create the tables
a1d1605e Moritz Bunkus
$dbupdater->process_query($dbh, "sql/lx-office.sql", undef, $db_charset);
d319704a Moritz Bunkus
# load chart of accounts
a1d1605e Moritz Bunkus
$dbupdater->process_query($dbh, "sql/$form->{chart}-chart.sql", undef, $db_charset);
d319704a Moritz Bunkus
f7057756 Moritz Bunkus
$query = "UPDATE defaults SET coa = ?";
do_query($form, $dbh, $query, $form->{chart});
43f9b1c5 Geoffrey Richardson
$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});
89c9d0aa Moritz Bunkus
d319704a Moritz Bunkus
$dbh->disconnect;

$main::lxdebug->leave_sub();
}

sub dbdelete {
$main::lxdebug->enter_sub();

my ($self, $form) = @_;
f7057756 Moritz Bunkus
$form->{db} =~ s/\"//g;
d319704a Moritz Bunkus
my %dbdelete = ('Pg' => qq|DROP DATABASE "$form->{db}"|,
f7057756 Moritz Bunkus
'Oracle' => qq|DROP USER "$form->{db}" CASCADE|);
d319704a Moritz Bunkus
$form->{sid} = $form->{dbdefault};
&dbconnect_vars($form, $form->{dbdefault});
22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
d319704a Moritz Bunkus
or $form->dberror;
f7057756 Moritz Bunkus
my $query = $dbdelete{$form->{dbdriver}};
do_query($form, $dbh, $query);
d319704a Moritz Bunkus
$dbh->disconnect;

$main::lxdebug->leave_sub();
}

sub dbsources_unused {
$main::lxdebug->enter_sub();

8c7e4493 Moritz Bunkus
my ($self, $form) = @_;
d319704a Moritz Bunkus
$form->{only_acc_db} = 1;

8c7e4493 Moritz Bunkus
my %members = $main::auth->read_all_users();
my %dbexcl = map { $_ => 1 } grep { $_ } map { $_->{dbname} } values %members;
d319704a Moritz Bunkus
8c7e4493 Moritz Bunkus
$dbexcl{$form->{dbdefault}} = 1;
$dbexcl{$main::auth->{DB_config}->{db}} = 1;

my @dbunused = grep { !$dbexcl{$_} } dbsources("", $form);
d319704a Moritz Bunkus
$main::lxdebug->leave_sub();

8c7e4493 Moritz Bunkus
return @dbunused;
d319704a Moritz Bunkus
}

sub dbneedsupdate {
$main::lxdebug->enter_sub();

my ($self, $form) = @_;

38a2e789 Moritz Bunkus
my %members = $main::auth->read_all_users();
my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver})->parse_dbupdate_controls;
d319704a Moritz Bunkus
0b280f98 Moritz Bunkus
my ($query, $sth, %dbs_needing_updates);
d319704a Moritz Bunkus
8c7e4493 Moritz Bunkus
foreach my $login (grep /[a-z]/, keys %members) {
my $member = $members{$login};
d319704a Moritz Bunkus
0b280f98 Moritz Bunkus
map { $form->{$_} = $member->{$_} } qw(dbname dbuser dbpasswd dbhost dbport);
dbconnect_vars($form, $form->{dbname});
8c7e4493 Moritz Bunkus
22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd});
d319704a Moritz Bunkus
0b280f98 Moritz Bunkus
next unless $dbh;
d319704a Moritz Bunkus
0b280f98 Moritz Bunkus
my $version;
d319704a Moritz Bunkus
0b280f98 Moritz Bunkus
$query = qq|SELECT version FROM defaults|;
$sth = prepare_query($form, $dbh, $query);
if ($sth->execute()) {
($version) = $sth->fetchrow_array();
d319704a Moritz Bunkus
}
0b280f98 Moritz Bunkus
$sth->finish();
d319704a Moritz Bunkus
38a2e789 Moritz Bunkus
$dbh->disconnect and next unless $version;

my $update_available = $dbupdater->update_available($version) || $dbupdater->update2_available($dbh);
$dbh->disconnect;
d319704a Moritz Bunkus
38a2e789 Moritz Bunkus
if ($update_available) {
0b280f98 Moritz Bunkus
my $dbinfo = {};
map { $dbinfo->{$_} = $member->{$_} } grep /^db/, keys %{ $member };
$dbs_needing_updates{$member->{dbhost} . "::" . $member->{dbname}} = $dbinfo;
d319704a Moritz Bunkus
}
}

$main::lxdebug->leave_sub();

0b280f98 Moritz Bunkus
return values %dbs_needing_updates;
d319704a Moritz Bunkus
}

sub calc_version {
8c6efb2a Moritz Bunkus
$main::lxdebug->enter_sub(2);
d319704a Moritz Bunkus
my (@v, $version, $i);

@v = split(/\./, $_[0]);
while (scalar(@v) < 4) {
push(@v, 0);
}
$version = 0;
for ($i = 0; $i < 4; $i++) {
$version *= 1000;
$version += $v[$i];
}

8c6efb2a Moritz Bunkus
$main::lxdebug->leave_sub(2);
d319704a Moritz Bunkus
return $version;
}

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_a =~ s/.*-upgrade-//;
$my_a =~ s/.sql$//;
$my_b =~ s/.*-upgrade-//;
$my_b =~ s/.sql$//;
b8da8785 Sven Schöling
my ($my_a_from, $my_a_to) = split(/-/, $my_a);
my ($my_b_from, $my_b_to) = split(/-/, $my_b);
d319704a Moritz Bunkus
$res_a = calc_version($my_a_from);
$res_b = calc_version($my_b_from);

if ($res_a == $res_b) {
$res_a = calc_version($my_a_to);
$res_b = calc_version($my_b_to);
}

return $res_a <=> $res_b;
}

4fd8bdbf Moritz Bunkus
sub create_schema_info_table {
$main::lxdebug->enter_sub();

my ($self, $form, $dbh) = @_;

my $query = "SELECT tag FROM schema_info LIMIT 1";
if (!$dbh->do($query)) {
81b82d22 Moritz Bunkus
$dbh->rollback();
4fd8bdbf Moritz Bunkus
$query =
f7057756 Moritz Bunkus
qq|CREATE TABLE schema_info (| .
qq| tag text, | .
qq| login text, | .
qq| itime timestamp DEFAULT now(), | .
qq| PRIMARY KEY (tag))|;
4fd8bdbf Moritz Bunkus
$dbh->do($query) || $form->dberror($query);
}

$main::lxdebug->leave_sub();
}

d319704a Moritz Bunkus
sub dbupdate {
$main::lxdebug->enter_sub();

my ($self, $form) = @_;

8e6eda05 Moritz Bunkus
local *SQLDIR;

d319704a Moritz Bunkus
$form->{sid} = $form->{dbdefault};

my @upgradescripts = ();
my $query;
my $rc = -2;

if ($form->{dbupdate}) {

# read update scripts into memory
f7057756 Moritz Bunkus
opendir(SQLDIR, "sql/" . $form->{dbdriver} . "-upgrade")
or &error("", "sql/" . $form->{dbdriver} . "-upgrade : $!");
d319704a Moritz Bunkus
@upgradescripts =
sort(cmp_script_version
f7057756 Moritz Bunkus
grep(/$form->{dbdriver}-upgrade-.*?\.(sql|pl)$/,
readdir(SQLDIR)));
closedir(SQLDIR);
d319704a Moritz Bunkus
}

be6f6cfd Moritz Bunkus
my $db_charset = $::lx_office_conf{system}->{dbcharset};
faef45c2 Moritz Bunkus
$db_charset ||= Common::DEFAULT_CHARSET;

0b6cb3b8 Moritz Bunkus
my $dbupdater = SL::DBUpgrade2->new(form => $form, dbdriver => $form->{dbdriver});
a1d1605e Moritz Bunkus
f7057756 Moritz Bunkus
foreach my $db (split(/ /, $form->{dbupdate})) {
d319704a Moritz Bunkus
next unless $form->{$db};

# strip db from dataset
$db =~ s/^db//;
&dbconnect_vars($form, $db);

22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd})
d319704a Moritz Bunkus
or $form->dberror;

8c7e4493 Moritz Bunkus
$dbh->do($form->{dboptions}) if ($form->{dboptions});

d319704a Moritz Bunkus
# check version
$query = qq|SELECT version FROM defaults|;
f7057756 Moritz Bunkus
my ($version) = selectrow_query($form, $dbh, $query);
d319704a Moritz Bunkus
next unless $version;

$version = calc_version($version);

foreach my $upgradescript (@upgradescripts) {
my $a = $upgradescript;
5cf977e5 Moritz Bunkus
$a =~ s/^\Q$form->{dbdriver}\E-upgrade-|\.(sql|pl)$//g;
d319704a Moritz Bunkus
my ($mindb, $maxdb) = split /-/, $a;
df9b211e Moritz Bunkus
my $str_maxdb = $maxdb;
d319704a Moritz Bunkus
$mindb = calc_version($mindb);
$maxdb = calc_version($maxdb);

next if ($version >= $maxdb);

# if there is no upgrade script exit
last if ($version < $mindb);

# apply upgrade
3d967be3 Sven Schöling
$main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $upgradescript");
35636cc2 Moritz Bunkus
$dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade/$upgradescript", $str_maxdb, $db_charset);
d319704a Moritz Bunkus
$version = $maxdb;

}

$rc = 0;
$dbh->disconnect;

}

$main::lxdebug->leave_sub();

return $rc;
}

4fd8bdbf Moritz Bunkus
sub dbupdate2 {
$main::lxdebug->enter_sub();

7e0ad798 Moritz Bunkus
my ($self, $form, $dbupdater) = @_;
4fd8bdbf Moritz Bunkus
$form->{sid} = $form->{dbdefault};

9b0c7269 Moritz Bunkus
my $rc = -2;
be6f6cfd Moritz Bunkus
my $db_charset = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
4fd8bdbf Moritz Bunkus
9b0c7269 Moritz Bunkus
map { $_->{description} = SL::Iconv::convert($_->{charset}, $db_charset, $_->{description}) } values %{ $dbupdater->{all_controls} };
faef45c2 Moritz Bunkus
4fd8bdbf Moritz Bunkus
foreach my $db (split / /, $form->{dbupdate}) {
next unless $form->{$db};

# strip db from dataset
$db =~ s/^db//;
&dbconnect_vars($form, $db);

22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($form->{dbconnect}, $form->{dbuser}, $form->{dbpasswd}) or $form->dberror;
4fd8bdbf Moritz Bunkus
8c7e4493 Moritz Bunkus
$dbh->do($form->{dboptions}) if ($form->{dboptions});

0b280f98 Moritz Bunkus
$self->create_schema_info_table($form, $dbh);

9b0c7269 Moritz Bunkus
my @upgradescripts = $dbupdater->unapplied_upgrade_scripts($dbh);
4fd8bdbf Moritz Bunkus
9b0c7269 Moritz Bunkus
$dbh->disconnect and next if !@upgradescripts;
4fd8bdbf Moritz Bunkus
foreach my $control (@upgradescripts) {
# apply upgrade
3d967be3 Sven Schöling
$main::lxdebug->message(LXDebug->DEBUG2(), "Applying Update $control->{file}");
9aaca433 Moritz Bunkus
print $form->parse_html_template("dbupgrade/upgrade_message2", $control);
4fd8bdbf Moritz Bunkus
35636cc2 Moritz Bunkus
$dbupdater->process_file($dbh, "sql/" . $form->{"dbdriver"} . "-upgrade2/$control->{file}", $control, $db_charset);
4fd8bdbf Moritz Bunkus
}

$rc = 0;
$dbh->disconnect;

}

$main::lxdebug->leave_sub();

return $rc;
}

8c7e4493 Moritz Bunkus
sub save_member {
d319704a Moritz Bunkus
$main::lxdebug->enter_sub();

8e6eda05 Moritz Bunkus
my ($self) = @_;
b8da8785 Sven Schöling
my $form = \%main::form;
8e6eda05 Moritz Bunkus
8c7e4493 Moritz Bunkus
# format dbconnect and dboptions string
dbconnect_vars($self, $self->{dbname});
d319704a Moritz Bunkus
8c7e4493 Moritz Bunkus
map { $self->{$_} =~ s/\r//g; } qw(address signature);
d319704a Moritz Bunkus
8c7e4493 Moritz Bunkus
$main::auth->save_user($self->{login}, map { $_, $self->{$_} } config_vars());
d319704a Moritz Bunkus
22c02125 Moritz Bunkus
my $dbh = SL::DBConnect->connect($self->{dbconnect}, $self->{dbuser}, $self->{dbpasswd});
8c7e4493 Moritz Bunkus
if ($dbh) {
14c1b704 Moritz Bunkus
$self->create_employee_entry($form, $dbh, $self, 1);
8c7e4493 Moritz Bunkus
$dbh->disconnect();
d319704a Moritz Bunkus
}

$main::lxdebug->leave_sub();
}

8c7e4493 Moritz Bunkus
sub create_employee_entry {
d319704a Moritz Bunkus
$main::lxdebug->enter_sub();

14c1b704 Moritz Bunkus
my $self = shift;
my $form = shift;
my $dbh = shift;
my $myconfig = shift;
my $update_existing = shift;
d319704a Moritz Bunkus
c8c960bc Moritz Bunkus
if (!does_table_exist($dbh, 'employee')) {
$main::lxdebug->leave_sub();
return;
}

8c7e4493 Moritz Bunkus
# add login to employee table if it does not exist
# no error check for employee table, ignore if it does not exist
14c1b704 Moritz Bunkus
my ($id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $self->{login});
d319704a Moritz Bunkus
14c1b704 Moritz Bunkus
if (!$id) {
b8da8785 Sven Schöling
my $query = qq|INSERT INTO employee (login, name, workphone, role) VALUES (?, ?, ?, ?)|;
8c7e4493 Moritz Bunkus
do_query($form, $dbh, $query, ($self->{login}, $myconfig->{name}, $myconfig->{tel}, "user"));
14c1b704 Moritz Bunkus
} 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);
d319704a Moritz Bunkus
}

$main::lxdebug->leave_sub();
}

sub config_vars {
$main::lxdebug->enter_sub();

0dd879bc Moritz Bunkus
my @conf = qw(address admin businessnumber company countrycode
d319704a Moritz Bunkus
currency dateformat dbconnect dbdriver dbhost dbport dboptions
ef5a164c Moritz Bunkus
dbname dbuser dbpasswd email fax name numberformat password
f3490e85 Sven Schöling
printer sid signature stylesheet tel templates vclimit angebote
f7057756 Moritz Bunkus
bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen
taxnumber co_ustid duns menustyle template_format default_media
d707f7ac Moritz Bunkus
default_printer_id copies show_form_details favorites
f13e90e5 Moritz Bunkus
pdonumber sdonumber hide_cvar_search_options mandatory_departments
sepa_creditor_id);
d319704a Moritz Bunkus
$main::lxdebug->leave_sub();

return @conf;
}

sub error {
$main::lxdebug->enter_sub();

my ($self, $msg) = @_;

98e5f069 Moritz Bunkus
$main::lxdebug->show_backtrace();

d319704a Moritz Bunkus
if ($ENV{HTTP_USER_AGENT}) {
print qq|Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">

<body bgcolor=ffffff>

<h2><font color=red>Error!</font></h2>
<p><b>$msg</b>|;

}

die "Error: $msg\n";

$main::lxdebug->leave_sub();
}

1;