/[A3C]/lib/A3C/SQL.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 /lib/A3C/SQL.pm

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

revision 145 by dpavlin, Sat May 31 16:30:09 2008 UTC revision 220 by dpavlin, Sun Jun 22 14:55:55 2008 UTC
# Line 4  use strict; Line 4  use strict;
4  use warnings;  use warnings;
5    
6  use base qw(Jifty::Object Class::Accessor::Fast);  use base qw(Jifty::Object Class::Accessor::Fast);
7  __PACKAGE__->mk_accessors( qw(query arguments dbh) );  __PACKAGE__->mk_accessors( qw(query arguments dbh encoding duration) );
8    
9  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
10    use Time::HiRes qw/time/;
11    
12  =head1 NAME  =head1 NAME
13    
# Line 28  specify it like this: Line 29  specify it like this:
29    my $sql = A3C::SQL->new({    my $sql = A3C::SQL->new({
30          query => 'select now()',          query => 'select now()',
31          dbh => $my_dbh,          dbh => $my_dbh,
32            encoding => 'UTF-8',
33    });    });
34    
35    Mungling with C<encoding> is rearly needed, especially if using recent C<DBD::Pg> as driver.
36    
37  =head2 sth  =head2 sth
38    
39  Execute query and return statement handle. Ususally you don't have to call this manually.  Execute query and return statement handle. Ususally you don't have to call this manually.
# Line 41  sub sth { Line 45  sub sth {
45          if ( ! $self->{_sth} ) {          if ( ! $self->{_sth} ) {
46                  my $dbh = $self->dbh || Jifty->handle->dbh;                  my $dbh = $self->dbh || Jifty->handle->dbh;
47                  my $sth = $dbh->prepare( $self->query ) or $dbh->errstr;                  my $sth = $dbh->prepare( $self->query ) or $dbh->errstr;
48                    my $t = time();
49                  if ( $self->arguments ) {                  if ( $self->arguments ) {
50                          Jifty->log->debug( $self->sql . ' arguments: ' . dump( $self->arguments ) );                          Jifty->log->debug( $self->sql . ' arguments: ' . dump( $self->arguments ) );
51                          $sth->execute( $self->arguments ) or $dbh->errstr;                          $sth->execute( $self->arguments ) or die $dbh->errstr;
52                  } else {                  } else {
53                          $sth->execute or $dbh->errstr;                          $sth->execute or die $dbh->errstr;
54                  }                  }
55                    $self->duration( time() - $t );
56                  $self->{_sth} = $sth;                  $self->{_sth} = $sth;
57          }          }
58    
# Line 65  sub next { Line 71  sub next {
71          my $self = shift;          my $self = shift;
72          my $row = $self->sth->fetchrow_hashref;          my $row = $self->sth->fetchrow_hashref;
73          return unless defined $row;          return unless defined $row;
74          return A3C::SQL::row->new( $row );          return A3C::SQL::row->new( $row, $self->encoding );
75  }  }
76    
77  =head2 count  =head2 count
# Line 79  sub count { Line 85  sub count {
85          return $self->sth->rows;          return $self->sth->rows;
86  }  }
87    
88    =head1 HELPERS
89    
90    This helpers are accessor to L<DBI>
91    
92    =head2 _column_names
93    
94      my @columns = $sql->_column_names;
95    
96    =cut
97    
98    sub _column_names {
99            my $self = shift;
100            return @{ $self->sth->{NAME} };
101    }
102    
103  package A3C::SQL::row;  package A3C::SQL::row;
104    
105  use Encode qw/decode/;  use Encode qw/decode/;
106  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
107    use base qw/Jifty::Object/;
108    
109  our $AUTOLOAD;  our $AUTOLOAD;
110    
# Line 91  sub new { Line 113  sub new {
113          my $class = ref($that) || $that;          my $class = ref($that) || $that;
114          my $self = shift;          my $self = shift;
115          bless $self, $class;          bless $self, $class;
116            $self->{__encoding} = shift || 'UTF-8';
117          return $self;          return $self;
118  }    }  
119    
# Line 99  sub AUTOLOAD { Line 122  sub AUTOLOAD {
122          my $type = ref($self) or die "$self is not an object";          my $type = ref($self) or die "$self is not an object";
123          my $name = $AUTOLOAD;          my $name = $AUTOLOAD;
124          $name =~ s/.*://;          $name =~ s/.*://;
125  #       warn "SQL: $name doesn't exist" unless defined($self->{$name});          my $v = $self->{$name};
126          return decode('UTF-8', $self->{$name});          Jifty->log->error("SQL: $name doesn't exist") unless defined $v;
127            if ( ! Encode::is_utf8( $v ) ) {
128                    eval { $v = decode( $self->{__encoding}, $self->{$name} ) };
129                    if ( $@ ) {
130                            warn "## column $name can't decode ",dump( $self->{$name} );
131                            $v = $self->{$name};
132                    }
133            }
134            return $v;
135  }  }
136    
137  sub DESTROY {}  sub DESTROY {}

Legend:
Removed from v.145  
changed lines
  Added in v.220

  ViewVC Help
Powered by ViewVC 1.1.26