Skip to content

Commit

Permalink
Merge pull request #1116 from CosmWasm/pair-to-record
Browse files Browse the repository at this point in the history
Rename Pair to Record
  • Loading branch information
webmaster128 authored Sep 28, 2021
2 parents 2843c92 + 5a0d56b commit 5b1ed5c
Show file tree
Hide file tree
Showing 14 changed files with 98 additions and 61 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ and this project adheres to
- cosmwasm-std: Make methods `Uint256::to_be_bytes`/`::to_le_bytes` const.
- cosmwasm-std: Make methods `Uint512::to_be_bytes`/`::to_le_bytes` const.
- cosmwasm-std: Make method `Uint512::from_le_bytes` const.
- cosmwasm-std: Rename `Pair` to `Record`. `Pair` is now an alias for `Record`
and deprecated.

### Removed

Expand Down
26 changes: 26 additions & 0 deletions MIGRATING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,32 @@ This guide explains what is needed to upgrade contracts when migrating over
major releases of `cosmwasm`. Note that you can also view the
[complete CHANGELOG](./CHANGELOG.md) to understand the differences.

## 0.16 -> 1.0 (unreleased)

- Update CosmWasm dependencies in Cargo.toml (skip the ones you don't use):

```
[dependencies]
cosmwasm-std = "1.0.0"
cosmwasm-storage = "1.0.0"
# ...
[dev-dependencies]
cosmwasm-schema = "1.0.0"
cosmwasm-vm = "1.0.0"
# ...
```

- Use type `Record` instead of `Pair`

```rust
// before
use cosmwasm_std::Pair;

// after
use cosmwasm_std::Record;
```

## 0.15 -> 0.16

- Update CosmWasm dependencies in Cargo.toml (skip the ones you don't use):
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ pub trait Storage {
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair> + 'a>;
) -> Box<dyn Iterator<Item = Record> + 'a>;
}
```

Expand Down
6 changes: 3 additions & 3 deletions packages/std/src/imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::serde::from_slice;
use crate::traits::{Api, Querier, QuerierResult, Storage};
#[cfg(feature = "iterator")]
use crate::{
iterator::{Order, Pair},
iterator::{Order, Record},
memory::get_optional_region_address,
};

Expand Down Expand Up @@ -108,7 +108,7 @@ impl Storage for ExternalStorage {
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair>> {
) -> Box<dyn Iterator<Item = Record>> {
// There is lots of gotchas on turning options into regions for FFI, thus this design
// See: https://github.com/CosmWasm/cosmwasm/pull/509
let start_region = start.map(build_region);
Expand All @@ -130,7 +130,7 @@ struct ExternalIterator {

#[cfg(feature = "iterator")]
impl Iterator for ExternalIterator {
type Item = Pair;
type Item = Record;

fn next(&mut self) -> Option<Self::Item> {
let next_result = unsafe { db_next(self.iterator_id) };
Expand Down
10 changes: 8 additions & 2 deletions packages/std/src/iterator.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
use crate::errors::StdError;
use std::convert::TryFrom;

/// A Key-Value pair, returned from our iterators
pub type Pair<V = Vec<u8>> = (Vec<u8>, V);
/// A record of a key-value storage that is created through an iterator API.
/// The first element (key) is always raw binary data. The second element
/// (value) is binary by default but can be changed to a custom type. This
/// allows contracts to reuse the type when deserializing database records.
pub type Record<V = Vec<u8>> = (Vec<u8>, V);

#[deprecated(note = "Renamed to Record, please use this instead")]
pub type Pair<V = Vec<u8>> = Record<V>;

#[derive(Copy, Clone)]
// We assign these to integers to provide a stable API for passing over FFI (to wasm and Go)
Expand Down
5 changes: 4 additions & 1 deletion packages/std/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,10 @@ pub use crate::ibc::{
IbcPacketReceiveMsg, IbcPacketTimeoutMsg, IbcReceiveResponse, IbcTimeout, IbcTimeoutBlock,
};
#[cfg(feature = "iterator")]
pub use crate::iterator::{Order, Pair};
#[allow(deprecated)]
pub use crate::iterator::Pair;
#[cfg(feature = "iterator")]
pub use crate::iterator::{Order, Record};
pub use crate::math::{
Decimal, Decimal256, Decimal256RangeExceeded, DecimalRangeExceeded, Fraction, Uint128, Uint256,
Uint512, Uint64,
Expand Down
34 changes: 17 additions & 17 deletions packages/std/src/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use std::iter;
use std::ops::{Bound, RangeBounds};

#[cfg(feature = "iterator")]
use crate::iterator::{Order, Pair};
use crate::iterator::{Order, Record};
use crate::traits::Storage;

#[derive(Default)]
Expand Down Expand Up @@ -45,7 +45,7 @@ impl Storage for MemoryStorage {
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair> + 'a> {
) -> Box<dyn Iterator<Item = Record> + 'a> {
let bounds = range_bounds(start, end);

// BTreeMap.range panics if range is start > end.
Expand Down Expand Up @@ -96,12 +96,12 @@ fn range_bounds(start: Option<&[u8]>, end: Option<&[u8]>) -> impl RangeBounds<Ve
}

#[cfg(feature = "iterator")]
/// The BTreeMap specific key-value pair reference type, as returned by BTreeMap<Vec<u8>, T>::range.
/// The BTreeMap specific key-value pair reference type, as returned by BTreeMap<Vec<u8>, Vec<u8>>::range.
/// This is internal as it can change any time if the map implementation is swapped out.
type BTreeMapPairRef<'a, T = Vec<u8>> = (&'a Vec<u8>, &'a T);
type BTreeMapRecordRef<'a> = (&'a Vec<u8>, &'a Vec<u8>);

#[cfg(feature = "iterator")]
fn clone_item<T: Clone>(item_ref: BTreeMapPairRef<T>) -> Pair<T> {
fn clone_item(item_ref: BTreeMapRecordRef) -> Record {
let (key, value) = item_ref;
(key.clone(), value.clone())
}
Expand Down Expand Up @@ -160,7 +160,7 @@ mod tests {
// unbounded
{
let iter = store.range(None, None, Order::Ascending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand All @@ -174,7 +174,7 @@ mod tests {
// unbounded (descending)
{
let iter = store.range(None, None, Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand All @@ -188,14 +188,14 @@ mod tests {
// bounded
{
let iter = store.range(Some(b"f"), Some(b"n"), Order::Ascending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(elements, vec![(b"foo".to_vec(), b"bar".to_vec())]);
}

// bounded (descending)
{
let iter = store.range(Some(b"air"), Some(b"loop"), Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand All @@ -208,35 +208,35 @@ mod tests {
// bounded empty [a, a)
{
let iter = store.range(Some(b"foo"), Some(b"foo"), Order::Ascending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(elements, vec![]);
}

// bounded empty [a, a) (descending)
{
let iter = store.range(Some(b"foo"), Some(b"foo"), Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(elements, vec![]);
}

// bounded empty [a, b) with b < a
{
let iter = store.range(Some(b"z"), Some(b"a"), Order::Ascending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(elements, vec![]);
}

// bounded empty [a, b) with b < a (descending)
{
let iter = store.range(Some(b"z"), Some(b"a"), Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(elements, vec![]);
}

// right unbounded
{
let iter = store.range(Some(b"f"), None, Order::Ascending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand All @@ -249,7 +249,7 @@ mod tests {
// right unbounded (descending)
{
let iter = store.range(Some(b"f"), None, Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand All @@ -262,14 +262,14 @@ mod tests {
// left unbounded
{
let iter = store.range(None, Some(b"f"), Order::Ascending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(elements, vec![(b"ant".to_vec(), b"hill".to_vec()),]);
}

// left unbounded (descending)
{
let iter = store.range(None, Some(b"no"), Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand Down
4 changes: 2 additions & 2 deletions packages/std/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use crate::binary::Binary;
use crate::coins::Coin;
use crate::errors::{RecoverPubkeyError, StdError, StdResult, VerificationError};
#[cfg(feature = "iterator")]
use crate::iterator::{Order, Pair};
use crate::iterator::{Order, Record};
use crate::query::{
AllBalanceResponse, BalanceResponse, BankQuery, CustomQuery, QueryRequest, WasmQuery,
};
Expand Down Expand Up @@ -40,7 +40,7 @@ pub trait Storage {
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair> + 'a>;
) -> Box<dyn Iterator<Item = Record> + 'a>;

fn set(&mut self, key: &[u8], value: &[u8]);
/// Removes a database entry at `key`.
Expand Down
10 changes: 5 additions & 5 deletions packages/storage/src/bucket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::marker::PhantomData;

use cosmwasm_std::{to_vec, StdError, StdResult, Storage};
#[cfg(feature = "iterator")]
use cosmwasm_std::{Order, Pair};
use cosmwasm_std::{Order, Record};

use crate::length_prefixed::{to_length_prefixed, to_length_prefixed_nested};
#[cfg(feature = "iterator")]
Expand Down Expand Up @@ -88,7 +88,7 @@ where
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = StdResult<Pair<T>>> + 'b> {
) -> Box<dyn Iterator<Item = StdResult<Record<T>>> + 'b> {
let mapped = range_with_prefix(self.storage, &self.prefix, start, end, order)
.map(deserialize_kv::<T>);
Box::new(mapped)
Expand Down Expand Up @@ -159,7 +159,7 @@ where
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = StdResult<Pair<T>>> + 'b> {
) -> Box<dyn Iterator<Item = StdResult<Record<T>>> + 'b> {
let mapped = range_with_prefix(self.storage, &self.prefix, start, end, order)
.map(deserialize_kv::<T>);
Box::new(mapped)
Expand Down Expand Up @@ -441,7 +441,7 @@ mod tests {
bucket.save(b"maria", &maria).unwrap();
bucket.save(b"jose", &jose).unwrap();

let res_data: StdResult<Vec<Pair<Data>>> =
let res_data: StdResult<Vec<Record<Data>>> =
bucket.range(None, None, Order::Ascending).collect();
let data = res_data.unwrap();
assert_eq!(data.len(), 2);
Expand All @@ -450,7 +450,7 @@ mod tests {

// also works for readonly
let read_bucket = bucket_read::<Data>(&store, b"data");
let res_data: StdResult<Vec<Pair<Data>>> =
let res_data: StdResult<Vec<Record<Data>>> =
read_bucket.range(None, None, Order::Ascending).collect();
let data = res_data.unwrap();
assert_eq!(data.len(), 2);
Expand Down
10 changes: 5 additions & 5 deletions packages/storage/src/namespace_helpers.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use cosmwasm_std::Storage;
#[cfg(feature = "iterator")]
use cosmwasm_std::{Order, Pair};
use cosmwasm_std::{Order, Record};

pub(crate) fn get_with_prefix(
storage: &dyn Storage,
Expand Down Expand Up @@ -37,7 +37,7 @@ pub(crate) fn range_with_prefix<'a>(
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair> + 'a> {
) -> Box<dyn Iterator<Item = Record> + 'a> {
// prepare start, end with prefix
let start = match start {
Some(s) => concat(namespace, s),
Expand Down Expand Up @@ -153,7 +153,7 @@ mod tests {

// ensure we get proper result from prefixed_range iterator
let iter = range_with_prefix(&storage, &prefix, None, None, Order::Descending);
let elements: Vec<Pair> = iter.collect();
let elements: Vec<Record> = iter.collect();
assert_eq!(
elements,
vec![
Expand All @@ -179,7 +179,7 @@ mod tests {
set_with_prefix(&mut storage, &other_prefix, b"moon", b"buggy");

// make sure start and end are applied properly
let res: Vec<Pair> =
let res: Vec<Record> =
range_with_prefix(&storage, &prefix, Some(b"b"), Some(b"c"), Order::Ascending)
.collect();
assert_eq!(res.len(), 1);
Expand All @@ -196,7 +196,7 @@ mod tests {
.count();
assert_eq!(res_count, 0);

let res: Vec<Pair> =
let res: Vec<Record> =
range_with_prefix(&storage, &prefix, Some(b"ant"), None, Order::Ascending).collect();
assert_eq!(res.len(), 2);
assert_eq!(res[0], (b"bar".to_vec(), b"none".to_vec()));
Expand Down
6 changes: 3 additions & 3 deletions packages/storage/src/prefixed_storage.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use cosmwasm_std::Storage;
#[cfg(feature = "iterator")]
use cosmwasm_std::{Order, Pair};
use cosmwasm_std::{Order, Record};

use crate::length_prefixed::{to_length_prefixed, to_length_prefixed_nested};
#[cfg(feature = "iterator")]
Expand Down Expand Up @@ -64,7 +64,7 @@ impl<'a> Storage for PrefixedStorage<'a> {
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair> + 'b> {
) -> Box<dyn Iterator<Item = Record> + 'b> {
range_with_prefix(self.storage, &self.prefix, start, end, order)
}
}
Expand Down Expand Up @@ -112,7 +112,7 @@ impl<'a> Storage for ReadonlyPrefixedStorage<'a> {
start: Option<&[u8]>,
end: Option<&[u8]>,
order: Order,
) -> Box<dyn Iterator<Item = Pair> + 'b> {
) -> Box<dyn Iterator<Item = Record> + 'b> {
range_with_prefix(self.storage, &self.prefix, start, end, order)
}
}
Expand Down
4 changes: 2 additions & 2 deletions packages/storage/src/type_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use serde::de::DeserializeOwned;
use std::any::type_name;

#[cfg(feature = "iterator")]
use cosmwasm_std::Pair;
use cosmwasm_std::Record;
use cosmwasm_std::{from_slice, StdError, StdResult};

/// may_deserialize parses json bytes from storage (Option), returning Ok(None) if no data present
Expand All @@ -27,7 +27,7 @@ pub(crate) fn must_deserialize<T: DeserializeOwned>(value: &Option<Vec<u8>>) ->
}

#[cfg(feature = "iterator")]
pub(crate) fn deserialize_kv<T: DeserializeOwned>(kv: Pair<Vec<u8>>) -> StdResult<Pair<T>> {
pub(crate) fn deserialize_kv<T: DeserializeOwned>(kv: Record<Vec<u8>>) -> StdResult<Record<T>> {
let (k, v) = kv;
let t = from_slice::<T>(&v)?;
Ok((k, t))
Expand Down
Loading

0 comments on commit 5b1ed5c

Please sign in to comment.