8e1ea811a746841fd77c941fb1966ccf902ad670
[kivitendo-erp.git] / SL / DBUtils.pm
1 package SL::DBUtils;
2
3 require Exporter;
4 @ISA = qw(Exporter);
5
6 @EXPORT = qw(conv_i conv_date conv_dateq do_query selectrow_query do_statement
7              dump_query quote_db_date
8              selectfirst_hashref_query selectfirst_array_query
9              selectall_hashref_query selectall_array_query
10              prepare_execute_query prepare_query);
11
12 sub conv_i {
13   my ($value, $default) = @_;
14   return (defined($value) && "$value" ne "") ? $value * 1 : $default;
15 }
16
17 sub conv_date {
18   my ($value) = @_;
19   return (defined($value) && "$value" ne "") ? $value : undef;
20 }
21
22 sub conv_dateq {
23   my ($value) = @_;
24   if (defined($value) && "$value" ne "") {
25     $value =~ s/\'/\'\'/g;
26     return "'$value'";
27   }
28   return "NULL";
29 }
30
31 sub do_query {
32   my ($form, $dbh, $query) = splice(@_, 0, 3);
33
34   dump_query(LXDebug::QUERY, '', $query, @_);
35
36   if (0 == scalar(@_)) {
37     $dbh->do($query) || $form->dberror($query);
38   } else {
39     $dbh->do($query, undef, @_) ||
40       $form->dberror($query . " (" . join(", ", @_) . ")");
41   }
42 }
43
44 sub selectrow_query { &selectfirst_array_query }
45
46 sub do_statement {
47   my ($form, $sth, $query) = splice(@_, 0, 3);
48
49   dump_query(LXDebug::QUERY, '', $query, @_);
50
51   if (0 == scalar(@_)) {
52     $sth->execute() || $form->dberror($query);
53   } else {
54     $sth->execute(@_) ||
55       $form->dberror($query . " (" . join(", ", @_) . ")");
56   }
57 }
58
59 sub dump_query {
60   my ($level, $msg, $query) = splice(@_, 0, 3);
61
62   while ($query =~ /\?/) {
63     my $value = shift(@_);
64     $value =~ s/\'/\\\'/g;
65     $value = "'${value}'";
66     $query =~ s/\?/$value/;
67   }
68
69   $query =~ s/[\n\s]+/ /g;
70
71   $msg .= " " if ($msg);
72
73   $main::lxdebug->message($level, $msg . $query);
74 }
75
76 sub quote_db_date {
77   my ($str) = @_;
78
79   return "NULL" unless defined $str;
80   return "current_date" if $str =~ /current_date/;
81
82   $str =~ s/'/''/g;
83   return "'$str'";
84 }
85
86 sub prepare_query {
87   my ($form, $dbh, $query) = splice(@_, 0, 3);
88
89   dump_query(LXDebug::QUERY, '', $query, @_);
90
91   my $sth = $dbh->prepare($query) || $form->dberror($query);
92   return $sth;
93 }
94
95 sub prepare_execute_query {
96   my ($form, $dbh, $query) = splice(@_, 0, 3);
97
98   dump_query(LXDebug::QUERY, '', $query, @_);
99
100   my $sth = $dbh->prepare($query) || $form->dberror($query);
101   if (scalar(@_) != 0) {
102     $sth->execute(@_) || $form->dberror($query . " (" . join(", ", @_) . ")");
103   } else {
104     $sth->execute() || $form->dberror($query);
105   }
106
107   return $sth;
108 }
109
110 sub selectall_hashref_query {
111   my ($form, $dbh, $query) = splice(@_, 0, 3);
112
113   my $sth = prepare_execute_query($form, $dbh, $query, @_);
114   my $result = [];
115   while (my $ref = $sth->fetchrow_hashref()) {
116     push(@{ $result }, $ref);
117   }
118   $sth->finish();
119
120   return $result;
121 }
122
123 sub selectall_array_query {
124   my ($form, $dbh, $query) = splice(@_, 0, 3);
125
126   my $sth = prepare_execute_query($form, $dbh, $query, @_);
127   my @result;
128   while (my ($value) = $sth->fetchrow_array()) {
129     push(@result, $value);
130   }
131   $sth->finish();
132
133   return @result;
134 }
135
136 sub selectfirst_hashref_query {
137   my ($form, $dbh, $query) = splice(@_, 0, 3);
138
139   my $sth = prepare_execute_query($form, $dbh, $query, @_);
140   my $ref = $sth->fetchrow_hashref();
141   $sth->finish();
142
143   return $ref;
144 }
145
146 sub selectfirst_array_query {
147   my ($form, $dbh, $query) = splice(@_, 0, 3);
148
149   my $sth = prepare_execute_query($form, $dbh, $query, @_);
150   my @ret = $sth->fetchrow_array();
151   $sth->finish();
152
153   return @ret;
154 }
155
156 1;
157
158
159 __END__
160
161 =head1 NAME
162
163 SL::DBUTils.pm: All about Databaseconections in Lx
164
165 =head1 SYNOPSIS
166
167   use DBUtils;
168   
169   conv_i
170   conv_date
171   conv_dateq
172   quote_db_date($str)
173
174   do_query($form, $dbh, $query)
175   do_statement($form, $sth, $query)
176
177   dump_query($level, $msg, $query)
178   prepare_execute_query($form, $dbh, $query)
179
180   my $all_results_ref       = selectall_hashref_query($form, $dbh, $query)
181   my $first_result_hash_ref = selectfirst_hashref_query($form, $dbh, $query);
182   
183   my @first_result =  selectfirst_array_query($form, $dbh, $query);  # ==
184   my @first_result =  selectrow_query($form, $dbh, $query);
185   
186     
187 =head1 DESCRIPTION
188   
189 =head1 FUNCTIONS
190   
191 =over 4
192   
193 =item conv_i
194
195 =item conv_date
196
197 =item conv_dateq
198
199 =item quote_db_date($str)
200
201 =item do_query($form, $dbh, $query)
202
203 =item do_statement($form, $sth, $query)
204
205 =item dump_query($level, $msg, $query)
206
207 =item prepare_execute_query($form, $dbh, $query)
208
209 =item selectall_hashref_query($form, $dbh, $query)
210
211 =item selectfirst_hashref_query($form, $dbh, $query);
212
213 =item selectfirst_array_query($form, $dbh, $query);  # ==
214
215 =item selectrow_query($form, $dbh, $query);
216   
217 =back
218   
219 =head1 EXAMPLE
220
221 =head1 SEE ALSO
222
223 =head1 MODULE AUTHORS
224
225 Moritz Bunkus E<lt>m.bunkus@linet-services.de<gt>
226 Sven Schoeling E<lt>s.schoeling@linet-services.de<gt>
227  
228 =head1 DOCUMENTATION AUTHORS
229
230 Udo Spallek  E<lt>udono@gmx.netE<gt>
231
232 =head1 COPYRIGHT AND LICENSE
233
234 Copyright 2007 by Lx-Office Community
235
236 This program is free software; you can redistribute it and/or modify
237 it under the terms of the GNU General Public License as published by
238 the Free Software Foundation; either version 2 of the License, or
239 (at your option) any later version.
240
241 This program is distributed in the hope that it will be useful,
242 but WITHOUT ANY WARRANTY; without even the implied warranty of
243 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
244 GNU General Public License for more details.
245 You should have received a copy of the GNU General Public License
246 along with this program; if not, write to the Free Software
247 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
248 =cut