index 21ad1f75244642af8b04a889676d1a08bb8925a1..985963da4a01e994e99d87dd0a858d8eef26fd9a 100644 (file)
use strict;
use warnings;
+
use Carp;
use DBI;
use GOSA::GosaSupportDaemon;
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);
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;
&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;
}
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);
}
-# 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 {
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($@) {
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($@) {
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($@) {
@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 {
@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 {
@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);