rocks.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. use std::{marker::PhantomData, path::Path};
  2. use async_std::sync::Arc;
  3. use rocksdb::{ColumnFamily, ColumnFamilyDescriptor, Options, DB};
  4. use crate::{
  5. serial::{deserialize, serialize, Decodable, Encodable},
  6. Error, Result,
  7. };
  8. pub enum IteratorMode {
  9. Start,
  10. End,
  11. }
  12. pub trait Column {
  13. const NAME: &'static str;
  14. }
  15. pub mod columns {
  16. pub struct Slabs;
  17. pub struct Nullifiers;
  18. pub struct MerkleRoots;
  19. }
  20. impl Column for columns::Slabs {
  21. const NAME: &'static str = "slabs";
  22. }
  23. impl Column for columns::Nullifiers {
  24. const NAME: &'static str = "nullifiers";
  25. }
  26. impl Column for columns::MerkleRoots {
  27. const NAME: &'static str = "merkleroots";
  28. }
  29. pub struct Rocks {
  30. db: DB,
  31. }
  32. impl Rocks {
  33. pub fn new(path: &Path) -> Result<Arc<Self>> {
  34. // column family options
  35. let cf_opts = Options::default();
  36. // default column family
  37. let default_cf =
  38. ColumnFamilyDescriptor::new(rocksdb::DEFAULT_COLUMN_FAMILY_NAME, cf_opts.clone());
  39. // slabs column family
  40. let slab_cf = ColumnFamilyDescriptor::new(columns::Slabs::NAME, cf_opts.clone());
  41. // nullifiers column family
  42. let nullifiers_cf = ColumnFamilyDescriptor::new(columns::Nullifiers::NAME, cf_opts.clone());
  43. // merkleroots column family
  44. let merkleroots_cf = ColumnFamilyDescriptor::new(columns::MerkleRoots::NAME, cf_opts);
  45. // column families
  46. let cfs = vec![default_cf, slab_cf, nullifiers_cf, merkleroots_cf];
  47. // database options
  48. let mut opt = Options::default();
  49. opt.create_if_missing(true);
  50. opt.create_missing_column_families(true);
  51. // open database with following options and cf
  52. let db = DB::open_cf_descriptors(&opt, path, cfs)?;
  53. Ok(Arc::new(Self { db }))
  54. }
  55. pub fn cf_handle<C>(&self) -> Result<&ColumnFamily>
  56. where
  57. C: Column,
  58. {
  59. self.db.cf_handle(C::NAME).ok_or_else(|| Error::RocksdbError("unknown column".to_string()))
  60. }
  61. pub fn put_cf(&self, cf: &ColumnFamily, key: Vec<u8>, value: Vec<u8>) -> Result<()> {
  62. self.db.put_cf(cf, key, value)?;
  63. Ok(())
  64. }
  65. pub fn get_cf(&self, cf: &ColumnFamily, key: Vec<u8>) -> Result<Option<Vec<u8>>> {
  66. let val = self.db.get_cf(cf, key)?;
  67. Ok(val)
  68. }
  69. pub fn key_exist_cf(&self, cf: &ColumnFamily, key: Vec<u8>) -> Result<bool> {
  70. let val = self.db.get_cf(cf, key)?;
  71. Ok(val.is_some())
  72. }
  73. pub fn iterator(&self, cf: &ColumnFamily, iterator_mode: IteratorMode) -> rocksdb::DBIterator {
  74. let iterator_mode = match iterator_mode {
  75. IteratorMode::Start => rocksdb::IteratorMode::Start,
  76. IteratorMode::End => rocksdb::IteratorMode::End,
  77. };
  78. self.db.iterator_cf(cf, iterator_mode)
  79. }
  80. pub fn destroy(path: &Path) -> Result<()> {
  81. DB::destroy(&Options::default(), path)?;
  82. Ok(())
  83. }
  84. }
  85. pub struct RocksColumn<T: Column> {
  86. rocks: Arc<Rocks>,
  87. column: PhantomData<T>,
  88. }
  89. impl<T: Column> RocksColumn<T> {
  90. pub fn new(rocks: Arc<Rocks>) -> RocksColumn<T> {
  91. RocksColumn { rocks, column: PhantomData }
  92. }
  93. fn cf_handle(&self) -> Result<&ColumnFamily> {
  94. self.rocks.cf_handle::<T>()
  95. }
  96. pub fn put(&self, key: impl Encodable, value: impl Encodable) -> Result<()> {
  97. let key = serialize(&key);
  98. let value = serialize(&value);
  99. let cf = self.cf_handle()?;
  100. self.rocks.put_cf(cf, key, value)?;
  101. Ok(())
  102. }
  103. pub fn get(&self, key: impl Encodable) -> Result<Option<Vec<u8>>> {
  104. let key = serialize(&key);
  105. let cf = self.cf_handle()?;
  106. let val = self.rocks.get_cf(cf, key)?;
  107. Ok(val)
  108. }
  109. pub fn get_value_deserialized<D: Decodable>(&self, key: Vec<u8>) -> Result<Option<D>> {
  110. let value = self.get(key)?;
  111. match value {
  112. Some(v) => {
  113. let v: D = deserialize(&v)?;
  114. Ok(Some(v))
  115. }
  116. None => Ok(None),
  117. }
  118. }
  119. pub fn key_exist(&self, key: impl Encodable) -> Result<bool> {
  120. let key = serialize(&key);
  121. let cf = self.cf_handle()?;
  122. let val = self.rocks.key_exist_cf(cf, key)?;
  123. Ok(val)
  124. }
  125. pub fn iterator(&self, iterator_mode: IteratorMode) -> Result<rocksdb::DBIterator> {
  126. let cf = self.cf_handle()?;
  127. let iter = self.rocks.iterator(cf, iterator_mode);
  128. Ok(iter)
  129. }
  130. }