/[cvs]/nfo/perl/libs/libdb.pm
ViewVC logotype

Annotation of /nfo/perl/libs/libdb.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations)
Sun Dec 1 22:13:17 2002 UTC (21 years, 11 months ago) by joko
Branch: MAIN
Changes since 1.6: +6 -2 lines
+ minor bugfix?

1 cvsjoko 1.1 ## --------------------------------------------------------------------------------
2 joko 1.7 ## $Id: libdb.pm,v 1.6 2002/11/29 04:53:39 joko Exp $
3 cvsjoko 1.1 ## --------------------------------------------------------------------------------
4 cvsjoko 1.2 ## $Log: libdb.pm,v $
5 joko 1.7 ## Revision 1.6 2002/11/29 04:53:39 joko
6     ## + hash2Sql now knows about SQL_SELECT
7     ##
8 joko 1.6 ## Revision 1.5 2002/11/17 07:18:38 joko
9     ## + small modification in hash2sql
10     ##
11 joko 1.5 ## Revision 1.4 2002/10/16 22:36:42 joko
12     ## + sub testDbServer
13     ##
14 joko 1.4 ## Revision 1.3 2002/07/27 00:28:20 cvsjoko
15     ## bugfixes
16     ##
17 cvsjoko 1.3 ## Revision 1.2 2002/07/20 11:09:58 cvsjoko
18     ## + bugfixes
19     ## + dont' print sql-errors
20     ##
21 cvsjoko 1.2 ## Revision 1.1 2002/07/19 18:14:03 cvsjoko
22     ## no message
23     ##
24 cvsjoko 1.1 ##
25     ## --------------------------------------------------------------------------------
26    
27     package libdb;
28    
29     use strict;
30     use warnings;
31    
32     require Exporter;
33     our @ISA = qw( Exporter );
34 joko 1.6 our @EXPORT_OK = qw(
35 cvsjoko 1.1 testDsn hash2Sql
36     SQL_INSERT SQL_UPDATE
37     connectTarget disconnectTarget sendSql
38     dbNow
39     getDbNameByDsn sqlDbAction createSqlDb dropSqlDb
40     quotesql
41 joko 1.4 testDsnForTables testDbServer
42 cvsjoko 1.1 );
43    
44 joko 1.6
45     use libp qw( croak );
46     use DBI;
47    
48 cvsjoko 1.1 use constant SQL_INSERT => 10;
49     use constant SQL_UPDATE => 11;
50 joko 1.6 use constant SQL_SELECT => 12;
51 cvsjoko 1.1
52     my $dbmeta_ref_cache;
53    
54     sub testDsn {
55     my $dsn = shift;
56     my $result;
57     if ( my $dbh = DBI->connect($dsn, '', '', {
58     PrintError => 0,
59     } ) ) {
60     $dbh->disconnect();
61     return 1;
62     }
63     }
64    
65 joko 1.4 sub testDbServer {
66     my $dsn = shift;
67     $dsn =~ s/database=(\w+)//;
68    
69     #print "testDbServer: $dsn", "\n";
70    
71     my $result;
72     if ( my $dbh = DBI->connect($dsn, '', '', {
73     PrintError => 0,
74     } ) ) {
75     $dbh->disconnect();
76     return 1;
77     }
78     }
79    
80 joko 1.6
81     # TODO: handle usage of "$crit" in an abstract way somehow
82 cvsjoko 1.1 sub hash2Sql {
83    
84     my $table = shift;
85     my $hash = shift;
86     my $mode = shift;
87     my $crit = shift;
88    
89     my $sql;
90 joko 1.6 $mode = SQL_SELECT if ($mode eq 'SQL_SELECT' || $mode eq 'SELECT');
91     $mode = SQL_INSERT if ($mode eq 'SQL_INSERT' || $mode eq 'INSERT');
92     $mode = SQL_UPDATE if ($mode eq 'SQL_UPDATE' || $mode eq 'UPDATE');
93    
94     if ($mode == SQL_SELECT) {
95     $sql = "SELECT #fields# FROM $table WHERE $crit";
96     } elsif ($mode == SQL_INSERT) {
97     $sql = "INSERT INTO $table (#fields#) VALUES (#values#)";
98     } elsif ($mode == SQL_UPDATE) {
99     $sql = "UPDATE $table SET #fields-values# WHERE $crit";
100 cvsjoko 1.1 }
101    
102     my (@fields, @values);
103     foreach my $key (keys %{$hash}) {
104     push @fields, $key;
105     push @values, $hash->{$key};
106     }
107     # quote each element
108     map { if (defined $_) { $_ = "'$_'" } else { $_ = "null" } } @values;
109    
110     my $fields = join(', ', @fields);
111     my $values = join(', ', @values);
112     my $fields_values = '';
113     my $fc = 0;
114     foreach (@fields) {
115     $fields_values .= $_ . '=' . $values[$fc] . ', ';
116     $fc++;
117     }
118     $fields_values = substr($fields_values, 0, -2);
119    
120     $sql =~ s/#fields#/$fields/;
121     $sql =~ s/#values#/$values/;
122     $sql =~ s/#fields-values#/$fields_values/;
123    
124     return $sql;
125     }
126    
127     sub patch_dbmeta {
128    
129     my $dbmeta = shift;
130    
131     if ($dbmeta =~ m/^dbi:/) {
132     $dbmeta = {
133     dsn => $dbmeta,
134     trace_level => 0,
135     trace_file => undef,
136     };
137     }
138    
139     return $dbmeta;
140    
141     }
142    
143     sub connectTarget {
144     my $dbmeta = shift;
145     croak "please supply a dsn or a \"dbmeta\"-hash" if (!$dbmeta);
146     $dbmeta = patch_dbmeta($dbmeta);
147     if (!$dbmeta->{connected}) {
148 cvsjoko 1.2 if ($dbmeta->{dbh} = DBI->connect($dbmeta->{dsn}, '', '', { PrintError => 0 } )) {
149 cvsjoko 1.1 $dbmeta->{dbh}->trace($dbmeta->{trace_level}, $dbmeta->{trace_file});
150     $dbmeta->{dbh}->{PrintError} = 0;
151     $dbmeta->{connected} = 1;
152     $dbmeta_ref_cache = $dbmeta;
153 cvsjoko 1.2 return 1;
154 cvsjoko 1.1 }
155     }
156     }
157    
158     sub disconnectTarget {
159     #my $dbmeta = shift;
160     #croak "please supply a \"dbmeta\"-hash" if (!$dbmeta);
161     #$dbmeta = patch_dbmeta($dbmeta);
162     #$dbmeta->{dbh} && $dbmeta->{dbh}->disconnect();
163     my $dbmeta = $dbmeta_ref_cache;
164     $dbmeta->{dbh} && $dbmeta->{dbh}->disconnect();
165 joko 1.7 undef($dbmeta->{dbh});
166     #undef($dbmeta_ref_cache);
167 cvsjoko 1.1 }
168    
169     sub sendSql {
170     my $sql = shift;
171     my $dbmeta_ref = shift;
172     if (!$dbmeta_ref) {
173     $dbmeta_ref = $dbmeta_ref_cache;
174     }
175     #print "sql: $sql", "\n";
176     if (!$dbmeta_ref->{connected}) {
177     print "not connected!", "\n";
178     return 0;
179     }
180     if (my $result = $dbmeta_ref->{dbh}->prepare($sql)) {
181 joko 1.4 #if ($result->execute()) {
182     $result->execute();
183 cvsjoko 1.1 return $result;
184 joko 1.4 #}
185 cvsjoko 1.1 }
186     }
187    
188     sub dbNow {
189     #my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
190     my $now_string = strftime("%Y-%m-%d %H:%M:%S", localtime);
191     return $now_string;
192     }
193    
194    
195     sub getDbNameByDsn {
196     my $dsn = shift;
197     $dsn =~ m/database=(.+?);/;
198     my $database_name = $1;
199     return $database_name;
200     }
201    
202     sub sqlDbAction {
203     my $dsn = shift;
204     $dsn =~ s/database=.+?;//;
205     my $sql = shift;
206     my $dbmeta = {
207     dsn => $dsn,
208     trace_level => 1,
209     trace_file => 'dbitrace',
210     };
211 cvsjoko 1.2 my $bool_ok;
212     if (connectTarget($dbmeta)) {
213     sendSql($sql);
214 cvsjoko 1.3 #print "state: ", $dbmeta->{dbh}->state, "\n";
215     #print "err ", $dbmeta->{dbh}->err, "\n";
216     #$bool_ok = ($dbmeta->{dbh} && $dbmeta->{dbh}->state && !$dbmeta->{dbh}->err);
217     $bool_ok = ($dbmeta->{dbh} && !$dbmeta->{dbh}->err);
218 cvsjoko 1.2 disconnectTarget($dbmeta);
219     }
220     return $bool_ok;
221 cvsjoko 1.1 }
222    
223     sub createSqlDb {
224     my $dsn = shift;
225     my $dbname = getDbNameByDsn($dsn);
226 cvsjoko 1.2 print " - creating rdbms-database $dbname ($dsn) ...";
227 cvsjoko 1.1 my $sql;
228     $sql = "CREATE DATABASE $dbname;";
229 cvsjoko 1.2 if ( sqlDbAction($dsn, $sql) ) {
230 cvsjoko 1.3 print "ok", "\n";
231     return 1;
232 cvsjoko 1.2 } else {
233 cvsjoko 1.3 print "failed", "\n";
234     return 0;
235 cvsjoko 1.2 }
236 cvsjoko 1.1 }
237 cvsjoko 1.2
238 cvsjoko 1.1 sub dropSqlDb {
239     my $dsn = shift;
240     my $dbname = getDbNameByDsn($dsn);
241     print " - dropping database $dbname", "\n";
242     my $sql;
243     $sql = "DROP DATABASE $dbname;";
244     sqlDbAction($dsn, $sql);
245     }
246    
247     sub quotesql {
248     my $string = shift;
249 joko 1.4 if ($string) {
250     $string =~ s/'/\\'/g;
251     }
252 cvsjoko 1.1 return $string;
253     }
254    
255     sub testDsnForTables {
256     my $dsn = shift;
257     connectTarget($dsn);
258     my $result = sendSql('SHOW TABLES;');
259     my $bool_tablesHere = $result->fetchrow_hashref();
260     $result->finish();
261     disconnectTarget($dsn);
262     return 1 if ($bool_tablesHere);
263     }
264    
265 cvsjoko 1.3 1;

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed