/[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.3 - (hide 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 cvsjoko 1.1 ## --------------------------------------------------------------------------------
2 cvsjoko 1.3 ## $Id: libdb.pm,v 1.2 2002/07/20 11:09:58 cvsjoko Exp $
3 cvsjoko 1.1 ## --------------------------------------------------------------------------------
4 cvsjoko 1.2 ## $Log: libdb.pm,v $
5 cvsjoko 1.3 ## Revision 1.2 2002/07/20 11:09:58 cvsjoko
6     ## + bugfixes
7     ## + dont' print sql-errors
8     ##
9 cvsjoko 1.2 ## Revision 1.1 2002/07/19 18:14:03 cvsjoko
10     ## no message
11     ##
12 cvsjoko 1.1 ##
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 cvsjoko 1.2 if ($dbmeta->{dbh} = DBI->connect($dbmeta->{dsn}, '', '', { PrintError => 0 } )) {
113 cvsjoko 1.1 $dbmeta->{dbh}->trace($dbmeta->{trace_level}, $dbmeta->{trace_file});
114     $dbmeta->{dbh}->{PrintError} = 0;
115     $dbmeta->{connected} = 1;
116     $dbmeta_ref_cache = $dbmeta;
117 cvsjoko 1.2 return 1;
118 cvsjoko 1.1 }
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 cvsjoko 1.2 my $bool_ok;
174     if (connectTarget($dbmeta)) {
175     sendSql($sql);
176 cvsjoko 1.3 #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 cvsjoko 1.2 disconnectTarget($dbmeta);
181     }
182     return $bool_ok;
183 cvsjoko 1.1 }
184    
185     sub createSqlDb {
186     my $dsn = shift;
187     my $dbname = getDbNameByDsn($dsn);
188 cvsjoko 1.2 print " - creating rdbms-database $dbname ($dsn) ...";
189 cvsjoko 1.1 my $sql;
190     $sql = "CREATE DATABASE $dbname;";
191 cvsjoko 1.2 if ( sqlDbAction($dsn, $sql) ) {
192 cvsjoko 1.3 print "ok", "\n";
193     return 1;
194 cvsjoko 1.2 } else {
195 cvsjoko 1.3 print "failed", "\n";
196     return 0;
197 cvsjoko 1.2 }
198 cvsjoko 1.1 }
199 cvsjoko 1.2
200 cvsjoko 1.1 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 cvsjoko 1.3 1;

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