/[SQLSession]/trunk/lib/SQLSession/Action/DoSQL.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/SQLSession/Action/DoSQL.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 5 by dpavlin, Sat Dec 2 14:00:51 2006 UTC revision 29 by dpavlin, Thu Dec 7 22:13:56 2006 UTC
# Line 11  package SQLSession::Action::DoSQL; Line 11  package SQLSession::Action::DoSQL;
11  use base qw/SQLSession::Action Jifty::Action/;  use base qw/SQLSession::Action Jifty::Action/;
12    
13  use SQLSession::Model::DatabaseCollection;  use SQLSession::Model::DatabaseCollection;
14    use DBI;
15    
16  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
17    
18  use Jifty::Param::Schema;  use Jifty::Param::Schema;
# Line 18  use Jifty::Action schema { Line 20  use Jifty::Action schema {
20    
21          param sql_query =>          param sql_query =>
22                  label is 'SQL',                  label is 'SQL',
23                    render as 'textarea',
24    #               ajax validates,
25    #               ajax canonicalizes,
26                  is mandatory;                  is mandatory;
27                    
28          param database =>          param database =>
# Line 27  use Jifty::Action schema { Line 32  use Jifty::Action schema {
32                  available are defer {                  available are defer {
33                          my $dbs = SQLSession::Model::DatabaseCollection->new;                          my $dbs = SQLSession::Model::DatabaseCollection->new;
34                          $dbs->unlimit;                          $dbs->unlimit;
35                          warn "dbs = ",dump($dbs->items_array_ref);                          [{
                         return [{  
36                                  display_from => 'name',                                  display_from => 'name',
37                                  value_from => 'name',                                  value_from => 'id',
38                                  collection => $dbs,                                  collection => $dbs,
39                          }];                          }];
40                  };                  };
41    
42  };  };
43    
44    sub sticky_on_success { 1 }
45    sub sticky_on_failure { 1 }
46    
47    =head2 validate_sql_query
48    
49    Can't be empty!
50    
51    =cut
52    
53    sub validate_sql_query {
54            my $self = shift;
55            my $value = shift;
56    
57            if ( $value =~ m/^\s+;*\s*$/s ) {
58                    return $self->validation_error( sql_query => 'You need to type in SQL query' );
59            } else {
60                    return $self->validation_ok('sql_query');
61            }
62    }
63    
64    use SQL::ReservedWords;
65    
66    sub canonicalize_sql_query {
67            my $self = shift;
68            my $sql = shift;
69    
70            my @words = SQL::ReservedWords->words;
71    
72            my $w = join('|', @words);
73    
74            warn "original SQL:\t$sql";
75    
76            $sql =~ s/\b($w)\b/uc($1)/egis;
77    
78            warn "canonicalize SQL:\t$sql";
79    
80            return $sql;
81    }
82    
83  =head2 take_action  =head2 take_action
84    
85    Execute SQL query on database
86    
87  =cut  =cut
88    
89  sub take_action {  sub take_action {
90      my $self = shift;      my $self = shift;
91            
92      # Custom action code      # Custom action code
       
     $self->report_success if not $self->result->failure;  
       
     return 1;  
 }  
93    
94  =head2 report_success          my $database = $self->argument_value('database') || $self->form_value('database');
95            warn "database: $database\n";
96    
97  =cut          my $db = SQLSession::Model::Database->new;
98            $db->load_by_cols( id => $database ) ||
99                    $self->result->error("Can't find database $database");
100    
101  sub report_success {          my $dbh = DBI->connect( $db->dsn, $db->login, $db->passwd ) ||
102      my $self = shift;                  $self->result->error("Can't connect to " . $db->dsn . " as " . $db->login . "<br/>" . $DBI::errstr) && return 0;
103      # Your success message here  
104      $self->result->message('Success');          $dbh->do("SET client_encoding = UTF8");
105    
106            my $sql = $self->argument_value('sql_query');
107    
108            warn "SQL: $sql\n";
109    
110            my $sth = $dbh->prepare( $sql ) ||
111                    $self->result->error( $dbh->errstr() ) && return 0;
112    
113            $sth->execute() ||
114                    $self->result->error( $sth->errstr() ) && return 0;
115            
116        $self->result->message('Query produced ' . (
117                    $sth->rows == 0 ?       'no results' :
118                    $sth->rows == 1 ?       'single row' :
119                                                            $sth->rows . ' rows'
120            )) if ($sth->rows >= 0);
121    
122            $self->result->content( sth => $sth );
123    
124        return 1;
125  }  }
126    
127  1;  1;

Legend:
Removed from v.5  
changed lines
  Added in v.29

  ViewVC Help
Powered by ViewVC 1.1.26