slabstore.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. use std::path::Path;
  2. use std::sync::Arc;
  3. use crate::serial::{deserialize, serialize};
  4. use crate::{slab::Slab, Result};
  5. use rocksdb::{IteratorMode, Options, DB};
  6. pub struct SlabStore {
  7. db: DB,
  8. }
  9. impl SlabStore {
  10. pub fn new(path: &Path) -> Result<Arc<Self>> {
  11. let mut opt = Options::default();
  12. opt.create_if_missing(true);
  13. let db = DB::open(&opt, path)?;
  14. Ok(Arc::new(SlabStore { db }))
  15. }
  16. pub fn get(&self, key: Vec<u8>) -> Result<Option<Vec<u8>>> {
  17. let value = self.db.get(key)?;
  18. Ok(value)
  19. }
  20. pub fn put(&self, value: Vec<u8>) -> Result<Option<Vec<u8>>> {
  21. let slab: Slab = deserialize(&value)?;
  22. let last_index = self.get_last_index()?;
  23. let key = last_index + 1;
  24. if slab.get_index() == key {
  25. let key = serialize(&key);
  26. self.db.put(key.clone(), value)?;
  27. Ok(Some(key))
  28. } else {
  29. Ok(None)
  30. }
  31. }
  32. pub fn get_value_deserialized(&self, key: Vec<u8>) -> Result<Option<Slab>> {
  33. let value = self.db.get(key)?;
  34. match value {
  35. Some(v) => {
  36. let v: Slab = deserialize(&v)?;
  37. Ok(Some(v))
  38. }
  39. None => Ok(None),
  40. }
  41. }
  42. pub fn get_last_index(&self) -> Result<u64> {
  43. let last_index = self.db.iterator(IteratorMode::End).next();
  44. match last_index {
  45. Some((index, _)) => Ok(deserialize(&index)?),
  46. None => Ok(0),
  47. }
  48. }
  49. pub fn get_last_index_as_bytes(&self) -> Result<Vec<u8>> {
  50. let last_index = self.db.iterator(IteratorMode::End).next();
  51. match last_index {
  52. Some((index, _)) => Ok(index.to_vec()),
  53. None => Ok(serialize::<u64>(&0)),
  54. }
  55. }
  56. pub fn destroy(path: &Path) -> Result<()> {
  57. DB::destroy(&Options::default(), path)?;
  58. Ok(())
  59. }
  60. }