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