/[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.5 - (hide annotations)
Sun Nov 17 07:18:38 2002 UTC (21 years, 5 months ago) by joko
Branch: MAIN
Changes since 1.4: +6 -3 lines
+ small modification in hash2sql

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

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