graft_sqlite/file/
mem_file.rs

1use 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}