rocks.rs 4.7 KB

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