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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations)
Wed Oct 16 22:36:42 2002 UTC (21 years, 6 months ago) by joko
Branch: MAIN
Changes since 1.3: +28 -7 lines
+ sub testDbServer

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

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