rocks.rs 4.4 KB

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