1use sqlite_loadable::prelude::*;
2
3use sqlite_loadable::{api, define_scalar_function, Result};
4
5pub fn uuid(context: *mut sqlite3_context, _values: &[*mut sqlite3_value]) -> Result<()> {
13 let val = uuid::Uuid::new_v4().to_string();
14 api::result_text(context, val)?;
15 Ok(())
16}
17
18pub fn uuid_v7(context: *mut sqlite3_context, _values: &[*mut sqlite3_value]) -> Result<()> {
26 let val = uuid::Uuid::now_v7().to_string();
27 api::result_text(context, val)?;
28 Ok(())
29}
30
31pub fn uuid_blob(context: *mut sqlite3_context, _values: &[*mut sqlite3_value]) -> Result<()> {
39 let val = uuid::Uuid::new_v4();
40 api::result_blob(context, val.as_bytes());
41 Ok(())
42}
43
44pub fn uuid_v7_blob(context: *mut sqlite3_context, _values: &[*mut sqlite3_value]) -> Result<()> {
52 let val = uuid::Uuid::now_v7();
53 api::result_blob(context, val.as_bytes());
54 Ok(())
55}
56
57pub fn uuid_from_blob(context: *mut sqlite3_context, values: &[*mut sqlite3_value]) -> Result<()> {
67 let v = api::value_blob(values.get(0).expect("Failed to get blob value"));
68 let uuid = uuid::Uuid::from_slice(v.as_ref()).expect("Invalid uuid blob");
69 api::result_text(context, uuid.to_string())?;
70 Ok(())
71}
72
73pub fn uuid_as_blob(context: *mut sqlite3_context, values: &[*mut sqlite3_value]) -> Result<()> {
86 let v = api::value_text(values.get(0).expect("Failed to get text value"))?;
87 let uuid = uuid::Uuid::parse_str(v).expect("Invalid uuid string");
88 api::result_blob(context, uuid.as_bytes());
89 Ok(())
90}
91
92#[sqlite_entrypoint]
93pub fn sqlite3_sqliteuuid_init(db: *mut sqlite3) -> Result<()> {
94 define_scalar_function(db, "uuid", 0, uuid, FunctionFlags::UTF8)?;
95 define_scalar_function(db, "uuid_v7", 0, uuid_v7, FunctionFlags::UTF8)?;
96 define_scalar_function(db, "uuid_blob", 0, uuid_blob, FunctionFlags::UTF8)?;
97 define_scalar_function(db, "uuid_v7_blob", 0, uuid_v7_blob, FunctionFlags::UTF8)?;
98 define_scalar_function(
99 db,
100 "uuid_from_blob",
101 1,
102 uuid_from_blob,
103 FunctionFlags::UTF8 | FunctionFlags::DETERMINISTIC,
104 )?;
105 define_scalar_function(
106 db,
107 "uuid_as_blob",
108 1,
109 uuid_as_blob,
110 FunctionFlags::UTF8 | FunctionFlags::DETERMINISTIC,
111 )?;
112 Ok(())
113}
114
115#[cfg(test)]
116mod tests {}