reifydb_store_multi/persistent/sqlite/
query.rs1use std::ops::Bound;
5
6use reifydb_core::common::CommitVersion;
7
8#[inline]
9pub(super) fn version_to_bytes(version: CommitVersion) -> [u8; 8] {
10 version.0.to_be_bytes()
11}
12
13#[inline]
14pub(super) fn version_from_bytes(bytes: &[u8]) -> CommitVersion {
15 CommitVersion(u64::from_be_bytes(bytes.try_into().expect("version must be 8 bytes")))
16}
17
18pub(super) fn build_create_warm_current_sql(table_name: &str) -> String {
19 format!(
20 "CREATE TABLE IF NOT EXISTS \"{}\" (\
21 key BLOB PRIMARY KEY,\
22 version BLOB NOT NULL,\
23 value BLOB\
24 ) WITHOUT ROWID",
25 table_name
26 )
27}
28
29pub(super) fn build_get_warm_current_sql(table_name: &str) -> String {
30 format!("SELECT version, value FROM \"{}\" WHERE key = ?1", table_name)
31}
32
33pub(super) fn build_upsert_warm_current_sql(table_name: &str) -> String {
34 format!(
35 "INSERT INTO \"{0}\" (key, version, value) VALUES (?1, ?2, ?3) \
36 ON CONFLICT(key) DO UPDATE SET \
37 version = excluded.version, \
38 value = excluded.value \
39 WHERE excluded.version >= \"{0}\".version",
40 table_name
41 )
42}
43
44pub(super) fn build_range_warm_current_sql(
45 table_name: &str,
46 start: Bound<()>,
47 end: Bound<()>,
48 has_last_key: bool,
49 descending: bool,
50) -> String {
51 let mut sql = format!("SELECT key, version, value FROM \"{}\" WHERE 1=1", table_name);
52 match start {
53 Bound::Included(()) => sql.push_str(" AND key >= ?"),
54 Bound::Excluded(()) => sql.push_str(" AND key > ?"),
55 Bound::Unbounded => {}
56 }
57 match end {
58 Bound::Included(()) => sql.push_str(" AND key <= ?"),
59 Bound::Excluded(()) => sql.push_str(" AND key < ?"),
60 Bound::Unbounded => {}
61 }
62 if has_last_key {
63 sql.push_str(if descending {
64 " AND key < ?"
65 } else {
66 " AND key > ?"
67 });
68 }
69 sql.push_str(" AND version <= ?");
70 if descending {
71 sql.push_str(" ORDER BY key DESC LIMIT ?");
72 } else {
73 sql.push_str(" ORDER BY key ASC LIMIT ?");
74 }
75 sql
76}