1use crate::ffi::sqlite3_value;
4use std::ffi::c_void;
5
6use crate::ffi;
7use crate::ffi::sqlite3_context;
8
9use crate::str_for_sqlite;
10use crate::types::{ToSqlOutput, ValueRef};
11
12#[inline]
16pub(super) unsafe fn set_result(
17 ctx: *mut sqlite3_context,
18 #[allow(unused_variables)] args: &[*mut sqlite3_value],
19 result: &ToSqlOutput<'_>,
20) {
21 let value = match *result {
22 ToSqlOutput::Borrowed(v) => v,
23 ToSqlOutput::Owned(ref v) => ValueRef::from(v),
24
25 #[cfg(feature = "blob")]
26 ToSqlOutput::ZeroBlob(len) => {
27 return ffi::sqlite3_result_zeroblob(ctx, len);
29 }
30 #[cfg(feature = "functions")]
31 ToSqlOutput::Arg(i) => {
32 return ffi::sqlite3_result_value(ctx, args[i]);
33 }
34 #[cfg(feature = "pointer")]
35 ToSqlOutput::Pointer(ref p) => {
36 return ffi::sqlite3_result_pointer(ctx, p.0 as _, p.1.as_ptr(), p.2);
37 }
38 };
39
40 match value {
41 ValueRef::Null => ffi::sqlite3_result_null(ctx),
42 ValueRef::Integer(i) => ffi::sqlite3_result_int64(ctx, i),
43 ValueRef::Real(r) => ffi::sqlite3_result_double(ctx, r),
44 ValueRef::Text(s) => {
45 let (c_str, len, destructor) = str_for_sqlite(s);
46 ffi::sqlite3_result_text64(ctx, c_str, len, destructor, ffi::SQLITE_UTF8 as _);
47 }
49 ValueRef::Blob(b) => {
50 let length = b.len();
51 if length == 0 {
52 ffi::sqlite3_result_zeroblob(ctx, 0);
53 } else {
54 ffi::sqlite3_result_blob64(
55 ctx,
56 b.as_ptr().cast::<c_void>(),
57 length as ffi::sqlite3_uint64,
58 ffi::SQLITE_TRANSIENT(),
59 );
60 }
61 }
62 }
63}