--- trunk/lib/SQLSession/Action/DoSQL.pm 2006/12/02 21:17:46 6 +++ trunk/lib/SQLSession/Action/DoSQL.pm 2006/12/02 22:30:43 7 @@ -11,6 +11,8 @@ use base qw/SQLSession::Action Jifty::Action/; use SQLSession::Model::DatabaseCollection; +use DBI; + use Data::Dump qw/dump/; use Jifty::Param::Schema; @@ -18,7 +20,9 @@ param sql_query => label is 'SQL', - is mandatory; + render as 'textarea', + is mandatory, + ajax validates; param database => label is 'Database', @@ -36,28 +40,59 @@ }; +sub sticky_on_success { 1 } +sub sticky_on_failure { 1 } + +=head2 validate_sql_query + +Can't be empty! + +=cut + +sub valdate_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'); +} + =head2 take_action +Execute SQL query on database + =cut sub take_action { my $self = shift; # Custom action code - - $self->report_success if not $self->result->failure; - - return 1; -} -=head2 report_success + my $database = $self->argument_value('database'); + warn "database: $database\n"; -=cut + my $dbs = SQLSession::Model::DatabaseCollection->new; + $dbs->limit( column => 'name', value => $database ); + my $db = $dbs->first || $self->result->error("Can't find database $database"); -sub report_success { - my $self = shift; - # Your success message here - $self->result->message('Success'); + my $dbh = DBI->connect( $db->dsn, $db->login, $db->passwd ) || + $self->result->error("can't connect to ", $db->dsn, " as ", $db->login, " ", $DBI::errstr); + + my $sql = $self->argument_value('sql_query'); + + warn "SQL: $sql\n"; + + my $sth = $dbh->prepare( $sql ) || + $self->result->error( $dbh->errstr() ); + + $sth->execute() || + $self->result->error( $sth->errstr() ); + + $self->result->message('Query produced ' . ( + $sth->rows == 0 ? 'no results' : + $sth->rows == 1 ? 'single row' : + $sth->rows . ' rows' + )) if ($sth->rows >= 0); + + return 1; } 1;