mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-26 19:41:37 +08:00
Avoid relying on sqlite to justify str::from_utf8_unchecked
This commit is contained in:
parent
1b27ce0541
commit
cf9b6e9ae2
@ -53,20 +53,18 @@ impl InnerConnection {
|
|||||||
where
|
where
|
||||||
C: Fn(&str, &str) -> Ordering,
|
C: Fn(&str, &str) -> Ordering,
|
||||||
{
|
{
|
||||||
use std::str;
|
|
||||||
|
|
||||||
let r = catch_unwind(|| {
|
let r = catch_unwind(|| {
|
||||||
let boxed_f: *mut C = arg1 as *mut C;
|
let boxed_f: *mut C = arg1 as *mut C;
|
||||||
assert!(!boxed_f.is_null(), "Internal error - null function pointer");
|
assert!(!boxed_f.is_null(), "Internal error - null function pointer");
|
||||||
let s1 = {
|
let s1 = {
|
||||||
let c_slice = slice::from_raw_parts(arg3 as *const u8, arg2 as usize);
|
let c_slice = slice::from_raw_parts(arg3 as *const u8, arg2 as usize);
|
||||||
str::from_utf8_unchecked(c_slice)
|
String::from_utf8_lossy(c_slice)
|
||||||
};
|
};
|
||||||
let s2 = {
|
let s2 = {
|
||||||
let c_slice = slice::from_raw_parts(arg5 as *const u8, arg4 as usize);
|
let c_slice = slice::from_raw_parts(arg5 as *const u8, arg4 as usize);
|
||||||
str::from_utf8_unchecked(c_slice)
|
String::from_utf8_lossy(c_slice)
|
||||||
};
|
};
|
||||||
(*boxed_f)(s1, s2)
|
(*boxed_f)(s1.as_ref(), s2.as_ref())
|
||||||
});
|
});
|
||||||
let t = match r {
|
let t = match r {
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
@ -122,7 +120,7 @@ impl InnerConnection {
|
|||||||
let conn = Connection::from_handle(arg2).unwrap();
|
let conn = Connection::from_handle(arg2).unwrap();
|
||||||
let collation_name = {
|
let collation_name = {
|
||||||
let c_slice = CStr::from_ptr(arg3).to_bytes();
|
let c_slice = CStr::from_ptr(arg3).to_bytes();
|
||||||
str::from_utf8_unchecked(c_slice)
|
str::from_utf8(c_slice).expect("illegal coallation sequence name")
|
||||||
};
|
};
|
||||||
callback(&conn, collation_name)
|
callback(&conn, collation_name)
|
||||||
});
|
});
|
||||||
|
11
src/hooks.rs
11
src/hooks.rs
@ -188,16 +188,21 @@ impl InnerConnection {
|
|||||||
let action = Action::from(action_code);
|
let action = Action::from(action_code);
|
||||||
let db_name = {
|
let db_name = {
|
||||||
let c_slice = CStr::from_ptr(db_str).to_bytes();
|
let c_slice = CStr::from_ptr(db_str).to_bytes();
|
||||||
str::from_utf8_unchecked(c_slice)
|
str::from_utf8(c_slice)
|
||||||
};
|
};
|
||||||
let tbl_name = {
|
let tbl_name = {
|
||||||
let c_slice = CStr::from_ptr(tbl_str).to_bytes();
|
let c_slice = CStr::from_ptr(tbl_str).to_bytes();
|
||||||
str::from_utf8_unchecked(c_slice)
|
str::from_utf8(c_slice)
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = catch_unwind(|| {
|
let _ = catch_unwind(|| {
|
||||||
let boxed_hook: *mut F = p_arg as *mut F;
|
let boxed_hook: *mut F = p_arg as *mut F;
|
||||||
(*boxed_hook)(action, db_name, tbl_name, row_id);
|
(*boxed_hook)(
|
||||||
|
action,
|
||||||
|
db_name.expect("illegal db name"),
|
||||||
|
tbl_name.expect("illegal table name"),
|
||||||
|
row_id,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,9 +69,11 @@ impl Session<'_> {
|
|||||||
let boxed_filter: *mut F = p_arg as *mut F;
|
let boxed_filter: *mut F = p_arg as *mut F;
|
||||||
let tbl_name = {
|
let tbl_name = {
|
||||||
let c_slice = CStr::from_ptr(tbl_str).to_bytes();
|
let c_slice = CStr::from_ptr(tbl_str).to_bytes();
|
||||||
str::from_utf8_unchecked(c_slice)
|
str::from_utf8(c_slice)
|
||||||
};
|
};
|
||||||
if let Ok(true) = catch_unwind(|| (*boxed_filter)(tbl_name)) {
|
if let Ok(true) =
|
||||||
|
catch_unwind(|| (*boxed_filter)(tbl_name.expect("non-utf8 table name")))
|
||||||
|
{
|
||||||
1
|
1
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
@ -660,11 +662,11 @@ where
|
|||||||
let tuple: *mut (Option<F>, C) = p_ctx as *mut (Option<F>, C);
|
let tuple: *mut (Option<F>, C) = p_ctx as *mut (Option<F>, C);
|
||||||
let tbl_name = {
|
let tbl_name = {
|
||||||
let c_slice = CStr::from_ptr(tbl_str).to_bytes();
|
let c_slice = CStr::from_ptr(tbl_str).to_bytes();
|
||||||
str::from_utf8_unchecked(c_slice)
|
str::from_utf8(c_slice)
|
||||||
};
|
};
|
||||||
match *tuple {
|
match *tuple {
|
||||||
(Some(ref filter), _) => {
|
(Some(ref filter), _) => {
|
||||||
if let Ok(true) = catch_unwind(|| filter(tbl_name)) {
|
if let Ok(true) = catch_unwind(|| filter(tbl_name.expect("illegal table name"))) {
|
||||||
1
|
1
|
||||||
} else {
|
} else {
|
||||||
0
|
0
|
||||||
|
@ -672,7 +672,7 @@ impl Statement<'_> {
|
|||||||
unsafe {
|
unsafe {
|
||||||
match self.stmt.expanded_sql() {
|
match self.stmt.expanded_sql() {
|
||||||
Some(s) => {
|
Some(s) => {
|
||||||
let sql = str::from_utf8_unchecked(s.to_bytes()).to_owned();
|
let sql = String::from_utf8_lossy(s.to_bytes()).to_string();
|
||||||
ffi::sqlite3_free(s.as_ptr() as *mut _);
|
ffi::sqlite3_free(s.as_ptr() as *mut _);
|
||||||
Some(sql)
|
Some(sql)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user