X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-si%2Fmodules%2FDBsqlite.pm;h=985963da4a01e994e99d87dd0a858d8eef26fd9a;hb=6a2030fa85791f8f789fb3bf549d99dfba833860;hp=21ad1f75244642af8b04a889676d1a08bb8925a1;hpb=30b195a1a34556941020bfed9f203cee9bd9fefb;p=gosa.git diff --git a/gosa-si/modules/DBsqlite.pm b/gosa-si/modules/DBsqlite.pm index 21ad1f752..985963da4 100644 --- a/gosa-si/modules/DBsqlite.pm +++ b/gosa-si/modules/DBsqlite.pm @@ -2,6 +2,7 @@ package GOSA::DBsqlite; use strict; use warnings; + use Carp; use DBI; use GOSA::GosaSupportDaemon; @@ -29,7 +30,7 @@ sub new { my @ret = $sth->fetchall_arrayref(); $sth->finish(); if(length(@ret)==1 && $ret[0][0][0] eq 'ok') { - &main::daemon_log("0 DEBUG: Database disk image '".$self->{db_name}."' is ok.", 7); + &main::daemon_log("0 DEBUG: Database disk image '".$self->{db_name}."' is ok.", 74); } else { &main::daemon_log("0 ERROR: Database disk image '".$self->{db_name}."' is malformed, creating new database!", 1); $self->{dbh}->disconnect() or &main::daemon_log("0 ERROR: Could not disconnect from database '".$self->{db_name}."'!", 1); @@ -92,7 +93,7 @@ get_lock: goto get_lock; } else { seek($self->{db_lock_handle}, 0, 2); - &main::daemon_log("0 DEBUG: Acquired lock for database ".$self->{db_name}, 8); + &main::daemon_log("0 DEBUG: Acquired lock for database ".$self->{db_name}, 74); $self->connect(); } return; @@ -109,7 +110,7 @@ sub unlock { &main::daemon_log("0 BIG ERROR: Lockfile for database ".$self->{db_name}."got closed within critical section!", 1); } flock($self->{db_lock_handle}, LOCK_UN); - &main::daemon_log("0 DEBUG: Released lock for database ".$self->{db_name}, 8); + &main::daemon_log("0 DEBUG: Released lock for database ".$self->{db_name}, 74); $self->disconnect(); return; } @@ -130,15 +131,15 @@ sub create_table { push(@col_names, $col_name); } $col_names->{ $table_name } = \@col_names; + my $col_names_string = join(", ", @col_names); # Not activated yet # Check schema - # if($self->check_schema($table_name)) { - # $self->exec_statement("DROP TABLE $table_name"); - # &main::daemon_log("WARNING: Schema of table $table_name has changed! Table will be recreated!", 3); - # } + if($self->check_schema($table_name, $col_names_ref)) { + $self->exec_statement("DROP TABLE $table_name"); + &main::daemon_log("WARNING: Schema of table $table_name has changed! Table will be recreated!", 3); + } - my $col_names_string = join(", ", @col_names); my $sql_statement = "CREATE TABLE IF NOT EXISTS $table_name ( $col_names_string )"; my $res = $self->exec_statement($sql_statement); @@ -153,47 +154,44 @@ sub create_table { } -# sub check_schema { -# my $self = shift; -# my $result = 1; -# if(not defined($self) or ref($self) ne 'GOSA::DBsqlite') { -# &main::daemon_log("0 ERROR: GOSA::DBsqlite::check_schema was called static! Argument was '$self'!", 1); -# return $result; -# } -# -# my $table_name = shift || undef; -# my $table_columns; -# -# if($table_name and $col_names->{$table_name}) { -# # Query the table_info from database -# foreach my $column ( @{ $self->exec_statement ( "pragma table_info('$table_name')" ) } ) { -# my $column_name = @$column[1]; -# my $data_type = @$column[2]; -# $table_columns->{$column_name}= $data_type; -# } -# -# foreach my $column (@{$col_names->{$table_name}}) { -# my ($column_name, $datatype) = split(/\s/, $column); -# if(exists($table_columns->{$column_name})) { -# if(lc $datatype eq lc $table_columns->{$column_name}) { -# next; -# } else { -# &main::daemon_log("WARNING: Column '$column_name' has wrong datatype!", 1); -# $result = 0; -# } -# } else { -# $result = 0; -# &main::daemon_log("WARNING: Column '$column_name' is missing!", 1); -# #&main::daemon_log("DEBUG Columns are not equal! Column '".$self->{db_name}.".$column_name' is missing!", 0); -# #my $sql_statement = "ALTER TABLE $table_name ADD COLUMN $column_name $datatype"; -# #$self->exec_statement($sql_statement); -# # The ALTER TABLE statement sucks completely in SQLite, so just recreate the table -# } -# } -# } -# -# return $result; -# } +sub check_schema { + my $self = shift; + my $table_name = shift; + my $col_names_ref = shift; # ['id INTEGER PRIMARY KEY', 'timestamp VARCHAR(14) DEFAULT \'none\'', ... ] + my $col_names_length = @$col_names_ref; + + my $sql = "PRAGMA table_info($table_name)"; + my $res = $self->exec_statement($sql); # [ ['0', 'id', 'INTEGER', '0', undef, '1' ], ['1', 'timestamp', 'VARCHAR(14)', '0', '\'none\'', '0'], ... ] + my $db_table_length = @$res; + + # Tabel does not exists, so no differences + if ($db_table_length == 0) + { + return 0; + } + + + + # The number of columns is diffrent + if ($col_names_length != $db_table_length) + { + return 1; + } + + # The column name and column type to not match + for (my $i=0; $i < $db_table_length; $i++) + { + my @col_names_list = split(" ", @$col_names_ref[$i]); + if (($col_names_list[0] ne @{@$res[$i]}[1]) || ($col_names_list[1] ne @{@$res[$i]}[2])) + { + return 1; + } + } + + + return 0; +} + sub add_dbentry { @@ -265,7 +263,7 @@ sub add_dbentry { my $sth = $self->{dbh}->prepare($sql_statement); $db_res = $sth->execute(); $sth->finish(); - &main::daemon_log("0 DEBUG: Execution of statement '$sql_statement' succeeded!", 9); + &main::daemon_log("0 DEBUG: Execution of statement '$sql_statement' succeeded!", 74); $success = 1; }; if($@) { @@ -279,7 +277,7 @@ sub add_dbentry { my $sth = $self->{dbh}->prepare($sql_statement); $db_res = $sth->execute(); $sth->finish(); - &main::daemon_log("0 DEBUG: Execution of statement '$sql_statement' succeeded!", 9); + &main::daemon_log("0 DEBUG: Execution of statement '$sql_statement' succeeded!", 74); $success = 1; }; if($@) { @@ -294,7 +292,7 @@ sub add_dbentry { my $sth = $self->{dbh}->prepare($sql_statement); $db_res = $sth->execute(); $sth->finish(); - &main::daemon_log("0 DEBUG: Execution of statement '$sql_statement' succeeded!", 7); + &main::daemon_log("0 DEBUG: Execution of statement '$sql_statement' succeeded!", 74); $success = 1; }; if($@) { @@ -456,7 +454,7 @@ sub exec_statement { @db_answer = @{$sth->fetchall_arrayref()}; $sth->finish(); $success=1; - &main::daemon_log("0 DEBUG: $sql_statement succeeded.", 9); + &main::daemon_log("0 DEBUG: $sql_statement succeeded.", 74); }; if($@) { eval { @@ -478,7 +476,7 @@ sub exec_statement { @db_answer = @{$sth->fetchall_arrayref()}; $sth->finish(); $success=1; - &main::daemon_log("0 DEBUG: $sql_statement succeeded.", 9); + &main::daemon_log("0 DEBUG: $sql_statement succeeded.", 74); }; if($@) { eval { @@ -501,7 +499,7 @@ sub exec_statement { @db_answer = @{$sth->fetchall_arrayref()}; $sth->finish(); DBI->trace(0); - &main::daemon_log("0 DEBUG: $sql_statement succeeded.", 9); + &main::daemon_log("0 DEBUG: $sql_statement succeeded.", 74); }; if($@) { DBI->trace(0);