[system] / branches / rel-2-2-dev / webwork2 / lib / WeBWorK / DB / Schema / SQL.pm Repository:
ViewVC logotype

View of /branches/rel-2-2-dev/webwork2/lib/WeBWorK/DB/Schema/SQL.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1168 - (download) (as text) (annotate)
Sat Jun 14 06:01:19 2003 UTC (9 years, 11 months ago) by sh002i
Original Path: trunk/webwork2/lib/WeBWorK/DB/Schema/SQL.pm
File size: 7068 byte(s)
removed outdated warning.
-sam

    1 ################################################################################
    2 # WeBWorK mod_perl (c) 2000-2002 WeBWorK Project
    3 # $Id$
    4 ################################################################################
    5 
    6 package WeBWorK::DB::Schema::SQL;
    7 use base qw(WeBWorK::DB::Schema);
    8 
    9 =head1 NAME
   10 
   11 WeBWorK::DB::Schema::SQL - support SQL access to all tables.
   12 
   13 =cut
   14 
   15 use strict;
   16 use warnings;
   17 use Carp qw(croak);
   18 
   19 use constant TABLES => qw(*);
   20 use constant STYLE  => "dbi";
   21 
   22 ################################################################################
   23 # constructor for SQL-specific behavior
   24 ################################################################################
   25 
   26 sub new {
   27   my ($proto, $db, $driver, $table, $record, $params) = @_;
   28   my $self = $proto->SUPER::new($db, $driver, $table, $record, $params);
   29 
   30   # override table name if tableOverride param is given
   31   $self->{table} = $params->{tableOverride} if $params->{tableOverride};
   32 
   33   return $self;
   34 }
   35 
   36 ################################################################################
   37 # table access functions
   38 ################################################################################
   39 
   40 sub list($@) {
   41   my ($self, @keyparts) = @_;
   42 
   43   my $table = $self->{table};
   44   my @keynames = $self->sqlKeynames();
   45   my $keynames = join(", ", @keynames);
   46 
   47   croak "too many keyparts for table $table (need at most: @keynames)"
   48     if @keyparts > @keynames;
   49 
   50   my $stmt = "SELECT $keynames FROM $table ";
   51   $stmt .= $self->makeWhereClause(@keyparts);
   52   $self->debug("SQL-list: $stmt\n");
   53 
   54   $self->{driver}->connect("ro");
   55   my $result = $self->{driver}->dbi()->selectall_arrayref($stmt);
   56   $self->{driver}->disconnect();
   57   croak "failed to SELECT: $DBI::errstr" unless defined $result;
   58   return @$result;
   59 }
   60 
   61 sub exists($@) {
   62   my ($self, @keyparts) = @_;
   63 
   64   my $table = $self->{table};
   65   my @keynames = $self->sqlKeynames();
   66 
   67   croak "wrong number of keyparts for table $table (needs: @keynames)"
   68     unless @keyparts == @keynames;
   69 
   70   my $stmt = "SELECT COUNT(*) FROM $table ";
   71   $stmt .= $self->makeWhereClause(@keyparts);
   72   $self->debug("SQL-exists: $stmt\n");
   73 
   74   $self->{driver}->connect("ro");
   75   my ($result) = $self->{driver}->dbi()->selectrow_array($stmt);
   76   $self->{driver}->disconnect();
   77   croak "failed to SELECT: $DBI::errstr" unless defined $result;
   78   return $result > 0;
   79 }
   80 
   81 sub add($$) {
   82   my ($self, $Record) = @_;
   83 
   84   my @realKeynames = $self->{record}->KEYFIELDS();
   85   my @keyparts = map { $Record->$_() } @realKeynames;
   86   croak "(" . join(", ", @keyparts) . "): exists (use put)"
   87     if $self->exists(@keyparts);
   88 
   89   my $table = $self->{table};
   90   my @fieldnames = $self->sqlFieldnames();
   91   my $fieldnames = join(", ", @fieldnames);
   92   my $marks = join(", ", map { "?" } @fieldnames);
   93 
   94   my @realFieldnames = $self->{record}->FIELDS();
   95   my @fieldvalues = map { $Record->$_() } @realFieldnames;
   96 
   97   my $stmt = "INSERT INTO $table ($fieldnames) VALUES ($marks)";
   98   $self->debug("SQL-add: $stmt\n");
   99   #no warnings;
  100   #$self->debug("SQL-add: fieldvalues=@fieldvalues\n");
  101   #use warnings;
  102 
  103   $self->{driver}->connect("rw");
  104   my $sth = $self->{driver}->dbi()->prepare($stmt);
  105   my $result = $sth->execute(@fieldvalues);
  106   $self->{driver}->disconnect();
  107 
  108   unless (defined $result) {
  109     my @realKeynames = $self->{record}->KEYFIELDS();
  110     my @keyvalues = map { $Record->$_() } @realKeynames;
  111     croak "(" . join(", ", @keyvalues) . "): failed to INSERT: $DBI::errstr";
  112   }
  113 
  114   return 1;
  115 }
  116 
  117 sub get($@) {
  118   my ($self, @keyparts) = @_;
  119 
  120   my $table = $self->{table};
  121   my @keynames = $self->sqlKeynames();
  122 
  123   croak "wrong number of keyparts for table $table (needs: @keynames)"
  124     unless @keyparts == @keynames;
  125 
  126   my $stmt = "SELECT * FROM $table ";
  127   $stmt .= $self->makeWhereClause(@keyparts);
  128   $self->debug("SQL-get: $stmt\n");
  129 
  130   $self->{driver}->connect("ro");
  131   my $result = $self->{driver}->dbi()->selectrow_arrayref($stmt);
  132   $self->{driver}->disconnect();
  133   # $result comes back undefined if there are no matches. hmm...
  134   #croak "failed to SELECT: $DBI::errstr" unless defined $result;
  135   return undef unless defined $result;
  136 
  137   my @record = @$result;
  138   my $Record = $self->{record}->new();
  139   my @realFieldnames = $self->{record}->FIELDS();
  140   foreach (@realFieldnames) {
  141     $Record->$_(shift @record);
  142   }
  143 
  144   return $Record;
  145 }
  146 
  147 sub put($$) {
  148   my ($self, $Record) = @_;
  149 
  150   my @realKeynames = $self->{record}->KEYFIELDS();
  151   my @keyparts = map { $Record->$_() } @realKeynames;
  152   croak "(" . join(", ", @keyparts) . "): not found (use add)"
  153     unless $self->exists(@keyparts);
  154 
  155   my $table = $self->{table};
  156   my @fieldnames = $self->sqlFieldnames();
  157   my $fieldnames = join(", ", @fieldnames);
  158   my $marks = join(", ", map { "?" } @fieldnames);
  159 
  160   my @realFieldnames = $self->{record}->FIELDS();
  161   my @fieldvalues = map { $Record->$_() } @realFieldnames;
  162 
  163   my $stmt = "UPDATE $table SET";
  164   while (@fieldnames) {
  165     $stmt .= " " . (shift @fieldnames) . "=?";
  166     $stmt .= "," if @fieldnames;
  167   }
  168   $stmt .= " ";
  169   $stmt .= $self->makeWhereClause(map { $Record->$_() } @realKeynames);
  170   $self->debug("SQL-put: $stmt\n");
  171 
  172   $self->{driver}->connect("rw");
  173   my $sth = $self->{driver}->dbi()->prepare($stmt);
  174   my $result = $sth->execute(@fieldvalues);
  175   $self->{driver}->disconnect();
  176 
  177   unless (defined $result) {
  178     #my @realKeynames = $self->{record}->KEYFIELDS();
  179     #my @keyvalues = map { $Record->$_() } @realKeynames;
  180     croak "(" . join(", ", @keyparts) . "): failed to UPDATE: $DBI::errstr";
  181   }
  182 
  183   return 1;
  184 }
  185 
  186 sub delete($@) {
  187   my ($self, @keyparts) = @_;
  188 
  189   #croak "(" . join(", ", @keyparts) . "): not found"
  190   return 0 unless $self->exists(@keyparts);
  191 
  192   my $table = $self->{table};
  193   my @keynames = $self->sqlKeynames();
  194 
  195   croak "wrong number of keyparts for table $table (needs: @keynames)"
  196     unless @keyparts == @keynames;
  197 
  198   my $stmt = "DELETE FROM $table ";
  199   $stmt .= $self->makeWhereClause(@keyparts);
  200   $self->debug("SQL-delete: $stmt\n");
  201 
  202   $self->{driver}->connect("rw");
  203   my $result = $self->{driver}->dbi()->do($stmt);
  204   $self->{driver}->disconnect();
  205   croak "failed to DELETE: $DBI::errstr" unless defined $result;
  206 
  207   return $result;
  208 }
  209 
  210 ################################################################################
  211 # utility functions
  212 ################################################################################
  213 
  214 sub makeWhereClause($@) {
  215   my ($self, @keyparts) = @_;
  216 
  217   my @keynames = $self->sqlKeynames();
  218   my $where;
  219   my $first = 1;
  220   while (@keyparts) {
  221     unless (defined $keyparts[0]) {
  222       shift @keynames;
  223       shift @keyparts;
  224       next;
  225     }
  226     $where .= " AND" unless $first;
  227     $where .= " " . (shift @keynames);
  228     $where .= "='" . (shift @keyparts) . "'";
  229     $first = 0;
  230   }
  231 
  232   return $where ? "WHERE$where" : "";
  233 }
  234 
  235 sub sqlKeynames($) {
  236   my ($self) = @_;
  237   my @keynames = $self->{record}->KEYFIELDS();
  238   return map { $self->{params}->{fieldOverride}->{$_} || $_ }
  239     @keynames;
  240 }
  241 
  242 sub sqlFieldnames($) {
  243   my ($self) = @_;
  244   my @keynames = $self->{record}->FIELDS();
  245   return map { $self->{params}->{fieldOverride}->{$_} || $_ }
  246     @keynames;
  247 }
  248 
  249 sub debug($@) {
  250   my ($self, @string) = @_;
  251 
  252   if ($self->{params}->{debug}) {
  253     warn @string;
  254   }
  255 }
  256 
  257 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9