Author: REHSACK
Date: Mon May 17 06:30:42 2010
New Revision: 13993

Modified:
   dbi/trunk/lib/DBI/SQL/Nano.pm

Log:
- apply Jens' style
- apply ORDER BY sort optimization from SQL::Statement


Modified: dbi/trunk/lib/DBI/SQL/Nano.pm
==============================================================================
--- dbi/trunk/lib/DBI/SQL/Nano.pm       (original)
+++ dbi/trunk/lib/DBI/SQL/Nano.pm       Mon May 17 06:30:42 2010
@@ -24,17 +24,20 @@
 
 use Carp qw(croak);
 
-require DBI; # for looks_like_number()
+require DBI;    # for looks_like_number()
 
-BEGIN {
-    $VERSION = sprintf("1.%06d", q$Revision$ =~ /(\d+)/o);
+BEGIN
+{
+    $VERSION = sprintf( "1.%06d", q$Revision$ =~ /(\d+)/o );
 
     $versions->{nano_version} = $VERSION;
-    if ($ENV{DBI_SQL_NANO} || !eval { require SQL::Statement; 
$SQL::Statement::VERSION ge '1.28' }) {
+    if ( $ENV{DBI_SQL_NANO} || !eval { require SQL::Statement; 
$SQL::Statement::VERSION ge '1.28' } )
+    {
         @DBI::SQL::Nano::Statement::ISA = qw(DBI::SQL::Nano::Statement_);
         @DBI::SQL::Nano::Table::ISA     = qw(DBI::SQL::Nano::Table_);
     }
-    else {
+    else
+    {
         @DBI::SQL::Nano::Statement::ISA = qw( SQL::Statement );
         @DBI::SQL::Nano::Table::ISA     = qw( SQL::Eval::Table);
         $versions->{statement_version}  = $SQL::Statement::VERSION;
@@ -47,8 +50,9 @@
 
 use Carp qw(croak);
 
-sub new {
-    my($class,$sql) = @_;
+sub new
+{
+    my ( $class, $sql ) = @_;
     my $self = {};
     bless $self, $class;
     return $self->prepare($sql);
@@ -57,499 +61,631 @@
 #####################################################################
 # PREPARE
 #####################################################################
-sub prepare {
-    my($self,$sql) = @_;
+sub prepare
+{
+    my ( $self, $sql ) = @_;
     $sql =~ s/\s+$//;
-    for ($sql) {
+    for ($sql)
+    {
         /^\s*CREATE\s+TABLE\s+(.*?)\s*\((.+)\)\s*$/is
-            &&do{
-                $self->{command}      = 'CREATE';
-                $self->{table_name}   = $1;
-                $self->{column_names} = parse_coldef_list($2) if $2;
-                croak "Can't find columns" unless $self->{column_names};
-            };
+          && do
+        {
+            $self->{command}      = 'CREATE';
+            $self->{table_name}   = $1;
+            $self->{column_names} = parse_coldef_list($2) if $2;
+            $self->{column_names} or croak "Can't find columns";
+        };
         /^\s*DROP\s+TABLE\s+(IF\s+EXISTS\s+)?(.*?)\s*$/is
-            &&do{
-                $self->{command}      = 'DROP';
-                $self->{table_name}   = $2;
-                $self->{ignore_missing_table} = 1 if $1;
-            };
+          && do
+        {
+            $self->{command}              = 'DROP';
+            $self->{table_name}           = $2;
+            $self->{ignore_missing_table} = 1 if $1;
+        };
         /^\s*SELECT\s+(.*?)\s+FROM\s+(\S+)((.*))?/is
-            &&do{
-                $self->{command}      = 'SELECT';
-                $self->{column_names} = parse_comma_list($1) if $1;
-                croak "Can't find columns" unless $self->{column_names};
-                $self->{table_name}   = $2;
-                if ( my $clauses = $4) {
-                   if ($clauses =~ /^(.*)\s+ORDER\s+BY\s+(.*)$/is) {
-                        $clauses = $1;
-                        $self->{order_clause} = $self->parse_order_clause($2);
-                   }
-                    $self->{where_clause}=$self->parse_where_clause($clauses)
-                        if $clauses;
-               }
-            };
+          && do
+        {
+            $self->{command} = 'SELECT';
+            $self->{column_names} = parse_comma_list($1) if $1;
+            $self->{column_names} or croak "Can't find columns";
+            $self->{table_name} = $2;
+            if ( my $clauses = $4 )
+            {
+                if ( $clauses =~ /^(.*)\s+ORDER\s+BY\s+(.*)$/is )
+                {
+                    $clauses = $1;
+                    $self->{order_clause} = $self->parse_order_clause($2);
+                }
+                $self->{where_clause} = $self->parse_where_clause($clauses) if 
($clauses);
+            }
+        };
         /^\s*INSERT\s+INTO\s+(\S+)\s*(\((.*?)\))?\s*VALUES\s*\((.+)\)/is
-            &&do{
-                $self->{command}      = 'INSERT';
-                $self->{table_name}   = $1;
-                $self->{column_names} = parse_comma_list($2) if $2;
-                $self->{values}       = $self->parse_values_list($4) if $4;
-                croak "Can't parse values" unless $self->{values};
-            };
+          && do
+        {
+            $self->{command}      = 'INSERT';
+            $self->{table_name}   = $1;
+            $self->{column_names} = parse_comma_list($2) if $2;
+            $self->{values}       = $self->parse_values_list($4) if $4;
+            $self->{values} or croak "Can't parse values";
+        };
         /^\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;
-            };
+          && do
+        {
+            $self->{command}      = 'DELETE';
+            $self->{table_name}   = $1;
+            $self->{where_clause} = $self->parse_where_clause($3) if $3;
+        };
         /^\s*UPDATE\s+(\S+)\s+SET\s+(.+)(\s+WHERE\s+.+)/is
-            &&do{
-                $self->{command}      = 'UPDATE';
-                $self->{table_name}   = $1;
-                $self->parse_set_clause($2) if $2;
-                $self->{where_clause} = $self->parse_where_clause($3) if $3;
-            };
+          && do
+        {
+            $self->{command}    = 'UPDATE';
+            $self->{table_name} = $1;
+            $self->parse_set_clause($2) if $2;
+            $self->{where_clause} = $self->parse_where_clause($3) if $3;
+        };
     }
-    croak "Couldn't parsen"
-       unless $self->{command} and $self->{table_name};
+    croak "Couldn't parsen" 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;
-    croak "Bad ORDER BY clause '$str'" if @clause > 2;
+
+sub parse_order_clause
+{
+    my ( $self, $str ) = @_;
+    my @clause = split /\s+/, $str;
+    return { $clause[0] => 'ASC' } if ( @clause == 1 );
+    croak "Bad ORDER BY clause '$str'" if ( @clause > 2 );
     $clause[1] ||= '';
-    return { $clause[0] => uc $clause[1] } if $clause[1] =~ /^ASC$/i
-                                           or $clause[1] =~ /^DESC$/i;
+    return { $clause[0] => uc $clause[1] }
+      if $clause[1] =~ /^ASC$/i
+          or $clause[1] =~ /^DESC$/i;
     croak "Bad ORDER BY clause '$clause[1]'";
 }
-sub parse_coldef_list  {                # check column definitions
+
+sub parse_coldef_list
+{    # check column definitions
     my @col_defs;
-    for ( split',',shift ) {
+    for ( split ',', shift )
+    {
         my $col = clean_parse_str($_);
-        if ( $col =~ /^(\S+?)\s+.+/ ) { # doesn't check what it is
-            $col = $1;                  # just checks if it exists
-       }
-        else {
-           croak "No column definition for '$_'";
-       }
-        push @col_defs,$col;
+        if ( $col =~ /^(\S+?)\s+.+/ )
+        {    # doesn't check what it is
+            $col = $1;    # just checks if it exists
+        }
+        else
+        {
+            croak "No column definition for '$_'";
+        }
+        push @col_defs, $col;
     }
     return \...@col_defs;
 }
-sub parse_comma_list  {[map{clean_parse_str($_)} split(',',shift)]}
-sub clean_parse_str { local $_ = shift; s/\(//;s/\)//;s/^\s+//; s/\s+$//; $_; }
-sub parse_values_list {
-    my($self,$str) = @_;
-    [map{$self->parse_value(clean_parse_str($_))}split(',',$str)]
+
+sub parse_comma_list
+{
+    [ map { clean_parse_str($_) } split( ',', shift ) ];
+}
+sub clean_parse_str { local $_ = shift; s/\(//; s/\)//; s/^\s+//; s/\s+$//; 
$_; }
+
+sub parse_values_list
+{
+    my ( $self, $str ) = @_;
+    [ map { $self->parse_value( clean_parse_str($_) ) } split( ',', $str ) ];
 }
-sub parse_set_clause {
+
+sub parse_set_clause
+{
     my $self = shift;
     my @cols = split /,/, shift;
     my $set_clause;
-    for my $col(@cols) {
-        my($col_name,$value)= $col =~ /^\s*(.+?)\s*=\s*(.+?)\s*$/s;
-        push @{$self->{column_names}}, $col_name;
-        push @{$self->{values}}, $self->parse_value($value);
-    }
-    croak "Can't parse set clause"
-        unless $self->{column_names}
-           and $self->{values};
-}
-sub parse_value {
-    my($self,$str) = @_;
-    return undef unless defined $str;
+    for my $col (@cols)
+    {
+        my ( $col_name, $value ) = $col =~ /^\s*(.+?)\s*=\s*(.+?)\s*$/s;
+        push @{ $self->{column_names} }, $col_name;
+        push @{ $self->{values} },       $self->parse_value($value);
+    }
+    croak "Can't parse set clause" unless ( $self->{column_names} and 
$self->{values} );
+}
+
+sub parse_value
+{
+    my ( $self, $str ) = @_;
+    return unless ( defined $str );
     $str =~ s/\s+$//;
     $str =~ s/^\s+//;
-    if ($str =~ /^\?$/) {
-        push @{$self->{params}},'?';
-        return { value=>'?'  ,type=> 'placeholder' };
-    }
-    return { value=>undef,type=> 'NULL'   } if $str =~ /^NULL$/i;
-    return { value=>$1   ,type=> 'string' } if $str =~ /^'(.+)'$/s;
-    return { value=>$str ,type=> 'number' } if DBI::looks_like_number($str);
-    return { value=>$str ,type=> 'column' };
+    if ( $str =~ /^\?$/ )
+    {
+        push @{ $self->{params} }, '?';
+        return {
+                 value => '?',
+                 type  => 'placeholder'
+               };
+    }
+    return {
+             value => undef,
+             type  => 'NULL'
+           } if ( $str =~ /^NULL$/i );
+    return {
+             value => $1,
+             type  => 'string'
+           } if ( $str =~ /^'(.+)'$/s );
+    return {
+             value => $str,
+             type  => 'number'
+           } if ( DBI::looks_like_number($str) );
+    return {
+             value => $str,
+             type  => 'column'
+           };
 }
-sub parse_where_clause {
-    my($self,$str) = @_;
+
+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 {
+    else
+    {
         croak "Couldn't find WHERE clause in '$str'";
     }
-    my($neg) = $str =~ s/^\s*(NOT)\s+//is;
+    my ($neg) = $str =~ s/^\s*(NOT)\s+//is;
     my $opexp = '=|<>|<=|>=|<|>|LIKE|CLIKE|IS';
-    my($val1,$op,$val2) = $str =~ /^(.+?)\s*($opexp)\s*(.+)\s*$/iso;
-    croak "Couldn't parse WHERE expression '$str'"
-       unless defined $val1 and defined $op and defined $val2;
+    my ( $val1, $op, $val2 ) = $str =~ /^(.+?)\s*($opexp)\s*(.+)\s*$/iso;
+    croak "Couldn't parse WHERE expression '$str'" unless ( defined $val1 and 
defined $op and defined $val2 );
     return {
-        arg1 => $self->parse_value($val1),
-        arg2 => $self->parse_value($val2),
-        op   => $op,
-        neg  => $neg,
-    }
+             arg1 => $self->parse_value($val1),
+             arg2 => $self->parse_value($val2),
+             op   => $op,
+             neg  => $neg,
+           };
 }
 
 #####################################################################
 # EXECUTE
 #####################################################################
-sub execute {
-    my($self, $data, $params) = @_;
+sub execute
+{
+    my ( $self, $data, $params ) = @_;
     my $num_placeholders = $self->params;
-    my $num_params       = scalar @$params || 0;
-    croak "Number of params '$num_params' does not match "
-      . "number of placeholders '$num_placeholders'"
-      unless $num_placeholders == $num_params;
-    if (scalar @$params) {
-        for my $i(0..$#{$self->{values}}) {
-            if ($self->{values}->[$i]->{type} eq 'placeholder') {
+    my $num_params = scalar @$params || 0;
+    croak "Number of params '$num_params' does not match number of 
placeholders '$num_placeholders'"
+      unless ( $num_placeholders == $num_params );
+    if ( scalar @$params )
+    {
+        for my $i ( 0 .. $#{ $self->{values} } )
+        {
+            if ( $self->{values}->[$i]->{type} eq 'placeholder' )
+            {
                 $self->{values}->[$i]->{value} = shift @$params;
             }
         }
-        if ($self->{where_clause}) {
-            if ($self->{where_clause}->{arg1}->{type} eq 'placeholder') {
+        if ( $self->{where_clause} )
+        {
+            if ( $self->{where_clause}->{arg1}->{type} eq 'placeholder' )
+            {
                 $self->{where_clause}->{arg1}->{value} = shift @$params;
             }
-            if ($self->{where_clause}->{arg2}->{type} eq 'placeholder') {
+            if ( $self->{where_clause}->{arg2}->{type} eq 'placeholder' )
+            {
                 $self->{where_clause}->{arg2}->{value} = shift @$params;
             }
         }
     }
     my $command = $self->{command};
-    ( $self->{'NUM_OF_ROWS'},
-      $self->{'NUM_OF_FIELDS'},
-      $self->{'data'},
-    ) = $self->$command($data, $params);
+    ( $self->{'NUM_OF_ROWS'}, $self->{'NUM_OF_FIELDS'}, $self->{'data'}, ) = 
$self->$command( $data, $params );
     $self->{NAME} ||= $self->{column_names};
     $self->{'NUM_OF_ROWS'} || '0E0';
 }
-sub DROP ($$$) {
-    my($self, $data, $params) = @_;
-    my $table = $self->open_tables($data, 0, 0);
+
+sub DROP ($$$)
+{
+    my ( $self, $data, $params ) = @_;
+    my $table = $self->open_tables( $data, 0, 0 );
     $table->drop($data);
-    (-1, 0);
+    ( -1, 0 );
+}
+
+sub CREATE ($$$)
+{
+    my ( $self, $data, $params ) = @_;
+    my $table = $self->open_tables( $data, 1, 1 );
+    $table->push_names( $data, $self->{column_names} );
+    ( 0, 0 );
 }
-sub CREATE ($$$) {
-    my($self, $data, $params) = @_;
-    my $table = $self->open_tables($data, 1, 1);
-    $table->push_names($data, $self->{column_names});
-    (0, 0);
-}
-sub INSERT ($$$) {
-    my($self, $data, $params) = @_;
-    my $table = $self->open_tables($data, 0, 1);
+
+sub INSERT ($$$)
+{
+    my ( $self, $data, $params ) = @_;
+    my $table = $self->open_tables( $data, 0, 1 );
     $self->verify_columns($table);
-    $table->seek($data, 0, 2);
-    my($array) = [];
-    my($val, $col, $i);
-    $self->{column_names}=$table->col_names() unless $self->{column_names};
-    my $cNum = scalar(@{$self->{column_names}}) if $self->{column_names};
+    $table->seek( $data, 0, 2 );
+    my ($array) = [];
+    my ( $val, $col, $i );
+    $self->{column_names} = $table->col_names() unless ( $self->{column_names} 
);
+    my $cNum = scalar( @{ $self->{column_names} } ) if ( $self->{column_names} 
);
     my $param_num = 0;
-    if ($cNum) {
-        for ($i = 0;  $i < $cNum;  $i++) {
+
+    if ($cNum)
+    {
+        for ( $i = 0; $i < $cNum; $i++ )
+        {
             $col = $self->{column_names}->[$i];
-            $array->[$self->column_nums($table,$col)] = $self->row_values($i);
+            $array->[ $self->column_nums( $table, $col ) ] = 
$self->row_values($i);
         }
-    } else {
+    }
+    else
+    {
         croak "Bad col names in INSERT";
     }
-    $table->push_row($data, $array);
-    (1, 0);
+    $table->push_row( $data, $array );
+    ( 1, 0 );
 }
-sub DELETE ($$$) {
-    my($self, $data, $params) = @_;
-    my $table = $self->open_tables($data, 0, 1);
+
+sub DELETE ($$$)
+{
+    my ( $self, $data, $params ) = @_;
+    my $table = $self->open_tables( $data, 0, 1 );
     $self->verify_columns($table);
-    my($affected) = 0;
-    my(@rows, $array);
+    my ($affected) = 0;
+    my ( @rows, $array );
     my $can_dor = $table->can('delete_one_row');
-    while ($array = $table->fetch_row($data)) {
-        if ($self->eval_where($table,$array)) {
+    while ( $array = $table->fetch_row($data) )
+    {
+
+        if ( $self->eval_where( $table, $array ) )
+        {
             ++$affected;
-           if( $self->{fetched_from_key} ) {
+            if ( $self->{fetched_from_key} )
+            {
                 $array = $self->{fetched_value};
-                $table->delete_one_row($data,$array);
-                return ($affected, 0);
-           }
-            push(@rows, $array) if( $can_dor );
-        } else {
-            push(@rows, $array) unless( $can_dor );
-        }
-    }
-    if( $can_dor ) {
-       foreach $array (@rows) {
-           $table->delete_one_row($data, $array);
-       }
-    }
-    else {
-       $table->seek($data, 0, 0);
-       foreach $array (@rows) {
-           $table->push_row($data, $array);
-       }
-       $table->truncate($data);
-    }
-    return ($affected, 0);
-}
-sub SELECT ($$$) {
-    my($self, $data, $params) = @_;
-    my $table = $self->open_tables($data, 0, 0);
+                $table->delete_one_row( $data, $array );
+                return ( $affected, 0 );
+            }
+            push( @rows, $array ) if ($can_dor);
+        }
+        else
+        {
+            push( @rows, $array ) unless ($can_dor);
+        }
+    }
+    if ($can_dor)
+    {
+        foreach $array (@rows)
+        {
+            $table->delete_one_row( $data, $array );
+        }
+    }
+    else
+    {
+        $table->seek( $data, 0, 0 );
+        foreach $array (@rows)
+        {
+            $table->push_row( $data, $array );
+        }
+        $table->truncate($data);
+    }
+    return ( $affected, 0 );
+}
+
+sub _anycmp($$;$)
+{
+    my ( $a, $b, $case_fold ) = @_;
+
+    if ( !defined($a) || !defined($b) )
+    {
+        return defined($a) - defined($b);
+    }
+    elsif ( DBI::looks_like_number($a) && DBI::looks_like_number($b) )
+    {
+        return $a <=> $b;
+    }
+    else
+    {
+        return $case_fold ? lc($a) cmp lc($b) || $a cmp $b : $a cmp $b;
+    }
+}
+
+sub SELECT ($$$)
+{
+    my ( $self, $data, $params ) = @_;
+    my $table = $self->open_tables( $data, 0, 0 );
     $self->verify_columns($table);
     my $tname = $self->{table_name};
-    my($affected) = 0;
-    my(@rows, $array, $val, $col, $i);
-    while ($array = $table->fetch_row($data)) {
-        if ($self->eval_where($table,$array)) {
-            $array = $self->{fetched_value} if $self->{fetched_from_key};
+    my ($affected) = 0;
+    my ( @rows, $array, $val, $col, $i );
+    while ( $array = $table->fetch_row($data) )
+    {
+        if ( $self->eval_where( $table, $array ) )
+        {
+            $array = $self->{fetched_value} if ( $self->{fetched_from_key} );
             my $col_nums = $self->column_nums($table);
-            my %cols   = reverse %{ $col_nums };
+            my %cols     = reverse %{$col_nums};
             my $rowhash;
-            for (sort keys %cols) {
-                $rowhash->{$cols{$_}} = $array->[$_];
+            for ( sort keys %cols )
+            {
+                $rowhash->{ $cols{$_} } = $array->[$_];
             }
             my @newarray;
-            for ($i = 0;  $i < @{$self->{column_names}};  $i++) {
-               $col = $self->{column_names}->[$i];
-               push @newarray,$rowhash->{$col};
+            for ( $i = 0; $i < @{ $self->{column_names} }; $i++ )
+            {
+                $col = $self->{column_names}->[$i];
+                push @newarray, $rowhash->{$col};
             }
-            push(@rows, \...@newarray);
-            return (scalar(@rows),scalar @{$self->{column_names}},\...@rows)
-               if $self->{fetched_from_key};
-        }
-    }
-    if ( $self->{order_clause} ) {
-        my( $sort_col, $desc ) = each %{$self->{order_clause}};
-        undef $desc unless $desc eq 'DESC';
-        my @sortCols = ( $self->column_nums($table,$sort_col,1) );
-        my($c, $d, $colNum);
-        my $sortFunc = sub {
-            my $result;
-            $i = 0;
-            do {
-                $colNum = $sortCols[$i++];
-                # $desc = $sortCols[$i++];
-                $c = $a->[$colNum];
-                $d = $b->[$colNum];
-                if (!defined($c)) {
-                    $result = defined $d ? -1 : 0;
-                } elsif (!defined($d)) {
-                    $result = 1;
-               } elsif ( DBI::looks_like_number($c) && 
DBI::looks_like_number($d) ) {
-                    $result = ($c <=> $d);
-                } else {
-                   if ($self->{"case_fold"}) {
-                        $result = lc $c cmp lc $d || $c cmp $d;
-                   }
-                    else {
-                        $result = $c cmp $d;
-                   }
-                }
-                if ($desc) {
-                    $result = -$result;
-                }
-            } while (!$result  &&  $i < @sortCols);
+            push( @rows, \...@newarray );
+            return ( scalar(@rows), scalar @{ $self->{column_names} }, 
\...@rows )
+              if ( $self->{fetched_from_key} );
+        }
+    }
+    if ( $self->{order_clause} )
+    {
+        my ( $sort_col, $desc ) = each %{ $self->{order_clause} };
+        my @sortCols = ( $self->column_nums( $table, $sort_col, 1 ) );
+       $sortCols[1] = uc $desc eq 'DESC' ? 1 : 0;
+
+        @rows = sort {
+            my ( $result, $colNum, $desc );
+            my $i = 0;
+            do
+            {
+                $colNum = $sortCols[ $i++ ];
+                $desc   = $sortCols[ $i++ ];
+                $result = _anycmp( $a->[$colNum], $b->[$colNum] );
+                $result = -$result if ($desc);
+            } while ( !$result && $i < @sortCols );
             $result;
-        };
-        @rows = (sort $sortFunc @rows);
+        } @rows;
     }
-    (scalar(@rows), scalar @{$self->{column_names}}, \...@rows);
+    ( scalar(@rows), scalar @{ $self->{column_names} }, \...@rows );
 }
-sub UPDATE ($$$) {
-    my($self, $data, $params) = @_;
-    my $table = $self->open_tables($data, 0, 1);
+
+sub UPDATE ($$$)
+{
+    my ( $self, $data, $params ) = @_;
+    my $table = $self->open_tables( $data, 0, 1 );
     $self->verify_columns($table);
     return undef unless $table;
-    my($affected) = 0;
-    my(@rows, $array, $f_array, $val, $col, $i);
-    while ($array = $table->fetch_row($data)) {
-        if ($self->eval_where($table,$array)) {
-            $array = $self->{fetched_value} if $self->{fetched_from_key}
-                                             and $table->can('update_one_row');
+    my ($affected) = 0;
+    my ( @rows, $array, $f_array, $val, $col, $i );
+    while ( $array = $table->fetch_row($data) )
+    {
+        if ( $self->eval_where( $table, $array ) )
+        {
+            $array = $self->{fetched_value} if ( $self->{fetched_from_key} and 
$table->can('update_one_row') );
             my $col_nums = $self->column_nums($table);
-            my %cols   = reverse %{ $col_nums };
+            my %cols     = reverse %{$col_nums};
             my $rowhash;
-            for (sort keys %cols) {
-                $rowhash->{$cols{$_}} = $array->[$_];
+            for ( sort keys %cols )
+            {
+                $rowhash->{ $cols{$_} } = $array->[$_];
             }
-            for ($i = 0;  $i < @{$self->{column_names}};  $i++) {
-               $col = $self->{column_names}->[$i];
-               $array->[$self->column_nums($table,$col)]=$self->row_values($i);
+            for ( $i = 0; $i < @{ $self->{column_names} }; $i++ )
+            {
+                $col = $self->{column_names}->[$i];
+                $array->[ $self->column_nums( $table, $col ) ] = 
$self->row_values($i);
             }
             $affected++;
-            if ($self->{fetched_from_key}){
-                $table->update_one_row($data,$array);
-                return ($affected, 0);
-           }
-            push(@rows, $array);
-       }
-        else {
-            push(@rows, $array);
+            if ( $self->{fetched_from_key} )
+            {
+                $table->update_one_row( $data, $array );
+                return ( $affected, 0 );
+            }
+            push( @rows, $array );
+        }
+        else
+        {
+            push( @rows, $array );
         }
     }
-    $table->seek($data, 0, 0);
-    foreach my $array (@rows) {
-        $table->push_row($data, $array);
+    $table->seek( $data, 0, 0 );
+    foreach my $array (@rows)
+    {
+        $table->push_row( $data, $array );
     }
     $table->truncate($data);
-    ($affected, 0);
+    ( $affected, 0 );
 }
-sub verify_columns {
-   my($self,$table) = @_;
-   my @cols = @{$self->{column_names}};
-   if ($self->{where_clause}) {
-      if (my $col = $self->{where_clause}->{arg1}) {
-          push @cols, $col->{value} if $col->{type} eq 'column';
-      }
-      if (my $col = $self->{where_clause}->{arg2}) {
-          push @cols, $col->{value} if $col->{type} eq 'column';
-      }
-   }
-   for (@cols) {
-       $self->column_nums($table,$_);
-   }
+
+sub verify_columns
+{
+    my ( $self, $table ) = @_;
+    my @cols = @{ $self->{column_names} };
+    if ( $self->{where_clause} )
+    {
+        if ( my $col = $self->{where_clause}->{arg1} )
+        {
+            push @cols, $col->{value} if $col->{type} eq 'column';
+        }
+        if ( my $col = $self->{where_clause}->{arg2} )
+        {
+            push @cols, $col->{value} if $col->{type} eq 'column';
+        }
+    }
+    for (@cols)
+    {
+        $self->column_nums( $table, $_ );
+    }
 }
-sub column_nums {
-    my($self,$table,$stmt_col_name,$find_in_stmt)=...@_;
+
+sub column_nums
+{
+    my ( $self, $table, $stmt_col_name, $find_in_stmt ) = @_;
     my %dbd_nums = %{ $table->col_nums() };
     my @dbd_cols = @{ $table->col_names() };
     my %stmt_nums;
-    if ($stmt_col_name and !$find_in_stmt) {
-        while(my($k,$v)=each %dbd_nums) {
+    if ( $stmt_col_name and !$find_in_stmt )
+    {
+        while ( my ( $k, $v ) = each %dbd_nums )
+        {
             return $v if uc $k eq uc $stmt_col_name;
         }
         croak "No such column '$stmt_col_name'";
     }
-    if ($stmt_col_name and $find_in_stmt) {
-        for my $i(0...@{$self->{column_names}}) {
+    if ( $stmt_col_name and $find_in_stmt )
+    {
+        for my $i ( 0 .. @{ $self->{column_names} } )
+        {
             return $i if uc $stmt_col_name eq uc $self->{column_names}->[$i];
         }
         croak "No such column '$stmt_col_name'";
     }
-    for my $i(0 .. $#dbd_cols) {
-        for my $stmt_col(@{$self->{column_names}}) {
+    for my $i ( 0 .. $#dbd_cols )
+    {
+        for my $stmt_col ( @{ $self->{column_names} } )
+        {
             $stmt_nums{$stmt_col} = $i if uc $dbd_cols[$i] eq uc $stmt_col;
         }
     }
     return \%stmt_nums;
 }
-sub eval_where {
-    my $self   = shift;
-    my $table  = shift;
-    my $rowary = shift;
-    my $where = $self->{"where_clause"} || return 1;
-    my $col_nums = $table->col_nums() ;
-    my %cols   = reverse %{ $col_nums };
+
+sub eval_where
+{
+    my $self     = shift;
+    my $table    = shift;
+    my $rowary   = shift;
+    my $where    = $self->{"where_clause"} || return 1;
+    my $col_nums = $table->col_nums();
+    my %cols     = reverse %{$col_nums};
     my $rowhash;
-    for (sort keys %cols) {
-        $rowhash->{uc $cols{$_}} = $rowary->[$_];
+    for ( sort keys %cols )
+    {
+        $rowhash->{ uc $cols{$_} } = $rowary->[$_];
     }
-    return $self->process_predicate($where,$table,$rowhash);
+    return $self->process_predicate( $where, $table, $rowhash );
 }
-sub process_predicate {
-    my($self,$pred,$table,$rowhash) = @_;
+
+sub process_predicate
+{
+    my ( $self, $pred, $table, $rowhash ) = @_;
     my $val1 = $pred->{arg1};
-    if ($val1->{type} eq 'column') {
-        $val1 = $rowhash->{ uc $val1->{value}};
+    if ( $val1->{type} eq 'column' )
+    {
+        $val1 = $rowhash->{ uc $val1->{value} };
     }
-    else {
+    else
+    {
         $val1 = $val1->{value};
     }
     my $val2 = $pred->{arg2};
-    if ($val2->{type}eq 'column') {
-        $val2 = $rowhash->{uc $val2->{value}};
+    if ( $val2->{type} eq 'column' )
+    {
+        $val2 = $rowhash->{ uc $val2->{value} };
     }
-    else {
+    else
+    {
         $val2 = $val2->{value};
     }
-    my $op   = $pred->{op};
-    my $neg  = $pred->{neg};
-    if ( $op eq '=' and !$neg and $table->can('fetch_one_row') ) {
-        my $key_col = $table->fetch_one_row(1,1);
-        if ($pred->{arg1}->{value} =~ /^$key_col$/i) {
-            $self->{fetched_from_key}=1;
-            $self->{fetched_value} = $table->fetch_one_row(
-                0,$pred->{arg2}->{value}
-            );
+    my $op  = $pred->{op};
+    my $neg = $pred->{neg};
+    if ( $op eq '=' and !$neg and $table->can('fetch_one_row') )
+    {
+        my $key_col = $table->fetch_one_row( 1, 1 );
+        if ( $pred->{arg1}->{value} =~ /^$key_col$/i )
+        {
+            $self->{fetched_from_key} = 1;
+            $self->{fetched_value} = $table->fetch_one_row( 0, 
$pred->{arg2}->{value} );
             return 1;
-       }
+        }
     }
-    my $match = $self->is_matched($val1,$op,$val2) || 0;
+    my $match = $self->is_matched( $val1, $op, $val2 ) || 0;
     if ($neg) { $match = $match ? 0 : 1; }
     return $match;
 }
-sub is_matched {
-    my($self,$val1,$op,$val2)=...@_;
-    if ($op eq 'IS') {
-        return 1 if (!defined $val1 or $val1 eq '');
+
+sub is_matched
+{
+    my ( $self, $val1, $op, $val2 ) = @_;
+    if ( $op eq 'IS' )
+    {
+        return 1 if ( !defined $val1 or $val1 eq '' );
         return 0;
     }
-    $val1 = '' unless defined $val1;
-    $val2 = '' unless defined $val2;
-    if ($op =~ /LIKE|CLIKE/i) {
+    $val1 = '' unless ( defined $val1 );
+    $val2 = '' unless ( defined $val2 );
+    if ( $op =~ /LIKE|CLIKE/i )
+    {
         $val2 = quotemeta($val2);
         $val2 =~ s/\\%/.*/g;
         $val2 =~ s/_/./g;
     }
-    if ($op eq 'LIKE' )  { return $val1 =~ /^$val2$/s;  }
-    if ($op eq 'CLIKE' ) { return $val1 =~ /^$val2$/si; }
-    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; }
-        if ($op eq '<>' ) { return $val1 != $val2; }
-        if ($op eq '<=' ) { return $val1 <= $val2; }
-        if ($op eq '>=' ) { return $val1 >= $val2; }
-    }
-    else {
-        if ($op eq '<'  ) { return $val1 lt $val2; }
-        if ($op eq '>'  ) { return $val1 gt $val2; }
-        if ($op eq '='  ) { return $val1 eq $val2; }
-        if ($op eq '<>' ) { return $val1 ne $val2; }
-        if ($op eq '<=' ) { return $val1 ge $val2; }
-        if ($op eq '>=' ) { return $val1 le $val2; }
+    if ( $op eq 'LIKE' )  { return $val1 =~ /^$val2$/s; }
+    if ( $op eq 'CLIKE' ) { return $val1 =~ /^$val2$/si; }
+    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; }
+        if ( $op eq '<>' ) { return $val1 != $val2; }
+        if ( $op eq '<=' ) { return $val1 <= $val2; }
+        if ( $op eq '>=' ) { return $val1 >= $val2; }
+    }
+    else
+    {
+        if ( $op eq '<' )  { return $val1 lt $val2; }
+        if ( $op eq '>' )  { return $val1 gt $val2; }
+        if ( $op eq '=' )  { return $val1 eq $val2; }
+        if ( $op eq '<>' ) { return $val1 ne $val2; }
+        if ( $op eq '<=' ) { return $val1 ge $val2; }
+        if ( $op eq '>=' ) { return $val1 le $val2; }
     }
 }
-sub params {
-    my $self = shift;
+
+sub params
+{
+    my $self    = shift;
     my $val_num = shift;
-    if (!$self->{"params"}) { return 0; }
-    if (defined $val_num) {
+    if ( !$self->{"params"} ) { return 0; }
+    if ( defined $val_num )
+    {
         return $self->{"params"}->[$val_num];
     }
-    if (wantarray) {
-        return @{$self->{"params"}};
+    if (wantarray)
+    {
+        return @{ $self->{"params"} };
     }
-    else {
+    else
+    {
         return scalar @{ $self->{"params"} };
     }
 
 }
-sub open_tables {
-    my($self, $data, $createMode, $lockMode) = @_;
+
+sub open_tables
+{
+    my ( $self, $data, $createMode, $lockMode ) = @_;
     my $table_name = $self->{table_name};
     my $table;
-    eval{$table = $self->open_table($data,$table_name,$createMode,$lockMode)};
-    croak $@ if $@;
+    eval { $table = $self->open_table( $data, $table_name, $createMode, 
$lockMode ) };
+    if ($@)
+    {
+        chomp $@;
+        croak $@;
+    }
     croak "Couldn't open table '$table_name'" unless $table;
-    if (!$self->{column_names} or $self->{column_names}->[0] eq '*') {
+    if ( !$self->{column_names} or $self->{column_names}->[0] eq '*' )
+    {
         $self->{column_names} = $table->col_names();
     }
     return $table;
 }
-sub row_values {
-    my $self = shift;
+
+sub row_values
+{
+    my $self    = shift;
     my $val_num = shift;
-    if (!$self->{"values"}) { return 0; }
-    if (defined $val_num) {
+    if ( !$self->{"values"} ) { return 0; }
+    if ( defined $val_num )
+    {
         return $self->{"values"}->[$val_num]->{value};
     }
-    if (wantarray) {
-        return map{$_->{"value"} } @{$self->{"values"}};
+    if (wantarray)
+    {
+        return map { $_->{"value"} } @{ $self->{"values"} };
     }
-    else {
+    else
+    {
         return scalar @{ $self->{"values"} };
     }
 }
@@ -560,16 +696,17 @@
 
 use Carp qw(croak);
 
-sub new ($$) {
-    my($proto, $attr) = @_;
-    my($self) = { %$attr };
+sub new ($$)
+{
+    my ( $proto, $attr ) = @_;
+    my ($self) = {%$attr};
 
     defined( $self->{col_nums} ) and "HASH" eq ref( $self->{col_nums} )
       or croak("attrbute 'col_nums' must be defined as a hash");
     defined( $self->{col_names} ) and "ARRAY" eq ref( $self->{col_names} )
       or croak("attrbute 'col_names' must be defined as an array");
 
-    bless($self, (ref($proto) || $proto));
+    bless( $self, ( ref($proto) || $proto ) );
     return $self;
 }
 
@@ -579,12 +716,12 @@
 sub col_nums()    { $_[0]->{col_nums} }
 sub col_names()   { $_[0]->{col_names}; }
 
-sub drop ($$)        { croak "Abstract method " . ref($_[0]) . "::drop called" 
}
-sub fetch_row ($$$)  { croak "Abstract method " . ref($_[0]) . "::fetch_row 
called" }
-sub push_row ($$$)   { croak "Abstract method " . ref($_[0]) . "::push_row 
called" }
-sub push_names ($$$) { croak "Abstract method " . ref($_[0]) . "::push_names 
called" }
-sub truncate ($$)    { croak "Abstract method " . ref($_[0]) . "::truncate 
called" }
-sub seek ($$$$)      { croak "Abstract method " . ref($_[0]) . "::seek called" 
}
+sub drop ($$)        { croak "Abstract method " . ref( $_[0] ) . "::drop 
called" }
+sub fetch_row ($$$)  { croak "Abstract method " . ref( $_[0] ) . "::fetch_row 
called" }
+sub push_row ($$$)   { croak "Abstract method " . ref( $_[0] ) . "::push_row 
called" }
+sub push_names ($$$) { croak "Abstract method " . ref( $_[0] ) . "::push_names 
called" }
+sub truncate ($$)    { croak "Abstract method " . ref( $_[0] ) . "::truncate 
called" }
+sub seek ($$$$)      { croak "Abstract method " . ref( $_[0] ) . "::seek 
called" }
 
 1;
 __END__

Reply via email to