Code

Add type attribute to CopyPasteVars (#5601)
[gosa.git] / trunk / 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";
19 #if(stat($lock)) {
20 #       unlink($lock);
21 #}
22 #
23 #if(stat($db_name)) {
24 #       unlink($db_name)
25 #}
27 for(my $i=0;$i<$count;$i++) {
28         $threads{$i}= threads->create(\&check_database);
29 }
31 foreach my $thread (threads->list()) {
32         $thread->join();
33 }
35 sub check_database {
36         $threads{threads->self->tid()}= GOSA::DBsqlite->new($db_name);
37         threads->yield();
38         $threads{threads->self->tid()}->run_test("test");
40         return;
41 }
43 sub new {
44         my $class = shift;
45         my $db_name = shift;
47         my $self = {dbh=>undef,db_name=>undef,db_lock=>undef,db_lock_handle=>undef};
48         my $dbh = DBI->connect("dbi:SQLite:dbname=$db_name", "", "", {RaiseError => 1, AutoCommit => 1});
49         $self->{dbh} = $dbh;
50         $self->{db_name} = $db_name;
51         $self->{db_lock} = $lock;
52         bless($self,$class);
53         return($self);
54 }
56 sub lock {
57         my $self = shift;
58         open($self->{db_lock_handle}, ">>".($self->{db_lock})) unless ref $self->{db_lock_handle};
59         flock($self->{db_lock_handle},LOCK_EX);
60         seek($self->{db_lock_handle}, 0, 2);
61 }
64 sub unlock {
65         my $self = shift;
66         flock($self->{db_lock_handle},LOCK_UN);
67 }
69 sub run_test {
70         my $self= shift;
71         my $table_name= shift;
72         my $sql= "CREATE TABLE IF NOT EXISTS $table_name (id INTEGER PRIMARY KEY, status VARCHAR(255) DEFAULT 'none')";
73         $self->lock();
74         eval {
75                 $self->{dbh}->do($sql);
76         };
77         if($@) {
78                 print STDERR Dumper($@);
79         }
80         $self->unlock();
82         for(my $i=0;$i<100;$i++) {
83                 $sql= "INSERT INTO $table_name (id, status) VALUES (null, 'test $i')";
84                 $self->lock();
85                 eval {
86                         $self->{dbh}->do($sql);
87                 };
88                 if($@) {
89                         print STDERR Dumper($@);
90                 }
91                 $self->unlock();
92         }
93 }