aingle_rkv/store/
integermulti.rs1use aingle_lmdb::{
12 Database,
13 WriteFlags,
14};
15
16use std::marker::PhantomData;
17
18use crate::error::StoreError;
19
20use crate::readwrite::{
21 Readable,
22 Writer,
23};
24
25use crate::value::Value;
26
27use crate::store::multi::{
28 Iter,
29 MultiStore,
30};
31
32use crate::store::integer::{
33 Key,
34 PrimitiveInt,
35};
36
37pub struct MultiIntegerStore<K>
38where
39 K: PrimitiveInt,
40{
41 inner: MultiStore,
42 phantom: PhantomData<K>,
43}
44
45impl<K> MultiIntegerStore<K>
46where
47 K: PrimitiveInt,
48{
49 pub(crate) fn new(db: Database) -> MultiIntegerStore<K> {
50 MultiIntegerStore {
51 inner: MultiStore::new(db),
52 phantom: PhantomData,
53 }
54 }
55
56 pub fn get<'env, T: Readable>(&self, reader: &'env T, k: K) -> Result<Iter<'env>, StoreError> {
57 self.inner.get(reader, Key::new(&k)?)
58 }
59
60 pub fn get_first<'env, T: Readable>(&self, reader: &'env T, k: K) -> Result<Option<Value<'env>>, StoreError> {
61 self.inner.get_first(reader, Key::new(&k)?)
62 }
63
64 pub fn put(&self, writer: &mut Writer, k: K, v: &Value) -> Result<(), StoreError> {
65 self.inner.put(writer, Key::new(&k)?, v)
66 }
67
68 pub fn put_with_flags(&self, writer: &mut Writer, k: K, v: &Value, flags: WriteFlags) -> Result<(), StoreError> {
69 self.inner.put_with_flags(writer, Key::new(&k)?, v, flags)
70 }
71
72 pub fn delete_all(&self, writer: &mut Writer, k: K) -> Result<(), StoreError> {
73 self.inner.delete_all(writer, Key::new(&k)?)
74 }
75
76 pub fn delete(&self, writer: &mut Writer, k: K, v: &Value) -> Result<(), StoreError> {
77 self.inner.delete(writer, Key::new(&k)?, v)
78 }
79
80 pub fn clear(&self, writer: &mut Writer) -> Result<(), StoreError> {
81 self.inner.clear(writer)
82 }
83}
84
85#[cfg(test)]
86mod tests {
87 extern crate tempfile;
88
89 use self::tempfile::Builder;
90 use std::fs;
91
92 use super::*;
93 use crate::*;
94
95 #[test]
96 fn test_integer_keys() {
97 let root = Builder::new().prefix("test_integer_keys").tempdir().expect("tempdir");
98 fs::create_dir_all(root.path()).expect("dir created");
99 let k = Rkv::new(root.path()).expect("new succeeded");
100 let s = k.open_multi_integer("s", StoreOptions::create()).expect("open");
101
102 macro_rules! test_integer_keys {
103 ($type:ty, $key:expr) => {{
104 let mut writer = k.write().expect("writer");
105
106 s.put(&mut writer, $key, &Value::Str("hello!")).expect("write");
107 assert_eq!(s.get_first(&writer, $key).expect("read"), Some(Value::Str("hello!")));
108 writer.commit().expect("committed");
109
110 let reader = k.read().expect("reader");
111 assert_eq!(s.get_first(&reader, $key).expect("read"), Some(Value::Str("hello!")));
112 }};
113 }
114
115 test_integer_keys!(u32, std::u32::MIN);
116 test_integer_keys!(u32, std::u32::MAX);
117 }
118
119 #[test]
120 fn test_clear() {
121 let root = Builder::new().prefix("test_multi_integer_clear").tempdir().expect("tempdir");
122 fs::create_dir_all(root.path()).expect("dir created");
123 let k = Rkv::new(root.path()).expect("new succeeded");
124 let s = k.open_multi_integer("s", StoreOptions::create()).expect("open");
125
126 {
127 let mut writer = k.write().expect("writer");
128 s.put(&mut writer, 1, &Value::Str("hello!")).expect("write");
129 s.put(&mut writer, 1, &Value::Str("hello1!")).expect("write");
130 s.put(&mut writer, 2, &Value::Str("hello!")).expect("write");
131 writer.commit().expect("committed");
132 }
133
134 {
135 let mut writer = k.write().expect("writer");
136 s.clear(&mut writer).expect("cleared");
137 writer.commit().expect("committed");
138
139 let reader = k.read().expect("reader");
140 assert_eq!(s.get_first(&reader, 1).expect("read"), None);
141 assert_eq!(s.get_first(&reader, 2).expect("read"), None);
142 }
143 }
144}