Author: timbo
Date: Sun Nov 14 12:32:08 2004
New Revision: 578

Modified:
   dbi/trunk/lib/DBI/SQL/Nano.pm
Log:
Fix parsing of WHERE expressions.
Allow whitespace before DLETE and UPDATE
Make! error! messages! less! exclamatory, single line, and distinct.
Fix looks_like_number usage.


Modified: dbi/trunk/lib/DBI/SQL/Nano.pm
==============================================================================
--- dbi/trunk/lib/DBI/SQL/Nano.pm       (original)
+++ dbi/trunk/lib/DBI/SQL/Nano.pm       Sun Nov 14 12:32:08 2004
@@ -22,10 +22,9 @@
 require DBI; # for looks_like_number()
 use vars qw( $VERSION $versions );
 BEGIN {
-    $VERSION = '0.02';
+    $VERSION = '0.03';
     $versions->{nano_version} = $VERSION;
-    eval { require "SQL/Statement.pm" } unless $ENV{DBI_SQL_NANO};
-    if ($@ or $ENV{DBI_SQL_NANO}) {
+    if ($ENV{DBI_SQL_NANO} || !eval { require "SQL/Statement.pm" }) {
         @DBI::SQL::Nano::Statement::ISA = qw(DBI::SQL::Nano::Statement_);
         @DBI::SQL::Nano::Table::ISA     = qw(DBI::SQL::Nano::Table_);
     }
@@ -59,7 +58,7 @@
                 $self->{command}      = 'CREATE';
                 $self->{table_name}   = $1;
                 $self->{column_names} = parse_coldef_list($2) if $2;
-                die "Can't find columns!" unless $self->{column_names};
+                die "Can't find columns\n" unless $self->{column_names};
             };
         /^\s*DROP\s+TABLE\s+(IF\s+EXISTS\s+)?(.*?)\s*$/is
             &&do{
@@ -71,7 +70,7 @@
             &&do{
                 $self->{command}      = 'SELECT';
                 $self->{column_names} = parse_comma_list($1) if $1;
-                die "Can't find columns!\n" unless $self->{column_names};
+                die "Can't find columns\n" unless $self->{column_names};
                 $self->{table_name}   = $2;
                 if ( my $clauses = $4) {
                    if ($clauses =~ /^(.*)\s+ORDER\s+BY\s+(.*)$/is) {
@@ -88,15 +87,15 @@
                 $self->{table_name}   = $1;
                 $self->{column_names} = parse_comma_list($2) if $2;
                 $self->{values}       = $self->parse_values_list($4) if $4;
-                die "Can't parse values!\n" unless $self->{values};
+                die "Can't parse values\n" unless $self->{values};
             };
-        /DELETE\s+FROM\s+(\S+)((.*))?/is
+        /^\s*DELETE\s+FROM\s+(\S+)((.*))?/is
             &&do{
                 $self->{command}      = 'DELETE';
                 $self->{table_name}   = $1;
                 $self->{where_clause} = $self->parse_where_clause($3) if $3;
             };
-        /UPDATE\s+(\S+)\s+SET\s+(.+)(\s+WHERE\s+.+)/is
+        /^\s*UPDATE\s+(\S+)\s+SET\s+(.+)(\s+WHERE\s+.+)/is
             &&do{
                 $self->{command}      = 'UPDATE';
                 $self->{table_name}   = $1;
@@ -104,19 +103,19 @@
                 $self->{where_clause} = $self->parse_where_clause($3) if $3;
             };
     }
-    die " Couldn't parse!\n  <$sql>\n" unless $self->{command}
-                                       and $self->{table_name};
+    die "Couldn't parse\n"
+       unless $self->{command} and $self->{table_name};
     return $self;
 }
 sub parse_order_clause {
     my($self,$str) = @_;
     my @clause = split /\s+/,$str;
     return { $clause[0] => 'ASC' } if @clause == 1;
-    die "Bad ORDER BY clause '$str'!\n" if @clause > 2;
+    die "Bad ORDER BY clause '$str'\n" if @clause > 2;
     $clause[1] ||= '';
     return { $clause[0] => uc $clause[1] } if $clause[1] =~ /^ASC$/i
                                            or $clause[1] =~ /^DESC$/i;
-    die "Bad ORDER BY clause '$clause[1]'!\n";
+    die "Bad ORDER BY clause '$clause[1]'\n";
 }
 sub parse_coldef_list  {                # check column definitions
     my @col_defs;
@@ -126,7 +125,7 @@
             $col = $1;                  # just checks if it exists
        }
         else {
-           die "No column definition for '$_'!\n";
+           die "No column definition for '$_'\n";
        }
         push @col_defs,$col;
     }
@@ -147,7 +146,7 @@
         push @{$self->{column_names}}, $col_name;
         push @{$self->{values}}, $self->parse_value($value);
     }
