1
1
#include <sqlite3_ruby.h>
2
2
3
- void
4
- rb_sqlite3_raise ( sqlite3 * db , int status )
3
+ static VALUE
4
+ status2klass ( int status )
5
5
{
6
- VALUE klass = Qnil ;
7
-
8
6
/* Consider only lower 8 bits, to work correctly when
9
7
extended result codes are enabled. */
10
8
switch (status & 0xff ) {
11
9
case SQLITE_OK :
12
- return ;
13
- break ;
10
+ return Qnil ;
14
11
case SQLITE_ERROR :
15
- klass = rb_path2class ("SQLite3::SQLException" );
16
- break ;
12
+ return rb_path2class ("SQLite3::SQLException" );
17
13
case SQLITE_INTERNAL :
18
- klass = rb_path2class ("SQLite3::InternalException" );
19
- break ;
14
+ return rb_path2class ("SQLite3::InternalException" );
20
15
case SQLITE_PERM :
21
- klass = rb_path2class ("SQLite3::PermissionException" );
22
- break ;
16
+ return rb_path2class ("SQLite3::PermissionException" );
23
17
case SQLITE_ABORT :
24
- klass = rb_path2class ("SQLite3::AbortException" );
25
- break ;
18
+ return rb_path2class ("SQLite3::AbortException" );
26
19
case SQLITE_BUSY :
27
- klass = rb_path2class ("SQLite3::BusyException" );
28
- break ;
20
+ return rb_path2class ("SQLite3::BusyException" );
29
21
case SQLITE_LOCKED :
30
- klass = rb_path2class ("SQLite3::LockedException" );
31
- break ;
22
+ return rb_path2class ("SQLite3::LockedException" );
32
23
case SQLITE_NOMEM :
33
- klass = rb_path2class ("SQLite3::MemoryException" );
34
- break ;
24
+ return rb_path2class ("SQLite3::MemoryException" );
35
25
case SQLITE_READONLY :
36
- klass = rb_path2class ("SQLite3::ReadOnlyException" );
37
- break ;
26
+ return rb_path2class ("SQLite3::ReadOnlyException" );
38
27
case SQLITE_INTERRUPT :
39
- klass = rb_path2class ("SQLite3::InterruptException" );
40
- break ;
28
+ return rb_path2class ("SQLite3::InterruptException" );
41
29
case SQLITE_IOERR :
42
- klass = rb_path2class ("SQLite3::IOException" );
43
- break ;
30
+ return rb_path2class ("SQLite3::IOException" );
44
31
case SQLITE_CORRUPT :
45
- klass = rb_path2class ("SQLite3::CorruptException" );
46
- break ;
32
+ return rb_path2class ("SQLite3::CorruptException" );
47
33
case SQLITE_NOTFOUND :
48
- klass = rb_path2class ("SQLite3::NotFoundException" );
49
- break ;
34
+ return rb_path2class ("SQLite3::NotFoundException" );
50
35
case SQLITE_FULL :
51
- klass = rb_path2class ("SQLite3::FullException" );
52
- break ;
36
+ return rb_path2class ("SQLite3::FullException" );
53
37
case SQLITE_CANTOPEN :
54
- klass = rb_path2class ("SQLite3::CantOpenException" );
55
- break ;
38
+ return rb_path2class ("SQLite3::CantOpenException" );
56
39
case SQLITE_PROTOCOL :
57
- klass = rb_path2class ("SQLite3::ProtocolException" );
58
- break ;
40
+ return rb_path2class ("SQLite3::ProtocolException" );
59
41
case SQLITE_EMPTY :
60
- klass = rb_path2class ("SQLite3::EmptyException" );
61
- break ;
42
+ return rb_path2class ("SQLite3::EmptyException" );
62
43
case SQLITE_SCHEMA :
63
- klass = rb_path2class ("SQLite3::SchemaChangedException" );
64
- break ;
44
+ return rb_path2class ("SQLite3::SchemaChangedException" );
65
45
case SQLITE_TOOBIG :
66
- klass = rb_path2class ("SQLite3::TooBigException" );
67
- break ;
46
+ return rb_path2class ("SQLite3::TooBigException" );
68
47
case SQLITE_CONSTRAINT :
69
- klass = rb_path2class ("SQLite3::ConstraintException" );
70
- break ;
48
+ return rb_path2class ("SQLite3::ConstraintException" );
71
49
case SQLITE_MISMATCH :
72
- klass = rb_path2class ("SQLite3::MismatchException" );
73
- break ;
50
+ return rb_path2class ("SQLite3::MismatchException" );
74
51
case SQLITE_MISUSE :
75
- klass = rb_path2class ("SQLite3::MisuseException" );
76
- break ;
52
+ return rb_path2class ("SQLite3::MisuseException" );
77
53
case SQLITE_NOLFS :
78
- klass = rb_path2class ("SQLite3::UnsupportedException" );
79
- break ;
54
+ return rb_path2class ("SQLite3::UnsupportedException" );
80
55
case SQLITE_AUTH :
81
- klass = rb_path2class ("SQLite3::AuthorizationException" );
82
- break ;
56
+ return rb_path2class ("SQLite3::AuthorizationException" );
83
57
case SQLITE_FORMAT :
84
- klass = rb_path2class ("SQLite3::FormatException" );
85
- break ;
58
+ return rb_path2class ("SQLite3::FormatException" );
86
59
case SQLITE_RANGE :
87
- klass = rb_path2class ("SQLite3::RangeException" );
88
- break ;
60
+ return rb_path2class ("SQLite3::RangeException" );
89
61
case SQLITE_NOTADB :
90
- klass = rb_path2class ("SQLite3::NotADatabaseException" );
91
- break ;
62
+ return rb_path2class ("SQLite3::NotADatabaseException" );
92
63
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 ;
94
74
}
95
75
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 );
99
80
}
100
81
101
82
/*
@@ -104,14 +85,38 @@ rb_sqlite3_raise(sqlite3 *db, int status)
104
85
void
105
86
rb_sqlite3_raise_msg (sqlite3 * db , int status , const char * msg )
106
87
{
107
- VALUE exception ;
108
-
109
- if (status == SQLITE_OK ) {
88
+ VALUE klass = status2klass (status );
89
+ if (NIL_P (klass )) {
110
90
return ;
111
91
}
112
92
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 ));
114
95
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 );
115
115
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
+
116
121
rb_exc_raise (exception );
117
122
}
0 commit comments