graft_sqlite/file/
mem_file.rs1use std::fmt::Debug;
2
3use culprit::Result;
4use sqlite_plugin::flags::LockLevel;
5
6use crate::vfs::ErrCtx;
7
8use super::VfsFile;
9
10#[derive(Default)]
11pub struct MemFile {
12 data: Vec<u8>,
13}
14
15impl Debug for MemFile {
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 f.debug_struct("MemFile")
18 .field("len", &self.data.len())
19 .finish()
20 }
21}
22
23impl VfsFile for MemFile {
24 fn readonly(&self) -> bool {
25 false
26 }
27
28 fn in_memory(&self) -> bool {
29 true
30 }
31
32 fn lock(&mut self, _level: LockLevel) -> Result<(), ErrCtx> {
33 Ok(())
34 }
35
36 fn unlock(&mut self, _level: LockLevel) -> Result<(), ErrCtx> {
37 Ok(())
38 }
39
40 fn file_size(&mut self) -> Result<usize, ErrCtx> {
41 Ok(self.data.len())
42 }
43
44 fn truncate(&mut self, size: usize) -> Result<(), ErrCtx> {
45 self.data.truncate(size);
46 Ok(())
47 }
48
49 fn write(&mut self, offset: usize, data: &[u8]) -> Result<usize, ErrCtx> {
50 if offset + data.len() > self.data.len() {
51 self.data.resize(offset + data.len(), 0);
52 }
53 self.data[offset..offset + data.len()].copy_from_slice(data);
54 Ok(data.len())
55 }
56
57 fn read(&mut self, offset: usize, data: &mut [u8]) -> Result<usize, ErrCtx> {
58 let start = offset.min(self.data.len());
59 let end = (offset + data.len()).min(self.data.len());
60 let len = end - start;
61 data[0..len].copy_from_slice(&self.data[start..end]);
62 Ok(end - start)
63 }
64}