From: Sam H. v. a. <we...@ma...> - 2007-08-25 18:21:04
|
Log Message: ----------- Resolve bug #1293 by actually throwing a RecordExists exception from NewSQL::Std. Tags: ---- rel-2-4-dev Modified Files: -------------- webwork2/lib/WeBWorK: DB.pm webwork2/lib/WeBWorK/DB: Schema.pm webwork2/lib/WeBWorK/DB/Schema/NewSQL: Std.pm Revision Data ------------- Index: DB.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/DB.pm,v retrieving revision 1.104.2.1 retrieving revision 1.104.2.2 diff -Llib/WeBWorK/DB.pm -Llib/WeBWorK/DB.pm -u -r1.104.2.1 -r1.104.2.2 --- lib/WeBWorK/DB.pm +++ lib/WeBWorK/DB.pm @@ -378,7 +378,7 @@ eval { return $self->{user}->add($User); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addUser: user exists (perhaps you meant to use putUser?)"; } elsif ($@) { die $@; @@ -483,7 +483,7 @@ eval { return $self->{password}->add($Password); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addPassword: password exists (perhaps you meant to use putPassword?)"; } elsif ($@) { die $@; @@ -576,7 +576,7 @@ eval { return $self->{permission}->add($PermissionLevel); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addPermissionLevel: permission level exists (perhaps you meant to use putPermissionLevel?)"; } elsif ($@) { die $@; @@ -662,7 +662,7 @@ eval { return $self->{key}->add($Key); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addKey: key exists (perhaps you meant to use putKey?)"; } elsif ($@) { die $@; @@ -746,7 +746,7 @@ eval { return $self->{locations}->add($Location); }; - if ( my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists ) { + if ( my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists ) { croak "addLocation: location exists (perhaps you meant to use putLocation?)"; } elsif ($@) { die $@; @@ -847,7 +847,7 @@ eval { return $self->{location_addresses}->add($LocationAddress); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addLocationAddress: location address exists (perhaps you meant to use putLocationAddress?)"; } elsif ($@) { die $@; @@ -918,7 +918,7 @@ return $self->{set}->add($GlobalSet); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addGlobalSet: global set exists (perhaps you meant to use putGlobalSet?)"; } elsif ($@) { die $@; @@ -1009,7 +1009,7 @@ eval { return $self->{set_user}->add($UserSet); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addUserSet: user set exists (perhaps you meant to use putUserSet?)"; } elsif ($@) { die $@; @@ -1121,7 +1121,7 @@ eval { return $self->{set_version}->add($SetVersion); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addSetVersion: set version exists (perhaps you meant to use putSetVersion?)"; } elsif ($@) { die $@; @@ -1235,7 +1235,7 @@ eval { return $self->{set_locations}->add($GlobalSetLocation); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addGlobalSetLocation: global set_location exists (perhaps you meant to use putGlobalSetLocation?)"; } elsif ($@) { die $@; @@ -1334,7 +1334,7 @@ eval { return $self->{set_locations_user}->add($UserSetLocation); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addUserSetLocation: user set_location exists (perhaps you meant to use putUserSetLocation?)"; } elsif ($@) { die $@; @@ -1436,7 +1436,7 @@ eval { return $self->{problem}->add($GlobalProblem); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addGlobalProblem: global problem exists (perhaps you meant to use putGlobalProblem?)"; } elsif ($@) { die $@; @@ -1534,7 +1534,7 @@ eval { return $self->{problem_user}->add($UserProblem); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addUserProblem: user problem exists (perhaps you meant to use putUserProblem?)"; } elsif ($@) { die $@; @@ -1678,7 +1678,7 @@ eval { return $self->{problem_version}->add($ProblemVersion); }; - if (my $ex = caught WeBWorK::DB::Schema::Exception::RecordExists) { + if (my $ex = caught WeBWorK::DB::Schema::Ex::RecordExists) { croak "addProblemVersion: problem version exists (perhaps you meant to use putProblemVersion?)"; } elsif ($@) { die $@; Index: Schema.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/DB/Schema.pm,v retrieving revision 1.10.4.1 retrieving revision 1.10.4.2 diff -Llib/WeBWorK/DB/Schema.pm -Llib/WeBWorK/DB/Schema.pm -u -r1.10.4.1 -r1.10.4.2 --- lib/WeBWorK/DB/Schema.pm +++ lib/WeBWorK/DB/Schema.pm @@ -51,9 +51,9 @@ use warnings; use Exception::Class ( - 'WeBWorK::DB::Schema::Exception' => {}, - 'WeBWorK::DB::Schema::Exception::RecordExists' => { - isa => 'WeBWorK::DB::Schema::Exception', + 'WeBWorK::DB::Schema::Ex' => {}, + 'WeBWorK::DB::Schema::Ex::RecordExists' => { + isa => 'WeBWorK::DB::Schema::Ex', }, ); Index: Std.pm =================================================================== RCS file: /webwork/cvs/system/webwork2/lib/WeBWorK/DB/Schema/NewSQL/Std.pm,v retrieving revision 1.10.2.1 retrieving revision 1.10.2.2 diff -Llib/WeBWorK/DB/Schema/NewSQL/Std.pm -Llib/WeBWorK/DB/Schema/NewSQL/Std.pm -u -r1.10.2.1 -r1.10.2.2 --- lib/WeBWorK/DB/Schema/NewSQL/Std.pm +++ lib/WeBWorK/DB/Schema/NewSQL/Std.pm @@ -59,6 +59,9 @@ $self->sql_init; + # provide a custom error handler + $self->dbh->{HandleError} = \&handle_error; + return $self; } @@ -644,4 +647,24 @@ } } +# maps error numbers to exception classes for MySQL +our %MYSQL_ERROR_CODES = ( + 1062 => 'WeBWorK::DB::Schema::Ex::RecordExists', +); + +# turns MySQL error codes into excpetions -- WeBWorK::DB::Schema::Ex objects +# for known error types, and normal die STRING exceptions for unknown errors. +# This is one method you'd want to override if you were writing a subclass for +# another RDBMS. +sub handle_error { + my ($errmsg, $handle, $returned) = @_; + + if (exists $MYSQL_ERROR_CODES{$handle->err}) { + $MYSQL_ERROR_CODES{$handle->err}->throw; + } else { + die $errmsg; + } +} + 1; + |