Upgrade rusqlite to version 0.25

This commit is contained in:
Kris Nuttycombe 2022-10-02 09:09:52 -06:00
parent 81e0d482d0
commit f7aa7b2c84
12 changed files with 143 additions and 157 deletions

View File

@ -23,3 +23,5 @@ zcash_encoding = { path = "components/zcash_encoding" }
zcash_note_encryption = { path = "components/zcash_note_encryption" } zcash_note_encryption = { path = "components/zcash_note_encryption" }
orchard = { git = "https://github.com/zcash/orchard.git", rev = "33f1c1141e50adb68715f3359bd75378b4756cca" } orchard = { git = "https://github.com/zcash/orchard.git", rev = "33f1c1141e50adb68715f3359bd75378b4756cca" }
group = { git = "https://github.com/zkcrypto/group.git", rev = "f61e3e420ed1220c8f1f80988f8c6c5e202d8715" } group = { git = "https://github.com/zkcrypto/group.git", rev = "f61e3e420ed1220c8f1f80988f8c6c5e202d8715" }
schemer = { git = "https://github.com/nuttycom/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" }
schemer-rusqlite = { git = "https://github.com/nuttycom/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" }

View File

@ -21,7 +21,7 @@ hdwallet = { version = "0.3.1", optional = true }
jubjub = "0.9" jubjub = "0.9"
protobuf = "~2.27.1" # MSRV 1.52.1 protobuf = "~2.27.1" # MSRV 1.52.1
rand_core = "0.6" rand_core = "0.6"
rusqlite = { version = "0.24", features = ["bundled", "time"] } rusqlite = { version = "0.25", features = ["bundled", "time"] }
secp256k1 = { version = "0.21" } secp256k1 = { version = "0.21" }
schemer = "0.2" schemer = "0.2"
schemer-rusqlite = "0.2" schemer-rusqlite = "0.2"

View File

