--- trunk/lib/SQLSession/Action/DoSQL.pm 2006/12/02 22:30:43 7 +++ trunk/lib/SQLSession/Action/DoSQL.pm 2006/12/04 19:22:48 24 @@ -22,7 +22,8 @@ label is 'SQL', render as 'textarea', is mandatory, - ajax validates; + ajax validates, + ajax canonicalizes; param database => label is 'Database', @@ -33,7 +34,7 @@ $dbs->unlimit; [{ display_from => 'name', - value_from => 'name', + value_from => 'id', collection => $dbs, }]; }; @@ -49,10 +50,32 @@ =cut -sub valdate_sql_query { +sub validate_sql_query { my $self = shift; - my $value = shift || return $self->validation_error( sql_query => 'You need to type in SQL query' ); - return $self->validation_ok('sql_query'); + my $value = shift; + + if ( $value =~ m/^\s+;*\s*$/s ) { + return $self->validation_error( sql_query => 'You need to type in SQL query' ); + } else { + return $self->validation_ok('sql_query'); + } +} + +use SQL::ReservedWords; + +sub canonicalize_sql_query { + my $self = shift; + my $sql = shift; + + my @words = SQL::ReservedWords->words; + + my $w = join('|', @words); + + warn "canonicalize SQL: $sql"; + + $sql =~ s/\b($w)\b/uc($1)/egis; + + return $sql; } =head2 take_action @@ -69,22 +92,24 @@ my $database = $self->argument_value('database'); warn "database: $database\n"; - my $dbs = SQLSession::Model::DatabaseCollection->new; - $dbs->limit( column => 'name', value => $database ); - my $db = $dbs->first || $self->result->error("Can't find database $database"); + my $db = SQLSession::Model::Database->new; + $db->load_by_cols( id => $database ) || + $self->result->error("Can't find database $database"); my $dbh = DBI->connect( $db->dsn, $db->login, $db->passwd ) || - $self->result->error("can't connect to ", $db->dsn, " as ", $db->login, " ", $DBI::errstr); + $self->result->error("Can't connect to " . $db->dsn . " as " . $db->login . "
" . $DBI::errstr) && return 0; + + $dbh->do("SET client_encoding = UTF8"); my $sql = $self->argument_value('sql_query'); warn "SQL: $sql\n"; my $sth = $dbh->prepare( $sql ) || - $self->result->error( $dbh->errstr() ); + $self->result->error( $dbh->errstr() ) && return 0; $sth->execute() || - $self->result->error( $sth->errstr() ); + $self->result->error( $sth->errstr() ) && return 0; $self->result->message('Query produced ' . ( $sth->rows == 0 ? 'no results' : @@ -92,6 +117,8 @@ $sth->rows . ' rows' )) if ($sth->rows >= 0); + $self->result->content( sth => $sth ); + return 1; }