/[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.3 - (show annotations)
Sat Jul 27 00:28:20 2002 UTC (21 years, 9 months ago) by cvsjoko
Branch: MAIN
Changes since 1.2: +14 -7 lines
bugfixes

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

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