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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 915 - (view) (download) (as text)

1 : sh002i 874 ################################################################################
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 : sh002i 915 use Carp qw(croak);
17 : sh002i 874
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 : sh002i 904 $self->{table} = $params->{tableOverride} if $params->{tableOverride};
51 : sh002i 874 bless $self, $class;
52 :     return $self;
53 :     }
54 :    
55 :     ################################################################################
56 :     # table access functions
57 :     ################################################################################
58 :    
59 : sh002i 904 sub list($@) {
60 : sh002i 874 my ($self, @keyparts) = @_;
61 :    
62 :     my $table = $self->{table};
63 : sh002i 904 my @keynames = $self->sqlKeynames();
64 : sh002i 874 my $keynames = join(", ", @keynames);
65 :    
66 : sh002i 915 croak "too many keyparts for table $table (need at most: @keynames)"
67 : sh002i 904 if @keyparts > @keynames;
68 :    
69 :     my $stmt = "SELECT $keynames FROM $table ";
70 :     $stmt .= $self->makeWhereClause(@keyparts);
71 : sh002i 915 $self->debug("SQL-list: $stmt\n");
72 : sh002i 904
73 : sh002i 874 $self->{driver}->connect("ro");
74 : sh002i 904 my $result = $self->{driver}->handle()->selectall_arrayref($stmt);
75 : sh002i 874 $self->{driver}->disconnect();
76 : sh002i 915 croak "failed to SELECT: $DBI::errstr" unless defined $result;
77 : sh002i 904 return @$result;
78 : sh002i 874 }
79 :    
80 : sh002i 904 sub exists($@) {
81 : sh002i 874 my ($self, @keyparts) = @_;
82 :    
83 :     my $table = $self->{table};
84 : sh002i 904 my @keynames = $self->sqlKeynames();
85 : sh002i 874
86 : sh002i 915 croak "wrong number of keyparts for table $table (needs: @keynames)"
87 : sh002i 904 unless @keyparts == @keynames;
88 : sh002i 874
89 : sh002i 904 my $stmt = "SELECT COUNT(*) FROM $table ";
90 :     $stmt .= $self->makeWhereClause(@keyparts);
91 : sh002i 915 $self->debug("SQL-exists: $stmt\n");
92 : sh002i 874
93 :     $self->{driver}->connect("ro");
94 : sh002i 904 my ($result) = $self->{driver}->handle()->selectrow_array($stmt);
95 : sh002i 874 $self->{driver}->disconnect();
96 : sh002i 915 croak "failed to SELECT: $DBI::errstr" unless defined $result;
97 : sh002i 904 return $result > 0;
98 : sh002i 874 }
99 :    
100 :     sub add($$) {
101 :     my ($self, $Record) = @_;
102 :    
103 : sh002i 904 my @realKeynames = $self->{record}->KEYFIELDS();
104 :     my @keyparts = map { $Record->$_() } @realKeynames;
105 : sh002i 915 croak "(" . join(", ", @keyparts) . "): exists (use put)"
106 : sh002i 904 if $self->exists(@keyparts);
107 :    
108 : sh002i 874 my $table = $self->{table};
109 : sh002i 904 my @fieldnames = $self->sqlFieldnames();
110 : sh002i 874 my $fieldnames = join(", ", @fieldnames);
111 :     my $marks = join(", ", map { "?" } @fieldnames);
112 : sh002i 904
113 :     my @realFieldnames = $self->{record}->FIELDS();
114 :     my @fieldvalues = map { $Record->$_() } @realFieldnames;
115 :    
116 : sh002i 874 my $stmt = "INSERT INTO $table ($fieldnames) VALUES ($marks)";
117 : sh002i 915 $self->debug("SQL-add: $stmt\n");
118 : sh002i 874
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 : sh002i 904 my @realKeynames = $self->{record}->KEYFIELDS();
126 :     my @keyvalues = map { $Record->$_() } @realKeynames;
127 : sh002i 915 croak "(" . join(", ", @keyvalues) . "): failed to INSERT: $DBI::errstr";
128 : sh002i 874 }
129 :    
130 :     return 1;
131 :     }
132 :    
133 : sh002i 904 sub get($@) {
134 :     my ($self, @keyparts) = @_;
135 : sh002i 874
136 :     my $table = $self->{table};
137 : sh002i 904 my @keynames = $self->sqlKeynames();
138 : sh002i 874
139 : sh002i 915 croak "wrong number of keyparts for table $table (needs: @keynames)"
140 : sh002i 904 unless @keyparts == @keynames;
141 : sh002i 874
142 : sh002i 904 my $stmt = "SELECT * FROM $table ";
143 :     $stmt .= $self->makeWhereClause(@keyparts);
144 : sh002i 915 $self->debug("SQL-get: $stmt\n");
145 : sh002i 874
146 :     $self->{driver}->connect("ro");
147 : sh002i 904 my $result = $self->{driver}->handle()->selectrow_arrayref($stmt);
148 : sh002i 874 $self->{driver}->disconnect();
149 : sh002i 904 # $result comes back undefined if there are no matches. hmm...
150 : sh002i 915 #croak "failed to SELECT: $DBI::errstr" unless defined $result;
151 : sh002i 904 return undef unless defined $result;
152 : sh002i 874
153 : sh002i 904 my @record = @$result;
154 : sh002i 874 my $Record = $self->{record}->new();
155 : sh002i 904 my @realFieldnames = $self->{record}->FIELDS();
156 :     foreach (@realFieldnames) {
157 : sh002i 874 $Record->$_(shift @record);
158 :     }
159 :    
160 :     return $Record;
161 :     }
162 :    
163 :     sub put($$) {
164 :     my ($self, $Record) = @_;
165 :    
166 : sh002i 904 my @realKeynames = $self->{record}->KEYFIELDS();
167 :     my @keyparts = map { $Record->$_() } @realKeynames;
168 : sh002i 915 croak "(" . join(", ", @keyparts) . "): not found (use add)"
169 : sh002i 904 unless $self->exists(@keyparts);
170 :    
171 : sh002i 874 my $table = $self->{table};
172 : sh002i 904 my @fieldnames = $self->sqlFieldnames();
173 : sh002i 874 my $fieldnames = join(", ", @fieldnames);
174 :     my $marks = join(", ", map { "?" } @fieldnames);
175 : sh002i 904
176 :     my @realFieldnames = $self->{record}->FIELDS();
177 :     my @fieldvalues = map { $Record->$_() } @realFieldnames;
178 :    
179 : sh002i 874 my $stmt = "UPDATE $table SET";
180 :     while (@fieldnames) {
181 : sh002i 904 $stmt .= " " . (shift @fieldnames) . "=?";
182 : sh002i 874 $stmt .= "," if @fieldnames;
183 :     }
184 : sh002i 915 $self->debug("SQL-put: $stmt\n");
185 : sh002i 874
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 : sh002i 904 #my @realKeynames = $self->{record}->KEYFIELDS();
193 :     #my @keyvalues = map { $Record->$_() } @realKeynames;
194 : sh002i 915 croak "(" . join(", ", @keyparts) . "): failed to UPDATE: $DBI::errstr";
195 : sh002i 874 }
196 :    
197 :     return 1;
198 :     }
199 :    
200 : sh002i 904 sub delete($@) {
201 : sh002i 874 my ($self, @keyparts) = @_;
202 :    
203 : sh002i 915 croak "(" . join(", ", @keyparts) . "): not found"
204 : sh002i 904 unless $self->exists(@keyparts);
205 :    
206 : sh002i 874 my $table = $self->{table};
207 : sh002i 904 my @keynames = $self->sqlKeynames();
208 : sh002i 874
209 : sh002i 915 croak "wrong number of keyparts for table $table (needs: @keynames)"
210 : sh002i 904 unless @keyparts == @keynames;
211 : sh002i 874
212 : sh002i 904 my $stmt = "DELETE FROM $table ";
213 :     $stmt .= $self->makeWhereClause(@keyparts);
214 : sh002i 915 $self->debug("SQL-delete: $stmt\n");
215 : sh002i 874
216 : sh002i 904 $self->{driver}->connect("rw");
217 :     my $result = $self->{driver}->handle()->do($stmt);
218 : sh002i 874 $self->{driver}->disconnect();
219 : sh002i 915 croak "failed to DELETE: $DBI::errstr" unless defined $result;
220 : sh002i 874
221 : sh002i 904 if ($result > 1) {
222 :     warn "danger! deleted more than one record!";
223 : sh002i 874 }
224 :    
225 : sh002i 904 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 : sh002i 874 }
249 :    
250 : sh002i 904 return $where ? "WHERE$where" : "";
251 : sh002i 874 }
252 :    
253 : sh002i 904 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 : sh002i 915 sub debug($@) {
268 :     my ($self, @string) = @_;
269 :    
270 :     # if ($self->{params}->{debug}) {
271 :     warn @string;
272 :     # }
273 :     }
274 :    
275 : sh002i 874 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9