/[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 13 by dpavlin, Sun Dec 3 13:28:48 2006 UTC revision 66 by dpavlin, Thu Jan 25 20:28:42 2007 UTC
# Line 12  use base qw/SQLSession::Action Jifty::Ac Line 12  use base qw/SQLSession::Action Jifty::Ac
12    
13  use SQLSession::Model::DatabaseCollection;  use SQLSession::Model::DatabaseCollection;
14  use DBI;  use DBI;
15    use Time::HiRes qw/time/;
16    
17  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
18    
# Line 21  use Jifty::Action schema { Line 22  use Jifty::Action schema {
22          param sql_query =>          param sql_query =>
23                  label is 'SQL',                  label is 'SQL',
24                  render as 'textarea',                  render as 'textarea',
                 is mandatory,  
25                  ajax validates,                  ajax validates,
26                  ajax canonicalizes;                  ajax canonicalizes,
27                    is mandatory;
28                    
29          param database =>          param database =>
30                  label is 'Database',                  label is 'Database',
# Line 34  use Jifty::Action schema { Line 35  use Jifty::Action schema {
35                          $dbs->unlimit;                          $dbs->unlimit;
36                          [{                          [{
37                                  display_from => 'name',                                  display_from => 'name',
38                                  value_from => 'name',                                  value_from => 'id',
39                                  collection => $dbs,                                  collection => $dbs,
40                          }];                          }];
41                  };                  };
# Line 71  sub canonicalize_sql_query { Line 72  sub canonicalize_sql_query {
72    
73          my $w = join('|', @words);          my $w = join('|', @words);
74    
75          warn "canonicalize SQL: $sql";          $w .= '|limit|offset';  # fixup
76    
77            warn "original SQL:\t$sql";
78    
79          $sql =~ s/\b($w)\b/uc($1)/egis;          $sql =~ s/\b($w)\b/uc($1)/egis;
80    
81            warn "canonicalize SQL:\t$sql";
82    
83          return $sql;          return $sql;
84  }  }
85    
# Line 89  sub take_action { Line 94  sub take_action {
94            
95      # Custom action code      # Custom action code
96    
97          my $database = $self->argument_value('database');          my $database = $self->argument_value('database') || $self->form_value('database');
98          warn "database: $database\n";          warn "database: $database\n";
99    
100          my $dbs = SQLSession::Model::DatabaseCollection->new;          my $db = SQLSession::Model::Database->new;
101          $dbs->limit( column => 'name', value => $database );          $db->load_by_cols( id => $database ) ||
102          my $db = $dbs->first || $self->result->error("Can't find database $database");                  $self->result->error("Can't find database $database");
103    
104          my $dbh = DBI->connect( $db->dsn, $db->login, $db->passwd ) ||          my $dbh = DBI->connect( $db->dsn, $db->login, $db->passwd ) ||
105                  $self->result->error("Can't connect to " . $db->dsn . " as " . $db->login . "<br/>" . $DBI::errstr) && return 0;                  $self->result->error("Can't connect to " . $db->dsn . " as " . $db->login . "<br/>" . $DBI::errstr) && return 0;
106    
107            $dbh->do("SET client_encoding = UTF8") if ($db->dsn =~ /Pg/);
108    
109          my $sql = $self->argument_value('sql_query');          my $sql = $self->argument_value('sql_query');
110    
111          warn "SQL: $sql\n";          warn "SQL: $sql\n";
112    
113            my $t = time();
114    
115          my $sth = $dbh->prepare( $sql ) ||          my $sth = $dbh->prepare( $sql ) ||
116                  $self->result->error( $dbh->errstr() ) && return 0;                  $self->result->error( $dbh->errstr() ) && return 0;
117    
118          $sth->execute() ||          $sth->execute() ||
119                  $self->result->error( $sth->errstr() ) && return 0;                  $self->result->error( $sth->errstr() ) && return 0;
120                    
121      $self->result->message('Query produced ' . (          $self->result->message('Query produced ' . (
122                  $sth->rows == 0 ?       'no results' :                  $sth->rows == 0 ?       'no results' :
123                  $sth->rows == 1 ?       'single row' :                  $sth->rows == 1 ?       'single row' :
124                                                          $sth->rows . ' rows'                  sprintf("%d rows in %.2fs", $sth->rows, time() - $t)
125          )) if ($sth->rows >= 0);          )) if ($sth->rows >= 0);
126    
127          $self->result->content( sth => $sth );          $self->result->content( sth => $sth );

Legend:
Removed from v.13  
changed lines
  Added in v.66

  ViewVC Help
Powered by ViewVC 1.1.26