/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 70 - (hide annotations)
Thu Jan 25 21:16:06 2007 UTC (17 years, 4 months ago) by dpavlin
File size: 2545 byte(s)
more strict uppercasing

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

  ViewVC Help
Powered by ViewVC 1.1.26