From 00c38742540db538690e877573ce827405494deb Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sun, 5 Jun 2022 19:46:18 +0200 Subject: [PATCH 1/2] added mode attribute tag --- frame/support/procedural/src/lib.rs | 5 +++ frame/support/procedural/src/transactional.rs | 16 ++++++++ frame/support/src/storage/mod.rs | 1 + frame/support/src/storage/transactional.rs | 37 ++++++++++++++++++- 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index 418fad56b7674..439d53b4ec2f7 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -434,6 +434,11 @@ pub fn transactional(attr: TokenStream, input: TokenStream) -> TokenStream { transactional::transactional(attr, input).unwrap_or_else(|e| e.to_compile_error().into()) } +#[proc_macro_attribute] +pub fn without_transactional(attr: TokenStream, input: TokenStream) -> TokenStream { + transactional::without_transactional(attr, input).unwrap_or_else(|e| e.to_compile_error().into()) +} + #[proc_macro_attribute] pub fn require_transactional(attr: TokenStream, input: TokenStream) -> TokenStream { transactional::require_transactional(attr, input) diff --git a/frame/support/procedural/src/transactional.rs b/frame/support/procedural/src/transactional.rs index eb77a320a509f..e16926538b8c4 100644 --- a/frame/support/procedural/src/transactional.rs +++ b/frame/support/procedural/src/transactional.rs @@ -42,6 +42,22 @@ pub fn transactional(_attr: TokenStream, input: TokenStream) -> Result Result { + let ItemFn { attrs, vis, sig, block } = syn::parse(input)?; + + let crate_ = generate_crate_access_2018("frame-support")?; + let output = quote! { + #(#attrs)* + #vis #sig { + use #crate_::storage::set_transactional_mode; + set_transactional_mode(); + #block + } + }; + + Ok(output.into()) +} + pub fn require_transactional(_attr: TokenStream, input: TokenStream) -> Result { let ItemFn { attrs, vis, sig, block } = syn::parse(input)?; diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index 6911da630cb34..787bb4353c80f 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -32,6 +32,7 @@ use sp_std::{marker::PhantomData, prelude::*}; pub use self::{ transactional::{ in_storage_layer, with_storage_layer, with_transaction, with_transaction_unchecked, + set_transactional_mode }, types::StorageEntryMetadataBuilder, }; diff --git a/frame/support/src/storage/transactional.rs b/frame/support/src/storage/transactional.rs index d1bdb30af947b..dc51fa07e30f6 100644 --- a/frame/support/src/storage/transactional.rs +++ b/frame/support/src/storage/transactional.rs @@ -35,6 +35,8 @@ pub type Layer = u32; pub const TRANSACTION_LEVEL_KEY: &[u8] = b":transaction_level:"; /// The maximum number of nested layers. pub const TRANSACTIONAL_LIMIT: Layer = 255; +/// The key that holds if transactional is being used. +pub const TRANSACTIONAL_MODE_KEY: &[u8] = b":transactional_mode:"; /// Returns the current number of nested transactional layers. fn get_transaction_level() -> Layer { @@ -89,7 +91,17 @@ impl Drop for StorageLayerGuard { /// Check if the current call is within a transactional layer. pub fn is_transactional() -> bool { - get_transaction_level() > 0 + get_transaction_level() > 0 && get_transactional_mode() +} + +/// Returns the mode of transactional +pub fn get_transactional_mode() -> bool { + crate::storage::unhashed::get_or::(TRANSACTIONAL_MODE_KEY, true) +} + +/// Set the value of transactional mode +pub fn set_transactional_mode(value: bool) { + crate::storage::unhashed::put::(TRANSACTIONAL_MODE_KEY, &value); } /// Execute the supplied function in a new storage transaction. @@ -298,4 +310,27 @@ mod tests { assert_noop!(res, "epic fail"); }); } + + #[test] + fn transactional_mode_should_be_true_by_default() { + TestExternalities::default().execute_with(|| { + assert_eq!(get_transactional_mode(), true); + }); + } + + #[test] + fn set_transactional_mode_should_work(){ + TestExternalities::default().execute_with(|| { + set_transactional_mode(false); + assert_eq!(get_transactional_mode(), false); + }); + } + + #[test] + fn is_transactional_should_be_false_when_mode_false() { + TestExternalities::default().execute_with(|| { + set_transactional_mode(false); + assert_eq!(is_transactional(), false); + }); + } } From d3f6b6cf890b1d62b3ef3c2ea15afa370a7506d0 Mon Sep 17 00:00:00 2001 From: Szegoo Date: Sun, 5 Jun 2022 19:53:00 +0200 Subject: [PATCH 2/2] fmt --- frame/support/procedural/src/lib.rs | 3 ++- frame/support/src/storage/mod.rs | 4 ++-- frame/support/src/storage/transactional.rs | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index 439d53b4ec2f7..4be6e265f0f84 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -436,7 +436,8 @@ pub fn transactional(attr: TokenStream, input: TokenStream) -> TokenStream { #[proc_macro_attribute] pub fn without_transactional(attr: TokenStream, input: TokenStream) -> TokenStream { - transactional::without_transactional(attr, input).unwrap_or_else(|e| e.to_compile_error().into()) + transactional::without_transactional(attr, input) + .unwrap_or_else(|e| e.to_compile_error().into()) } #[proc_macro_attribute] diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index 787bb4353c80f..7df86ad998be0 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -31,8 +31,8 @@ use sp_std::{marker::PhantomData, prelude::*}; pub use self::{ transactional::{ - in_storage_layer, with_storage_layer, with_transaction, with_transaction_unchecked, - set_transactional_mode + in_storage_layer, set_transactional_mode, with_storage_layer, with_transaction, + with_transaction_unchecked, }, types::StorageEntryMetadataBuilder, }; diff --git a/frame/support/src/storage/transactional.rs b/frame/support/src/storage/transactional.rs index dc51fa07e30f6..d3bdcfdd6ca43 100644 --- a/frame/support/src/storage/transactional.rs +++ b/frame/support/src/storage/transactional.rs @@ -319,7 +319,7 @@ mod tests { } #[test] - fn set_transactional_mode_should_work(){ + fn set_transactional_mode_should_work() { TestExternalities::default().execute_with(|| { set_transactional_mode(false); assert_eq!(get_transactional_mode(), false);