Code

Allow better debugging.
[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;
13 my %threads;
14 # Count of threads, if > 1 it corrupts the db
15 my $count= 10;
16 my $db_name= "./test.sqlite";
17 my $lock = $db_name.".si.lock";
18 if(stat($lock)) {
19         unlink($lock);
20 }
22 if(stat($db_name)) {
23         unlink($db_name)
24 }
26 for(my $i=0;$i<$count;$i++) {
27         $threads{$i}= threads->create(\&check_database);
28 }
30 foreach my $thread (threads->list()) {
31         $thread->join();
32 }
34 sub check_database {
35         $threads{threads->self->tid()}= GOSA::DBsqlite->new($db_name);
36         threads->yield();
37         $threads{threads->self->tid()}->run_test("test");
39         return;
40 }
42 sub new {
43         my $class = shift;
44         my $db_name = shift;
46         my $self = {dbh=>undef,db_name=>undef,db_lock=>undef,db_lock_handle=>undef};
47         my $dbh = DBI->connect("dbi:SQLite:dbname=$db_name", "", "", {RaiseError => 1, AutoCommit => 1});
48         $self->{dbh} = $dbh;
49         $self->{db_name} = $db_name;
50         $self->{db_lock} = $lock;
51         bless($self,$class);
52         return($self);
53 }
55 sub lock {
56         my $self = shift;
57         open($self->{db_lock_handle}, ">>".($self->{db_lock})) unless ref $self->{db_lock_handle};
58         flock($self->{db_lock_handle},LOCK_EX);
59         seek($self->{db_lock_handle}, 0, 2);
60 }
63 sub unlock {
64         my $self = shift;
65         flock($self->{db_lock_handle},LOCK_UN);
66 }
68 sub run_test {
69         my $self= shift;
70         my $table_name= shift;
71         my $sql= "CREATE TABLE IF NOT EXISTS $table_name (id INTEGER, value VARCHAR(255))";
72         $self->lock();
73         eval {
74                 $self->{dbh}->do($sql);
75         };
76         if($@) {
77                 print STDERR Dumper($@);
78         }
79         $self->unlock();
81         for(my $i=0;$i<100;$i++) {
82                 $sql= "INSERT INTO $table_name VALUES ($i, 'test $i')";
83                 $self->lock();
84                 eval {
85                         $self->{dbh}->do($sql);
86                 };
87                 if($@) {
88                         print STDERR Dumper($@);
89                 }
90                 $self->unlock();
91         }
92 }