Prepare for git repository
[spider.git] / perl / DXSql.pm
1 #
2 # The master SQL module
3 #
4 # $Id$
5 #
6 # Copyright (c) 2006 Dirk Koopman G1TLH
7 #
8
9 package DXSql;
10
11 use strict;
12
13 use DXSql::SQLite;
14 use DXSql::mysql;
15 use DXDebug;
16
17 use vars qw($active);
18 $active = 0;
19
20 sub init
21 {
22         my $dsn = shift;
23         return unless $dsn;
24         return $active if $active;
25         
26         eval { 
27                 require DBI;
28         };
29         unless ($@) {
30                 import DBI;
31                 $active++;
32         }
33         undef $@;
34         return $active;
35
36
37 sub new
38 {
39         my $class = shift;
40         my $dsn = shift;
41         my $self;
42         
43         return undef unless $active;
44         my $dbh;
45         my ($style) = $dsn =~ /^dbi:(\w+):/;
46         my $newclass = "DXSql::$style";
47         eval "require $newclass";
48         if ($@) {
49                 $active = 0;
50                 return undef;
51         }
52         return bless {}, $newclass;
53 }
54
55 sub connect
56 {
57         my $self = shift; 
58         my $dsn = shift;
59         my $user = shift;
60         my $passwd = shift;
61         
62         my $dbh;
63         eval {
64                 no strict 'refs';
65                 $dbh = DBI->connect($dsn, $user, $passwd, {AutoCommit => 0}); 
66         };
67         unless ($dbh) {
68                 $active = 0;
69                 return undef;
70         }
71         $self->{dbh} = $dbh;
72         return $self;
73 }
74
75 sub finish
76 {
77         my $self = shift;
78         $self->{dbh}->disconnect;
79
80
81 sub do
82 {
83         my $self = shift;
84         my $s = shift;
85         
86         eval { $self->{dbh}->do($s); }; 
87 }
88
89 sub commit
90 {
91         $_[0]->{dbh}->commit;
92         $_[0]->{dbh}->{AutoCommit} = 0;
93 }
94
95 sub rollback
96 {
97         $_[0]->{dbh}->rollback;
98         $_[0]->{dbh}->{AutoCommit} = 0;
99 }
100
101 sub quote
102 {
103         return $_[0]->{dbh}->quote($_[1]);
104 }
105
106 sub prepare
107 {
108         return $_[0]->{dbh}->prepare($_[1]);
109 }
110
111 sub spot_insert_prepare
112 {
113         my $self = shift;
114         return $self->prepare('insert into spot values(?' . ',?' x 14 . ')');
115 }
116
117 sub spot_insert
118 {
119         my $self = shift;
120         my $spot = shift;
121         my $sth = shift;
122         
123         if ($sth) {
124                 eval {$sth->execute(undef, @$spot)};
125         } else {
126                 my $s = "insert into spot values(NULL,";
127                 $s .= sprintf("%.1f,", $spot->[0]);
128                 $s .= $self->quote($spot->[1]) . "," ;
129                 $s .= $spot->[2] . ',';
130                 $s .= (length $spot->[3] ? $self->quote($spot->[3]) : 'NULL') . ',';
131                 $s .= $self->quote($spot->[4]) . ',';
132                 $s .= $spot->[5] . ',';
133                 $s .= $spot->[6] . ',';
134                 $s .= (length $spot->[7] ? $self->quote($spot->[7]) : 'NULL') . ',';
135                 $s .= $spot->[8] . ',';
136                 $s .= $spot->[9] . ',';
137                 $s .= $spot->[10] . ',';
138                 $s .= $spot->[11] . ',';
139                 $s .= (length $spot->[12] ? $self->quote($spot->[12]) : 'NULL') . ',';
140                 $s .= (length $spot->[13] ? $self->quote($spot->[13]) : 'NULL') . ')';
141                 eval {$self->do($s)};
142         }
143 }
144
145 sub spot_search
146 {
147         my $self = shift;
148         my $expr = shift;
149         my $dayfrom = shift;
150         my $dayto = shift;
151         my $n = shift;
152         my $dxchan = shift;
153         
154         dbg("expr: $expr") if isdbg('search');
155         if ($expr =~ /\$f/) {
156                 $expr =~ s/(?:==|eq)/ = /g;
157                 $expr =~ s/\$f10/spotteritu/g;
158                 $expr =~ s/\$f11/spottercq/g;
159                 $expr =~ s/\$f12/spotstate/g;
160                 $expr =~ s/\$f13/spotterstate/g;
161                 $expr =~ s/\$f0/freq/g;
162                 $expr =~ s/\$f1/spotcall/g;
163                 $expr =~ s/\$f2/time/g;
164                 $expr =~ s/\$f3/comment/g;
165                 $expr =~ s/\$f4/spotter/g;
166                 $expr =~ s/\$f5/spotdxcc/g;
167                 $expr =~ s/\$f6/spotterdxcc/g;
168                 $expr =~ s/\$f7/origin/g;
169                 $expr =~ s/\$f8/spotitu/g;
170                 $expr =~ s/\$f9/spotcq/g;
171                 $expr =~ s/\|\|/ or /g;
172                 $expr =~ s/\&\&/ and /g;
173                 $expr =~ s/=~\s+m\{\^([%\w]+)[^\}]*\}/ like '$1'/g;
174         } else {
175                 $expr = '';
176         }  
177         my $fdays = $dayfrom ? "time <= " . ($main::systime - ($dayfrom * 86400)) : "";
178         my $days = "time >= " . ($main::systime - ($dayto * 86400));
179         my $trange = $fdays ? "($fdays and $days)" : $days;
180         $expr .= $expr ? " and $trange" : $trange;
181     my $s = qq{select freq,spotcall,time,comment,spotter,spotdxcc,spotterdxcc,
182 origin,spotitu,spotcq,spotteritu,spottercq,spotstate,spotterstate from spot
183 where $expr order by time desc limit $n};
184     dbg("sql expr: $s") if isdbg('search');
185         my $ref = $self->{dbh}->selectall_arrayref($s);
186         return @$ref;
187 }
188
189 1;
190