[system] / trunk / webwork2 / lib / WeBWorK / DB / Schema / SQL.pm Repository:
ViewVC logotype

View of /trunk/webwork2/lib/WeBWorK/DB/Schema/SQL.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 915 - (download) (as text) (annotate)
Tue May 27 23:42:23 2003 UTC (10 years ago) by sh002i
File size: 7427 byte(s)
croak instead of die.
-sam

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

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9