Cleanup some flatbuffer usage

This commit is contained in:
Hanh 2023-03-01 23:09:45 +10:00
parent 12aa5328ab
commit 078af89cae
3 changed files with 38 additions and 56 deletions

View File

@ -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<Vec<u8>> {
let mut builder = flatbuffers::FlatBufferBuilder::new();
pub fn get_backup_package(coin: u8, id_account: u32) -> anyhow::Result<BackupT> {
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<Vec<u8>>
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<Vec<u8>>
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

View File

@ -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))
}

View File

@ -243,8 +243,7 @@ pub fn get_notes(connection: &Connection, id: u32) -> Result<Vec<u8>> {
Ok(data)
}
pub fn get_txs(connection: &Connection, id: u32) -> Result<Vec<u8>> {
let mut builder = flatbuffers::FlatBufferBuilder::new();
pub fn get_txs(connection: &Connection, id: u32) -> Result<ShieldedTxVecT> {
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<Vec<u8>> {
let timestamp: u32 = row.get("timestamp")?;
let contact_name: Option<String> = row.get("cname")?;
let account_name: Option<String> = 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<String> = row.get("address")?;
let memo: Option<String> = 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<Vec<u8>> {