ckb_rocksdb/ops/
delete.rs

1// Copyright 2019 Tyler Neely
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15
16use crate::ffi;
17use libc::{c_char, size_t};
18
19use crate::{handle::Handle, ColumnFamily, Error, WriteOptions};
20
21pub trait Delete<W> {
22    fn delete_full<K>(&self, key: K, writeopts: Option<&W>) -> Result<(), Error>
23    where
24        K: AsRef<[u8]>;
25
26    /// Remove the database entry for key.
27    ///
28    /// Returns an error if the key was not found.
29    fn delete<K>(&self, key: K) -> Result<(), Error>
30    where
31        K: AsRef<[u8]>,
32    {
33        self.delete_full(key, None)
34    }
35
36    fn delete_opt<K>(&self, key: K, writeopts: &W) -> Result<(), Error>
37    where
38        K: AsRef<[u8]>,
39    {
40        self.delete_full(key, Some(writeopts))
41    }
42}
43
44pub trait DeleteCF<W> {
45    fn delete_cf_full<K>(
46        &self,
47        cf: Option<&ColumnFamily>,
48        key: K,
49        writeopts: Option<&W>,
50    ) -> Result<(), Error>
51    where
52        K: AsRef<[u8]>;
53
54    fn delete_cf<K>(&self, cf: &ColumnFamily, key: K) -> Result<(), Error>
55    where
56        K: AsRef<[u8]>,
57    {
58        self.delete_cf_full(Some(cf), key, None)
59    }
60
61    fn put_cf_opt<K>(&self, cf: &ColumnFamily, key: K, writeopts: &W) -> Result<(), Error>
62    where
63        K: AsRef<[u8]>,
64    {
65        self.delete_cf_full(Some(cf), key, Some(writeopts))
66    }
67}
68
69impl<T, W> Delete<W> for T
70where
71    T: DeleteCF<W>,
72{
73    fn delete_full<K: AsRef<[u8]>>(&self, key: K, writeopts: Option<&W>) -> Result<(), Error> {
74        self.delete_cf_full(None, key, writeopts)
75    }
76}
77
78impl<T> DeleteCF<WriteOptions> for T
79where
80    T: Handle<ffi::rocksdb_t> + super::Write,
81{
82    fn delete_cf_full<K>(
83        &self,
84        cf: Option<&ColumnFamily>,
85        key: K,
86        writeopts: Option<&WriteOptions>,
87    ) -> Result<(), Error>
88    where
89        K: AsRef<[u8]>,
90    {
91        let mut default_writeopts = None;
92
93        let wo_handle = WriteOptions::input_or_default(writeopts, &mut default_writeopts)?;
94
95        let key = key.as_ref();
96        let key_ptr = key.as_ptr() as *const c_char;
97        let key_len = key.len() as size_t;
98
99        unsafe {
100            match cf {
101                Some(cf) => ffi_try!(ffi::rocksdb_delete_cf(
102                    self.handle(),
103                    wo_handle,
104                    cf.handle(),
105                    key_ptr,
106                    key_len,
107                )),
108                None => ffi_try!(ffi::rocksdb_delete(
109                    self.handle(),
110                    wo_handle,
111                    key_ptr,
112                    key_len,
113                )),
114            }
115
116            Ok(())
117        }
118    }
119}