/[cvs]/nfo/perl/libs/shortcuts/database.pm
ViewVC logotype

Contents of /nfo/perl/libs/shortcuts/database.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations)
Tue May 13 09:10:50 2003 UTC (21 years ago) by joko
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +7 -2 lines
disabled debugging

1 ## ---------------------------------------------------------------------------
2 ## $Id: database.pm,v 1.3 2003/04/11 01:06:44 joko Exp $
3 ## ---------------------------------------------------------------------------
4 ## $Log: database.pm,v $
5 ## Revision 1.3 2003/04/11 01:06:44 joko
6 ## enhanced hash2sql:
7 ## + revamped crud action tokenizer
8 ## + introduced SQL_DELETE
9 ##
10 ## Revision 1.2 2003/04/09 07:51:11 joko
11 ## renamed from db.pm
12 ##
13 ## Revision 1.1 2003/04/08 23:09:16 joko
14 ## initial commit: code from perl/libs/libdb.pm
15 ##
16 ## ---------------------------------------------------------------------------
17
18 =pod
19
20 =head1 Background
21
22 Databases = Everything is sql
23 Perl ~ Everything is a hash ;-)
24
25
26 =cut
27
28
29
30 package shortcuts::database;
31
32 use strict;
33 use warnings;
34
35 require Exporter;
36 our @ISA = qw( Exporter );
37 our @EXPORT_OK = qw(
38 SQL_INSERT SQL_UPDATE SQL_SELECT
39 hash2sql
40 quotesql
41 dsn2dbname
42 );
43
44
45 use constant SQL_INSERT => 10;
46 use constant SQL_UPDATE => 11;
47 use constant SQL_SELECT => 12;
48 use constant SQL_DELETE => 13;
49
50
51 use Data::Dumper;
52
53
54 # TODO: handle usage of "$crit" in an abstract way somehow
55 sub hash2sql {
56
57 # the arguments
58 my $table = shift;
59 my $hash = shift;
60 my $mode = shift;
61 my $crit = shift;
62
63 # our result
64 my $sql;
65
66 # declare commands and associated tokens
67 my @command = qw( SELECT INSERT UPDATE DELETE );
68 my @token = ( SQL_SELECT, SQL_INSERT, SQL_UPDATE, SQL_DELETE );
69
70 # translate stringified mode to token
71 my $c = 0;
72 foreach (@command) {
73 $mode = $token[$c] if ($mode eq 'SQL_' . $_ || $mode eq $_);
74 $c++;
75 }
76
77 # pre-flight check: has mode been resolved into token?
78 if ($mode !~ m/\d+/) {
79 print __PACKAGE__ . "::hash2sql: no mode, no token, no way!", "\n";
80 return;
81 }
82
83 # dispatch mode
84 if ($mode == SQL_SELECT) {
85 $sql = "SELECT #fields# FROM $table";
86 } elsif ($mode == SQL_INSERT) {
87 $sql = "INSERT INTO $table (#fields#) VALUES (#values#)";
88 } elsif ($mode == SQL_UPDATE) {
89 $sql = "UPDATE $table SET #fields-values#";
90 } elsif ($mode == SQL_DELETE) {
91 if (!$crit) {
92 print __PACKAGE__ . "::hash2sql: Criteria required for mode 'SQL_DELETE' (\$crit must not be empty!).", "\n";
93 return;
94 }
95 $sql = "DELETE FROM $table";
96 }
97
98 # apply filter?
99 if ($mode != SQL_INSERT && $crit) {
100 $sql .= " WHERE $crit" if $sql;
101 }
102
103 my (@fields, @values);
104 foreach my $key (keys %{$hash}) {
105 push @fields, $key;
106 push @values, $hash->{$key};
107 }
108
109 # quote each element
110 map { if (defined $_) { $_ = "'$_'" } else { $_ = "null" } } @values;
111
112 my $fields = join(', ', @fields);
113 my $values = join(', ', @values);
114 my $fields_values = '';
115 my $fc = 0;
116 foreach (@fields) {
117 $fields_values .= $_ . '=' . $values[$fc] . ', ';
118 $fc++;
119 }
120 $fields_values = substr($fields_values, 0, -2);
121
122 # FIXME: this should only be valid for 'SELECT' queries
123 $fields ||= '*';
124
125 $sql =~ s/#fields#/$fields/;
126 $sql =~ s/#values#/$values/;
127 $sql =~ s/#fields-values#/$fields_values/;
128
129 #print __PACKAGE__ . "::hash2sql: \$sql=$sql", "\n";
130
131 return $sql;
132 }
133
134
135 sub quotesql {
136 my $string = shift;
137 if ($string) {
138 $string =~ s/'/\\'/g;
139 }
140 return $string;
141 }
142
143 sub dsn2dbname {
144 my $dsn = shift;
145 $dsn =~ m/database=(.+?);/;
146 my $database_name = $1;
147 return $database_name;
148 }
149
150 1;
151 __END__

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