--- nfo/perl/libs/shortcuts/database.pm 2003/04/09 07:47:52 1.1 +++ nfo/perl/libs/shortcuts/database.pm 2003/04/11 01:06:44 1.3 @@ -1,8 +1,13 @@ ## --------------------------------------------------------------------------- -## $Id: database.pm,v 1.1 2003/04/09 07:47:52 joko Exp $ +## $Id: database.pm,v 1.3 2003/04/11 01:06:44 joko Exp $ ## --------------------------------------------------------------------------- ## $Log: database.pm,v $ -## Revision 1.1 2003/04/09 07:47:52 joko +## Revision 1.3 2003/04/11 01:06:44 joko +## enhanced hash2sql: +## + revamped crud action tokenizer +## + introduced SQL_DELETE +## +## Revision 1.2 2003/04/09 07:51:11 joko ## renamed from db.pm ## ## Revision 1.1 2003/04/08 23:09:16 joko @@ -22,7 +27,7 @@ -package shortcuts::db; +package shortcuts::database; use strict; use warnings; @@ -40,6 +45,7 @@ use constant SQL_INSERT => 10; use constant SQL_UPDATE => 11; use constant SQL_SELECT => 12; +use constant SQL_DELETE => 13; use Data::Dumper; @@ -48,27 +54,50 @@ # TODO: handle usage of "$crit" in an abstract way somehow sub hash2sql { + # the arguments my $table = shift; my $hash = shift; my $mode = shift; my $crit = shift; + # our result my $sql; - $mode = SQL_SELECT if ($mode eq 'SQL_SELECT' || $mode eq 'SELECT'); - $mode = SQL_INSERT if ($mode eq 'SQL_INSERT' || $mode eq 'INSERT'); - $mode = SQL_UPDATE if ($mode eq 'SQL_UPDATE' || $mode eq 'UPDATE'); + + # declare commands and associated tokens + my @command = qw( SELECT INSERT UPDATE DELETE ); + my @token = ( SQL_SELECT, SQL_INSERT, SQL_UPDATE, SQL_DELETE ); + + # translate stringified mode to token + my $c = 0; + foreach (@command) { + $mode = $token[$c] if ($mode eq 'SQL_' . $_ || $mode eq $_); + $c++; + } + + # pre-flight check: has mode been resolved into token? + if ($mode !~ m/\d+/) { + print __PACKAGE__ . "::hash2sql: no mode, no token, no way!", "\n"; + return; + } + # dispatch mode if ($mode == SQL_SELECT) { $sql = "SELECT #fields# FROM $table"; } elsif ($mode == SQL_INSERT) { $sql = "INSERT INTO $table (#fields#) VALUES (#values#)"; } elsif ($mode == SQL_UPDATE) { $sql = "UPDATE $table SET #fields-values#"; + } elsif ($mode == SQL_DELETE) { + if (!$crit) { + print __PACKAGE__ . "::hash2sql: Criteria required for mode 'SQL_DELETE' (\$crit must not be empty!).", "\n"; + return; + } + $sql = "DELETE FROM $table"; } - # FIXME: this wouldn't be valid for 'INSERT' queries - if ($crit) { - $sql .= " WHERE $crit"; + # apply filter? + if ($mode != SQL_INSERT && $crit) { + $sql .= " WHERE $crit" if $sql; } my (@fields, @values); @@ -76,6 +105,7 @@ push @fields, $key; push @values, $hash->{$key}; } + # quote each element map { if (defined $_) { $_ = "'$_'" } else { $_ = "null" } } @values; @@ -96,7 +126,7 @@ $sql =~ s/#values#/$values/; $sql =~ s/#fields-values#/$fields_values/; - print "shortcuts::db::hash2sql: \$sql=$sql", "\n"; + print __PACKAGE__ . "::hash2sql: \$sql=$sql", "\n"; return $sql; }