migrations.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //! Wallet Migrations
  2. use std::ops::Deref;
  3. use std::str::FromStr;
  4. use std::sync::Arc;
  5. use cdk_common::mint_url::MintUrl;
  6. use redb::{
  7. Database, MultimapTableDefinition, ReadableMultimapTable, ReadableTable, TableDefinition,
  8. };
  9. use super::Error;
  10. // <Mint_url, Info>
  11. const MINTS_TABLE: TableDefinition<&str, &str> = TableDefinition::new("mints_table");
  12. // <Mint_Url, Keyset_id>
  13. const MINT_KEYSETS_TABLE: MultimapTableDefinition<&str, &[u8]> =
  14. MultimapTableDefinition::new("mint_keysets");
  15. pub fn migrate_01_to_02(db: Arc<Database>) -> Result<u32, Error> {
  16. migrate_trim_mint_urls_01_to_02(db)?;
  17. Ok(2)
  18. }
  19. fn migrate_mints_table_01_to_02(db: Arc<Database>) -> Result<(), Error> {
  20. let mints: Vec<(String, String)>;
  21. {
  22. let read_txn = db.begin_read().map_err(Error::from)?;
  23. let table = read_txn.open_table(MINTS_TABLE).map_err(Error::from)?;
  24. mints = table
  25. .iter()
  26. .map_err(Error::from)?
  27. .flatten()
  28. .map(|(mint_url, mint_info)| {
  29. (mint_url.value().to_string(), mint_info.value().to_string())
  30. })
  31. .collect();
  32. }
  33. let write_txn = db.begin_write()?;
  34. {
  35. let mut table = write_txn.open_table(MINTS_TABLE).map_err(Error::from)?;
  36. for (mint_url_str, info) in mints {
  37. let mint_url = MintUrl::from_str(&mint_url_str).map_err(Error::from)?;
  38. table.remove(mint_url_str.as_str())?;
  39. table.insert(mint_url.to_string().as_str(), info.as_str())?;
  40. }
  41. }
  42. write_txn.commit()?;
  43. Ok(())
  44. }
  45. fn migrate_mint_keyset_table_01_to_02(db: Arc<Database>) -> Result<(), Error> {
  46. let mut mints: Vec<(String, Vec<Vec<u8>>)> = vec![];
  47. {
  48. let read_txn = db.begin_read().map_err(Error::from)?;
  49. let table = read_txn
  50. .open_multimap_table(MINT_KEYSETS_TABLE)
  51. .map_err(Error::from)?;
  52. let mint_keysets_range = table.iter().map_err(Error::from)?;
  53. for (url, keysets) in mint_keysets_range.flatten() {
  54. let keysets: Vec<Vec<u8>> = keysets
  55. .into_iter()
  56. .flatten()
  57. .map(|k| k.value().to_vec())
  58. .collect();
  59. mints.push((url.value().to_string(), keysets));
  60. }
  61. }
  62. let write_txn = db.begin_write()?;
  63. {
  64. let mut table = write_txn
  65. .open_multimap_table(MINT_KEYSETS_TABLE)
  66. .map_err(Error::from)?;
  67. for (mint_url_str, keysets) in mints {
  68. let mint_url = MintUrl::from_str(&mint_url_str).map_err(Error::from)?;
  69. table.remove_all(mint_url_str.as_str())?;
  70. for keyset in keysets {
  71. table.insert(mint_url.to_string().as_str(), keyset.deref())?;
  72. }
  73. }
  74. }
  75. write_txn.commit()?;
  76. Ok(())
  77. }
  78. fn migrate_trim_mint_urls_01_to_02(db: Arc<Database>) -> Result<(), Error> {
  79. migrate_mints_table_01_to_02(Arc::clone(&db))?;
  80. migrate_mint_keyset_table_01_to_02(Arc::clone(&db))?;
  81. Ok(())
  82. }