@ -12,7 +12,7 @@ use crate::{error::SqliteClientError, BlockDb};
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
use { use {
crate::{BlockHash, FsBlockDb}, crate::{BlockHash, FsBlockDb},
rusqlite::{Connection, NO_PARAMS}, rusqlite::Connection,
std::fs::File, std::fs::File,
std::io::BufReader, std::io::BufReader,
std::path::{Path, PathBuf}, std::path::{Path, PathBuf},
@ -107,7 +107,7 @@ pub(crate) fn blockmetadb_insert(
VALUES (?, ?, ?, ?, ?)" VALUES (?, ?, ?, ?, ?)"
)?; )?;
conn.execute("BEGIN IMMEDIATE", NO_PARAMS)?; conn.execute("BEGIN IMMEDIATE", [])?;
let result = block_meta let result = block_meta
.iter() .iter()
.map(|m| { .map(|m| {
@ -122,11 +122,11 @@ pub(crate) fn blockmetadb_insert(
.collect::<Result<Vec<_>, _>>(); .collect::<Result<Vec<_>, _>>();
match result { match result {
Ok(_) => { Ok(_) => {
conn.execute("COMMIT", NO_PARAMS)?; conn.execute("COMMIT", [])?;
Ok(()) Ok(())
} }
Err(error) => { Err(error) => {
match conn.execute("ROLLBACK", NO_PARAMS) { match conn.execute("ROLLBACK", []) {
Ok(_) => Err(error), Ok(_) => Err(error),
Err(e) => Err(e) =>
// Panicking here is probably the right thing to do, because it // Panicking here is probably the right thing to do, because it
@ -145,16 +145,12 @@ pub(crate) fn blockmetadb_insert(
pub(crate) fn blockmetadb_get_max_cached_height( pub(crate) fn blockmetadb_get_max_cached_height(
conn: &Connection, conn: &Connection,
) -> Result<Option<BlockHeight>, rusqlite::Error> { ) -> Result<Option<BlockHeight>, rusqlite::Error> {
conn.query_row( conn.query_row("SELECT MAX(height) FROM compactblocks_meta", [], |row| {
"SELECT MAX(height) FROM compactblocks_meta",
NO_PARAMS,
|row| {
// `SELECT MAX(_)` will always return a row, but it will return `null` if the // `SELECT MAX(_)` will always return a row, but it will return `null` if the
// table is empty, which has no integer type. We handle the optionality here. // table is empty, which has no integer type. We handle the optionality here.
let h: Option<u32> = row.get(0)?; let h: Option<u32> = row.get(0)?;
Ok(h.map(BlockHeight::from)) Ok(h.map(BlockHeight::from))
}, })
)
} }
/// Implements a traversal of `limit` blocks of the filesystem-backed /// Implements a traversal of `limit` blocks of the filesystem-backed

View File

@ -1,6 +1,4 @@
//! Functions for initializing the various databases. //! Functions for initializing the various databases.
use rusqlite::NO_PARAMS;
use crate::BlockDb; use crate::BlockDb;
#[cfg(feature = "unstable")] #[cfg(feature = "unstable")]
@ -32,7 +30,7 @@ pub fn init_cache_database(db_cache: &BlockDb) -> Result<(), rusqlite::Error> {
height INTEGER PRIMARY KEY, height INTEGER PRIMARY KEY,
data BLOB NOT NULL data BLOB NOT NULL
)", )",
NO_PARAMS, [],
)?; )?;
Ok(()) Ok(())
} }

View File

@ -40,7 +40,7 @@ use std::path::Path;
#[cfg(feature = "transparent-inputs")] #[cfg(feature = "transparent-inputs")]
use std::collections::HashSet; use std::collections::HashSet;
use rusqlite::{Connection, NO_PARAMS}; use rusqlite::Connection;
use zcash_primitives::{ use zcash_primitives::{
block::BlockHash, block::BlockHash,
@ -385,14 +385,14 @@ impl<'a, P: consensus::Parameters> DataConnStmtCache<'a, P> {
where where
F: FnOnce(&mut Self) -> Result<A, SqliteClientError>, F: FnOnce(&mut Self) -> Result<A, SqliteClientError>,
{ {
self.wallet_db.conn.execute("BEGIN IMMEDIATE", NO_PARAMS)?; self.wallet_db.conn.execute("BEGIN IMMEDIATE", [])?;
match f(self) { match f(self) {
Ok(result) => { Ok(result) => {
self.wallet_db.conn.execute("COMMIT", NO_PARAMS)?; self.wallet_db.conn.execute("COMMIT", [])?;
Ok(result) Ok(result)
} }
Err(error) => { Err(error) => {
match self.wallet_db.conn.execute("ROLLBACK", NO_PARAMS) { match self.wallet_db.conn.execute("ROLLBACK", []) {
Ok(_) => Err(error), Ok(_) => Err(error),
Err(e) => Err(e) =>
// Panicking here is probably the right thing to do, because it // Panicking here is probably the right thing to do, because it

View File

@ -271,7 +271,7 @@ impl<'a, P> DataConnStmtCache<'a, P> {
(":fee", &fee.map(i64::from)), (":fee", &fee.map(i64::from)),
(":txid", &&txid.as_ref()[..]), (":txid", &&txid.as_ref()[..]),
]; ];
match self.stmt_update_tx_data.execute_named(sql_args)? { match self.stmt_update_tx_data.execute(sql_args)? {
0 => Ok(false), 0 => Ok(false),
1 => Ok(true), 1 => Ok(true),
_ => unreachable!("txid column is marked as UNIQUE"), _ => unreachable!("txid column is marked as UNIQUE"),
@ -322,10 +322,7 @@ impl<'a, P> DataConnStmtCache<'a, P> {
(":prevout_idx", &outpoint.n()), (":prevout_idx", &outpoint.n()),
]; ];
match self match self.stmt_mark_transparent_utxo_spent.execute(sql_args)? {
.stmt_mark_transparent_utxo_spent
.execute_named(sql_args)?
{
0 => Ok(false), 0 => Ok(false),
1 => Ok(true), 1 => Ok(true),
_ => unreachable!("tx_outpoint constraint is marked as UNIQUE"), _ => unreachable!("tx_outpoint constraint is marked as UNIQUE"),
@ -353,7 +350,7 @@ impl<'a, P: consensus::Parameters> DataConnStmtCache<'a, P> {
]; ];
self.stmt_insert_received_transparent_utxo self.stmt_insert_received_transparent_utxo
.execute_named(sql_args)?; .execute(sql_args)?;
Ok(self.wallet_db.conn.last_insert_rowid()) Ok(self.wallet_db.conn.last_insert_rowid())
} }
@ -373,7 +370,7 @@ impl<'a, P: consensus::Parameters> DataConnStmtCache<'a, P> {
(":above_height", &u32::from(height)), (":above_height", &u32::from(height)),
]; ];
let rows = self.stmt_delete_utxos.execute_named(sql_args)?; let rows = self.stmt_delete_utxos.execute(sql_args)?;
Ok(rows) Ok(rows)
} }
@ -394,7 +391,7 @@ impl<'a, P: consensus::Parameters> DataConnStmtCache<'a, P> {
(":address", &address.encode(&self.wallet_db.params)), (":address", &address.encode(&self.wallet_db.params)),
]; ];
self.stmt_insert_address.execute_named(sql_args)?; self.stmt_insert_address.execute(sql_args)?;
Ok(self.wallet_db.conn.last_insert_rowid()) Ok(self.wallet_db.conn.last_insert_rowid())
} }
@ -439,7 +436,7 @@ impl<'a, P> DataConnStmtCache<'a, P> {
(":is_change", &is_change), (":is_change", &is_change),
]; ];
self.stmt_insert_received_note.execute_named(sql_args)?; self.stmt_insert_received_note.execute(sql_args)?;
Ok(NoteId::ReceivedNoteId( Ok(NoteId::ReceivedNoteId(
self.wallet_db.conn.last_insert_rowid(), self.wallet_db.conn.last_insert_rowid(),
@ -483,7 +480,7 @@ impl<'a, P> DataConnStmtCache<'a, P> {
(":output_index", &(output_index as i64)), (":output_index", &(output_index as i64)),
]; ];
match self.stmt_update_received_note.execute_named(sql_args)? { match self.stmt_update_received_note.execute(sql_args)? {
0 => Ok(false), 0 => Ok(false),
1 => Ok(true), 1 => Ok(true),
_ => unreachable!("tx_output constraint is marked as UNIQUE"), _ => unreachable!("tx_output constraint is marked as UNIQUE"),
@ -536,7 +533,7 @@ impl<'a, P> DataConnStmtCache<'a, P> {
.map(|m| m.as_slice()), .map(|m| m.as_slice()),
), ),
]; ];
self.stmt_insert_sent_note.execute_named(sql_args)?; self.stmt_insert_sent_note.execute(sql_args)?;
Ok(()) Ok(())
} }
@ -568,7 +565,7 @@ impl<'a, P> DataConnStmtCache<'a, P> {
(":output_pool", &pool_type.typecode()), (":output_pool", &pool_type.typecode()),
(":output_index", &i64::try_from(output_index).unwrap()), (":output_index", &i64::try_from(output_index).unwrap()),
]; ];
match self.stmt_update_sent_note.execute_named(sql_args)? { match self.stmt_update_sent_note.execute(sql_args)? {
0 => Ok(false), 0 => Ok(false),
1 => Ok(true), 1 => Ok(true),
_ => unreachable!("tx_output constraint is marked as UNIQUE"), _ => unreachable!("tx_output constraint is marked as UNIQUE"),
@ -605,14 +602,14 @@ impl<'a, P> DataConnStmtCache<'a, P> {
below_height: BlockHeight, below_height: BlockHeight,
) -> Result<(), SqliteClientError> { ) -> Result<(), SqliteClientError> {
self.stmt_prune_witnesses self.stmt_prune_witnesses
.execute(&[u32::from(below_height)])?; .execute([u32::from(below_height)])?;
Ok(()) Ok(())
} }
/// Marks notes that have not been mined in transactions as expired, up to the given /// Marks notes that have not been mined in transactions as expired, up to the given
/// block height. /// block height.
pub fn stmt_update_expired(&mut self, height: BlockHeight) -> Result<(), SqliteClientError> { pub fn stmt_update_expired(&mut self, height: BlockHeight) -> Result<(), SqliteClientError> {
self.stmt_update_expired.execute(&[u32::from(height)])?; self.stmt_update_expired.execute([u32::from(height)])?;
Ok(()) Ok(())
} }
} }

View File

@ -8,7 +8,7 @@
//! [`WalletWrite`]: zcash_client_backend::data_api::WalletWrite //! [`WalletWrite`]: zcash_client_backend::data_api::WalletWrite
use group::ff::PrimeField; use group::ff::PrimeField;
use rusqlite::{OptionalExtension, ToSql, NO_PARAMS}; use rusqlite::{named_params, OptionalExtension, ToSql};
use std::collections::HashMap; use std::collections::HashMap;
use std::convert::TryFrom; use std::convert::TryFrom;
@ -164,7 +164,7 @@ pub fn get_address<P: consensus::Parameters>(
FROM addresses WHERE account = ? FROM addresses WHERE account = ?
ORDER BY diversifier_index_be DESC ORDER BY diversifier_index_be DESC
LIMIT 1", LIMIT 1",
&[u32::from(account)], [u32::from(account)],
|row| row.get(0), |row| row.get(0),
)?; )?;
@ -184,7 +184,7 @@ pub(crate) fn get_max_account_id<P>(
) -> Result<Option<AccountId>, SqliteClientError> { ) -> Result<Option<AccountId>, SqliteClientError> {
// This returns the most recently generated address. // This returns the most recently generated address.
wdb.conn wdb.conn
.query_row("SELECT MAX(account) FROM accounts", NO_PARAMS, |row| { .query_row("SELECT MAX(account) FROM accounts", [], |row| {
let account_id: Option<u32> = row.get(0)?; let account_id: Option<u32> = row.get(0)?;
Ok(account_id.map(AccountId::from)) Ok(account_id.map(AccountId::from))
}) })
@ -207,12 +207,12 @@ pub(crate) fn add_account_internal<P: consensus::Parameters, E: From<rusqlite::E
key: &UnifiedFullViewingKey, key: &UnifiedFullViewingKey,
) -> Result<(), E> { ) -> Result<(), E> {
let ufvk_str: String = key.encode(network); let ufvk_str: String = key.encode(network);
conn.execute_named( conn.execute(
&format!( &format!(
"INSERT INTO {} (account, ufvk) VALUES (:account, :ufvk)", "INSERT INTO {} (account, ufvk) VALUES (:account, :ufvk)",
accounts_table accounts_table
), ),
&[(":account", &<u32>::from(account)), (":ufvk", &ufvk_str)], named_params![":account": &<u32>::from(account), ":ufvk": &ufvk_str],
)?; )?;
// Always derive the default Unified Address for the account. // Always derive the default Unified Address for the account.
@ -220,13 +220,13 @@ pub(crate) fn add_account_internal<P: consensus::Parameters, E: From<rusqlite::E
let address_str: String = address.encode(network); let address_str: String = address.encode(network);
// the diversifier index is stored in big-endian order to allow sorting // the diversifier index is stored in big-endian order to allow sorting
idx.0.reverse(); idx.0.reverse();
conn.execute_named( conn.execute(
"INSERT INTO addresses (account, diversifier_index_be, address) "INSERT INTO addresses (account, diversifier_index_be, address)
VALUES (:account, :diversifier_index_be, :address)", VALUES (:account, :diversifier_index_be, :address)",
&[ named_params![
(":account", &<u32>::from(account)), ":account": &<u32>::from(account),
(":diversifier_index_be", &&idx.0[..]), ":diversifier_index_be": &&idx.0[..],
(":address", &address_str), ":address": &address_str,
], ],
)?; )?;
@ -240,12 +240,12 @@ pub(crate) fn get_current_address<P: consensus::Parameters>(
// This returns the most recently generated address. // This returns the most recently generated address.
let addr: Option<(String, Vec<u8>)> = wdb let addr: Option<(String, Vec<u8>)> = wdb
.conn .conn
.query_row_named( .query_row(
"SELECT address, diversifier_index_be "SELECT address, diversifier_index_be
FROM addresses WHERE account = :account FROM addresses WHERE account = :account
ORDER BY diversifier_index_be DESC ORDER BY diversifier_index_be DESC
LIMIT 1", LIMIT 1",
&[(":account", &u32::from(account))], named_params![":account": &u32::from(account)],
|row| Ok((row.get(0)?, row.get(1)?)), |row| Ok((row.get(0)?, row.get(1)?)),
) )
.optional()?; .optional()?;
@ -285,7 +285,7 @@ pub(crate) fn get_transparent_receivers<P: consensus::Parameters>(
let mut ua_query = wdb let mut ua_query = wdb
.conn .conn
.prepare("SELECT address FROM addresses WHERE account = :account")?; .prepare("SELECT address FROM addresses WHERE account = :account")?;
let mut rows = ua_query.query_named(&[(":account", &u32::from(account))])?; let mut rows = ua_query.query(named_params![":account": &u32::from(account)])?;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let ua_str: String = row.get(0)?; let ua_str: String = row.get(0)?;
@ -308,7 +308,7 @@ pub(crate) fn get_transparent_receivers<P: consensus::Parameters>(
// Get the UFVK for the account. // Get the UFVK for the account.
let ufvk_str: String = wdb.conn.query_row( let ufvk_str: String = wdb.conn.query_row(
"SELECT ufvk FROM accounts WHERE account = :account", "SELECT ufvk FROM accounts WHERE account = :account",
&[u32::from(account)], [u32::from(account)],
|row| row.get(0), |row| row.get(0),
)?; )?;
let ufvk = UnifiedFullViewingKey::decode(&wdb.params, &ufvk_str) let ufvk = UnifiedFullViewingKey::decode(&wdb.params, &ufvk_str)
@ -333,7 +333,7 @@ pub(crate) fn get_unified_full_viewing_keys<P: consensus::Parameters>(
.conn .conn
.prepare("SELECT account, ufvk FROM accounts ORDER BY account ASC")?; .prepare("SELECT account, ufvk FROM accounts ORDER BY account ASC")?;
let rows = stmt_fetch_accounts.query_map(NO_PARAMS, |row| { let rows = stmt_fetch_accounts.query_map([], |row| {
let acct: u32 = row.get(0)?; let acct: u32 = row.get(0)?;
let account = AccountId::from(acct); let account = AccountId::from(acct);
let ufvk_str: String = row.get(1)?; let ufvk_str: String = row.get(1)?;
@ -366,7 +366,7 @@ pub fn is_valid_account_extfvk<P: consensus::Parameters>(
) -> Result<bool, SqliteClientError> { ) -> Result<bool, SqliteClientError> {
wdb.conn wdb.conn
.prepare("SELECT ufvk FROM accounts WHERE account = ?")? .prepare("SELECT ufvk FROM accounts WHERE account = ?")?
.query_row(&[u32::from(account).to_sql()?], |row| { .query_row([u32::from(account).to_sql()?], |row| {
row.get(0).map(|ufvk_str: String| { row.get(0).map(|ufvk_str: String| {
UnifiedFullViewingKey::decode(&wdb.params, &ufvk_str) UnifiedFullViewingKey::decode(&wdb.params, &ufvk_str)
.map_err(SqliteClientError::CorruptedData) .map_err(SqliteClientError::CorruptedData)
@ -419,7 +419,7 @@ pub fn get_balance<P>(wdb: &WalletDb<P>, account: AccountId) -> Result<Amount, S
"SELECT SUM(value) FROM received_notes "SELECT SUM(value) FROM received_notes
INNER JOIN transactions ON transactions.id_tx = received_notes.tx INNER JOIN transactions ON transactions.id_tx = received_notes.tx
WHERE account = ? AND spent IS NULL AND transactions.block IS NOT NULL", WHERE account = ? AND spent IS NULL AND transactions.block IS NOT NULL",
&[u32::from(account)], [u32::from(account)],
|row| row.get(0).or(Ok(0)), |row| row.get(0).or(Ok(0)),
)?; )?;
@ -464,7 +464,7 @@ pub fn get_balance_at<P>(
"SELECT SUM(value) FROM received_notes "SELECT SUM(value) FROM received_notes
INNER JOIN transactions ON transactions.id_tx = received_notes.tx INNER JOIN transactions ON transactions.id_tx = received_notes.tx
WHERE account = ? AND spent IS NULL AND transactions.block <= ?", WHERE account = ? AND spent IS NULL AND transactions.block <= ?",
&[u32::from(account), u32::from(anchor_height)], [u32::from(account), u32::from(anchor_height)],
|row| row.get(0).or(Ok(0)), |row| row.get(0).or(Ok(0)),
)?; )?;
@ -503,7 +503,7 @@ pub fn get_received_memo<P>(wdb: &WalletDb<P>, id_note: i64) -> Result<Memo, Sql
let memo_bytes: Vec<_> = wdb.conn.query_row( let memo_bytes: Vec<_> = wdb.conn.query_row(
"SELECT memo FROM received_notes "SELECT memo FROM received_notes
WHERE id_note = ?", WHERE id_note = ?",
&[id_note], [id_note],
|row| row.get(0), |row| row.get(0),
)?; )?;
@ -520,7 +520,7 @@ pub(crate) fn get_transaction<P: Parameters>(
let (tx_bytes, block_height): (Vec<_>, BlockHeight) = wdb.conn.query_row( let (tx_bytes, block_height): (Vec<_>, BlockHeight) = wdb.conn.query_row(
"SELECT raw, block FROM transactions "SELECT raw, block FROM transactions
WHERE id_tx = ?", WHERE id_tx = ?",
&[id_tx], [id_tx],
|row| { |row| {
let h: u32 = row.get(1)?; let h: u32 = row.get(1)?;
Ok((row.get(0)?, BlockHeight::from(h))) Ok((row.get(0)?, BlockHeight::from(h)))
@ -561,7 +561,7 @@ pub fn get_sent_memo<P>(wdb: &WalletDb<P>, id_note: i64) -> Result<Memo, SqliteC
let memo_bytes: Vec<_> = wdb.conn.query_row( let memo_bytes: Vec<_> = wdb.conn.query_row(
"SELECT memo FROM sent_notes "SELECT memo FROM sent_notes
WHERE id_note = ?", WHERE id_note = ?",
&[id_note], [id_note],
|row| row.get(0), |row| row.get(0),
)?; )?;
@ -593,18 +593,14 @@ pub fn block_height_extrema<P>(
wdb: &WalletDb<P>, wdb: &WalletDb<P>,
) -> Result<Option<(BlockHeight, BlockHeight)>, rusqlite::Error> { ) -> Result<Option<(BlockHeight, BlockHeight)>, rusqlite::Error> {
wdb.conn wdb.conn
.query_row( .query_row("SELECT MIN(height), MAX(height) FROM blocks", [], |row| {
"SELECT MIN(height), MAX(height) FROM blocks",
NO_PARAMS,
|row| {
let min_height: u32 = row.get(0)?; let min_height: u32 = row.get(0)?;
let max_height: u32 = row.get(1)?; let max_height: u32 = row.get(1)?;
Ok(Some(( Ok(Some((
BlockHeight::from(min_height), BlockHeight::from(min_height),
BlockHeight::from(max_height), BlockHeight::from(max_height),
))) )))
}, })
)
//.optional() doesn't work here because a failed aggregate function //.optional() doesn't work here because a failed aggregate function
//produces a runtime error, not an empty set of rows. //produces a runtime error, not an empty set of rows.
.or(Ok(None)) .or(Ok(None))
@ -638,7 +634,7 @@ pub fn get_tx_height<P>(
wdb.conn wdb.conn
.query_row( .query_row(
"SELECT block FROM transactions WHERE txid = ?", "SELECT block FROM transactions WHERE txid = ?",
&[txid.as_ref().to_vec()], [txid.as_ref().to_vec()],
|row| row.get(0).map(u32::into), |row| row.get(0).map(u32::into),
) )
.optional() .optional()
@ -671,7 +667,7 @@ pub fn get_block_hash<P>(
wdb.conn wdb.conn
.query_row( .query_row(
"SELECT hash FROM blocks WHERE height = ?", "SELECT hash FROM blocks WHERE height = ?",
&[u32::from(block_height)], [u32::from(block_height)],
|row| { |row| {
let row_data = row.get::<_, Vec<_>>(0)?; let row_data = row.get::<_, Vec<_>>(0)?;
Ok(BlockHash::from_slice(&row_data)) Ok(BlockHash::from_slice(&row_data))
@ -690,7 +686,7 @@ pub fn get_rewind_height<P>(wdb: &WalletDb<P>) -> Result<Option<BlockHeight>, Sq
FROM received_notes n FROM received_notes n
JOIN transactions tx ON tx.id_tx = n.tx JOIN transactions tx ON tx.id_tx = n.tx
WHERE n.spent IS NULL", WHERE n.spent IS NULL",
NO_PARAMS, [],
|row| { |row| {
row.get(0) row.get(0)
.map(|maybe_height: Option<u32>| maybe_height.map(|height| height.into())) .map(|maybe_height: Option<u32>| maybe_height.map(|height| height.into()))
@ -715,9 +711,9 @@ pub(crate) fn rewind_to_height<P: consensus::Parameters>(
.ok_or(SqliteClientError::BackendError(Error::SaplingNotActive))?; .ok_or(SqliteClientError::BackendError(Error::SaplingNotActive))?;
// Recall where we synced up to previously. // Recall where we synced up to previously.
let last_scanned_height = let last_scanned_height = wdb
wdb.conn .conn
.query_row("SELECT MAX(height) FROM blocks", NO_PARAMS, |row| { .query_row("SELECT MAX(height) FROM blocks", [], |row| {
row.get(0) row.get(0)
.map(|h: u32| h.into()) .map(|h: u32| h.into())
.or_else(|_| Ok(sapling_activation_height - 1)) .or_else(|_| Ok(sapling_activation_height - 1))
@ -737,7 +733,7 @@ pub(crate) fn rewind_to_height<P: consensus::Parameters>(
// Decrement witnesses. // Decrement witnesses.
wdb.conn.execute( wdb.conn.execute(
"DELETE FROM sapling_witnesses WHERE block > ?", "DELETE FROM sapling_witnesses WHERE block > ?",
&[u32::from(block_height)], [u32::from(block_height)],
)?; )?;
// Rewind received notes // Rewind received notes
@ -750,7 +746,7 @@ pub(crate) fn rewind_to_height<P: consensus::Parameters>(
ON tx.id_tx = rn.tx ON tx.id_tx = rn.tx
WHERE tx.block IS NOT NULL AND tx.block > ? WHERE tx.block IS NOT NULL AND tx.block > ?
);", );",
&[u32::from(block_height)], [u32::from(block_height)],
)?; )?;
// Do not delete sent notes; this can contain data that is not recoverable // Do not delete sent notes; this can contain data that is not recoverable
@ -760,19 +756,19 @@ pub(crate) fn rewind_to_height<P: consensus::Parameters>(
// Rewind utxos // Rewind utxos
wdb.conn.execute( wdb.conn.execute(
"DELETE FROM utxos WHERE height > ?", "DELETE FROM utxos WHERE height > ?",
&[u32::from(block_height)], [u32::from(block_height)],
)?; )?;
// Un-mine transactions. // Un-mine transactions.
wdb.conn.execute( wdb.conn.execute(
"UPDATE transactions SET block = NULL, tx_index = NULL WHERE block IS NOT NULL AND block > ?", "UPDATE transactions SET block = NULL, tx_index = NULL WHERE block IS NOT NULL AND block > ?",
&[u32::from(block_height)], [u32::from(block_height)],
)?; )?;
// Now that they aren't depended on, delete scanned blocks. // Now that they aren't depended on, delete scanned blocks.
wdb.conn.execute( wdb.conn.execute(
"DELETE FROM blocks WHERE height > ?", "DELETE FROM blocks WHERE height > ?",
&[u32::from(block_height)], [u32::from(block_height)],
)?; )?;
} }
@ -806,7 +802,7 @@ pub fn get_commitment_tree<P>(
wdb.conn wdb.conn
.query_row_and_then( .query_row_and_then(
"SELECT sapling_tree FROM blocks WHERE height = ?", "SELECT sapling_tree FROM blocks WHERE height = ?",
&[u32::from(block_height)], [u32::from(block_height)],
|row| { |row| {
let row_data: Vec<u8> = row.get(0)?; let row_data: Vec<u8> = row.get(0)?;
CommitmentTree::read(&row_data[..]).map_err(|e| { CommitmentTree::read(&row_data[..]).map_err(|e| {
@ -850,7 +846,7 @@ pub fn get_witnesses<P>(
.conn .conn
.prepare("SELECT note, witness FROM sapling_witnesses WHERE block = ?")?; .prepare("SELECT note, witness FROM sapling_witnesses WHERE block = ?")?;
let witnesses = stmt_fetch_witnesses let witnesses = stmt_fetch_witnesses
.query_map(&[u32::from(block_height)], |row| { .query_map([u32::from(block_height)], |row| {
let id_note = NoteId::ReceivedNoteId(row.get(0)?); let id_note = NoteId::ReceivedNoteId(row.get(0)?);
let wdb: Vec<u8> = row.get(1)?; let wdb: Vec<u8> = row.get(1)?;
Ok(IncrementalWitness::read(&wdb[..]).map(|witness| (id_note, witness))) Ok(IncrementalWitness::read(&wdb[..]).map(|witness| (id_note, witness)))
@ -879,7 +875,7 @@ pub fn get_nullifiers<P>(
ON tx.id_tx = rn.spent ON tx.id_tx = rn.spent
WHERE block IS NULL", WHERE block IS NULL",
)?; )?;
let nullifiers = stmt_fetch_nullifiers.query_map(NO_PARAMS, |row| { let nullifiers = stmt_fetch_nullifiers.query_map([], |row| {
let account: u32 = row.get(1)?; let account: u32 = row.get(1)?;
let nf_bytes: Vec<u8> = row.get(2)?; let nf_bytes: Vec<u8> = row.get(2)?;
Ok(( Ok((
@ -901,7 +897,7 @@ pub(crate) fn get_all_nullifiers<P>(
"SELECT rn.id_note, rn.account, rn.nf "SELECT rn.id_note, rn.account, rn.nf
FROM received_notes rn", FROM received_notes rn",
)?; )?;
let nullifiers = stmt_fetch_nullifiers.query_map(NO_PARAMS, |row| { let nullifiers = stmt_fetch_nullifiers.query_map([], |row| {
let account: u32 = row.get(1)?; let account: u32 = row.get(1)?;
let nf_bytes: Vec<u8> = row.get(2)?; let nf_bytes: Vec<u8> = row.get(2)?;
Ok(( Ok((

View File

@ -2,7 +2,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt; use std::fmt;
use rusqlite::{self, types::ToSql, NO_PARAMS}; use rusqlite::{self, types::ToSql};
use schemer::{Migrator, MigratorError}; use schemer::{Migrator, MigratorError};
use schemer_rusqlite::RusqliteAdapter; use schemer_rusqlite::RusqliteAdapter;
use secrecy::SecretVec; use secrecy::SecretVec;
@ -123,7 +123,7 @@ fn init_wallet_db_internal<P: consensus::Parameters + 'static>(
target_migration: Option<Uuid>, target_migration: Option<Uuid>,
) -> Result<(), MigratorError<WalletMigrationError>> { ) -> Result<(), MigratorError<WalletMigrationError>> {
wdb.conn wdb.conn
.execute("PRAGMA foreign_keys = OFF", NO_PARAMS) .execute("PRAGMA foreign_keys = OFF", [])
.map_err(|e| MigratorError::Adapter(WalletMigrationError::from(e)))?; .map_err(|e| MigratorError::Adapter(WalletMigrationError::from(e)))?;
let adapter = RusqliteAdapter::new(&mut wdb.conn, Some("schemer_migrations".to_string())); let adapter = RusqliteAdapter::new(&mut wdb.conn, Some("schemer_migrations".to_string()));
adapter.init().expect("Migrations table setup succeeds."); adapter.init().expect("Migrations table setup succeeds.");
@ -134,7 +134,7 @@ fn init_wallet_db_internal<P: consensus::Parameters + 'static>(
.expect("Wallet migration registration should have been successful."); .expect("Wallet migration registration should have been successful.");
migrator.up(target_migration)?; migrator.up(target_migration)?;
wdb.conn wdb.conn
.execute("PRAGMA foreign_keys = ON", NO_PARAMS) .execute("PRAGMA foreign_keys = ON", [])
.map_err(|e| MigratorError::Adapter(WalletMigrationError::from(e)))?; .map_err(|e| MigratorError::Adapter(WalletMigrationError::from(e)))?;
Ok(()) Ok(())
} }
@ -201,7 +201,7 @@ pub fn init_accounts_table<P: consensus::Parameters>(
keys: &HashMap<AccountId, UnifiedFullViewingKey>, keys: &HashMap<AccountId, UnifiedFullViewingKey>,
) -> Result<(), SqliteClientError> { ) -> Result<(), SqliteClientError> {
let mut empty_check = wdb.conn.prepare("SELECT * FROM accounts LIMIT 1")?; let mut empty_check = wdb.conn.prepare("SELECT * FROM accounts LIMIT 1")?;
if empty_check.exists(NO_PARAMS)? { if empty_check.exists([])? {
return Err(SqliteClientError::TableNotEmpty); return Err(SqliteClientError::TableNotEmpty);
} }
@ -213,11 +213,11 @@ pub fn init_accounts_table<P: consensus::Parameters>(
} }
// Insert accounts atomically // Insert accounts atomically
wdb.conn.execute("BEGIN IMMEDIATE", NO_PARAMS)?; wdb.conn.execute("BEGIN IMMEDIATE", [])?;
for (account, key) in keys.iter() { for (account, key) in keys.iter() {
wallet::add_account(wdb, *account, key)?; wallet::add_account(wdb, *account, key)?;
} }
wdb.conn.execute("COMMIT", NO_PARAMS)?; wdb.conn.execute("COMMIT", [])?;
Ok(()) Ok(())
} }
@ -262,14 +262,14 @@ pub fn init_blocks_table<P>(
sapling_tree: &[u8], sapling_tree: &[u8],
) -> Result<(), SqliteClientError> { ) -> Result<(), SqliteClientError> {
let mut empty_check = wdb.conn.prepare("SELECT * FROM blocks LIMIT 1")?; let mut empty_check = wdb.conn.prepare("SELECT * FROM blocks LIMIT 1")?;
if empty_check.exists(NO_PARAMS)? { if empty_check.exists([])? {
return Err(SqliteClientError::TableNotEmpty); return Err(SqliteClientError::TableNotEmpty);
} }
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO blocks (height, hash, time, sapling_tree) "INSERT INTO blocks (height, hash, time, sapling_tree)
VALUES (?, ?, ?, ?)", VALUES (?, ?, ?, ?)",
&[ [
u32::from(height).to_sql()?, u32::from(height).to_sql()?,
hash.0.to_sql()?, hash.0.to_sql()?,
time.to_sql()?, time.to_sql()?,
@ -283,7 +283,7 @@ pub fn init_blocks_table<P>(
#[cfg(test)] #[cfg(test)]
#[allow(deprecated)] #[allow(deprecated)]
mod tests { mod tests {
use rusqlite::{self, ToSql, NO_PARAMS}; use rusqlite::{self, ToSql};
use secrecy::Secret; use secrecy::Secret;
use std::collections::HashMap; use std::collections::HashMap;
use tempfile::NamedTempFile; use tempfile::NamedTempFile;
@ -412,7 +412,7 @@ mod tests {
.conn .conn
.prepare("SELECT sql FROM sqlite_schema WHERE type = 'table' ORDER BY tbl_name") .prepare("SELECT sql FROM sqlite_schema WHERE type = 'table' ORDER BY tbl_name")
.unwrap(); .unwrap();
let mut rows = tables_query.query(NO_PARAMS).unwrap(); let mut rows = tables_query.query([]).unwrap();
let mut expected_idx = 0; let mut expected_idx = 0;
while let Some(row) = rows.next().unwrap() { while let Some(row) = rows.next().unwrap() {
let sql: String = row.get(0).unwrap(); let sql: String = row.get(0).unwrap();
@ -519,7 +519,7 @@ mod tests {
.conn .conn
.prepare("SELECT sql FROM sqlite_schema WHERE type = 'view' ORDER BY tbl_name") .prepare("SELECT sql FROM sqlite_schema WHERE type = 'view' ORDER BY tbl_name")
.unwrap(); .unwrap();
let mut rows = views_query.query(NO_PARAMS).unwrap(); let mut rows = views_query.query([]).unwrap();
let mut expected_idx = 0; let mut expected_idx = 0;
while let Some(row) = rows.next().unwrap() { while let Some(row) = rows.next().unwrap() {
let sql: String = row.get(0).unwrap(); let sql: String = row.get(0).unwrap();
@ -544,7 +544,7 @@ mod tests {
extfvk TEXT NOT NULL, extfvk TEXT NOT NULL,
address TEXT NOT NULL address TEXT NOT NULL
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE blocks ( "CREATE TABLE blocks (
@ -553,7 +553,7 @@ mod tests {
time INTEGER NOT NULL, time INTEGER NOT NULL,
sapling_tree BLOB NOT NULL sapling_tree BLOB NOT NULL
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE transactions ( "CREATE TABLE transactions (
@ -566,7 +566,7 @@ mod tests {
raw BLOB, raw BLOB,
FOREIGN KEY (block) REFERENCES blocks(height) FOREIGN KEY (block) REFERENCES blocks(height)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE received_notes ( "CREATE TABLE received_notes (
@ -586,7 +586,7 @@ mod tests {
FOREIGN KEY (spent) REFERENCES transactions(id_tx), FOREIGN KEY (spent) REFERENCES transactions(id_tx),
CONSTRAINT tx_output UNIQUE (tx, output_index) CONSTRAINT tx_output UNIQUE (tx, output_index)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE sapling_witnesses ( "CREATE TABLE sapling_witnesses (
@ -598,7 +598,7 @@ mod tests {
FOREIGN KEY (block) REFERENCES blocks(height), FOREIGN KEY (block) REFERENCES blocks(height),
CONSTRAINT witness_height UNIQUE (note, block) CONSTRAINT witness_height UNIQUE (note, block)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE sent_notes ( "CREATE TABLE sent_notes (
@ -613,7 +613,7 @@ mod tests {
FOREIGN KEY (from_account) REFERENCES accounts(account), FOREIGN KEY (from_account) REFERENCES accounts(account),
CONSTRAINT tx_output UNIQUE (tx, output_index) CONSTRAINT tx_output UNIQUE (tx, output_index)
)", )",
NO_PARAMS, [],
)?; )?;
let address = encode_payment_address( let address = encode_payment_address(
@ -627,7 +627,7 @@ mod tests {
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO accounts (account, extfvk, address) "INSERT INTO accounts (account, extfvk, address)
VALUES (?, ?, ?)", VALUES (?, ?, ?)",
&[ [
u32::from(account).to_sql()?, u32::from(account).to_sql()?,
extfvk.to_sql()?, extfvk.to_sql()?,
address.to_sql()?, address.to_sql()?,
@ -661,7 +661,7 @@ mod tests {
address TEXT NOT NULL, address TEXT NOT NULL,
transparent_address TEXT NOT NULL transparent_address TEXT NOT NULL
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE blocks ( "CREATE TABLE blocks (
@ -670,7 +670,7 @@ mod tests {
time INTEGER NOT NULL, time INTEGER NOT NULL,
sapling_tree BLOB NOT NULL sapling_tree BLOB NOT NULL
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE transactions ( "CREATE TABLE transactions (
@ -683,7 +683,7 @@ mod tests {
raw BLOB, raw BLOB,
FOREIGN KEY (block) REFERENCES blocks(height) FOREIGN KEY (block) REFERENCES blocks(height)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE received_notes ( "CREATE TABLE received_notes (
@ -703,7 +703,7 @@ mod tests {
FOREIGN KEY (spent) REFERENCES transactions(id_tx), FOREIGN KEY (spent) REFERENCES transactions(id_tx),
CONSTRAINT tx_output UNIQUE (tx, output_index) CONSTRAINT tx_output UNIQUE (tx, output_index)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE sapling_witnesses ( "CREATE TABLE sapling_witnesses (
@ -715,7 +715,7 @@ mod tests {
FOREIGN KEY (block) REFERENCES blocks(height), FOREIGN KEY (block) REFERENCES blocks(height),
CONSTRAINT witness_height UNIQUE (note, block) CONSTRAINT witness_height UNIQUE (note, block)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE sent_notes ( "CREATE TABLE sent_notes (
@ -730,7 +730,7 @@ mod tests {
FOREIGN KEY (from_account) REFERENCES accounts(account), FOREIGN KEY (from_account) REFERENCES accounts(account),
CONSTRAINT tx_output UNIQUE (tx, output_index) CONSTRAINT tx_output UNIQUE (tx, output_index)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE utxos ( "CREATE TABLE utxos (
@ -745,7 +745,7 @@ mod tests {
FOREIGN KEY (spent_in_tx) REFERENCES transactions(id_tx), FOREIGN KEY (spent_in_tx) REFERENCES transactions(id_tx),
CONSTRAINT tx_outpoint UNIQUE (prevout_txid, prevout_idx) CONSTRAINT tx_outpoint UNIQUE (prevout_txid, prevout_idx)
)", )",
NO_PARAMS, [],
)?; )?;
let address = encode_payment_address( let address = encode_payment_address(
@ -759,7 +759,7 @@ mod tests {
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO accounts (account, extfvk, address, transparent_address) "INSERT INTO accounts (account, extfvk, address, transparent_address)
VALUES (?, ?, ?, '')", VALUES (?, ?, ?, '')",
&[ [
u32::from(account).to_sql()?, u32::from(account).to_sql()?,
extfvk.to_sql()?, extfvk.to_sql()?,
address.to_sql()?, address.to_sql()?,
@ -769,7 +769,7 @@ mod tests {
// add a sapling sent note // add a sapling sent note
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO blocks (height, hash, time, sapling_tree) VALUES (0, 0, 0, '')", "INSERT INTO blocks (height, hash, time, sapling_tree) VALUES (0, 0, 0, '')",
NO_PARAMS, [],
)?; )?;
let tx = TransactionData::from_parts( let tx = TransactionData::from_parts(
@ -794,7 +794,7 @@ mod tests {
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO sent_notes (tx, output_index, from_account, address, value) "INSERT INTO sent_notes (tx, output_index, from_account, address, value)
VALUES (0, 0, ?, ?, 0)", VALUES (0, 0, ?, ?, 0)",
&[u32::from(account).to_sql()?, address.to_sql()?], [u32::from(account).to_sql()?, address.to_sql()?],
)?; )?;
Ok(()) Ok(())
@ -824,7 +824,7 @@ mod tests {
address TEXT, address TEXT,
transparent_address TEXT transparent_address TEXT
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE blocks ( "CREATE TABLE blocks (
@ -833,7 +833,7 @@ mod tests {
time INTEGER NOT NULL, time INTEGER NOT NULL,
sapling_tree BLOB NOT NULL sapling_tree BLOB NOT NULL
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE transactions ( "CREATE TABLE transactions (
@ -846,7 +846,7 @@ mod tests {
raw BLOB, raw BLOB,
FOREIGN KEY (block) REFERENCES blocks(height) FOREIGN KEY (block) REFERENCES blocks(height)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE received_notes ( "CREATE TABLE received_notes (
@ -866,7 +866,7 @@ mod tests {
FOREIGN KEY (spent) REFERENCES transactions(id_tx), FOREIGN KEY (spent) REFERENCES transactions(id_tx),
CONSTRAINT tx_output UNIQUE (tx, output_index) CONSTRAINT tx_output UNIQUE (tx, output_index)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE sapling_witnesses ( "CREATE TABLE sapling_witnesses (
@ -878,7 +878,7 @@ mod tests {
FOREIGN KEY (block) REFERENCES blocks(height), FOREIGN KEY (block) REFERENCES blocks(height),
CONSTRAINT witness_height UNIQUE (note, block) CONSTRAINT witness_height UNIQUE (note, block)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE sent_notes ( "CREATE TABLE sent_notes (
@ -894,7 +894,7 @@ mod tests {
FOREIGN KEY (from_account) REFERENCES accounts(account), FOREIGN KEY (from_account) REFERENCES accounts(account),
CONSTRAINT tx_output UNIQUE (tx, output_pool, output_index) CONSTRAINT tx_output UNIQUE (tx, output_pool, output_index)
)", )",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"CREATE TABLE utxos ( "CREATE TABLE utxos (
@ -909,7 +909,7 @@ mod tests {
FOREIGN KEY (spent_in_tx) REFERENCES transactions(id_tx), FOREIGN KEY (spent_in_tx) REFERENCES transactions(id_tx),
CONSTRAINT tx_outpoint UNIQUE (prevout_txid, prevout_idx) CONSTRAINT tx_outpoint UNIQUE (prevout_txid, prevout_idx)
)", )",
NO_PARAMS, [],
)?; )?;
let ufvk_str = ufvk.encode(&tests::network()); let ufvk_str = ufvk.encode(&tests::network());
@ -918,7 +918,7 @@ mod tests {
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO accounts (account, ufvk, address, transparent_address) "INSERT INTO accounts (account, ufvk, address, transparent_address)
VALUES (?, ?, ?, '')", VALUES (?, ?, ?, '')",
&[ [
u32::from(account).to_sql()?, u32::from(account).to_sql()?,
ufvk_str.to_sql()?, ufvk_str.to_sql()?,
address_str.to_sql()?, address_str.to_sql()?,
@ -933,16 +933,16 @@ mod tests {
.encode(&tests::network()); .encode(&tests::network());
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO blocks (height, hash, time, sapling_tree) VALUES (0, 0, 0, '')", "INSERT INTO blocks (height, hash, time, sapling_tree) VALUES (0, 0, 0, '')",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO transactions (block, id_tx, txid) VALUES (0, 0, '')", "INSERT INTO transactions (block, id_tx, txid) VALUES (0, 0, '')",
NO_PARAMS, [],
)?; )?;
wdb.conn.execute( wdb.conn.execute(
"INSERT INTO sent_notes (tx, output_pool, output_index, from_account, address, value) "INSERT INTO sent_notes (tx, output_pool, output_index, from_account, address, value)
VALUES (0, ?, 0, ?, ?, 0)", VALUES (0, ?, 0, ?, ?, 0)",
&[PoolType::Transparent.typecode().to_sql()?, u32::from(account).to_sql()?, taddr.to_sql()?])?; [PoolType::Transparent.typecode().to_sql()?, u32::from(account).to_sql()?, taddr.to_sql()?])?;
} }
Ok(()) Ok(())

View File

@ -1,7 +1,7 @@
//! Migration that adds transaction summary views & add fee information to transactions. //! Migration that adds transaction summary views & add fee information to transactions.
use std::collections::HashSet; use std::collections::HashSet;
use rusqlite::{self, types::ToSql, OptionalExtension, NO_PARAMS}; use rusqlite::{self, types::ToSql, OptionalExtension};
use schemer::{self}; use schemer::{self};
use schemer_rusqlite::RusqliteMigration; use schemer_rusqlite::RusqliteMigration;
use uuid::Uuid; use uuid::Uuid;
@ -56,7 +56,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
let mut stmt_find_utxo_value = transaction let mut stmt_find_utxo_value = transaction
.prepare("SELECT value_zat FROM utxos WHERE prevout_txid = ? AND prevout_idx = ?")?; .prepare("SELECT value_zat FROM utxos WHERE prevout_txid = ? AND prevout_idx = ?")?;
let mut tx_rows = stmt_list_txs.query(NO_PARAMS)?; let mut tx_rows = stmt_list_txs.query([])?;
while let Some(row) = tx_rows.next()? { while let Some(row) = tx_rows.next()? {
let id_tx: i64 = row.get(0)?; let id_tx: i64 = row.get(0)?;
let tx_bytes: Option<Vec<u8>> = row.get(1)?; let tx_bytes: Option<Vec<u8>> = row.get(1)?;
@ -77,7 +77,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
let fee_paid = tx.fee_paid(|op| { let fee_paid = tx.fee_paid(|op| {
let op_amount = stmt_find_utxo_value let op_amount = stmt_find_utxo_value
.query_row(&[op.hash().to_sql()?, op.n().to_sql()?], |row| { .query_row([op.hash().to_sql()?, op.n().to_sql()?], |row| {
row.get::<_, i64>(0) row.get::<_, i64>(0)
}) })
.optional() .optional()
@ -101,7 +101,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
) )
})?; })?;
stmt_set_fee.execute(&[i64::from(fee_paid), id_tx])?; stmt_set_fee.execute([i64::from(fee_paid), id_tx])?;
} }
} }
@ -214,7 +214,6 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use rusqlite::{self, NO_PARAMS};
use tempfile::NamedTempFile; use tempfile::NamedTempFile;
#[cfg(feature = "transparent-inputs")] #[cfg(feature = "transparent-inputs")]
@ -274,7 +273,7 @@ mod tests {
.conn .conn
.prepare("SELECT received_total, received_note_count, memo_count FROM v_tx_received") .prepare("SELECT received_total, received_note_count, memo_count FROM v_tx_received")
.unwrap(); .unwrap();
let mut rows = q.query(NO_PARAMS).unwrap(); let mut rows = q.query([]).unwrap();
let mut row_count = 0; let mut row_count = 0;
while let Some(row) = rows.next().unwrap() { while let Some(row) = rows.next().unwrap() {
row_count += 1; row_count += 1;
@ -291,7 +290,7 @@ mod tests {
.conn .conn
.prepare("SELECT sent_total, sent_note_count, memo_count FROM v_tx_sent") .prepare("SELECT sent_total, sent_note_count, memo_count FROM v_tx_sent")
.unwrap(); .unwrap();
let mut rows = q.query(NO_PARAMS).unwrap(); let mut rows = q.query([]).unwrap();
let mut row_count = 0; let mut row_count = 0;
while let Some(row) = rows.next().unwrap() { while let Some(row) = rows.next().unwrap() {
row_count += 1; row_count += 1;
@ -308,7 +307,7 @@ mod tests {
.conn .conn
.prepare("SELECT net_value, has_change, memo_count FROM v_transactions") .prepare("SELECT net_value, has_change, memo_count FROM v_transactions")
.unwrap(); .unwrap();
let mut rows = q.query(NO_PARAMS).unwrap(); let mut rows = q.query([]).unwrap();
let mut row_count = 0; let mut row_count = 0;
while let Some(row) = rows.next().unwrap() { while let Some(row) = rows.next().unwrap() {
row_count += 1; row_count += 1;
@ -384,7 +383,7 @@ mod tests {
db_data.conn.execute( db_data.conn.execute(
"INSERT INTO utxos (address, prevout_txid, prevout_idx, script, value_zat, height) "INSERT INTO utxos (address, prevout_txid, prevout_idx, script, value_zat, height)
VALUES (?, X'0101010101010101010101010101010101010101010101010101010101010101', 1, X'', 1400000000, 1)", VALUES (?, X'0101010101010101010101010101010101010101010101010101010101010101', 1, X'', 1400000000, 1)",
&[taddr] [taddr]
).unwrap(); ).unwrap();
db_data db_data
.conn .conn
@ -398,11 +397,9 @@ mod tests {
let fee = db_data let fee = db_data
.conn .conn
.query_row( .query_row("SELECT fee FROM transactions WHERE id_tx = 0", [], |row| {
"SELECT fee FROM transactions WHERE id_tx = 0", Ok(Amount::from_i64(row.get(0)?).unwrap())
NO_PARAMS, })
|row| Ok(Amount::from_i64(row.get(0)?).unwrap()),
)
.unwrap(); .unwrap();
assert_eq!(fee, Amount::from_i64(300000000).unwrap()); assert_eq!(fee, Amount::from_i64(300000000).unwrap());

View File

@ -1,6 +1,6 @@
use std::collections::HashSet; use std::collections::HashSet;
use rusqlite::{Transaction, NO_PARAMS}; use rusqlite::Transaction;
use schemer; use schemer;
use schemer_rusqlite::RusqliteMigration; use schemer_rusqlite::RusqliteMigration;
use uuid::Uuid; use uuid::Uuid;
@ -64,7 +64,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
let mut stmt_fetch_accounts = transaction let mut stmt_fetch_accounts = transaction
.prepare("SELECT account, ufvk, address, transparent_address FROM accounts")?; .prepare("SELECT account, ufvk, address, transparent_address FROM accounts")?;
let mut rows = stmt_fetch_accounts.query(NO_PARAMS)?; let mut rows = stmt_fetch_accounts.query([])?;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let account: u32 = row.get(0)?; let account: u32 = row.get(0)?;
let account = AccountId::from(account); let account = AccountId::from(account);

View File

@ -1,7 +1,7 @@
//! Migration that adds support for unified full viewing keys. //! Migration that adds support for unified full viewing keys.
use std::collections::HashSet; use std::collections::HashSet;
use rusqlite::{self, params, NO_PARAMS}; use rusqlite::{self, named_params, params};
use schemer; use schemer;
use schemer_rusqlite::RusqliteMigration; use schemer_rusqlite::RusqliteMigration;
use secrecy::{ExposeSecret, SecretVec}; use secrecy::{ExposeSecret, SecretVec};
@ -67,7 +67,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
let mut stmt_fetch_accounts = let mut stmt_fetch_accounts =
transaction.prepare("SELECT account, address FROM accounts")?; transaction.prepare("SELECT account, address FROM accounts")?;
let mut rows = stmt_fetch_accounts.query(NO_PARAMS)?; let mut rows = stmt_fetch_accounts.query([])?;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
// We only need to check for the presence of the seed if we have keys that // We only need to check for the presence of the seed if we have keys that
// need to be migrated; otherwise, it's fine to not supply the seed if this // need to be migrated; otherwise, it's fine to not supply the seed if this
@ -137,14 +137,14 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
#[cfg(not(feature = "transparent-inputs"))] #[cfg(not(feature = "transparent-inputs"))]
let taddress_str: Option<String> = None; let taddress_str: Option<String> = None;
transaction.execute_named( transaction.execute(
"INSERT INTO accounts_new (account, ufvk, address, transparent_address) "INSERT INTO accounts_new (account, ufvk, address, transparent_address)
VALUES (:account, :ufvk, :address, :transparent_address)", VALUES (:account, :ufvk, :address, :transparent_address)",
&[ named_params![
(":account", &<u32>::from(account)), ":account": &<u32>::from(account),
(":ufvk", &ufvk_str), ":ufvk": &ufvk_str,
(":address", &address_str), ":address": &address_str,
(":transparent_address", &taddress_str), ":transparent_address": &taddress_str,
], ],
)?; )?;
} else { } else {
@ -182,7 +182,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
// dropped and doesn't maintain a lock on the table. // dropped and doesn't maintain a lock on the table.
let has_output_pool = { let has_output_pool = {
let mut stmt_fetch_columns = transaction.prepare("PRAGMA TABLE_INFO('sent_notes')")?; let mut stmt_fetch_columns = transaction.prepare("PRAGMA TABLE_INFO('sent_notes')")?;
let mut col_names = stmt_fetch_columns.query_map(NO_PARAMS, |row| { let mut col_names = stmt_fetch_columns.query_map([], |row| {
let col_name: String = row.get(1)?; let col_name: String = row.get(1)?;
Ok(col_name) Ok(col_name)
})?; })?;
@ -209,7 +209,7 @@ impl<P: consensus::Parameters> RusqliteMigration for Migration<P> {
VALUES (?, ?, ?, ?, ?, ?, ?, ?)", VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
)?; )?;
let mut rows = stmt_fetch_sent_notes.query(NO_PARAMS)?; let mut rows = stmt_fetch_sent_notes.query([])?;
while let Some(row) = rows.next()? { while let Some(row) = rows.next()? {
let id_note: i64 = row.get(0)?; let id_note: i64 = row.get(0)?;
let tx_ref: i64 = row.get(1)?; let tx_ref: i64 = row.get(1)?;

View File

@ -79,7 +79,7 @@ pub fn get_spendable_sapling_notes<P>(
)?; )?;
// Select notes // Select notes
let notes = stmt_select_notes.query_and_then_named::<_, SqliteClientError, _>( let notes = stmt_select_notes.query_and_then(
named_params![ named_params![
":account": &u32::from(account), ":account": &u32::from(account),
":anchor_height": &u32::from(anchor_height), ":anchor_height": &u32::from(anchor_height),
@ -140,7 +140,7 @@ pub fn select_spendable_sapling_notes<P>(
)?; )?;
// Select notes // Select notes
let notes = stmt_select_notes.query_and_then_named::<_, SqliteClientError, _>( let notes = stmt_select_notes.query_and_then(
named_params![ named_params![
":account": &u32::from(account), ":account": &u32::from(account),
":anchor_height": &u32::from(anchor_height), ":anchor_height": &u32::from(anchor_height),
@ -698,7 +698,7 @@ mod tests {
.query_row( .query_row(
"SELECT raw FROM transactions "SELECT raw FROM transactions
WHERE id_tx = ?", WHERE id_tx = ?",
&[tx_row], [tx_row],
|row| row.get(0), |row| row.get(0),
) )
.unwrap(); .unwrap();
@ -711,7 +711,7 @@ mod tests {
.query_row( .query_row(
"SELECT output_index FROM sent_notes "SELECT output_index FROM sent_notes
WHERE tx = ?", WHERE tx = ?",
&[tx_row], [tx_row],
|row| row.get(0), |row| row.get(0),
) )
.unwrap(); .unwrap();