rust_rocksdb/
sst_file_writer.rs1use crate::{Error, Options, ffi, ffi_util::to_cpath};
17
18use libc::{self, c_char, size_t};
19use std::{ffi::CString, marker::PhantomData, path::Path};
20
21pub struct SstFileWriter<'a> {
24 pub(crate) inner: *mut ffi::rocksdb_sstfilewriter_t,
25 phantom: PhantomData<&'a Options>,
28}
29
30unsafe impl Send for SstFileWriter<'_> {}
31unsafe impl Sync for SstFileWriter<'_> {}
32
33struct EnvOptions {
34 inner: *mut ffi::rocksdb_envoptions_t,
35}
36
37impl Drop for EnvOptions {
38 fn drop(&mut self) {
39 unsafe {
40 ffi::rocksdb_envoptions_destroy(self.inner);
41 }
42 }
43}
44
45impl Default for EnvOptions {
46 fn default() -> Self {
47 let opts = unsafe { ffi::rocksdb_envoptions_create() };
48 Self { inner: opts }
49 }
50}
51
52impl<'a> SstFileWriter<'a> {
53 pub fn create(opts: &'a Options) -> Self {
55 let env_options = EnvOptions::default();
56
57 let writer = Self::create_raw(opts, &env_options);
58
59 Self {
60 inner: writer,
61 phantom: PhantomData,
62 }
63 }
64
65 fn create_raw(opts: &Options, env_opts: &EnvOptions) -> *mut ffi::rocksdb_sstfilewriter_t {
66 unsafe { ffi::rocksdb_sstfilewriter_create(env_opts.inner, opts.inner) }
67 }
68
69 pub fn open<P: AsRef<Path>>(&mut self, path: P) -> Result<(), Error> {
77 let cpath = to_cpath(&path)?;
78 self.open_raw(&cpath)
79 }
80
81 fn open_raw(&mut self, cpath: &CString) -> Result<(), Error> {
82 unsafe {
83 ffi_try!(ffi::rocksdb_sstfilewriter_open(
84 self.inner,
85 cpath.as_ptr() as *const _
86 ));
87
88 Ok(())
89 }
90 }
91
92 pub fn finish(&mut self) -> Result<(), Error> {
94 unsafe {
95 ffi_try!(ffi::rocksdb_sstfilewriter_finish(self.inner,));
96 Ok(())
97 }
98 }
99
100 pub fn file_size(&self) -> u64 {
102 let mut file_size: u64 = 0;
103 unsafe {
104 ffi::rocksdb_sstfilewriter_file_size(self.inner, &raw mut file_size);
105 }
106 file_size
107 }
108
109 pub fn put<K, V>(&mut self, key: K, value: V) -> Result<(), Error>
112 where
113 K: AsRef<[u8]>,
114 V: AsRef<[u8]>,
115 {
116 let key = key.as_ref();
117 let value = value.as_ref();
118 unsafe {
119 ffi_try!(ffi::rocksdb_sstfilewriter_put(
120 self.inner,
121 key.as_ptr() as *const c_char,
122 key.len() as size_t,
123 value.as_ptr() as *const c_char,
124 value.len() as size_t,
125 ));
126 Ok(())
127 }
128 }
129
130 pub fn put_with_ts<K, V, S>(&mut self, key: K, ts: S, value: V) -> Result<(), Error>
133 where
134 K: AsRef<[u8]>,
135 V: AsRef<[u8]>,
136 S: AsRef<[u8]>,
137 {
138 let key = key.as_ref();
139 let value = value.as_ref();
140 let ts = ts.as_ref();
141 unsafe {
142 ffi_try!(ffi::rocksdb_sstfilewriter_put_with_ts(
143 self.inner,
144 key.as_ptr() as *const c_char,
145 key.len() as size_t,
146 ts.as_ptr() as *const c_char,
147 ts.len() as size_t,
148 value.as_ptr() as *const c_char,
149 value.len() as size_t,
150 ));
151 Ok(())
152 }
153 }
154
155 pub fn merge<K, V>(&mut self, key: K, value: V) -> Result<(), Error>
158 where
159 K: AsRef<[u8]>,
160 V: AsRef<[u8]>,
161 {
162 let key = key.as_ref();
163 let value = value.as_ref();
164
165 unsafe {
166 ffi_try!(ffi::rocksdb_sstfilewriter_merge(
167 self.inner,
168 key.as_ptr() as *const c_char,
169 key.len() as size_t,
170 value.as_ptr() as *const c_char,
171 value.len() as size_t,
172 ));
173 Ok(())
174 }
175 }
176
177 pub fn delete<K: AsRef<[u8]>>(&mut self, key: K) -> Result<(), Error> {
180 let key = key.as_ref();
181
182 unsafe {
183 ffi_try!(ffi::rocksdb_sstfilewriter_delete(
184 self.inner,
185 key.as_ptr() as *const c_char,
186 key.len() as size_t,
187 ));
188 Ok(())
189 }
190 }
191
192 pub fn delete_range<K: AsRef<[u8]>>(&mut self, begin_key: K, end_key: K) -> Result<(), Error> {
197 let begin_key = begin_key.as_ref();
198 let end_key = end_key.as_ref();
199
200 unsafe {
201 ffi_try!(ffi::rocksdb_sstfilewriter_delete_range(
202 self.inner,
203 begin_key.as_ptr() as *const c_char,
204 begin_key.len() as size_t,
205 end_key.as_ptr() as *const c_char,
206 end_key.len() as size_t,
207 ));
208 Ok(())
209 }
210 }
211
212 pub fn delete_with_ts<K: AsRef<[u8]>, S: AsRef<[u8]>>(
215 &mut self,
216 key: K,
217 ts: S,
218 ) -> Result<(), Error> {
219 let key = key.as_ref();
220 let ts = ts.as_ref();
221 unsafe {
222 ffi_try!(ffi::rocksdb_sstfilewriter_delete_with_ts(
223 self.inner,
224 key.as_ptr() as *const c_char,
225 key.len() as size_t,
226 ts.as_ptr() as *const c_char,
227 ts.len() as size_t,
228 ));
229 Ok(())
230 }
231 }
232}
233
234impl Drop for SstFileWriter<'_> {
235 fn drop(&mut self) {
236 unsafe {
237 ffi::rocksdb_sstfilewriter_destroy(self.inner);
238 }
239 }
240}