Code

Updated error handler
[gosa.git] / gosa-si / tests / sqlite-check-concurrency.pl
1 #!/usr/bin/perl -W
3 package GOSA::DBsqlite;
4 use strict;
5 use warnings;
7 use DBI;
8 use Data::Dumper;
9 use Time::HiRes qw(usleep);
10 use Fcntl ':flock';
11 use threads;
14 sub daemon_log {}
16 my %threads;
17 # Count of threads, if > 1 it corrupts the db
18 my $count= 10;
19 my $db_name= "./test.sqlite";
20 my $lock = $db_name.".si.lock";
22 #if(stat($lock)) {
23 #       unlink($lock);
24 #}
25 #
26 #if(stat($db_name)) {
27 #       unlink($db_name)
28 #}
30 for(my $i=0;$i<$count;$i++) {
31         $threads{$i}= threads->create(\&check_database);
32 }
34 foreach my $thread (threads->list()) {
35         $thread->join();
36 }
38 sub check_database {
39         $threads{threads->self->tid()}= GOSA::DBsqlite->new($db_name);
40         threads->yield();
41         $threads{threads->self->tid()}->run_test("test");
43         return;
44 }
46 sub new {
47         my $class = shift;
48         my $db_name = shift;
50         my $self = {dbh=>undef,db_name=>undef,db_lock=>undef,db_lock_handle=>undef};
51         my $dbh = DBI->connect("dbi:SQLite:dbname=$db_name", "", "", {RaiseError => 1, AutoCommit => 1});
52         $self->{dbh} = $dbh;
53         $self->{db_name} = $db_name;
54         $self->{db_lock} = $lock;
55         bless($self,$class);
56         return($self);
57 }
59 sub lock {
60         my $self = shift;
61         open($self->{db_lock_handle}, ">>".($self->{db_lock})) unless ref $self->{db_lock_handle};
62         flock($self->{db_lock_handle},LOCK_EX);
63         seek($self->{db_lock_handle}, 0, 2);
64 }
67 sub unlock {
68         my $self = shift;
69         flock($self->{db_lock_handle},LOCK_UN);
70 }
72 sub run_test {
73         my $self= shift;
74         my $table_name= shift;
75         my $sql= "CREATE TABLE IF NOT EXISTS $table_name (id INTEGER PRIMARY KEY, status VARCHAR(255) DEFAULT 'none')";
76         $self->lock();
77         eval {
78                 $self->{dbh}->do($sql);
79         };
80         if($@) {
81                 print STDERR Dumper($@);
82         }
83         $self->unlock();
85         for(my $i=0;$i<100;$i++) {
86                 $sql= "INSERT INTO $table_name (id, status) VALUES (null, 'test $i')";
87                 $self->lock();
88                 eval {
89                         $self->{dbh}->do($sql);
90                 };
91                 if($@) {
92                         print STDERR Dumper($@);
93                 }
94                 $self->unlock();
95         }
96 }