-    die "Can't parse set clause!\n"
+    die "Can't parse set clause\n"
         unless $self->{column_names}
            and $self->{values};
 }
@@ -168,16 +167,16 @@
 sub parse_where_clause {
     my($self,$str) = @_;
     $str =~ s/\s+$//;
-    if ($str =~ /^\s+WHERE\s+(.*)/i) {
+    if ($str =~ /^\s*WHERE\s+(.*)/i) {
         $str = $1;
     }
     else {
-        die "Couldn't parse WHERE clause!!\n";
+        die "Couldn't find WHERE clause in '$str'\n";
     }
     my($neg) = $str =~ s/^\s*(NOT)\s+//is;
     my $opexp = '=|<>|<=|>=|<|>|LIKE|CLIKE|IS';
-    my($val1,$op,$val2) = $str =~ /^(\S.+)\s*($opexp)\s*(\S.+)$/is;
-    die "Couldn't parse WHERE clause!\n"
+    my($val1,$op,$val2) = $str =~ /^(.+?)\s*($opexp)\s*(.+)\s*$/iso;
+    die "Couldn't parse WHERE expression '$str'\n"
        unless defined $val1 and defined $op and defined $val2;
     return {
         arg1 => $self->parse_value($val1),
@@ -195,7 +194,7 @@
     my $num_placeholders = $self->params;
     my $num_params       = scalar @$params || 0;
     die "Number of params '$num_params' does not match "
-      . "number of placeholders '$num_placeholders'!\n"
+      . "number of placeholders '$num_placeholders'\n"
       unless $num_placeholders == $num_params;
     if (scalar @$params) {
         for my $i(0..$#{$self->{values}}) {
@@ -327,7 +326,7 @@
                     $result = defined $d ? -1 : 0;
                 } elsif (!defined($d)) {
                     $result = 1;
-               } elsif ( DBI::looks_like_number($c,$d) ) {
+               } elsif ( DBI::looks_like_number($c) && 
DBI::looks_like_number($d) ) {
                     $result = ($c <=> $d);
                 } else {
                    if ($self->{"case_fold"}) {
@@ -487,7 +486,7 @@
     }
     if ($op eq 'LIKE' )  { return $val1 =~ /^$val2$/s;  }
     if ($op eq 'CLIKE' ) { return $val1 =~ /^$val2$/si; }
-    if ( DBI::looks_like_number($val1,$val2) ) {
+    if ( DBI::looks_like_number($val1) && DBI::looks_like_number($val2) ) {
         if ($op eq '<'  ) { return $val1 <  $val2; }
         if ($op eq '>'  ) { return $val1 >  $val2; }
         if ($op eq '='  ) { return $val1 == $val2; }
@@ -525,7 +524,7 @@
     my $table;
     eval{$table = $self->open_table($data,$table_name,$createMode,$lockMode)};
     die $@ if $@;
-    die "Couldn't open table '$table_name'!" unless $table;
+    die "Couldn't open table '$table_name'" unless $table;
     if (!$self->{column_names} or $self->{column_names}->[0] eq '*') {
         $self->{column_names} = $table->{col_names};
     }
@@ -572,7 +571,7 @@
  use Data::Dumper;
  my $stmt = DBI::SQL::Nano::Statement->new(
      "SELECT bar,baz FROM foo WHERE qux = 1"
- ) or die "Couldn't parse!";
+ ) or die "Couldn't parse";
  print Dumper $stmt;
 
 =head1 DESCRIPTION

Reply via email to