mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-26 11:31:37 +08:00
Fix incorrect ffi constant accesses.
This commit is contained in:
parent
61eb843c6b
commit
549373f764
@ -114,6 +114,15 @@ fn set_result<'a>(ctx: *mut sqlite3_context, result: &ToSqlOutput<'a>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn report_error(ctx: *mut sqlite3_context, err: &Error) {
|
unsafe fn report_error(ctx: *mut sqlite3_context, err: &Error) {
|
||||||
|
// Extended constraint error codes were added in SQLite 3.7.16. We don't have an explicit
|
||||||
|
// feature check for that, and this doesn't really warrant one. We'll use the extended code
|
||||||
|
// if we're on the bundled version (since it's at least 3.17.0) and the normal constraint
|
||||||
|
// error code if not.
|
||||||
|
#[cfg(feature = "bundled")]
|
||||||
|
fn constraint_error_code() -> i32 { ffi::SQLITE_CONSTRAINT_FUNCTION }
|
||||||
|
#[cfg(not(feature = "bundled"))]
|
||||||
|
fn constraint_error_code() -> i32 { ffi::SQLITE_CONSTRAINT }
|
||||||
|
|
||||||
match *err {
|
match *err {
|
||||||
Error::SqliteFailure(ref err, ref s) => {
|
Error::SqliteFailure(ref err, ref s) => {
|
||||||
ffi::sqlite3_result_error_code(ctx, err.extended_code);
|
ffi::sqlite3_result_error_code(ctx, err.extended_code);
|
||||||
@ -122,7 +131,7 @@ unsafe fn report_error(ctx: *mut sqlite3_context, err: &Error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
ffi::sqlite3_result_error_code(ctx, ffi::SQLITE_CONSTRAINT_FUNCTION);
|
ffi::sqlite3_result_error_code(ctx, constraint_error_code());
|
||||||
if let Ok(cstr) = str_to_cstring(err.description()) {
|
if let Ok(cstr) = str_to_cstring(err.description()) {
|
||||||
ffi::sqlite3_result_error(ctx, cstr.as_ptr(), -1);
|
ffi::sqlite3_result_error(ctx, cstr.as_ptr(), -1);
|
||||||
}
|
}
|
||||||
|
16
src/lib.rs
16
src/lib.rs
@ -1169,6 +1169,15 @@ mod test {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_notnull_constraint_error() {
|
fn test_notnull_constraint_error() {
|
||||||
|
// extended error codes for constraints were added in SQLite 3.7.16; if we're
|
||||||
|
// running on our bundled version, we know the extended error code exists.
|
||||||
|
#[cfg(feature = "bundled")]
|
||||||
|
fn check_extended_code(extended_code: c_int) {
|
||||||
|
assert_eq!(extended_code, ffi::SQLITE_CONSTRAINT_NOTNULL);
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "bundled"))]
|
||||||
|
fn check_extended_code(_extended_code: c_int) {}
|
||||||
|
|
||||||
let db = checked_memory_handle();
|
let db = checked_memory_handle();
|
||||||
db.execute_batch("CREATE TABLE foo(x NOT NULL)").unwrap();
|
db.execute_batch("CREATE TABLE foo(x NOT NULL)").unwrap();
|
||||||
|
|
||||||
@ -1178,12 +1187,7 @@ mod test {
|
|||||||
match result.unwrap_err() {
|
match result.unwrap_err() {
|
||||||
Error::SqliteFailure(err, _) => {
|
Error::SqliteFailure(err, _) => {
|
||||||
assert_eq!(err.code, ErrorCode::ConstraintViolation);
|
assert_eq!(err.code, ErrorCode::ConstraintViolation);
|
||||||
|
check_extended_code(err.extended_code);
|
||||||
// extended error codes for constraints were added in SQLite 3.7.16; if we're
|
|
||||||
// running on a version at least that new, check for the extended code
|
|
||||||
if version_number() >= 3007016 {
|
|
||||||
assert_eq!(err.extended_code, ffi::SQLITE_CONSTRAINT_NOTNULL)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
err => panic!("Unexpected error {}", err),
|
err => panic!("Unexpected error {}", err),
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user