X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fmodules%2FDBsqlite.pm;h=556b31ef7e96878077fe6793d4c0a0a73973aa3b;hb=67c1e7245360178883e824c3f7519d0d44863a8f;hp=62cd8a6dc0f4beb71a253f20daf3b28f13a41367;hpb=f75ff8b56ca98efe86be24a0c993ffbdfe21b1c1;p=gosa.git diff --git a/gosa-si/modules/DBsqlite.pm b/gosa-si/modules/DBsqlite.pm index 62cd8a6dc..556b31ef7 100644 --- a/gosa-si/modules/DBsqlite.pm +++ b/gosa-si/modules/DBsqlite.pm @@ -64,38 +64,38 @@ sub create_table { sub add_dbentry { - my $self = shift; - my $arg = shift; - my $res = 0; # default value - - # if dbh not specified, return errorflag 1 - my $table = $arg->{table}; - if( not defined $table ) { - return 1 ; - } + my $self = shift; + my $arg = shift; + my $res = 0; # default value + + # if dbh not specified, return errorflag 1 + my $table = $arg->{table}; + if( not defined $table ) { + return 1 ; + } - # if timestamp is not provided, add timestamp - if( not exists $arg->{timestamp} ) { - $arg->{timestamp} = &get_time; - } + # if timestamp is not provided, add timestamp + if( not exists $arg->{timestamp} ) { + $arg->{timestamp} = &get_time; + } - # check primkey and run insert or update - my $primkeys = $arg->{'primkey'}; - my $prim_statement=""; - if( 0 != @$primkeys ) { # more than one primkey exist in list - my @prim_list; - foreach my $primkey (@$primkeys) { - if( not exists $arg->{$primkey} ) { - return (3, "primkey '$primkey' has no value for add_dbentry"); - } - push(@prim_list, "$primkey='".$arg->{$primkey}."'"); - } - $prim_statement = "WHERE ".join(" AND ", @prim_list); + # check primkey and run insert or update + my $primkeys = $arg->{'primkey'}; + my $prim_statement=""; + if( 0 != @$primkeys ) { # more than one primkey exist in list + my @prim_list; + foreach my $primkey (@$primkeys) { + if( not exists $arg->{$primkey} ) { + return (3, "primkey '$primkey' has no value for add_dbentry"); + } + push(@prim_list, "$primkey='".$arg->{$primkey}."'"); + } + $prim_statement = "WHERE ".join(" AND ", @prim_list); - # check wether primkey is unique in table, otherwise return errorflag - my $sql_statement = "SELECT * FROM $table $prim_statement"; + # check wether primkey is unique in table, otherwise return errorflag + my $sql_statement = "SELECT * FROM $table $prim_statement"; eval { - $res = @{ $self->{dbh}->selectall_arrayref($sql_statement) }; + $res = @{ $self->{dbh}->selectall_arrayref($sql_statement) }; }; if($@) { $self->{dbh}->do("ANALYZE"); @@ -107,62 +107,75 @@ sub add_dbentry { } } - } + } - # primekey is unique or no primkey specified -> run insert - if ($res == 0) { - # fetch column names of table - my $col_names = &get_table_columns($self, $table); + # primkey is unique or no primkey specified -> run insert + if ($res == 0) { + # fetch column names of table + my $col_names = &get_table_columns($self, $table); + + my $create_id=0; + foreach my $col_name (@{$col_names}) { + if($col_name eq "id" && (! exists $arg->{$col_name})) { + &main::daemon_log("DEBUG: id field found without value! Creating autoincrement statement!"); + $create_id=1; + } + } - # assign values to column name variables - my @col_list; + # assign values to column name variables + my @col_list; my @val_list; - foreach my $col_name (@{$col_names}) { - # use function parameter for column values - if (exists $arg->{$col_name}) { - push(@col_list, "'".$col_name."'"); - push(@val_list, "'".$arg->{$col_name}."'"); - } - } - - my $sql_statement = "INSERT INTO $table (".join(", ", @col_list).") VALUES ('".join("', '", @val_list)."')"; - &main::daemon_log("DEBUG: $sql_statement", 7); + foreach my $col_name (@{$col_names}) { + # use function parameter for column values + if (exists $arg->{$col_name}) { + push(@col_list, "'".$col_name."'"); + push(@val_list, "'".$arg->{$col_name}."'"); + } + } + + my $sql_statement; + if($create_id==1) { + $sql_statement = "INSERT INTO $table ('id', ".join(", ", @col_list).") VALUES ((select coalesce(max(id), 0)+1 from $table), ".join(", ", @val_list).")"; + } else { + $sql_statement = "INSERT INTO $table (".join(", ", @col_list).") VALUES (".join(", ", @val_list).")"; + } my $db_res; eval { - $db_res = $self->{dbh}->do($sql_statement); + $db_res = $self->{dbh}->do($sql_statement); }; if($@) { $self->{dbh}->do("ANALYZE"); eval { - $db_res = $self->{dbh}->do($sql_statement); + $db_res = $self->{dbh}->do($sql_statement); }; if($@) { &main::daemon_log("ERROR: $sql_statement failed with $@", 1); } } - if( $db_res != 1 ) { - return (4, $sql_statement); - } - - # entry already exists -> run update - } else { - my @update_l; - while( my ($pram, $val) = each %{$arg} ) { - if( $pram eq 'table' ) { next; } - if( $pram eq 'primkey' ) { next; } - push(@update_l, "$pram='$val'"); - } - my $update_str= join(", ", @update_l); - $update_str= " SET $update_str"; + if( $db_res != 1 ) { + return (4, $sql_statement); + } + + # entry already exists -> run update + } else { + my @update_l; + while( my ($pram, $val) = each %{$arg} ) { + if( $pram eq 'table' ) { next; } + if( $pram eq 'primkey' ) { next; } + push(@update_l, "$pram='$val'"); + } + my $update_str= join(", ", @update_l); + $update_str= " SET $update_str"; - my $sql_statement= "UPDATE $table $update_str $prim_statement"; - my $db_res = &update_dbentry($self, $sql_statement ); - } + my $sql_statement= "UPDATE $table $update_str $prim_statement"; + my $db_res = &update_dbentry($self, $sql_statement ); + } - return 0; + return 0; } + sub update_dbentry { my ($self, $sql)= @_; my $db_answer= &exec_statement($self, $sql); @@ -283,29 +296,35 @@ sub exec_statement { sub exec_statementlist { - my $self = shift; - my $sql_list = shift; - my @db_answer; + my $self = shift; + my $sql_list = shift; + my @db_answer; - $self->{dbh}->do("ANALYZE"); - foreach my $sql (@$sql_list) { - eval { - push @db_answer, @{$self->{dbh}->selectall_arrayref($sql)}; - }; - if($@) { - $self->{dbh}->do("ANALYZE"); + foreach my $sql (@$sql_list) { + if(defined($sql) && length($sql) > 0) { eval { - push @db_answer, @{$self->{dbh}->selectall_arrayref($sql)}; + my @answer = @{$self->{dbh}->selectall_arrayref($sql)}; + push @db_answer, @answer; }; if($@) { - &main::daemon_log("ERROR: $sql failed with $@", 1); + $self->{dbh}->do("ANALYZE"); + eval { + my @answer = @{$self->{dbh}->selectall_arrayref($sql)}; + push @db_answer, @answer; + }; + if($@) { + &main::daemon_log("ERROR: $sql failed with $@", 1); + } } + } else { + next; } - } + } - return \@db_answer; + return \@db_answer; } + sub count_dbentries { my ($self, $table)= @_; my $error= 0;