aingle_rkv/store/
integermulti.rs

1// Copyright 2018 Mozilla
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4// this file except in compliance with the License. You may obtain a copy of the
5// License at http://www.apache.org/licenses/LICENSE-2.0
6// Unless required by applicable law or agreed to in writing, software distributed
7// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
8// CONDITIONS OF ANY KIND, either express or implied. See the License for the
9// specific language governing permissions and limitations under the License.
10
11use 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}