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

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9