From 078af89cae4d5e8a229aabb2bfa934e73e257094 Mon Sep 17 00:00:00 2001 From: Hanh Date: Wed, 1 Mar 2023 23:09:45 +1000 Subject: [PATCH] Cleanup some flatbuffer usage --- src/api/account.rs | 35 ++++++++++++----------------------- src/api/dart_ffi.rs | 15 +++++++++++---- src/db/read.rs | 44 +++++++++++++++----------------------------- 3 files changed, 38 insertions(+), 56 deletions(-) diff --git a/src/api/account.rs b/src/api/account.rs index 12b1abe..0535344 100644 --- a/src/api/account.rs +++ b/src/api/account.rs @@ -5,7 +5,7 @@ use crate::coinconfig::CoinConfig; use crate::db::data_generated::fb::{ AddressBalance, AddressBalanceArgs, AddressBalanceVec, AddressBalanceVecArgs, Backup, - BackupArgs, + BackupArgs, BackupT, }; use crate::db::AccountData; use crate::key2::decode_key; @@ -120,8 +120,7 @@ pub fn convert_to_watchonly(coin: u8, id_account: u32) -> anyhow::Result<()> { Ok(()) } -pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result> { - let mut builder = flatbuffers::FlatBufferBuilder::new(); +pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result { let c = CoinConfig::get(coin); let network = c.chain.network(); let db = c.db()?; @@ -133,9 +132,6 @@ pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result> aindex, .. } = db.get_account_info(id_account)?; - let name = builder.create_string(&name); - let seed = seed.map(|seed| builder.create_string(&seed)); - let sk = sk.map(|sk| builder.create_string(&sk)); let orchard_keys = db.get_orchard(id_account)?; let uvk = orchard_keys.map(|OrchardKeyBytes { fvk: ofvk, .. }| { // orchard sk is not serializable and must derived from seed @@ -145,24 +141,17 @@ pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result> let sapling_dfvk = sapling_efvk.to_diversifiable_full_viewing_key(); let orchard_fvk = orchard::keys::FullViewingKey::from_bytes(&ofvk); let ufvk = UnifiedFullViewingKey::new(Some(sapling_dfvk), orchard_fvk).unwrap(); - let ufvk = ufvk.encode(network); - builder.create_string(&ufvk) + ufvk.encode(network) }); - let fvk = builder.create_string(&fvk); - let backup = Backup::create( - &mut builder, - &BackupArgs { - name: Some(name), - seed, - index: aindex, - sk, - fvk: Some(fvk), - uvk, - }, - ); - builder.finish(backup, None); - let data = builder.finished_data().to_vec(); - Ok(data) + let backup = BackupT { + name: Some(name), + seed, + index: aindex, + sk, + fvk: Some(fvk), + uvk, + }; + Ok(backup) } /// Update the transparent secret key for the given account from a derivation path diff --git a/src/api/dart_ffi.rs b/src/api/dart_ffi.rs index ccfe491..fedbedd 100644 --- a/src/api/dart_ffi.rs +++ b/src/api/dart_ffi.rs @@ -5,6 +5,7 @@ use crate::note_selection::TransactionReport; use crate::{ChainError, TransactionPlan, Tx}; use allo_isolate::{ffi, IntoDart}; use android_logger::Config; +use flatbuffers::FlatBufferBuilder; use lazy_static::lazy_static; use log::Level; use rusqlite::Connection; @@ -238,8 +239,11 @@ pub unsafe extern "C" fn convert_to_watchonly(coin: u8, id_account: u32) -> CRes #[no_mangle] pub unsafe extern "C" fn get_backup(coin: u8, id_account: u32) -> CResult<*const u8> { let res = || { - let backup_bytes = crate::api::account::get_backup_package(coin, id_account)?; - Ok::<_, anyhow::Error>(backup_bytes) + let mut builder = FlatBufferBuilder::new(); + let backup = crate::api::account::get_backup_package(coin, id_account)?; + let backup_bytes = backup.pack(&mut builder); + builder.finish(backup_bytes, None); + Ok::<_, anyhow::Error>(builder.finished_data().to_vec()) }; to_cresult_bytes(res()) @@ -925,8 +929,11 @@ pub unsafe extern "C" fn get_notes(coin: u8, id: u32) -> CResult<*const u8> { #[no_mangle] pub unsafe extern "C" fn get_txs(coin: u8, id: u32) -> CResult<*const u8> { let res = |connection: &Connection| { - let data = crate::db::read::get_txs(connection, id)?; - Ok(data) + let shielded_txs = crate::db::read::get_txs(connection, id)?; + let mut builder = FlatBufferBuilder::new(); + let shielded_txs = shielded_txs.pack(&mut builder); + builder.finish(shielded_txs, None); + Ok(builder.finished_data().to_vec()) }; to_cresult_bytes(with_account(coin, res)) } diff --git a/src/db/read.rs b/src/db/read.rs index e4c4377..998d81b 100644 --- a/src/db/read.rs +++ b/src/db/read.rs @@ -243,8 +243,7 @@ pub fn get_notes(connection: &Connection, id: u32) -> Result> { Ok(data) } -pub fn get_txs(connection: &Connection, id: u32) -> Result> { - let mut builder = flatbuffers::FlatBufferBuilder::new(); +pub fn get_txs(connection: &Connection, id: u32) -> Result { let mut stmt = connection.prepare( "SELECT id_tx, txid, height, timestamp, t.address, c.name AS cname, a.name AS aname, value, memo FROM transactions t \ LEFT JOIN contacts c ON t.address = c.address \ @@ -260,42 +259,29 @@ pub fn get_txs(connection: &Connection, id: u32) -> Result> { let timestamp: u32 = row.get("timestamp")?; let contact_name: Option = row.get("cname")?; let account_name: Option = row.get("aname")?; - let name = contact_name.or(account_name).unwrap_or(String::new()); + let name = contact_name.or(account_name); let value: i64 = row.get("value")?; let address: Option = row.get("address")?; let memo: Option = row.get("memo")?; - let address = address.unwrap_or(String::new()); - let memo = memo.unwrap_or(String::new()); - let tx_id = builder.create_string(&tx_id); - let short_tx_id = builder.create_string(&short_tx_id); - let name = builder.create_string(&name); - let address = builder.create_string(&address); - let memo = builder.create_string(&memo); - let tx = ShieldedTx::create( - &mut builder, - &ShieldedTxArgs { - id: id_tx, - height, - tx_id: Some(tx_id), - short_tx_id: Some(short_tx_id), - timestamp, - name: Some(name), - value: value as u64, - address: Some(address), - memo: Some(memo), - }, - ); + let tx = ShieldedTxT { + id: id_tx, + height, + tx_id: Some(tx_id), + short_tx_id: Some(short_tx_id), + timestamp, + name, + value: value as u64, + address, + memo, + }; Ok(tx) })?; let mut txs = vec![]; for r in rows { txs.push(r?); } - let txs = builder.create_vector(&txs); - let txs = ShieldedTxVec::create(&mut builder, &ShieldedTxVecArgs { txs: Some(txs) }); - builder.finish(txs, None); - let data = builder.finished_data().to_vec(); - Ok(data) + let txs = ShieldedTxVecT { txs: Some(txs) }; + Ok(txs) } pub fn get_messages(connection: &Connection, id: u32) -> Result> {