changeset 305:08c87265d313

db_impl: Finish writing logic
author Lewin Bormann <lbo@spheniscida.de>
date Wed, 27 Sep 2017 20:37:21 +0200
parents d903e81666e7
children e36fd18488c1
files src/db_impl.rs
diffstat 1 files changed, 12 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/db_impl.rs	Wed Sep 27 20:35:54 2017 +0200
+++ b/src/db_impl.rs	Wed Sep 27 20:37:21 2017 +0200
@@ -340,26 +340,36 @@
 impl DB {
     // WRITE //
 
+    /// put adds a single entry.
     fn put(&mut self, k: &[u8], v: &[u8]) -> Result<()> {
         let mut wb = WriteBatch::new();
         wb.put(k, v);
         self.write(wb, false)
     }
 
+    /// write writes an entire WriteBatch. sync determines whether the write should be flushed to
+    /// disk.
     fn write(&mut self, batch: WriteBatch, sync: bool) -> Result<()> {
         assert!(self.log.is_some());
         let entries = batch.count() as u64;
         let log = self.log.as_mut().unwrap();
+        let next = self.vset.last_seq + 1;
 
-        log.add_record(&batch.encode(self.vset.last_seq + 1))?;
+        batch.insert_into_memtable(next, &mut self.mem);
+        log.add_record(&batch.encode(next))?;
         if sync {
             log.flush()?;
         }
-
         self.vset.last_seq += entries;
 
         Ok(())
     }
+
+    /// flush makes sure that all pending changes (e.g. from put()) are stored on disk.
+    fn flush(&mut self) -> Result<()> {
+        assert!(self.log.is_some());
+        self.log.as_mut().unwrap().flush()
+    }
 }
 
 impl DB {