Skip to content

Commit 5d96ee2

Browse files
committed
Add migrate to queue
1 parent 2388e20 commit 5d96ee2

File tree

6 files changed

+93
-17
lines changed

6 files changed

+93
-17
lines changed

contracts/queue/examples/schema.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ use std::fs::create_dir_all;
33

44
use cosmwasm_schema::{export_schema, remove_schemas, schema_for};
55

6-
use queue::contract::{
7-
CountResponse, HandleMsg, InitMsg, Item, ListResponse, QueryMsg, SumResponse,
8-
};
6+
use queue::contract::{CountResponse, HandleMsg, Item, ListResponse, QueryMsg, SumResponse};
7+
use queue::msg::{InitMsg, MigrateMsg};
98

109
fn main() {
1110
let mut out_dir = current_dir().unwrap();
@@ -15,6 +14,7 @@ fn main() {
1514

1615
export_schema(&schema_for!(InitMsg), &out_dir);
1716
export_schema(&schema_for!(HandleMsg), &out_dir);
17+
export_schema(&schema_for!(MigrateMsg), &out_dir);
1818
export_schema(&schema_for!(QueryMsg), &out_dir);
1919
export_schema(&schema_for!(Item), &out_dir);
2020
export_schema(&schema_for!(CountResponse), &out_dir);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema#",
3+
"title": "MigrateMsg",
4+
"type": "object"
5+
}

contracts/queue/src/contract.rs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ use serde::{Deserialize, Serialize};
55

66
use cosmwasm_std::{
77
from_slice, to_binary, to_vec, Binary, Deps, DepsMut, Env, HandleResponse, InitResponse,
8-
MessageInfo, Order, QueryResponse, StdResult,
8+
MessageInfo, MigrateResponse, Order, QueryResponse, StdResult, Storage,
99
};
1010

11-
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
12-
pub struct InitMsg {}
11+
use crate::msg::{InitMsg, MigrateMsg};
1312

1413
// we store one entry for each item in the queue
1514
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
@@ -82,16 +81,21 @@ pub fn handle(
8281
msg: HandleMsg,
8382
) -> StdResult<HandleResponse> {
8483
match msg {
85-
HandleMsg::Enqueue { value } => enqueue(deps, value),
86-
HandleMsg::Dequeue {} => dequeue(deps),
84+
HandleMsg::Enqueue { value } => handle_enqueue(deps, value),
85+
HandleMsg::Dequeue {} => handle_dequeue(deps),
8786
}
8887
}
8988

9089
const FIRST_KEY: u8 = 0;
9190

92-
fn enqueue(deps: DepsMut, value: i32) -> StdResult<HandleResponse> {
91+
fn handle_enqueue(deps: DepsMut, value: i32) -> StdResult<HandleResponse> {
92+
enqueue(deps.storage, value)?;
93+
Ok(HandleResponse::default())
94+
}
95+
96+
fn enqueue(storage: &mut dyn Storage, value: i32) -> StdResult<()> {
9397
// find the last element in the queue and extract key
94-
let last_item = deps.storage.range(None, None, Order::Descending).next();
98+
let last_item = storage.range(None, None, Order::Descending).next();
9599

96100
let new_key = match last_item {
97101
None => FIRST_KEY,
@@ -101,11 +105,11 @@ fn enqueue(deps: DepsMut, value: i32) -> StdResult<HandleResponse> {
101105
};
102106
let new_value = to_vec(&Item { value })?;
103107

104-
deps.storage.set(&[new_key], &new_value);
105-
Ok(HandleResponse::default())
108+
storage.set(&[new_key], &new_value);
109+
Ok(())
106110
}
107111

108-
fn dequeue(deps: DepsMut) -> StdResult<HandleResponse> {
112+
fn handle_dequeue(deps: DepsMut) -> StdResult<HandleResponse> {
109113
// find the first element in the queue and extract value
110114
let first = deps.storage.range(None, None, Order::Ascending).next();
111115

@@ -120,6 +124,29 @@ fn dequeue(deps: DepsMut) -> StdResult<HandleResponse> {
120124
}
121125
}
122126

127+
pub fn migrate(
128+
deps: DepsMut,
129+
_env: Env,
130+
_info: MessageInfo,
131+
_msg: MigrateMsg,
132+
) -> StdResult<MigrateResponse> {
133+
// clear all
134+
let keys: Vec<_> = deps
135+
.storage
136+
.range(None, None, Order::Ascending)
137+
.map(|(key, _)| key)
138+
.collect();
139+
for key in keys {
140+
deps.storage.remove(&key);
141+
}
142+
143+
// Write new values
144+
enqueue(deps.storage, 100)?;
145+
enqueue(deps.storage, 101)?;
146+
enqueue(deps.storage, 102)?;
147+
Ok(MigrateResponse::default())
148+
}
149+
123150
pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<QueryResponse> {
124151
match msg {
125152
QueryMsg::Count {} => to_binary(&query_count(deps)?),

contracts/queue/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod contract;
2+
pub mod msg;
23

34
#[cfg(target_arch = "wasm32")]
4-
cosmwasm_std::create_entry_points!(contract);
5+
cosmwasm_std::create_entry_points_with_migration!(contract);

contracts/queue/src/msg.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#![allow(clippy::field_reassign_with_default)] // see https://github.com/CosmWasm/cosmwasm/issues/685
2+
3+
use schemars::JsonSchema;
4+
use serde::{Deserialize, Serialize};
5+
6+
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
7+
pub struct InitMsg {}
8+
9+
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
10+
pub struct MigrateMsg {}

contracts/queue/tests/integration.rs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,21 @@
1717
//! });
1818
//! 4. Anywhere you see query(&deps, ...) you must replace it with query(&mut deps, ...)
1919
20-
use cosmwasm_std::{from_binary, from_slice, HandleResponse, HumanAddr, InitResponse, MessageInfo};
20+
use cosmwasm_std::{
21+
from_binary, from_slice, HandleResponse, HumanAddr, InitResponse, MessageInfo, MigrateResponse,
22+
};
2123
use cosmwasm_vm::{
2224
testing::{
23-
handle, init, mock_env, mock_info, mock_instance_with_gas_limit, query, MockApi,
25+
handle, init, migrate, mock_env, mock_info, mock_instance_with_gas_limit, query, MockApi,
2426
MockQuerier, MockStorage,
2527
},
2628
Instance,
2729
};
2830

2931
use queue::contract::{
30-
CountResponse, HandleMsg, InitMsg, Item, ListResponse, QueryMsg, ReducerResponse, SumResponse,
32+
CountResponse, HandleMsg, Item, ListResponse, QueryMsg, ReducerResponse, SumResponse,
3133
};
34+
use queue::msg::{InitMsg, MigrateMsg};
3235

3336
static WASM: &[u8] = include_bytes!("../target/wasm32-unknown-unknown/release/queue.wasm");
3437

@@ -170,6 +173,36 @@ fn push_and_reduce() {
170173
assert_eq!(counters, vec![(40, 85), (15, 125), (85, 0), (-10, 140)]);
171174
}
172175

176+
#[test]
177+
fn migrate_works() {
178+
let (mut deps, info) = create_contract();
179+
180+
let _: HandleResponse = handle(
181+
&mut deps,
182+
mock_env(),
183+
info.clone(),
184+
HandleMsg::Enqueue { value: 25 },
185+
)
186+
.unwrap();
187+
let _: HandleResponse = handle(
188+
&mut deps,
189+
mock_env(),
190+
info.clone(),
191+
HandleMsg::Enqueue { value: 17 },
192+
)
193+
.unwrap();
194+
assert_eq!(get_count(&mut deps), 2);
195+
assert_eq!(get_sum(&mut deps), 25 + 17);
196+
197+
let msg = MigrateMsg {};
198+
let info = mock_info("admin", &[]);
199+
let res: MigrateResponse = migrate(&mut deps, mock_env(), info, msg).unwrap();
200+
assert_eq!(res.messages.len(), 0);
201+
202+
assert_eq!(get_count(&mut deps), 3);
203+
assert_eq!(get_sum(&mut deps), 100 + 101 + 102);
204+
}
205+
173206
#[test]
174207
fn query_list() {
175208
let (mut deps, info) = create_contract();

0 commit comments

Comments
 (0)