X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fmodules%2FDBsqlite.pm;h=5bee915c414a74b42152acc92d4beaf4bd8dd92b;hb=5a6026e100abdffd3bebc1b66cc21d88845fa848;hp=f82a0d9738fdab6b2561b63afd171c3a5646edc6;hpb=299c45d66a6272e942e556bee9622727de99773e;p=gosa.git diff --git a/gosa-si/modules/DBsqlite.pm b/gosa-si/modules/DBsqlite.pm index f82a0d973..5bee915c4 100644 --- a/gosa-si/modules/DBsqlite.pm +++ b/gosa-si/modules/DBsqlite.pm @@ -1,4 +1,4 @@ -package DBsqlite; +package GOSA::DBsqlite; use strict; @@ -25,7 +25,9 @@ sub create_table { my $object = shift; my $table_name = shift; my $col_names_ref = shift; - my $sql_statement = "CREATE TABLE IF NOT EXISTS $table_name (".join(', ', @{$col_names_ref}).")"; +# unshift(@{$col_names_ref}, "id INTEGER PRIMARY KEY AUTOINCREMENT"); + my $col_names_string = join(', ', @{$col_names_ref}); + my $sql_statement = "CREATE TABLE IF NOT EXISTS $table_name ( $col_names_string )"; $object->{dbh}->do($sql_statement); return 0; } @@ -42,50 +44,70 @@ sub add_dbentry { if (not defined $table) { return 1; } - - # incrementing running id - if (not exists $arg->{id}) { - my $max_id = @{@{$obj->{dbh}->selectall_arrayref("SELECT MAX(id) FROM $table")}[0]}[0]; - if (not defined $max_id) { - $max_id = 0; - } - $arg->{id} = $max_id + 1; - } - - - # fetch column names of table - my $col_names = $obj->get_table_columns($table); - - # assign values to column name variables - my @add_list; - foreach my $col_name (@{$col_names}) { - if (exists $arg->{$col_name}) { - push(@add_list, $arg->{$col_name}); - } else { - my $default_val = "none"; - if ($col_name eq "timestamp") { - $default_val = "19700101000000"; - } - push(@add_list, $default_val); - } - - } - # check wether id does not exists in table, otherwise return errorflag 2 - my $res = @{$obj->{dbh}->selectall_arrayref( "SELECT * FROM $table WHERE id='$arg->{id}'")}; - if ($res != 0) { + # specify primary key in table + my $primkey = $arg->{primkey}; + + # check wether value to primary key is specified + if ( ( defined $primkey ) && ( not $arg->{ $primkey } ) ) { return 2; } + + # if timestamp is not provided, add timestamp + if( not exists $arg->{timestamp} ) { + $arg->{timestamp} = &get_time; + } - my $sql_statement = " INSERT INTO $table VALUES ('".join("', '", @add_list)."') "; - print " INSERT INTO $table VALUES ('".join("', '", @add_list)."')\n"; - $obj->{dbh}->do($sql_statement); + # check wether primkey is unique in table, otherwise return errorflag 3 + my $res = @{ $obj->{dbh}->selectall_arrayref( "SELECT * FROM $table WHERE $primkey='$arg->{$primkey}'") }; + if ($res == 0) { + # fetch column names of table + my $col_names = $obj->get_table_columns($table); + + # assign values to column name variables + my @add_list; + foreach my $col_name (@{$col_names}) { + # use function parameter for column values + if (exists $arg->{$col_name}) { + push(@add_list, $arg->{$col_name}); + } + } + + my $sql_statement = " INSERT INTO $table VALUES ('".join("', '", @add_list)."')"; + my $db_res = $obj->{dbh}->do($sql_statement); + if( $db_res != 1 ) { + return 1; + } else { + return 0; + } - return 0; + } else { + my $update_hash = { table=>$table }; + $update_hash->{where} = [ { $primkey=>[ $arg->{$primkey} ] } ]; + $update_hash->{update} = [ {} ]; + while( my ($pram, $val) = each %{$arg} ) { + if( $pram eq 'table' ) { next; } + if( $pram eq 'primkey' ) { next; } + $update_hash->{update}[0]->{$pram} = [$val]; + } + my $db_res = &update_dbentry( $obj, $update_hash ); + if( $db_res != 1 ) { + return 1; + } else { + return 0; + } + } } -sub change_dbentry { + +# error-flags +# 1 no table ($table) defined +# 2 no restriction parameter ($restric_pram) defined +# 3 no restriction value ($restric_val) defined +# 4 column name not known in table +# 5 no column names to change specified +sub update_dbentry { my $obj = shift; my $arg = shift; @@ -97,49 +119,41 @@ sub change_dbentry { } else { delete $arg->{table}; } + # extract where parameter from arg hash - my $restric_pram = $arg->{where}; - if (not defined $restric_pram) { - return 2; - } else { - delete $arg->{'where'}; - } - # extrac where value from arg hash - my $restric_val = $arg->{$restric_pram}; - if (not defined $restric_val) { - return 3; - } else { - delete $arg->{$restric_pram}; - } - - # check wether table has all specified columns - my $columns = {}; - my @res = @{$obj->{dbh}->selectall_arrayref("pragma table_info('$table')")}; - foreach my $column (@res) { - $columns->{@$column[1]} = ""; - } - my @pram_list = keys %$arg; - foreach my $pram (@pram_list) { - if (not exists $columns->{$pram}) { - return 4; + my $where_statement = ""; + if( exists $arg->{where} ) { + my $where_hash = @{ $arg->{where} }[0]; + if( 0 < keys %{ $where_hash } ) { + my @where_list; + while( my ($rest_pram, $rest_val) = each %{ $where_hash } ) { + my $statement; + if( $rest_pram eq 'timestamp' ) { + $statement = "$rest_pram<'@{ $rest_val }[0]'"; + } else { + $statement = "$rest_pram='@{ $rest_val }[0]'"; + } + push( @where_list, $statement ); + } + $where_statement .= "WHERE ".join('AND ', @where_list); } } - - - # select all changes - my @change_list; - my $sql_part; - while (my($pram, $val) = each(%{$arg})) { - push(@change_list, "$pram='$val'"); - } - - if (not@change_list) { - return 5; + # extract update parameter from arg hash + my $update_hash = @{ $arg->{update} }[0]; + my $update_statement = ""; + if( 0 < keys %{ $update_hash } ) { + my @update_list; + while( my ($rest_pram, $rest_val) = each %{ $update_hash } ) { + my $statement = "$rest_pram='@{ $rest_val }[0]'"; + push( @update_list, $statement ); + } + $update_statement .= join(', ', @update_list); } - $obj->{dbh}->do("UPDATE $table SET ".join(', ',@change_list)." WHERE $restric_pram='$restric_val'"); - return 0; + my $sql_statement = "UPDATE $table SET $update_statement $where_statement"; + my $db_answer = $obj->{dbh}->do($sql_statement); + return $db_answer; } @@ -155,30 +169,28 @@ sub del_dbentry { } else { delete $arg->{table}; } - # extract where parameter from arg hash - my $restric_pram = $arg->{where}; - if (not defined $restric_pram) { - return 2; - } else { - delete $arg->{'where'}; + + # collect select statements + my @del_list; + while (my ($pram, $val) = each %{$arg}) { + if ( $pram eq 'timestamp' ) { + push(@del_list, "$pram < '$val'"); + } else { + push(@del_list, "$pram = '$val'"); + } } - # extrac where value from arg hash - my $restric_val = $arg->{$restric_pram}; - if (not defined $restric_val) { - return 3; + + my $where_statement; + if( not @del_list ) { + $where_statement = ""; } else { - delete $arg->{$restric_pram}; - } - - # check wether entry exists - my $res = @{$obj->{dbh}->selectall_arrayref( "SELECT * FROM $table WHERE $restric_pram='$restric_val'")}; - if ($res == 0) { - return 4; + $where_statement = "WHERE ".join(' AND ', @del_list); } - $obj->{dbh}->do("DELETE FROM $table WHERE $restric_pram='$restric_val'"); + my $sql_statement = "DELETE FROM $table $where_statement"; + my $db_res = $obj->{dbh}->do($sql_statement); - return 0; + return $db_res; } @@ -210,13 +222,38 @@ sub select_dbentry { # collect select statements my @select_list; - my $sql_part; + my $sql_statement; while (my ($pram, $val) = each %{$arg}) { - push(@select_list, "$pram = '$val'"); + if ( $pram eq 'timestamp' ) { + push(@select_list, "$pram < '$val'"); + } else { + push(@select_list, "$pram = '$val'"); + } } + + if (@select_list == 0) { + $sql_statement = "SELECT ROWID, * FROM '$table'"; + } else { + $sql_statement = "SELECT ROWID, * FROM '$table' WHERE ".join(' AND ', @select_list); + } + + # query db + my $query_answer = $obj->{dbh}->selectall_arrayref($sql_statement); + + # fetch column list of db and create a hash with column_name->column_value of the select query + my $column_list = &get_table_columns($obj, $table); + my $list_len = @{ $column_list } ; + my $answer = {}; + my $hit_counter = 0; + - my $sql_statement = "SELECT * FROM 'jobs' WHERE ".join(' AND ', @select_list); - my $answer = $obj->{dbh}->selectall_arrayref($sql_statement); + foreach my $hit ( @{ $query_answer }) { + $hit_counter++; + $answer->{ $hit_counter }->{ 'ROWID' } = shift @{ $hit }; + for ( my $i = 0; $i < $list_len; $i++) { + $answer->{ $hit_counter }->{ @{ $column_list }[$i] } = @{ $hit }[$i]; + } + } return $answer; } @@ -224,7 +261,7 @@ sub select_dbentry { sub show_table { my $obj = shift; my $table_name = shift; - my @res = @{$obj->{dbh}->selectall_arrayref( "SELECT * FROM $table_name")}; + my @res = @{$obj->{dbh}->selectall_arrayref( "SELECT ROWID, * FROM $table_name")}; my @answer; foreach my $hit (@res) { push(@answer, "hit: ".join(', ', @{$hit})); @@ -240,4 +277,18 @@ sub exec_statement { return \@res; } +sub get_time { + my ($seconds, $minutes, $hours, $monthday, $month, + $year, $weekday, $yearday, $sommertime) = localtime(time); + $hours = $hours < 10 ? $hours = "0".$hours : $hours; + $minutes = $minutes < 10 ? $minutes = "0".$minutes : $minutes; + $seconds = $seconds < 10 ? $seconds = "0".$seconds : $seconds; + $month+=1; + $month = $month < 10 ? $month = "0".$month : $month; + $monthday = $monthday < 10 ? $monthday = "0".$monthday : $monthday; + $year+=1900; + return "$year$month$monthday$hours$minutes$seconds"; +} + + 1;