11#include <sqlite3_ruby.h>
22
3- void
4- rb_sqlite3_raise ( sqlite3 * db , int status )
3+ static VALUE
4+ status2klass ( int status )
55{
6- VALUE klass = Qnil ;
7-
86 /* Consider only lower 8 bits, to work correctly when
97 extended result codes are enabled. */
108 switch (status & 0xff ) {
119 case SQLITE_OK :
12- return ;
13- break ;
10+ return Qnil ;
1411 case SQLITE_ERROR :
15- klass = rb_path2class ("SQLite3::SQLException" );
16- break ;
12+ return rb_path2class ("SQLite3::SQLException" );
1713 case SQLITE_INTERNAL :
18- klass = rb_path2class ("SQLite3::InternalException" );
19- break ;
14+ return rb_path2class ("SQLite3::InternalException" );
2015 case SQLITE_PERM :
21- klass = rb_path2class ("SQLite3::PermissionException" );
22- break ;
16+ return rb_path2class ("SQLite3::PermissionException" );
2317 case SQLITE_ABORT :
24- klass = rb_path2class ("SQLite3::AbortException" );
25- break ;
18+ return rb_path2class ("SQLite3::AbortException" );
2619 case SQLITE_BUSY :
27- klass = rb_path2class ("SQLite3::BusyException" );
28- break ;
20+ return rb_path2class ("SQLite3::BusyException" );
2921 case SQLITE_LOCKED :
30- klass = rb_path2class ("SQLite3::LockedException" );
31- break ;
22+ return rb_path2class ("SQLite3::LockedException" );
3223 case SQLITE_NOMEM :
33- klass = rb_path2class ("SQLite3::MemoryException" );
34- break ;
24+ return rb_path2class ("SQLite3::MemoryException" );
3525 case SQLITE_READONLY :
36- klass = rb_path2class ("SQLite3::ReadOnlyException" );
37- break ;
26+ return rb_path2class ("SQLite3::ReadOnlyException" );
3827 case SQLITE_INTERRUPT :
39- klass = rb_path2class ("SQLite3::InterruptException" );
40- break ;
28+ return rb_path2class ("SQLite3::InterruptException" );
4129 case SQLITE_IOERR :
42- klass = rb_path2class ("SQLite3::IOException" );
43- break ;
30+ return rb_path2class ("SQLite3::IOException" );
4431 case SQLITE_CORRUPT :
45- klass = rb_path2class ("SQLite3::CorruptException" );
46- break ;
32+ return rb_path2class ("SQLite3::CorruptException" );
4733 case SQLITE_NOTFOUND :
48- klass = rb_path2class ("SQLite3::NotFoundException" );
49- break ;
34+ return rb_path2class ("SQLite3::NotFoundException" );
5035 case SQLITE_FULL :
51- klass = rb_path2class ("SQLite3::FullException" );
52- break ;
36+ return rb_path2class ("SQLite3::FullException" );
5337 case SQLITE_CANTOPEN :
54- klass = rb_path2class ("SQLite3::CantOpenException" );
55- break ;
38+ return rb_path2class ("SQLite3::CantOpenException" );
5639 case SQLITE_PROTOCOL :
57- klass = rb_path2class ("SQLite3::ProtocolException" );
58- break ;
40+ return rb_path2class ("SQLite3::ProtocolException" );
5941 case SQLITE_EMPTY :
60- klass = rb_path2class ("SQLite3::EmptyException" );
61- break ;
42+ return rb_path2class ("SQLite3::EmptyException" );
6243 case SQLITE_SCHEMA :
63- klass = rb_path2class ("SQLite3::SchemaChangedException" );
64- break ;
44+ return rb_path2class ("SQLite3::SchemaChangedException" );
6545 case SQLITE_TOOBIG :
66- klass = rb_path2class ("SQLite3::TooBigException" );
67- break ;
46+ return rb_path2class ("SQLite3::TooBigException" );
6847 case SQLITE_CONSTRAINT :
69- klass = rb_path2class ("SQLite3::ConstraintException" );
70- break ;
48+ return rb_path2class ("SQLite3::ConstraintException" );
7149 case SQLITE_MISMATCH :
72- klass = rb_path2class ("SQLite3::MismatchException" );
73- break ;
50+ return rb_path2class ("SQLite3::MismatchException" );
7451 case SQLITE_MISUSE :
75- klass = rb_path2class ("SQLite3::MisuseException" );
76- break ;
52+ return rb_path2class ("SQLite3::MisuseException" );
7753 case SQLITE_NOLFS :
78- klass = rb_path2class ("SQLite3::UnsupportedException" );
79- break ;
54+ return rb_path2class ("SQLite3::UnsupportedException" );
8055 case SQLITE_AUTH :
81- klass = rb_path2class ("SQLite3::AuthorizationException" );
82- break ;
56+ return rb_path2class ("SQLite3::AuthorizationException" );
8357 case SQLITE_FORMAT :
84- klass = rb_path2class ("SQLite3::FormatException" );
85- break ;
58+ return rb_path2class ("SQLite3::FormatException" );
8659 case SQLITE_RANGE :
87- klass = rb_path2class ("SQLite3::RangeException" );
88- break ;
60+ return rb_path2class ("SQLite3::RangeException" );
8961 case SQLITE_NOTADB :
90- klass = rb_path2class ("SQLite3::NotADatabaseException" );
91- break ;
62+ return rb_path2class ("SQLite3::NotADatabaseException" );
9263 default :
93- klass = rb_path2class ("SQLite3::Exception" );
64+ return rb_path2class ("SQLite3::Exception" );
65+ }
66+ }
67+
68+ void
69+ rb_sqlite3_raise (sqlite3 * db , int status )
70+ {
71+ VALUE klass = status2klass (status );
72+ if (NIL_P (klass )) {
73+ return ;
9474 }
9575
96- klass = rb_exc_new2 (klass , sqlite3_errmsg (db ));
97- rb_iv_set (klass , "@code" , INT2FIX (status ));
98- rb_exc_raise (klass );
76+ VALUE exception = rb_exc_new2 (klass , sqlite3_errmsg (db ));
77+ rb_iv_set (exception , "@code" , INT2FIX (status ));
78+
79+ rb_exc_raise (exception );
9980}
10081
10182/*
@@ -104,14 +85,38 @@ rb_sqlite3_raise(sqlite3 *db, int status)
10485void
10586rb_sqlite3_raise_msg (sqlite3 * db , int status , const char * msg )
10687{
107- VALUE exception ;
108-
109- if (status == SQLITE_OK ) {
88+ VALUE klass = status2klass (status );
89+ if (NIL_P (klass )) {
11090 return ;
11191 }
11292
113- exception = rb_exc_new2 (rb_path2class ("SQLite3::Exception" ), msg );
93+ VALUE exception = rb_exc_new2 (klass , msg );
94+ rb_iv_set (exception , "@code" , INT2FIX (status ));
11495 sqlite3_free ((void * )msg );
96+
97+ rb_exc_raise (exception );
98+ }
99+
100+ void
101+ rb_sqlite3_raise_with_sql (sqlite3 * db , int status , const char * sql )
102+ {
103+ VALUE klass = status2klass (status );
104+ if (NIL_P (klass )) {
105+ return ;
106+ }
107+
108+ const char * error_msg = sqlite3_errmsg (db );
109+ int error_offset = -1 ;
110+ #ifdef HAVE_SQLITE3_ERROR_OFFSET
111+ error_offset = sqlite3_error_offset (db );
112+ #endif
113+
114+ VALUE exception = rb_exc_new2 (klass , error_msg );
115115 rb_iv_set (exception , "@code" , INT2FIX (status ));
116+ if (sql ) {
117+ rb_iv_set (exception , "@sql" , rb_str_new2 (sql ));
118+ rb_iv_set (exception , "@sql_offset" , INT2FIX (error_offset ));
119+ }
120+
116121 rb_exc_raise (exception );
117122}
0 commit comments