From: Sam H. v. a. <we...@ma...> - 2007-08-25 18:22:29
|
Log Message: ----------- forward-port (sh002i): Resolve bug #1293 by actually throwing a RecordExists exception from NewSQL::Std. 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.106 retrieving revision 1.107 diff -Llib/WeBWorK/DB.pm -Llib/WeBWorK/DB.pm -u -r1.106 -r1.107 --- lib/WeBWorK/DB.pm +++ lib/WeBWorK/DB.pm @@ -447,7 +447,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 $@; @@ -552,7 +552,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 $@; @@ -645,7 +645,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 $@; @@ -731,7 +731,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 $@; @@ -864,7 +864,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 $@; @@ -965,7 +965,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 $@; @@ -1036,7 +1036,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 $@; @@ -1127,7 +1127,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 $@; @@ -1239,7 +1239,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 $@; @@ -1353,7 +1353,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 $@; @@ -1452,7 +1452,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 $@; @@ -1554,7 +1554,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 $@; @@ -1652,7 +1652,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 $@; @@ -1796,7 +1796,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.11 retrieving revision 1.12 diff -Llib/WeBWorK/DB/Schema.pm -Llib/WeBWorK/DB/Schema.pm -u -r1.11 -r1.12 --- 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.15 retrieving revision 1.16 diff -Llib/WeBWorK/DB/Schema/NewSQL/Std.pm -Llib/WeBWorK/DB/Schema/NewSQL/Std.pm -u -r1.15 -r1.16 --- lib/WeBWorK/DB/Schema/NewSQL/Std.pm +++ lib/WeBWorK/DB/Schema/NewSQL/Std.pm @@ -61,6 +61,9 @@ $self->sql_init; + # provide a custom error handler + $self->dbh->{HandleError} = \&handle_error; + return $self; } @@ -732,4 +735,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; + |