rocksdb/
sst_file_writer.rs1use crate::{ffi, ffi_util::to_cpath, Error, Options};
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<'a> Send for SstFileWriter<'a> {}
31unsafe impl<'a> Sync for SstFileWriter<'a> {}
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>>(&'a self, path: P) -> Result<(), Error> {
71 let cpath = to_cpath(&path)?;
72 self.open_raw(&cpath)
73 }
74
75 fn open_raw(&'a self, cpath: &CString) -> Result<(), Error> {
76 unsafe {
77 ffi_try!(ffi::rocksdb_sstfilewriter_open(
78 self.inner,
79 cpath.as_ptr() as *const _
80 ));
81
82 Ok(())
83 }
84 }
85
86 pub fn finish(&mut self) -> Result<(), Error> {
88 unsafe {
89 ffi_try!(ffi::rocksdb_sstfilewriter_finish(self.inner,));
90 Ok(())
91 }
92 }
93
94 pub fn file_size(&self) -> u64 {
96 let mut file_size: u64 = 0;
97 unsafe {
98 ffi::rocksdb_sstfilewriter_file_size(self.inner, &mut file_size);
99 }
100 file_size
101 }
102
103 pub fn put<K, V>(&mut self, key: K, value: V) -> Result<(), Error>
106 where
107 K: AsRef<[u8]>,
108 V: AsRef<[u8]>,
109 {
110 let key = key.as_ref();
111 let value = value.as_ref();
112
113 unsafe {
114 ffi_try!(ffi::rocksdb_sstfilewriter_put(
115 self.inner,
116 key.as_ptr() as *const c_char,
117 key.len() as size_t,
118 value.as_ptr() as *const c_char,
119 value.len() as size_t,
120 ));
121 Ok(())
122 }
123 }
124
125 pub fn merge<K, V>(&mut self, key: K, value: V) -> Result<(), Error>
128 where
129 K: AsRef<[u8]>,
130 V: AsRef<[u8]>,
131 {
132 let key = key.as_ref();
133 let value = value.as_ref();
134
135 unsafe {
136 ffi_try!(ffi::rocksdb_sstfilewriter_merge(
137 self.inner,
138 key.as_ptr() as *const c_char,
139 key.len() as size_t,
140 value.as_ptr() as *const c_char,
141 value.len() as size_t,
142 ));
143 Ok(())
144 }
145 }
146
147 pub fn delete<K: AsRef<[u8]>>(&mut self, key: K) -> Result<(), Error> {
150 let key = key.as_ref();
151
152 unsafe {
153 ffi_try!(ffi::rocksdb_sstfilewriter_delete(
154 self.inner,
155 key.as_ptr() as *const c_char,
156 key.len() as size_t,
157 ));
158 Ok(())
159 }
160 }
161}
162
163impl<'a> Drop for SstFileWriter<'a> {
164 fn drop(&mut self) {
165 unsafe {
166 ffi::rocksdb_sstfilewriter_destroy(self.inner);
167 }
168 }
169}