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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1206 - (view) (download) (as text)
Original Path: trunk/webwork2/lib/WeBWorK/DB/Schema/SQL.pm

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

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9