1313use crate :: commands:: OfflineWalletSubCommand :: * ;
1414use crate :: commands:: * ;
1515use crate :: error:: BDKCliError as Error ;
16+ #[ cfg( any( feature = "sqlite" , feature = "redb" ) ) ]
17+ use crate :: persister:: Persister ;
1618#[ cfg( feature = "cbf" ) ]
1719use crate :: utils:: BlockchainClient :: KyotoClient ;
1820use crate :: utils:: * ;
21+ #[ cfg( feature = "redb" ) ]
22+ use bdk_redb:: Store as RedbStore ;
1923use bdk_wallet:: bip39:: { Language , Mnemonic } ;
2024use bdk_wallet:: bitcoin:: Network ;
2125use bdk_wallet:: bitcoin:: bip32:: { DerivationPath , KeySource } ;
@@ -51,6 +55,8 @@ use crate::utils::BlockchainClient::Electrum;
5155#[ cfg( feature = "cbf" ) ]
5256use bdk_kyoto:: { Info , LightClient } ;
5357use bdk_wallet:: bitcoin:: base64:: prelude:: * ;
58+ #[ cfg( feature = "redb" ) ]
59+ use std:: sync:: Arc ;
5460#[ cfg( feature = "cbf" ) ]
5561use tokio:: select;
5662#[ cfg( any(
@@ -751,15 +757,28 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
751757 let home_dir = prepare_home_dir ( cli_opts. datadir ) ?;
752758 let wallet_name = & wallet_opts. wallet ;
753759 let database_path = prepare_wallet_db_dir ( wallet_name, & home_dir) ?;
754- #[ cfg( feature = "sqlite" ) ]
760+
761+ #[ cfg( any( feature = "sqlite" , feature = "redb" ) ) ]
755762 let result = {
756- let mut persister = match & wallet_opts. database_type {
763+ let mut persister: Persister = match & wallet_opts. database_type {
757764 #[ cfg( feature = "sqlite" ) ]
758765 DatabaseType :: Sqlite => {
759766 let db_file = database_path. join ( "wallet.sqlite" ) ;
760767 let connection = Connection :: open ( db_file) ?;
761768 log:: debug!( "Sqlite database opened successfully" ) ;
762- connection
769+ Persister :: Connection ( connection)
770+ }
771+ #[ cfg( feature = "redb" ) ]
772+ DatabaseType :: Redb => {
773+ let db = Arc :: new ( bdk_redb:: redb:: Database :: create (
774+ home_dir. join ( "wallet.redb" ) ,
775+ ) ?) ;
776+ let store = RedbStore :: new (
777+ db,
778+ wallet_name. as_deref ( ) . unwrap_or ( "wallet" ) . to_string ( ) ,
779+ ) ?;
780+ log:: debug!( "Redb database opened successfully" ) ;
781+ Persister :: RedbStore ( store)
763782 }
764783 } ;
765784
@@ -776,7 +795,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
776795 wallet. persist ( & mut persister) ?;
777796 result
778797 } ;
779- #[ cfg( not( any( feature = "sqlite" ) ) ) ]
798+ #[ cfg( not( any( feature = "sqlite" , feature = "redb" ) ) ) ]
780799 let result = {
781800 let wallet = new_wallet ( network, & wallet_opts) ?;
782801 let blockchain_client =
@@ -792,18 +811,30 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
792811 subcommand : WalletSubCommand :: OfflineWalletSubCommand ( offline_subcommand) ,
793812 } => {
794813 let network = cli_opts. network ;
795- #[ cfg( feature = "sqlite" ) ]
814+ #[ cfg( any ( feature = "sqlite" , feature = "redb" ) ) ]
796815 let result = {
797816 let home_dir = prepare_home_dir ( cli_opts. datadir ) ?;
798817 let wallet_name = & wallet_opts. wallet ;
799- let database_path = prepare_wallet_db_dir ( wallet_name, & home_dir) ?;
800- let mut persister = match & wallet_opts. database_type {
818+ let mut persister: Persister = match & wallet_opts. database_type {
801819 #[ cfg( feature = "sqlite" ) ]
802820 DatabaseType :: Sqlite => {
821+ let database_path = prepare_wallet_db_dir ( wallet_name, & home_dir) ?;
803822 let db_file = database_path. join ( "wallet.sqlite" ) ;
804823 let connection = Connection :: open ( db_file) ?;
805824 log:: debug!( "Sqlite database opened successfully" ) ;
806- connection
825+ Persister :: Connection ( connection)
826+ }
827+ #[ cfg( feature = "redb" ) ]
828+ DatabaseType :: Redb => {
829+ let db = Arc :: new ( bdk_redb:: redb:: Database :: create (
830+ home_dir. join ( "wallet.redb" ) ,
831+ ) ?) ;
832+ let store = RedbStore :: new (
833+ db,
834+ wallet_name. as_deref ( ) . unwrap_or ( "wallet" ) . to_string ( ) ,
835+ ) ?;
836+ log:: debug!( "Redb database opened successfully" ) ;
837+ Persister :: RedbStore ( store)
807838 }
808839 } ;
809840
@@ -816,7 +847,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
816847 wallet. persist ( & mut persister) ?;
817848 result
818849 } ;
819- #[ cfg( not( any( feature = "sqlite" ) ) ) ]
850+ #[ cfg( not( any( feature = "sqlite" , feature = "redb" ) ) ) ]
820851 let result = {
821852 let mut wallet = new_wallet ( network, & wallet_opts) ?;
822853 handle_offline_wallet_subcommand ( & mut wallet, & wallet_opts, offline_subcommand) ?
@@ -840,27 +871,38 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
840871 #[ cfg( feature = "repl" ) ]
841872 CliSubCommand :: Repl { wallet_opts } => {
842873 let network = cli_opts. network ;
843- #[ cfg( feature = "sqlite" ) ]
874+ #[ cfg( any ( feature = "sqlite" , feature = "redb" ) ) ]
844875 let ( mut wallet, mut persister) = {
845876 let wallet_name = & wallet_opts. wallet ;
846877
847878 let home_dir = prepare_home_dir ( cli_opts. datadir . clone ( ) ) ?;
848879
849- let database_path = prepare_wallet_db_dir ( wallet_name, & home_dir) ?;
850-
851- let mut persister = match & wallet_opts. database_type {
880+ let mut persister: Persister = match & wallet_opts. database_type {
852881 #[ cfg( feature = "sqlite" ) ]
853882 DatabaseType :: Sqlite => {
883+ let database_path = prepare_wallet_db_dir ( wallet_name, & home_dir) ?;
854884 let db_file = database_path. join ( "wallet.sqlite" ) ;
855885 let connection = Connection :: open ( db_file) ?;
856886 log:: debug!( "Sqlite database opened successfully" ) ;
857- connection
887+ Persister :: Connection ( connection)
888+ }
889+ #[ cfg( feature = "redb" ) ]
890+ DatabaseType :: Redb => {
891+ let db = Arc :: new ( bdk_redb:: redb:: Database :: create (
892+ home_dir. join ( "wallet.redb" ) ,
893+ ) ?) ;
894+ let store = RedbStore :: new (
895+ db,
896+ wallet_name. as_deref ( ) . unwrap_or ( "wallet" ) . to_string ( ) ,
897+ ) ?;
898+ log:: debug!( "Redb database opened successfully" ) ;
899+ Persister :: RedbStore ( store)
858900 }
859901 } ;
860902 let wallet = new_persisted_wallet ( network, & mut persister, & wallet_opts) ?;
861903 ( wallet, persister)
862904 } ;
863- #[ cfg( not( any( feature = "sqlite" ) ) ) ]
905+ #[ cfg( not( any( feature = "sqlite" , feature = "redb" ) ) ) ]
864906 let mut wallet = new_wallet ( network, & wallet_opts) ?;
865907 let home_dir = prepare_home_dir ( cli_opts. datadir . clone ( ) ) ?;
866908 let database_path = prepare_wallet_db_dir ( & wallet_opts. wallet , & home_dir) ?;
@@ -880,7 +922,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
880922 database_path. clone ( ) ,
881923 )
882924 . await ;
883- #[ cfg( feature = "sqlite" ) ]
925+ #[ cfg( any ( feature = "sqlite" , feature = "redb" ) ) ]
884926 wallet. persist ( & mut persister) ?;
885927
886928 match result {
0 commit comments