| 1 | use onestore::CommitIo; |
| 2 | use std::io; |
| 3 | |
| 4 | pub enum Event { |
| 5 | Write(usize, Vec<u8>), |
| 6 | Flush, |
| 7 | } |
| 8 | |
| 9 | pub struct Trace { |
| 10 | pub bytes: Vec<u8>, |
| 11 | pub events: Vec<Event>, |
| 12 | } |
| 13 | |
| 14 | impl CommitIo for Trace { |
| 15 | fn read_at(&mut self, offset: u64, output: &mut [u8]) -> io::Result<usize> { |
| 16 | let offset = offset as usize; |
| 17 | let count = output.len().min(self.bytes.len().saturating_sub(offset)); |
| 18 | if count != 0 { |
| 19 | output[..count].copy_from_slice(&self.bytes[offset..offset + count]); |
| 20 | } |
| 21 | Ok(count) |
| 22 | } |
| 23 | fn write_at(&mut self, offset: u64, bytes: &[u8]) -> io::Result<usize> { |
| 24 | let offset = offset as usize; |
| 25 | let count = bytes.len().min(4096); |
| 26 | self.bytes.resize(self.bytes.len().max(offset + count), 0); |
| 27 | self.bytes[offset..offset + count].copy_from_slice(&bytes[..count]); |
| 28 | self.events |
| 29 | .push(Event::Write(offset, bytes[..count].to_vec())); |
| 30 | Ok(count) |
| 31 | } |
| 32 | fn flush(&mut self) -> io::Result<()> { |
| 33 | self.events.push(Event::Flush); |
| 34 | Ok(()) |
| 35 | } |
| 36 | } |