void bdb_blockchain::do_fetch_outputs(const payment_address& address, fetch_handler_outputs handle_fetch) { // Associated outputs message::output_point_list assoc_outs; txn_guard_ptr txn = std::make_shared<txn_guard>(env_); Dbc* cursor; db_address_->cursor(txn->get(), &cursor, 0); BITCOIN_ASSERT(cursor != nullptr); readable_data_type key; // version byte + hash for key serializer serial; serial.write_byte(address.version()); serial.write_short_hash(address.hash()); key.set(serial.data()); writable_data_type value; int ret = cursor->get(key.get(), value.get(), DB_SET); while (ret != DB_NOTFOUND) { message::output_point outpoint; // We need a copy not a temporary data_chunk raw_outpoint(value.data()); // Then read the value off deserializer deserial(raw_outpoint); outpoint.hash = deserial.read_hash(); outpoint.index = deserial.read_4_bytes(); assoc_outs.push_back(outpoint); ret = cursor->get(key.get(), value.get(), DB_NEXT_DUP); } cursor->close(); txn->commit(); handle_fetch(std::error_code(), assoc_outs); }
RD_ByteArray *bytearray_load(const void *source) { RA_Array size = deserial(*(RA_Array*)source); RD_ByteArray *a = bytearray_new(size); memcpy(a + 1, (RA_Array*)source + 1, size); return a; }
bool bdb_common::fetch_spend(txn_guard_ptr txn, const message::output_point& spent_output, message::input_point& input_spend) { readable_data_type search_spend; search_spend.set(create_spent_key(spent_output)); writable_data_type raw_spend; if (db_spends_->get(txn->get(), search_spend.get(), raw_spend.get(), 0) != 0) return false; const data_chunk raw_spend_data = raw_spend.data(); deserializer deserial(raw_spend_data); input_spend.hash = deserial.read_hash(); input_spend.index = deserial.read_4_bytes(); return true; }