[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 1168 - (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 923 #no warnings;
100 :     #$self->debug("SQL-add: fieldvalues=@fieldvalues\n");
101 :     #use warnings;
102 : sh002i 874
103 :     $self->{driver}->connect("rw");
104 : sh002i 1167 my $sth = $self->{driver}->dbi()->prepare($stmt);
105 : sh002i 874 my $result = $sth->execute(@fieldvalues);
106 :     $self->{driver}->disconnect();
107 :    
108 :     unless (defined $result) {
109 : sh002i 904 my @realKeynames = $self->{record}->KEYFIELDS();
110 :     my @keyvalues = map { $Record->$_() } @realKeynames;
111 : sh002i 915 croak "(" . join(", ", @keyvalues) . "): failed to INSERT: $DBI::errstr";
112 : sh002i 874 }
113 :    
114 :     return 1;
115 :     }
116 :    
117 : sh002i 904 sub get($@) {
118 :     my ($self, @keyparts) = @_;
119 : sh002i 874
120 :     my $table = $self->{table};
121 : sh002i 904 my @keynames = $self->sqlKeynames();
122 : sh002i 874
123 : sh002i 915 croak "wrong number of keyparts for table $table (needs: @keynames)"
124 : sh002i 904 unless @keyparts == @keynames;
125 : sh002i 874
126 : sh002i 904 my $stmt = "SELECT * FROM $table ";
127 :     $stmt .= $self->makeWhereClause(@keyparts);
128 : sh002i 915 $self->debug("SQL-get: $stmt\n");
129 : sh002i 874
130 :     $self->{driver}->connect("ro");
131 : sh002i 1167 my $result = $self->{driver}->dbi()->selectrow_arrayref($stmt);
132 : sh002i 874 $self->{driver}->disconnect();
133 : sh002i 904 # $result comes back undefined if there are no matches. hmm...
134 : sh002i 915 #croak "failed to SELECT: $DBI::errstr" unless defined $result;
135 : sh002i 904 return undef unless defined $result;
136 : sh002i 874
137 : sh002i 904 my @record = @$result;
138 : sh002i 874 my $Record = $self->{record}->new();
139 : sh002i 904 my @realFieldnames = $self->{record}->FIELDS();
140 :     foreach (@realFieldnames) {
141 : sh002i 874 $Record->$_(shift @record);
142 :     }
143 :    
144 :     return $Record;
145 :     }
146 :    
147 :     sub put($$) {
148 :     my ($self, $Record) = @_;
149 :    
150 : sh002i 904 my @realKeynames = $self->{record}->KEYFIELDS();
151 :     my @keyparts = map { $Record->$_() } @realKeynames;
152 : sh002i 915 croak "(" . join(", ", @keyparts) . "): not found (use add)"
153 : sh002i 904 unless $self->exists(@keyparts);
154 :    
155 : sh002i 874 my $table = $self->{table};
156 : sh002i 904 my @fieldnames = $self->sqlFieldnames();
157 : sh002i 874 my $fieldnames = join(", ", @fieldnames);
158 :     my $marks = join(", ", map { "?" } @fieldnames);
159 : sh002i 904
160 :     my @realFieldnames = $self->{record}->FIELDS();
161 :     my @fieldvalues = map { $Record->$_() } @realFieldnames;
162 :    
163 : sh002i 874 my $stmt = "UPDATE $table SET";
164 :     while (@fieldnames) {
165 : sh002i 904 $stmt .= " " . (shift @fieldnames) . "=?";
166 : sh002i 874 $stmt .= "," if @fieldnames;
167 :     }
168 : sh002i 923 $stmt .= " ";
169 :     $stmt .= $self->makeWhereClause(map { $Record->$_() } @realKeynames);
170 : sh002i 915 $self->debug("SQL-put: $stmt\n");
171 : sh002i 874
172 :     $self->{driver}->connect("rw");
173 : sh002i 1167 my $sth = $self->{driver}->dbi()->prepare($stmt);
174 : sh002i 874 my $result = $sth->execute(@fieldvalues);
175 :     $self->{driver}->disconnect();
176 :    
177 :     unless (defined $result) {
178 : sh002i 904 #my @realKeynames = $self->{record}->KEYFIELDS();
179 :     #my @keyvalues = map { $Record->$_() } @realKeynames;
180 : sh002i 915 croak "(" . join(", ", @keyparts) . "): failed to UPDATE: $DBI::errstr";
181 : sh002i 874 }
182 :    
183 :     return 1;
184 :     }
185 :    
186 : sh002i 904 sub delete($@) {
187 : sh002i 874 my ($self, @keyparts) = @_;
188 :    
189 : sh002i 972 #croak "(" . join(", ", @keyparts) . "): not found"
190 :     return 0 unless $self->exists(@keyparts);
191 : sh002i 904
192 : sh002i 874 my $table = $self->{table};
193 : sh002i 904 my @keynames = $self->sqlKeynames();
194 : sh002i 874
195 : sh002i 915 croak "wrong number of keyparts for table $table (needs: @keynames)"
196 : sh002i 904 unless @keyparts == @keynames;
197 : sh002i 874
198 : sh002i 904 my $stmt = "DELETE FROM $table ";
199 :     $stmt .= $self->makeWhereClause(@keyparts);
200 : sh002i 915 $self->debug("SQL-delete: $stmt\n");
201 : sh002i 874
202 : sh002i 904 $self->{driver}->connect("rw");
203 : sh002i 1167 my $result = $self->{driver}->dbi()->do($stmt);
204 : sh002i 874 $self->{driver}->disconnect();
205 : sh002i 915 croak "failed to DELETE: $DBI::errstr" unless defined $result;
206 : sh002i 874
207 : sh002i 904 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 : sh002i 874 }
231 :    
232 : sh002i 904 return $where ? "WHERE$where" : "";
233 : sh002i 874 }
234 :    
235 : sh002i 904 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 : sh002i 915 sub debug($@) {
250 :     my ($self, @string) = @_;
251 :    
252 : sh002i 919 if ($self->{params}->{debug}) {
253 : sh002i 915 warn @string;
254 : sh002i 919 }
255 : sh002i 915 }
256 :    
257 : sh002i 874 1;

aubreyja at gmail dot com
ViewVC Help
Powered by ViewVC 1.0.9