Mercurial > lbo > hg > leveldb-rs
changeset 109:0b7271ebf175
Use VarIntWriter to create WriteBatches
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sat, 15 Oct 2016 15:43:23 +0200 |
parents | cb744c4fbd54 |
children | c48c912aee64 |
files | src/write_batch.rs |
diffstat | 1 files changed, 16 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/src/write_batch.rs Sun Oct 09 16:34:38 2016 +0200 +++ b/src/write_batch.rs Sat Oct 15 15:43:23 2016 +0200 @@ -1,11 +1,18 @@ use memtable::MemTable; use types::{Comparator, SequenceNumber, ValueType}; -use integer_encoding::{VarInt, FixedInt}; +use integer_encoding::{VarInt, VarIntWriter, FixedInt}; + +use std::io::Write; const SEQNUM_OFFSET: usize = 0; const COUNT_OFFSET: usize = 8; const HEADER_SIZE: usize = 12; +/// A WriteBatch contains entries to be written to a MemTable (for example) in a compact form. +/// +/// The storage format is (with the respective length in bytes) +/// +/// [tag: 1, keylen: ~var, key: keylen, vallen: ~var, val: vallen] pub struct WriteBatch { entries: Vec<u8>, } @@ -24,22 +31,11 @@ #[allow(unused_assignments)] pub fn put(&mut self, k: &[u8], v: &[u8]) { - let mut ix = self.entries.len(); - - self.entries.push(ValueType::TypeValue as u8); - ix += 1; - - self.entries.resize(ix + k.len().required_space(), 0); - ix += k.len().encode_var(&mut self.entries[ix..]); - - self.entries.extend_from_slice(k); - ix += k.len(); - - self.entries.resize(ix + v.len().required_space(), 0); - ix += v.len().encode_var(&mut self.entries[ix..]); - - self.entries.extend_from_slice(v); - ix += v.len(); + self.entries.write(&[ValueType::TypeValue as u8]).unwrap(); + self.entries.write_varint(k.len()).unwrap(); + self.entries.write(k).unwrap(); + self.entries.write_varint(v.len()).unwrap(); + self.entries.write(v).unwrap(); let c = self.count(); self.set_count(c + 1); @@ -47,16 +43,9 @@ #[allow(unused_assignments)] pub fn delete(&mut self, k: &[u8]) { - let mut ix = self.entries.len(); - - self.entries.push(ValueType::TypeDeletion as u8); - ix += 1; - - self.entries.resize(ix + k.len().required_space(), 0); - ix += k.len().encode_var(&mut self.entries[ix..]); - - self.entries.extend_from_slice(k); - ix += k.len(); + self.entries.write(&[ValueType::TypeDeletion as u8]).unwrap(); + self.entries.write_varint(k.len()).unwrap(); + self.entries.write(k).unwrap(); let c = self.count(); self.set_count(c + 1);