Skip to content

Commit 8b231a0

Browse files
committed
feat(adapters-kv): add rename and copy support to kv adapters
Signed-off-by: owl <[email protected]>
1 parent ffba2e9 commit 8b231a0

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

core/src/raw/adapters/typed_kv/backend.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,58 @@ impl<S: Adapter> Accessor for Backend<S> {
221221

222222
Ok((RpList::default(), pager))
223223
}
224+
225+
async fn rename(&self, from: &str, to: &str, _: OpRename) -> Result<RpRename> {
226+
match self.copy(from, to, OpCopy {}).await {
227+
Ok(_) => {
228+
let from = build_abs_path(&self.root, from);
229+
self.kv.delete(&from).await?;
230+
Ok(RpRename::default())
231+
}
232+
Err(e) => Err(e),
233+
}
234+
}
235+
236+
fn blocking_rename(&self, from: &str, to: &str, _: OpRename) -> Result<RpRename> {
237+
match self.blocking_copy(from, to, OpCopy {}) {
238+
Ok(_) => {
239+
let from = build_abs_path(&self.root, from);
240+
self.kv.blocking_delete(&from)?;
241+
Ok(RpRename::default())
242+
}
243+
Err(e) => Err(e),
244+
}
245+
}
246+
247+
async fn copy(&self, from: &str, to: &str, _: OpCopy) -> Result<RpCopy> {
248+
let from = build_abs_path(&self.root, from);
249+
let to = build_abs_path(&self.root, to);
250+
251+
let bs = match self.kv.get(&from).await? {
252+
// TODO: we can reuse the metadata in value to build content range.
253+
Some(bs) => bs,
254+
None => return Err(Error::new(ErrorKind::NotFound, "kv doesn't have this path")),
255+
};
256+
257+
self.kv.set(&to, bs).await?;
258+
259+
Ok(RpCopy::default())
260+
}
261+
262+
fn blocking_copy(&self, from: &str, to: &str, _: OpCopy) -> Result<RpCopy> {
263+
let from = build_abs_path(&self.root, from);
264+
let to = build_abs_path(&self.root, to);
265+
266+
let bs = match self.kv.blocking_get(&from)? {
267+
// TODO: we can reuse the metadata in value to build content range.
268+
Some(bs) => bs,
269+
None => return Err(Error::new(ErrorKind::NotFound, "kv doesn't have this path")),
270+
};
271+
272+
self.kv.blocking_set(&to, bs)?;
273+
274+
Ok(RpCopy::default())
275+
}
224276
}
225277

226278
impl<S> Backend<S>

0 commit comments

Comments
 (0)