slabstore.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use std::sync::Arc;
  2. use log::trace;
  3. use super::{
  4. rocks::{columns, IteratorMode, RocksColumn},
  5. slab::Slab,
  6. };
  7. use crate::{
  8. serial::{deserialize, serialize},
  9. Result,
  10. };
  11. pub struct SlabStore {
  12. rocks: RocksColumn<columns::Slabs>,
  13. }
  14. impl SlabStore {
  15. pub fn new(rocks: RocksColumn<columns::Slabs>) -> Result<Arc<Self>> {
  16. Ok(Arc::new(SlabStore { rocks }))
  17. }
  18. pub fn get(&self, key: Vec<u8>) -> Result<Option<Vec<u8>>> {
  19. trace!(target: "SLABSTORE", "get value");
  20. let key: u64 = deserialize(&key)?;
  21. let value = self.rocks.get(key)?;
  22. Ok(value)
  23. }
  24. pub fn put(&self, slab: Slab) -> Result<Option<u64>> {
  25. trace!(target: "SLABSTORE", "Put slab");
  26. let last_index = self.get_last_index()?;
  27. let key = last_index + 1;
  28. if slab.get_index() == key {
  29. self.rocks.put(key, slab)?;
  30. Ok(Some(key))
  31. } else {
  32. Ok(None)
  33. }
  34. }
  35. pub fn get_value_deserialized(&self, key: Vec<u8>) -> Result<Option<Slab>> {
  36. self.rocks.get_value_deserialized::<Slab>(key)
  37. }
  38. pub fn get_last_index(&self) -> Result<u64> {
  39. trace!(target: "SLABSTORE", "Get last index");
  40. let last_index = self.rocks.iterator(IteratorMode::End)?.next();
  41. match last_index {
  42. Some((index, _)) => Ok(deserialize(&index)?),
  43. None => Ok(0),
  44. }
  45. }
  46. pub fn get_last_index_as_bytes(&self) -> Result<Vec<u8>> {
  47. trace!(target: "SLABSTORE", "Get last index as bytes");
  48. let last_index = self.rocks.iterator(IteratorMode::End)?.next();
  49. match last_index {
  50. Some((index, _)) => Ok(index.to_vec()),
  51. None => Ok(serialize::<u64>(&0)),
  52. }
  53. }
  54. }