├── .gitignore ├── Cargo.toml ├── LICENSE ├── README.md ├── examples ├── backend │ ├── Cargo.toml │ ├── README.md │ ├── can.did │ ├── dfx.json │ └── src │ │ └── lib.rs ├── bench │ ├── Cargo.toml │ ├── README.md │ ├── bench1.sh │ ├── bench2.sh │ ├── can.did │ ├── dfx.json │ ├── report │ │ ├── bench1.log │ │ └── bench2.log │ └── src │ │ └── lib.rs ├── common │ ├── Cargo.toml │ ├── README.md │ ├── backend.wasm │ ├── can.did │ ├── dfx.json │ ├── run.sh │ └── src │ │ └── lib.rs └── static │ ├── actions.png │ └── deploy.png └── src ├── lib.rs └── vfs.rs /.gitignore: -------------------------------------------------------------------------------- 1 | */**/.dfx/ 2 | target/ 3 | */**/target/ 4 | Cargo.lock 5 | */**/Cargo.lock 6 | .idea/ -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ic-sqlite" 3 | description = "ICSQLite is a cloud SQLite database on Internet Computer and provides SDK for developers to use." 4 | version = "0.1.0" 5 | edition = "2021" 6 | license = "MIT OR Apache-2.0" 7 | authors = ["Froghub "] 8 | repository = "https://github.com/froghub-io/ic-sqlite.git" 9 | 10 | [dependencies] 11 | ic-cdk = "0.6.8" 12 | lazy_static = "1.2" 13 | sqlite-vfs = { package = "sqlite-vfs-ic", version = "0.2" } 14 | rusqlite = { package = "rusqlite-ic", version = "0.28", features = ["bundled", "serde_json"]} 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT OR Apache-2.0 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ICSQLite 2 | ICSQLite is a cloud SQLite database on Internet Computer and provides SDK for developers to use. 3 | Our goal is to help developers quickly migrate web2 applications to Internet Computer. 4 | 5 | 6 | ## Usage 7 | 8 | In your Cargo.toml: 9 | 10 | ```toml 11 | [dependencies] 12 | ic-sqlite = "0.1.0" 13 | ``` 14 | 15 | ## Limitations & Suggestions 16 | Limited by the total number of cycles of a call, if the number of rows retrieved by a single SQL query exceeds a certain amount, the call will crash. 17 | 18 | #### SQL statement suggestions 19 | * Strictly follow the rules of database optimization 20 | * Index building must be an empty table 21 | * Where query must be filtered for primary key or index field 22 | * Less use NOT,!=,<>,!<,!> NOT EXISTS, NOT IN, NOT LIKE, OR, they will ignore the index and cause a full table scan 23 | 24 | #### [Performance benchmarks for SQL commands](https://github.com/froghub-io/ic-sqlite/tree/main/examples/bench) 25 | | SQL
commands | performance counter
1w single table data | performance counter
10w single table data | performance counter
50w single table data | performance counter
100w single table data | 26 | |----------------------------------|------------------------------------------------|-------------------------------------------------|-------------------------------------------------|--------------------------------------------------| 27 | | create table | 1194347 | 1433766 | 2565609 | 4066020 | 28 | | create index
(empty table) | 884588 | 1122419 | 2241730 | 3601724 | 29 | | count | 209847 | 2995943 | 15183853 | 30392494 | 30 | | insert | 350256 | 349635 | 351731 | 355381 | 31 | | select
(where primary key) | 265363 | 265960 | 265345 | 268112 | 32 | | select
(where index field) | 312389 | 314594 | 314666 | 319276 | 33 | | select
(where like field) | 178263088 | 1784671532 | limit for single message execution | limit for single message execution | 34 | | update
(where primary key) | 385492 | 389192 | 391599 | 394111 | 35 | | update
(where index filed) | 239384 | 237908 | 237993 | 240998 | 36 | | delete
(where primary key) | 429190 | 259541 | 419615 | 423064 | 37 | 38 | ## [IC Canister Simple example usage](https://github.com/froghub-io/ic-sqlite/tree/main/examples/backend) 39 | 40 | ## Data migration suggestions & Debugging 41 | * Provide an interface for executing sql statements with super-management authority 42 | * Export standard sql statements for offline data and upload in batches 43 | * Debugging Get the data by running the sql statement through the super-management interface -------------------------------------------------------------------------------- /examples/backend/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "backend" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [lib] 9 | crate-type = ["cdylib"] 10 | 11 | [dependencies] 12 | candid = "0.7.14" 13 | ic-cdk = "0.5.2" 14 | ic-cdk-macros = "0.5.2" 15 | ic-sqlite = { path = "../../../ic-sqlite", version = "0.1.0" } 16 | serde = { version = "1", features = ["derive"] } 17 | serde_json = "1.0" -------------------------------------------------------------------------------- /examples/backend/README.md: -------------------------------------------------------------------------------- 1 | ## Examples Container 2 | 3 | ## Summary 4 | Example of using ICSQLite in IC Canister 5 | 6 | ## Setup 7 | 8 | To build and install this code, you will need: 9 | 10 | - Git 11 | - [DFX] version 0.9.0 12 | - [Rust] version 1.55.0 or later 13 | 14 | ```sh 15 | git clone https://github.com/froghub-io/ic-sqlite.git 16 | cd examples/backend 17 | ``` 18 | 19 | To start the local replica before installing the canister: 20 | 21 | ```sh 22 | dfx start --background --clean 23 | ``` 24 | 25 | Register, build and deploy the project. 26 | ```sh 27 | dfx deploy 28 | ``` 29 | 30 | ![deploy.png](https://github.com/froghub-io/ic-sqlite/blob/main/examples/static/deploy.png) 31 | 32 | Access the backend address 33 | 34 | ![actions.png](https://github.com/froghub-io/ic-sqlite/blob/main/examples/static/actions.png) -------------------------------------------------------------------------------- /examples/backend/can.did: -------------------------------------------------------------------------------- 1 | type Error = variant { 2 | InvalidCanister; 3 | CanisterError : record { 4 | message : text; 5 | }; 6 | }; 7 | 8 | type Result = variant { 9 | Ok: text; 10 | Err : Error; 11 | }; 12 | 13 | type Person = record { 14 | name: text; 15 | age: nat64 16 | }; 17 | 18 | type QueryParams = record { 19 | limit: nat64; 20 | offset: nat64; 21 | }; 22 | 23 | type FilterParams = record { 24 | name: text 25 | }; 26 | 27 | type UpdateParams = record { 28 | id: nat64; 29 | name: text; 30 | }; 31 | 32 | service : { 33 | "create": () -> (Result); 34 | "query": (QueryParams) -> (Result) query; 35 | "query_filter": (FilterParams) -> (Result) query; 36 | "insert": (Person) -> (Result); 37 | "delete": (nat64) -> (Result); 38 | "update": (UpdateParams) -> (Result); 39 | } 40 | -------------------------------------------------------------------------------- /examples/backend/dfx.json: -------------------------------------------------------------------------------- 1 | { 2 | "canisters": { 3 | "backend": { 4 | "candid": "./can.did", 5 | "package": "backend", 6 | "type": "rust" 7 | } 8 | }, 9 | "dfx": "0.11.0", 10 | "networks": { 11 | "local": { 12 | "bind": "127.0.0.1:8000", 13 | "type": "ephemeral" 14 | } 15 | }, 16 | "version": 1 17 | } -------------------------------------------------------------------------------- /examples/backend/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate ic_cdk_macros; 3 | #[macro_use] 4 | extern crate serde; 5 | 6 | use ic_cdk::api::call::RejectionCode; 7 | use candid::CandidType; 8 | 9 | #[update] 10 | fn create() -> Result { 11 | let conn = ic_sqlite::CONN.lock().unwrap(); 12 | return match conn.execute( 13 | "create table person ( 14 | id INTEGER PRIMARY KEY, 15 | name TEXT NOT NULL, 16 | age INTEGER 17 | )", 18 | [] 19 | ) { 20 | Ok(e) => Ok(format!("{:?}", e)), 21 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 22 | } 23 | } 24 | 25 | #[query] 26 | fn query(params: QueryParams) -> Result { 27 | let conn = ic_sqlite::CONN.lock().unwrap(); 28 | let mut stmt = match conn.prepare("select * from person limit ?1 offset ?2") { 29 | Ok(e) => e, 30 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 31 | }; 32 | let person_iter = match stmt.query_map((params.limit, params.offset), |row| { 33 | Ok(PersonQuery { 34 | id: row.get(0).unwrap(), 35 | name: row.get(1).unwrap(), 36 | age: row.get(2).unwrap(), 37 | }) 38 | }) { 39 | Ok(e) => e, 40 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 41 | }; 42 | let mut persons = Vec::new(); 43 | for person in person_iter { 44 | persons.push(person.unwrap()); 45 | } 46 | let res = serde_json::to_string(&persons).unwrap(); 47 | Ok(res) 48 | } 49 | 50 | #[query] 51 | fn query_filter(params: FilterParams) -> Result { 52 | let conn = ic_sqlite::CONN.lock().unwrap(); 53 | let mut stmt = match conn.prepare("select * from person where name=?1") { 54 | Ok(e) => e, 55 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 56 | }; 57 | let person_iter = match stmt.query_map((params.name, ), |row| { 58 | Ok(PersonQuery { 59 | id: row.get(0).unwrap(), 60 | name: row.get(1).unwrap(), 61 | age: row.get(2).unwrap(), 62 | }) 63 | }) { 64 | Ok(e) => e, 65 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 66 | }; 67 | let mut persons = Vec::new(); 68 | for person in person_iter { 69 | persons.push(person.unwrap()); 70 | } 71 | let res = serde_json::to_string(&persons).unwrap(); 72 | Ok(res) 73 | } 74 | 75 | #[update] 76 | fn insert(person: Person) -> Result { 77 | let conn = ic_sqlite::CONN.lock().unwrap(); 78 | return match conn.execute( 79 | "insert into person (name, age) values (?1, ?2);", 80 | (person.name, person.age,) 81 | ) { 82 | Ok(e) => Ok(format!("{:?}", e)), 83 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 84 | } 85 | } 86 | 87 | #[update] 88 | fn delete(id: usize) -> Result { 89 | let conn = ic_sqlite::CONN.lock().unwrap(); 90 | return match conn.execute( 91 | "delete from person where id=?1", 92 | (id,) 93 | ) { 94 | Ok(e) => Ok(format!("{:?}", e)), 95 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 96 | } 97 | } 98 | 99 | #[update] 100 | fn update(params: UpdateParams) -> Result { 101 | let conn = ic_sqlite::CONN.lock().unwrap(); 102 | return match conn.execute( 103 | "update person set name=?1 where id=?2", 104 | (params.name, params.id) 105 | ) { 106 | Ok(e) => Ok(format!("{:?}", e)), 107 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 108 | } 109 | } 110 | 111 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 112 | struct Person { 113 | name: String, 114 | age: usize, 115 | } 116 | 117 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 118 | struct PersonQuery { 119 | id: usize, 120 | name: String, 121 | age: usize, 122 | } 123 | 124 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 125 | struct QueryParams { 126 | limit: usize, 127 | offset: usize, 128 | } 129 | 130 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 131 | struct FilterParams { 132 | name: String, 133 | } 134 | 135 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 136 | struct UpdateParams { 137 | id: usize, 138 | name: String 139 | } 140 | 141 | 142 | #[derive(CandidType, Deserialize)] 143 | enum Error { 144 | InvalidCanister, 145 | CanisterError { message: String }, 146 | } 147 | 148 | type Result = std::result::Result; 149 | 150 | impl From<(RejectionCode, String)> for Error { 151 | fn from((code, message): (RejectionCode, String)) -> Self { 152 | match code { 153 | RejectionCode::CanisterError => Self::CanisterError { message }, 154 | _ => Self::InvalidCanister, 155 | } 156 | } 157 | } -------------------------------------------------------------------------------- /examples/bench/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "backend" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [lib] 9 | crate-type = ["cdylib"] 10 | 11 | [dependencies] 12 | candid = "0.7.14" 13 | ic-cdk = "0.5.2" 14 | ic-cdk-macros = "0.5.2" 15 | ic-sqlite = { path = "../../../ic-sqlite", version = "0.1.0" } 16 | serde = { version = "1", features = ["derive"] } 17 | serde_json = "1.0" -------------------------------------------------------------------------------- /examples/bench/README.md: -------------------------------------------------------------------------------- 1 | ## Bench Test Examples Container 2 | 3 | ## Summary 4 | Bench Test Example of using ICSQLite in IC Canister 5 | 6 | ## Setup 7 | 8 | To build and install this code, you will need: 9 | 10 | - Git 11 | - [DFX] version 0.9.0 12 | - [Rust] version 1.55.0 or later 13 | 14 | ```sh 15 | git clone https://github.com/froghub-io/ic-sqlite.git 16 | cd examples/bench 17 | ``` 18 | 19 | To start the local replica before installing the canister: 20 | 21 | ```sh 22 | dfx start --background --clean 23 | ``` 24 | 25 | Register, build and deploy the project. 26 | ```sh 27 | dfx deploy 28 | ``` 29 | 30 | Run bench scripts 31 | ```sh 32 | bash bench1.sh 33 | bash bench2.sh 34 | ``` -------------------------------------------------------------------------------- /examples/bench/bench1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # create table person 4 | dfx canister call backend execute 'create table person ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, gender INTEGER )' 5 | 6 | # create person name index 7 | dfx canister call backend execute 'create index name on person(name)' 8 | 9 | TOTAL=1000000 10 | COUNTER=0 11 | PER=10000 12 | while [ $COUNTER -lt $TOTAL ]; 13 | do 14 | 15 | CUR=`expr $COUNTER + $PER` 16 | echo "--- ${CUR} ---" 17 | 18 | dfx canister call backend bench1_insert_person "(${COUNTER}, $PER)" 19 | 20 | COUNTER=`expr $COUNTER + $PER` 21 | 22 | # create table person 23 | dfx canister call backend execute "create table person$COUNTER ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, gender INTEGER )" 24 | 25 | # create person name index 26 | dfx canister call backend execute "create index name$COUNTER on person$COUNTER(name)" 27 | 28 | # count performance counter 29 | dfx canister call backend count '("person")' 30 | 31 | # insert performance counter 32 | dfx canister call backend bench1_insert_person_one "(${COUNTER})" 33 | 34 | # query_by_id performance counter 35 | dfx canister call backend bench1_query_person_by_id "(${COUNTER})" 36 | 37 | # query_by_name performance counter 38 | dfx canister call backend bench1_query_person_by_name "(${COUNTER})" 39 | 40 | # query_by_like_name performance counter 41 | dfx canister call backend bench1_query_person_by_like_name "(${COUNTER})" 42 | 43 | # bench1_query_person_by_limit_offset performance counter 44 | HALF_COUNTER=`expr $COUNTER / 2` 45 | dfx canister call backend bench1_query_person_by_limit_offset "(10, ${HALF_COUNTER})" 46 | 47 | # update_by_name performance counter 48 | dfx canister call backend bench1_update_person_by_name "(${COUNTER})" 49 | 50 | # update_by_id performance counter 51 | dfx canister call backend bench1_update_person_by_id "(${COUNTER})" 52 | 53 | # delete_by_id performance counter 54 | dfx canister call backend bench1_delete_person_by_id "(${COUNTER})" 55 | 56 | done -------------------------------------------------------------------------------- /examples/bench/bench2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # create table person 4 | dfx canister call backend execute 'create table person2 ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, gender INTEGER, data TEXT NOT NULL )' 5 | 6 | # create person name index 7 | dfx canister call backend execute 'create index name2 on person2(name)' 8 | 9 | TOTAL=1000000 10 | COUNTER=0 11 | PER=10000 12 | while [ $COUNTER -lt $TOTAL ]; 13 | do 14 | 15 | CUR=`expr $COUNTER + $PER` 16 | echo "--- ${CUR} ---" 17 | 18 | dfx canister call backend bench2_insert_person2 "(${COUNTER}, $PER)" 19 | 20 | COUNTER=`expr $COUNTER + $PER` 21 | 22 | # create table person2 23 | dfx canister call backend execute "create table person2$COUNTER ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, gender INTEGER, data BLOB )" 24 | 25 | # create person2 name index 26 | dfx canister call backend execute "create index name2$COUNTER on person2$COUNTER(name)" 27 | 28 | # count performance counter 29 | dfx canister call backend count '("person2")' 30 | 31 | # insert performance counter 32 | dfx canister call backend bench2_insert_person2_one "(${COUNTER})" 33 | 34 | # query2_by_id performance counter 35 | dfx canister call backend bench2_query_person2_by_id "(${COUNTER})" 36 | 37 | # query2_by_name performance counter 38 | dfx canister call backend bench2_query_person2_by_name "(${COUNTER})" 39 | 40 | # query2_by_like_name performance counter 41 | dfx canister call backend bench2_query_person2_by_like_name "(${COUNTER})" 42 | 43 | # bench2_query_person2_by_limit_offset performance counter 44 | HALF_COUNTER=`expr $COUNTER / 2` 45 | dfx canister call backend bench2_query_person2_by_limit_offset "(10, ${HALF_COUNTER})" 46 | 47 | # update_by_name performance counter 48 | dfx canister call backend bench2_update_person2_by_name "(${COUNTER})" 49 | 50 | # update_by_id performance counter 51 | dfx canister call backend bench2_update_person2_by_id "(${COUNTER})" 52 | 53 | # delete_by_id performance counter 54 | dfx canister call backend bench2_delete_person2_by_id "(${COUNTER})" 55 | 56 | done -------------------------------------------------------------------------------- /examples/bench/can.did: -------------------------------------------------------------------------------- 1 | type Error = variant { 2 | InvalidCanister; 3 | CanisterError : record { 4 | message : text; 5 | }; 6 | }; 7 | 8 | type Result = variant { 9 | Ok: text; 10 | Err : Error; 11 | }; 12 | 13 | service : { 14 | "execute": (text) -> (Result); 15 | "count": (text) -> (Result); 16 | "bench1_insert_person": (nat64, nat64) -> (Result); 17 | "bench1_insert_person_one": (nat64) -> (Result); 18 | "bench1_query_person_by_id": (nat64) -> (Result); 19 | "bench1_query_person_by_name": (nat64) -> (Result); 20 | "bench1_query_person_by_like_name": (nat64) -> (Result); 21 | "bench1_query_person_by_limit_offset": (nat64, nat64) -> (Result); 22 | "bench1_update_person_by_id": (nat64) -> (Result); 23 | "bench1_update_person_by_name": (nat64) -> (Result); 24 | "bench1_delete_person_by_id": (nat64) -> (Result); 25 | "bench2_insert_person2": (nat64, nat64) -> (Result); 26 | "bench2_insert_person2_one": (nat64) -> (Result); 27 | "bench2_query_person2_by_id": (nat64) -> (Result); 28 | "bench2_query_person2_by_name": (nat64) -> (Result); 29 | "bench2_query_person2_by_like_name": (nat64) -> (Result); 30 | "bench2_query_person2_by_limit_offset": (nat64, nat64) -> (Result); 31 | "bench2_update_person2_by_id": (nat64) -> (Result); 32 | "bench2_update_person2_by_name": (nat64) -> (Result); 33 | "bench2_delete_person2_by_id": (nat64) -> (Result); 34 | } 35 | -------------------------------------------------------------------------------- /examples/bench/dfx.json: -------------------------------------------------------------------------------- 1 | { 2 | "canisters": { 3 | "backend": { 4 | "candid": "./can.did", 5 | "package": "backend", 6 | "type": "rust" 7 | } 8 | }, 9 | "dfx": "0.11.0", 10 | "networks": { 11 | "local": { 12 | "bind": "127.0.0.1:8000", 13 | "type": "ephemeral" 14 | } 15 | }, 16 | "version": 1 17 | } -------------------------------------------------------------------------------- /examples/bench/report/bench1.log: -------------------------------------------------------------------------------- 1 | nohup: ignoring input 2 | (variant { Ok = "execute performance_counter: 2149652" }) 3 | (variant { Ok = "execute performance_counter: 849717" }) 4 | --- 10000 --- 5 | (variant { Ok = "bench1_insert_person OK" }) 6 | (variant { Ok = "execute performance_counter: 1194347" }) 7 | (variant { Ok = "execute performance_counter: 884588" }) 8 | (variant { Ok = "count performance_counter: 209847" }) 9 | (variant { Ok = "insert performance_counter: 350256" }) 10 | (variant { Ok = "query_by_id performance_counter: 265363" }) 11 | (variant { Ok = "query_by_name performance_counter: 312389" }) 12 | (variant { Ok = "query_by_like_name performance_counter: 178263088" }) 13 | (variant { Ok = "query_by_limit_offset performance_counter: 43224428" }) 14 | (variant { Ok = "update_by_name performance_counter: 239384" }) 15 | (variant { Ok = "update_by_id performance_counter: 385492" }) 16 | (variant { Ok = "delete performance_counter: 429190" }) 17 | --- 20000 --- 18 | (variant { Ok = "bench1_insert_person OK" }) 19 | (variant { Ok = "execute performance_counter: 1224989" }) 20 | (variant { Ok = "execute performance_counter: 906160" }) 21 | (variant { Ok = "count performance_counter: 241659" }) 22 | (variant { Ok = "insert performance_counter: 349671" }) 23 | (variant { Ok = "query_by_id performance_counter: 263967" }) 24 | (variant { Ok = "query_by_name performance_counter: 309542" }) 25 | (variant { Ok = "query_by_like_name performance_counter: 356345507" }) 26 | (variant { Ok = "query_by_limit_offset performance_counter: 85535270" }) 27 | (variant { Ok = "update_by_name performance_counter: 237464" }) 28 | (variant { Ok = "update_by_id performance_counter: 386062" }) 29 | (variant { Ok = "delete performance_counter: 259238" }) 30 | --- 30000 --- 31 | (variant { Ok = "bench1_insert_person OK" }) 32 | (variant { Ok = "execute performance_counter: 1253329" }) 33 | (variant { Ok = "execute performance_counter: 936849" }) 34 | (variant { Ok = "count performance_counter: 269439" }) 35 | (variant { Ok = "insert performance_counter: 348902" }) 36 | (variant { Ok = "query_by_id performance_counter: 262792" }) 37 | (variant { Ok = "query_by_name performance_counter: 309887" }) 38 | (variant { Ok = "query_by_like_name performance_counter: 534550570" }) 39 | (variant { Ok = "query_by_limit_offset performance_counter: 127835965" }) 40 | (variant { Ok = "update_by_name performance_counter: 236947" }) 41 | (variant { Ok = "update_by_id performance_counter: 386373" }) 42 | (variant { Ok = "delete performance_counter: 433410" }) 43 | --- 40000 --- 44 | (variant { Ok = "bench1_insert_person OK" }) 45 | (variant { Ok = "execute performance_counter: 1278468" }) 46 | (variant { Ok = "execute performance_counter: 963356" }) 47 | (variant { Ok = "count performance_counter: 302582" }) 48 | (variant { Ok = "insert performance_counter: 349116" }) 49 | (variant { Ok = "query_by_id performance_counter: 263440" }) 50 | (variant { Ok = "query_by_name performance_counter: 311188" }) 51 | (variant { Ok = "query_by_like_name performance_counter: 712758381" }) 52 | (variant { Ok = "query_by_limit_offset performance_counter: 170139240" }) 53 | (variant { Ok = "update_by_name performance_counter: 238433" }) 54 | (variant { Ok = "update_by_id performance_counter: 386657" }) 55 | (variant { Ok = "delete performance_counter: 439817" }) 56 | --- 50000 --- 57 | (variant { Ok = "bench1_insert_person OK" }) 58 | (variant { Ok = "execute performance_counter: 1301034" }) 59 | (variant { Ok = "execute performance_counter: 987602" }) 60 | (variant { Ok = "count performance_counter: 450718" }) 61 | (variant { Ok = "insert performance_counter: 351048" }) 62 | (variant { Ok = "query_by_id performance_counter: 263741" }) 63 | (variant { Ok = "query_by_name performance_counter: 311642" }) 64 | (variant { Ok = "query_by_like_name performance_counter: 891384975" }) 65 | (variant { Ok = "query_by_limit_offset performance_counter: 212860227" }) 66 | (variant { Ok = "update_by_name performance_counter: 238431" }) 67 | (variant { Ok = "update_by_id performance_counter: 386703" }) 68 | (variant { Ok = "delete performance_counter: 434641" }) 69 | --- 60000 --- 70 | (variant { Ok = "bench1_insert_person OK" }) 71 | (variant { Ok = "execute performance_counter: 1329223" }) 72 | (variant { Ok = "execute performance_counter: 1016766" }) 73 | (variant { Ok = "count performance_counter: 921491" }) 74 | (variant { Ok = "insert performance_counter: 366893" }) 75 | (variant { Ok = "query_by_id performance_counter: 263711" }) 76 | (variant { Ok = "query_by_name performance_counter: 312249" }) 77 | (variant { Ok = "query_by_like_name performance_counter: 1070131770" }) 78 | (variant { Ok = "query_by_limit_offset performance_counter: 255526414" }) 79 | (variant { Ok = "update_by_name performance_counter: 238686" }) 80 | (variant { Ok = "update_by_id performance_counter: 385603" }) 81 | (variant { Ok = "delete performance_counter: 361541" }) 82 | --- 70000 --- 83 | (variant { Ok = "bench1_insert_person OK" }) 84 | (variant { Ok = "execute performance_counter: 1356126" }) 85 | (variant { Ok = "execute performance_counter: 1041452" }) 86 | (variant { Ok = "count performance_counter: 1483482" }) 87 | (variant { Ok = "insert performance_counter: 481502" }) 88 | (variant { Ok = "query_by_id performance_counter: 265171" }) 89 | (variant { Ok = "query_by_name performance_counter: 313336" }) 90 | (variant { Ok = "query_by_like_name performance_counter: 1248863217" }) 91 | (variant { Ok = "query_by_limit_offset performance_counter: 297963092" }) 92 | (variant { Ok = "update_by_name performance_counter: 238907" }) 93 | (variant { Ok = "update_by_id performance_counter: 386572" }) 94 | (variant { Ok = "delete performance_counter: 259942" }) 95 | --- 80000 --- 96 | (variant { Ok = "bench1_insert_person OK" }) 97 | (variant { Ok = "execute performance_counter: 1383313" }) 98 | (variant { Ok = "execute performance_counter: 1072071" }) 99 | (variant { Ok = "count performance_counter: 2051261" }) 100 | (variant { Ok = "insert performance_counter: 348910" }) 101 | (variant { Ok = "query_by_id performance_counter: 263602" }) 102 | (variant { Ok = "query_by_name performance_counter: 312128" }) 103 | (variant { Ok = "query_by_like_name performance_counter: 1427568812" }) 104 | (variant { Ok = "query_by_limit_offset performance_counter: 340407414" }) 105 | (variant { Ok = "update_by_name performance_counter: 237061" }) 106 | (variant { Ok = "update_by_id performance_counter: 388075" }) 107 | (variant { Ok = "delete performance_counter: 258357" }) 108 | --- 90000 --- 109 | (variant { Ok = "bench1_insert_person OK" }) 110 | (variant { Ok = "execute performance_counter: 1405293" }) 111 | (variant { Ok = "execute performance_counter: 1099011" }) 112 | (variant { Ok = "count performance_counter: 2627348" }) 113 | (variant { Ok = "insert performance_counter: 348273" }) 114 | (variant { Ok = "query_by_id performance_counter: 263976" }) 115 | (variant { Ok = "query_by_name performance_counter: 312609" }) 116 | (variant { Ok = "query_by_like_name performance_counter: 1606197981" }) 117 | (variant { Ok = "query_by_limit_offset performance_counter: 382845877" }) 118 | (variant { Ok = "update_by_name performance_counter: 237182" }) 119 | (variant { Ok = "update_by_id performance_counter: 387897" }) 120 | (variant { Ok = "delete performance_counter: 259867" }) 121 | --- 100000 --- 122 | (variant { Ok = "bench1_insert_person OK" }) 123 | (variant { Ok = "execute performance_counter: 1433766" }) 124 | (variant { Ok = "execute performance_counter: 1122419" }) 125 | (variant { Ok = "count performance_counter: 2995943" }) 126 | (variant { Ok = "insert performance_counter: 349635" }) 127 | (variant { Ok = "query_by_id performance_counter: 265960" }) 128 | (variant { Ok = "query_by_name performance_counter: 314594" }) 129 | (variant { Ok = "query_by_like_name performance_counter: 1784671532" }) 130 | (variant { Ok = "query_by_limit_offset performance_counter: 425282479" }) 131 | (variant { Ok = "update_by_name performance_counter: 237908" }) 132 | (variant { Ok = "update_by_id performance_counter: 389192" }) 133 | (variant { Ok = "delete performance_counter: 259541" }) 134 | --- 110000 --- 135 | (variant { Ok = "bench1_insert_person OK" }) 136 | (variant { Ok = "execute performance_counter: 1464850" }) 137 | (variant { Ok = "execute performance_counter: 1148108" }) 138 | (variant { Ok = "count performance_counter: 3005625" }) 139 | (variant { Ok = "insert performance_counter: 349730" }) 140 | (variant { Ok = "query_by_id performance_counter: 265980" }) 141 | (variant { Ok = "query_by_name performance_counter: 314428" }) 142 | (variant { Ok = "query_by_like_name performance_counter: 1963310961" }) 143 | (variant { Ok = "query_by_limit_offset performance_counter: 467721518" }) 144 | (variant { Ok = "update_by_name performance_counter: 238467" }) 145 | (variant { Ok = "update_by_id performance_counter: 388588" }) 146 | (variant { Ok = "delete performance_counter: 258900" }) 147 | --- 120000 --- 148 | (variant { Ok = "bench1_insert_person OK" }) 149 | (variant { Ok = "execute performance_counter: 1489192" }) 150 | (variant { Ok = "execute performance_counter: 1171897" }) 151 | (variant { Ok = "count performance_counter: 3014747" }) 152 | (variant { Ok = "insert performance_counter: 349542" }) 153 | (variant { Ok = "query_by_id performance_counter: 265127" }) 154 | (variant { Ok = "query_by_name performance_counter: 313785" }) 155 | (variant { Ok = "query_by_like_name performance_counter: 2141951324" }) 156 | (variant { Ok = "query_by_limit_offset performance_counter: 510165587" }) 157 | (variant { Ok = "update_by_name performance_counter: 237800" }) 158 | (variant { Ok = "update_by_id performance_counter: 388451" }) 159 | (variant { Ok = "delete performance_counter: 260368" }) 160 | --- 130000 --- 161 | (variant { Ok = "bench1_insert_person OK" }) 162 | (variant { Ok = "execute performance_counter: 1517436" }) 163 | (variant { Ok = "execute performance_counter: 1203569" }) 164 | (variant { Ok = "count performance_counter: 3027527" }) 165 | (variant { Ok = "insert performance_counter: 350519" }) 166 | (variant { Ok = "query_by_id performance_counter: 265528" }) 167 | (variant { Ok = "query_by_name performance_counter: 314394" }) 168 | (variant { Ok = "query_by_like_name performance_counter: 2320591967" }) 169 | (variant { Ok = "query_by_limit_offset performance_counter: 552600584" }) 170 | (variant { Ok = "update_by_name performance_counter: 238691" }) 171 | (variant { Ok = "update_by_id performance_counter: 387483" }) 172 | (variant { Ok = "delete performance_counter: 260033" }) 173 | --- 140000 --- 174 | (variant { Ok = "bench1_insert_person OK" }) 175 | (variant { Ok = "execute performance_counter: 1544546" }) 176 | (variant { Ok = "execute performance_counter: 1227905" }) 177 | (variant { Ok = "count performance_counter: 3109402" }) 178 | (variant { Ok = "insert performance_counter: 348928" }) 179 | (variant { Ok = "query_by_id performance_counter: 265021" }) 180 | (variant { Ok = "query_by_name performance_counter: 313929" }) 181 | (variant { Ok = "query_by_like_name performance_counter: 2499230500" }) 182 | (variant { Ok = "query_by_limit_offset performance_counter: 595037035" }) 183 | (variant { Ok = "update_by_name performance_counter: 237454" }) 184 | (variant { Ok = "update_by_id performance_counter: 386439" }) 185 | (variant { Ok = "delete performance_counter: 420231" }) 186 | --- 150000 --- 187 | (variant { Ok = "bench1_insert_person OK" }) 188 | (variant { Ok = "execute performance_counter: 1574464" }) 189 | (variant { Ok = "execute performance_counter: 1262123" }) 190 | (variant { Ok = "count performance_counter: 3714852" }) 191 | (variant { Ok = "insert performance_counter: 349993" }) 192 | (variant { Ok = "query_by_id performance_counter: 265518" }) 193 | (variant { Ok = "query_by_name performance_counter: 314996" }) 194 | (variant { Ok = "query_by_like_name performance_counter: 2677871245" }) 195 | (variant { Ok = "query_by_limit_offset performance_counter: 637473109" }) 196 | (variant { Ok = "update_by_name performance_counter: 238690" }) 197 | (variant { Ok = "update_by_id performance_counter: 387211" }) 198 | (variant { Ok = "delete performance_counter: 260124" }) 199 | --- 160000 --- 200 | (variant { Ok = "bench1_insert_person OK" }) 201 | (variant { Ok = "execute performance_counter: 1598390" }) 202 | (variant { Ok = "execute performance_counter: 1284110" }) 203 | (variant { Ok = "count performance_counter: 4308492" }) 204 | (variant { Ok = "insert performance_counter: 350634" }) 205 | (variant { Ok = "query_by_id performance_counter: 265780" }) 206 | (variant { Ok = "query_by_name performance_counter: 314395" }) 207 | (variant { Ok = "query_by_like_name performance_counter: 2856511196" }) 208 | (variant { Ok = "query_by_limit_offset performance_counter: 679912322" }) 209 | (variant { Ok = "update_by_name performance_counter: 239486" }) 210 | (variant { Ok = "update_by_id performance_counter: 390065" }) 211 | (variant { Ok = "delete performance_counter: 419161" }) 212 | --- 170000 --- 213 | (variant { Ok = "bench1_insert_person OK" }) 214 | (variant { Ok = "execute performance_counter: 1631213" }) 215 | (variant { Ok = "execute performance_counter: 1353495" }) 216 | (variant { Ok = "count performance_counter: 4907133" }) 217 | (variant { Ok = "insert performance_counter: 350542" }) 218 | (variant { Ok = "query_by_id performance_counter: 264968" }) 219 | (variant { Ok = "query_by_name performance_counter: 314558" }) 220 | (variant { Ok = "query_by_like_name performance_counter: 3035155206" }) 221 | (variant { Ok = "query_by_limit_offset performance_counter: 722353389" }) 222 | (variant { Ok = "update_by_name performance_counter: 237413" }) 223 | (variant { Ok = "update_by_id performance_counter: 390573" }) 224 | (variant { Ok = "delete performance_counter: 259657" }) 225 | --- 180000 --- 226 | (variant { Ok = "bench1_insert_person OK" }) 227 | (variant { Ok = "execute performance_counter: 1722209" }) 228 | (variant { Ok = "execute performance_counter: 1368529" }) 229 | (variant { Ok = "count performance_counter: 5435729" }) 230 | (variant { Ok = "insert performance_counter: 474460" }) 231 | (variant { Ok = "query_by_id performance_counter: 265468" }) 232 | (variant { Ok = "query_by_name performance_counter: 315995" }) 233 | (variant { Ok = "query_by_like_name performance_counter: 3213800865" }) 234 | (variant { Ok = "query_by_limit_offset performance_counter: 764790851" }) 235 | (variant { Ok = "update_by_name performance_counter: 239189" }) 236 | (variant { Ok = "update_by_id performance_counter: 417134" }) 237 | (variant { Ok = "delete performance_counter: 418677" }) 238 | --- 190000 --- 239 | (variant { Ok = "bench1_insert_person OK" }) 240 | (variant { Ok = "execute performance_counter: 1711390" }) 241 | (variant { Ok = "execute performance_counter: 1398193" }) 242 | (variant { Ok = "count performance_counter: 5733750" }) 243 | (variant { Ok = "insert performance_counter: 481805" }) 244 | (variant { Ok = "query_by_id performance_counter: 264878" }) 245 | (variant { Ok = "query_by_name performance_counter: 313837" }) 246 | (variant { Ok = "query_by_like_name performance_counter: 3392439752" }) 247 | (variant { Ok = "query_by_limit_offset performance_counter: 807227963" }) 248 | (variant { Ok = "update_by_name performance_counter: 237612" }) 249 | (variant { Ok = "update_by_id performance_counter: 389366" }) 250 | (variant { Ok = "delete performance_counter: 260967" }) 251 | --- 200000 --- 252 | (variant { Ok = "bench1_insert_person OK" }) 253 | (variant { Ok = "execute performance_counter: 1736892" }) 254 | (variant { Ok = "execute performance_counter: 1425678" }) 255 | (variant { Ok = "count performance_counter: 6051539" }) 256 | (variant { Ok = "insert performance_counter: 351842" }) 257 | (variant { Ok = "query_by_id performance_counter: 266426" }) 258 | (variant { Ok = "query_by_name performance_counter: 315197" }) 259 | (variant { Ok = "query_by_like_name performance_counter: 3571075716" }) 260 | (variant { Ok = "query_by_limit_offset performance_counter: 849676641" }) 261 | (variant { Ok = "update_by_name performance_counter: 239044" }) 262 | (variant { Ok = "update_by_id performance_counter: 389848" }) 263 | (variant { Ok = "delete performance_counter: 419876" }) 264 | --- 210000 --- 265 | (variant { Ok = "bench1_insert_person OK" }) 266 | (variant { Ok = "execute performance_counter: 1770086" }) 267 | (variant { Ok = "execute performance_counter: 1449645" }) 268 | (variant { Ok = "count performance_counter: 6353337" }) 269 | (variant { Ok = "insert performance_counter: 352152" }) 270 | (variant { Ok = "query_by_id performance_counter: 266286" }) 271 | (variant { Ok = "query_by_name performance_counter: 315565" }) 272 | (variant { Ok = "query_by_like_name performance_counter: 3749720479" }) 273 | (variant { Ok = "query_by_limit_offset performance_counter: 892126380" }) 274 | (variant { Ok = "update_by_name performance_counter: 238413" }) 275 | (variant { Ok = "update_by_id performance_counter: 391436" }) 276 | (variant { Ok = "delete performance_counter: 261906" }) 277 | --- 220000 --- 278 | (variant { Ok = "bench1_insert_person OK" }) 279 | (variant { Ok = "execute performance_counter: 1794449" }) 280 | (variant { Ok = "execute performance_counter: 1480412" }) 281 | (variant { Ok = "count performance_counter: 6659337" }) 282 | (variant { Ok = "insert performance_counter: 349952" }) 283 | (variant { Ok = "query_by_id performance_counter: 265898" }) 284 | (variant { Ok = "query_by_name performance_counter: 314736" }) 285 | (variant { Ok = "query_by_like_name performance_counter: 3928355204" }) 286 | (variant { Ok = "query_by_limit_offset performance_counter: 934556746" }) 287 | (variant { Ok = "update_by_name performance_counter: 237918" }) 288 | (variant { Ok = "update_by_id performance_counter: 387331" }) 289 | (variant { Ok = "delete performance_counter: 420123" }) 290 | --- 230000 --- 291 | (variant { Ok = "bench1_insert_person OK" }) 292 | (variant { Ok = "execute performance_counter: 1824184" }) 293 | (variant { Ok = "execute performance_counter: 1503912" }) 294 | (variant { Ok = "count performance_counter: 6971579" }) 295 | (variant { Ok = "insert performance_counter: 351427" }) 296 | (variant { Ok = "query_by_id performance_counter: 266142" }) 297 | (variant { Ok = "query_by_name performance_counter: 315878" }) 298 | (variant { Ok = "query_by_like_name performance_counter: 4106994675" }) 299 | (variant { Ok = "query_by_limit_offset performance_counter: 977002748" }) 300 | (variant { Ok = "update_by_name performance_counter: 237769" }) 301 | (variant { Ok = "update_by_id performance_counter: 390125" }) 302 | (variant { Ok = "delete performance_counter: 261282" }) 303 | --- 240000 --- 304 | (variant { Ok = "bench1_insert_person OK" }) 305 | (variant { Ok = "execute performance_counter: 1851536" }) 306 | (variant { Ok = "execute performance_counter: 1534961" }) 307 | (variant { Ok = "count performance_counter: 7271561" }) 308 | (variant { Ok = "insert performance_counter: 352502" }) 309 | (variant { Ok = "query_by_id performance_counter: 266414" }) 310 | (variant { Ok = "query_by_name performance_counter: 314835" }) 311 | (variant { Ok = "query_by_like_name performance_counter: 4285641493" }) 312 | (variant { Ok = "query_by_limit_offset performance_counter: 1019447584" }) 313 | (variant { Ok = "update_by_name performance_counter: 239605" }) 314 | (variant { Ok = "update_by_id performance_counter: 391188" }) 315 | (variant { Ok = "delete performance_counter: 420385" }) 316 | --- 250000 --- 317 | (variant { Ok = "bench1_insert_person OK" }) 318 | (variant { Ok = "execute performance_counter: 1883496" }) 319 | (variant { Ok = "execute performance_counter: 1562760" }) 320 | (variant { Ok = "count performance_counter: 7583756" }) 321 | (variant { Ok = "insert performance_counter: 352452" }) 322 | (variant { Ok = "query_by_id performance_counter: 266702" }) 323 | (variant { Ok = "query_by_name performance_counter: 316552" }) 324 | (variant { Ok = "query_by_like_name performance_counter: 4464285926" }) 325 | (variant { Ok = "query_by_limit_offset performance_counter: 1061899954" }) 326 | (variant { Ok = "update_by_name performance_counter: 239022" }) 327 | (variant { Ok = "update_by_id performance_counter: 389788" }) 328 | (variant { Ok = "delete performance_counter: 260535" }) 329 | --- 260000 --- 330 | (variant { Ok = "bench1_insert_person OK" }) 331 | (variant { Ok = "execute performance_counter: 1909295" }) 332 | (variant { Ok = "execute performance_counter: 1588968" }) 333 | (variant { Ok = "count performance_counter: 7885896" }) 334 | (variant { Ok = "insert performance_counter: 353475" }) 335 | (variant { Ok = "query_by_id performance_counter: 266609" }) 336 | (variant { Ok = "query_by_name performance_counter: 315893" }) 337 | (variant { Ok = "query_by_like_name performance_counter: 4642926506" }) 338 | (variant { Ok = "query_by_limit_offset performance_counter: 1104341541" }) 339 | (variant { Ok = "update_by_name performance_counter: 239975" }) 340 | (variant { Ok = "update_by_id performance_counter: 389553" }) 341 | (variant { Ok = "delete performance_counter: 420445" }) 342 | --- 270000 --- 343 | (variant { Ok = "bench1_insert_person OK" }) 344 | (variant { Ok = "execute performance_counter: 1986050" }) 345 | (variant { Ok = "execute performance_counter: 1615310" }) 346 | (variant { Ok = "count performance_counter: 8186266" }) 347 | (variant { Ok = "insert performance_counter: 351167" }) 348 | (variant { Ok = "query_by_id performance_counter: 264981" }) 349 | (variant { Ok = "query_by_name performance_counter: 314808" }) 350 | (variant { Ok = "query_by_like_name performance_counter: 4821563444" }) 351 | (variant { Ok = "query_by_limit_offset performance_counter: 1146786179" }) 352 | (variant { Ok = "update_by_name performance_counter: 237701" }) 353 | (variant { Ok = "update_by_id performance_counter: 390215" }) 354 | (variant { Ok = "delete performance_counter: 261246" }) 355 | --- 280000 --- 356 | (variant { Ok = "bench1_insert_person OK" }) 357 | (variant { Ok = "execute performance_counter: 1964512" }) 358 | (variant { Ok = "execute performance_counter: 1645156" }) 359 | (variant { Ok = "count performance_counter: 8489491" }) 360 | (variant { Ok = "insert performance_counter: 352524" }) 361 | (variant { Ok = "query_by_id performance_counter: 265957" }) 362 | (variant { Ok = "query_by_name performance_counter: 315606" }) 363 | Error: (BFailed update call. 364 | Caused by: (BFailed update call. 365 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 366 | (variant { Ok = "query_by_limit_offset performance_counter: 1189233129" }) 367 | (variant { Ok = "update_by_name performance_counter: 238745" }) 368 | (variant { Ok = "update_by_id performance_counter: 389471" }) 369 | (variant { Ok = "delete performance_counter: 420024" }) 370 | --- 290000 --- 371 | (variant { Ok = "bench1_insert_person OK" }) 372 | (variant { Ok = "execute performance_counter: 1993738" }) 373 | (variant { Ok = "execute performance_counter: 1671598" }) 374 | (variant { Ok = "count performance_counter: 8793071" }) 375 | (variant { Ok = "insert performance_counter: 351918" }) 376 | (variant { Ok = "query_by_id performance_counter: 266914" }) 377 | (variant { Ok = "query_by_name performance_counter: 316361" }) 378 | Error: (BFailed update call. 379 | Caused by: (BFailed update call. 380 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 381 | (variant { Ok = "query_by_limit_offset performance_counter: 1231688986" }) 382 | (variant { Ok = "update_by_name performance_counter: 238779" }) 383 | (variant { Ok = "update_by_id performance_counter: 390869" }) 384 | (variant { Ok = "delete performance_counter: 261780" }) 385 | --- 300000 --- 386 | (variant { Ok = "bench1_insert_person OK" }) 387 | (variant { Ok = "execute performance_counter: 2022254" }) 388 | (variant { Ok = "execute performance_counter: 1695302" }) 389 | (variant { Ok = "count performance_counter: 9100867" }) 390 | (variant { Ok = "insert performance_counter: 353392" }) 391 | (variant { Ok = "query_by_id performance_counter: 266475" }) 392 | (variant { Ok = "query_by_name performance_counter: 316054" }) 393 | Error: (BFailed update call. 394 | Caused by: (BFailed update call. 395 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 396 | (variant { Ok = "query_by_limit_offset performance_counter: 1274127125" }) 397 | (variant { Ok = "update_by_name performance_counter: 238866" }) 398 | (variant { Ok = "update_by_id performance_counter: 392905" }) 399 | (variant { Ok = "delete performance_counter: 420185" }) 400 | --- 310000 --- 401 | (variant { Ok = "bench1_insert_person OK" }) 402 | (variant { Ok = "execute performance_counter: 2043838" }) 403 | (variant { Ok = "execute performance_counter: 1723097" }) 404 | (variant { Ok = "count performance_counter: 9396514" }) 405 | (variant { Ok = "insert performance_counter: 351943" }) 406 | (variant { Ok = "query_by_id performance_counter: 266912" }) 407 | (variant { Ok = "query_by_name performance_counter: 316129" }) 408 | Error: (BFailed update call. 409 | Caused by: (BFailed update call. 410 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 411 | (variant { Ok = "query_by_limit_offset performance_counter: 1316571579" }) 412 | (variant { Ok = "update_by_name performance_counter: 239105" }) 413 | (variant { Ok = "update_by_id performance_counter: 391167" }) 414 | (variant { Ok = "delete performance_counter: 261798" }) 415 | --- 320000 --- 416 | (variant { Ok = "bench1_insert_person OK" }) 417 | (variant { Ok = "execute performance_counter: 2112227" }) 418 | (variant { Ok = "execute performance_counter: 1752108" }) 419 | (variant { Ok = "count performance_counter: 9709583" }) 420 | (variant { Ok = "insert performance_counter: 352026" }) 421 | (variant { Ok = "query_by_id performance_counter: 265469" }) 422 | (variant { Ok = "query_by_name performance_counter: 315581" }) 423 | Error: (BFailed update call. 424 | Caused by: (BFailed update call. 425 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 426 | (variant { Ok = "query_by_limit_offset performance_counter: 1359024513" }) 427 | (variant { Ok = "update_by_name performance_counter: 239454" }) 428 | (variant { Ok = "update_by_id performance_counter: 392512" }) 429 | (variant { Ok = "delete performance_counter: 420909" }) 430 | --- 330000 --- 431 | (variant { Ok = "bench1_insert_person OK" }) 432 | (variant { Ok = "execute performance_counter: 2100438" }) 433 | (variant { Ok = "execute performance_counter: 1777067" }) 434 | (variant { Ok = "count performance_counter: 10013062" }) 435 | (variant { Ok = "insert performance_counter: 352863" }) 436 | (variant { Ok = "query_by_id performance_counter: 265242" }) 437 | (variant { Ok = "query_by_name performance_counter: 315016" }) 438 | Error: (BFailed update call. 439 | Caused by: (BFailed update call. 440 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 441 | (variant { Ok = "query_by_limit_offset performance_counter: 1401474825" }) 442 | (variant { Ok = "update_by_name performance_counter: 238541" }) 443 | (variant { Ok = "update_by_id performance_counter: 392693" }) 444 | (variant { Ok = "delete performance_counter: 262184" }) 445 | --- 340000 --- 446 | (variant { Ok = "bench1_insert_person OK" }) 447 | (variant { Ok = "execute performance_counter: 2166614" }) 448 | (variant { Ok = "execute performance_counter: 1806268" }) 449 | (variant { Ok = "count performance_counter: 10310530" }) 450 | (variant { Ok = "insert performance_counter: 352837" }) 451 | (variant { Ok = "query_by_id performance_counter: 266030" }) 452 | (variant { Ok = "query_by_name performance_counter: 315342" }) 453 | Error: (BFailed update call. 454 | Caused by: (BFailed update call. 455 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 456 | (variant { Ok = "query_by_limit_offset performance_counter: 1443912615" }) 457 | (variant { Ok = "update_by_name performance_counter: 239446" }) 458 | (variant { Ok = "update_by_id performance_counter: 391742" }) 459 | (variant { Ok = "delete performance_counter: 420967" }) 460 | --- 350000 --- 461 | (variant { Ok = "bench1_insert_person OK" }) 462 | (variant { Ok = "execute performance_counter: 2188676" }) 463 | (variant { Ok = "execute performance_counter: 1914795" }) 464 | (variant { Ok = "count performance_counter: 10617715" }) 465 | (variant { Ok = "insert performance_counter: 351296" }) 466 | (variant { Ok = "query_by_id performance_counter: 266618" }) 467 | (variant { Ok = "query_by_name performance_counter: 316725" }) 468 | Error: (BFailed update call. 469 | Caused by: (BFailed update call. 470 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 471 | (variant { Ok = "query_by_limit_offset performance_counter: 1486356565" }) 472 | (variant { Ok = "update_by_name performance_counter: 239209" }) 473 | (variant { Ok = "update_by_id performance_counter: 387982" }) 474 | (variant { Ok = "delete performance_counter: 261647" }) 475 | --- 360000 --- 476 | (variant { Ok = "bench1_insert_person OK" }) 477 | (variant { Ok = "execute performance_counter: 2183401" }) 478 | (variant { Ok = "execute performance_counter: 1859053" }) 479 | (variant { Ok = "count performance_counter: 10919409" }) 480 | (variant { Ok = "insert performance_counter: 352430" }) 481 | (variant { Ok = "query_by_id performance_counter: 266046" }) 482 | (variant { Ok = "query_by_name performance_counter: 315234" }) 483 | Error: (BFailed update call. 484 | Caused by: (BFailed update call. 485 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 486 | (variant { Ok = "query_by_limit_offset performance_counter: 1528805776" }) 487 | (variant { Ok = "update_by_name performance_counter: 240068" }) 488 | (variant { Ok = "update_by_id performance_counter: 390352" }) 489 | (variant { Ok = "delete performance_counter: 420425" }) 490 | --- 370000 --- 491 | (variant { Ok = "bench1_insert_person OK" }) 492 | (variant { Ok = "execute performance_counter: 2213255" }) 493 | (variant { Ok = "execute performance_counter: 1887766" }) 494 | (variant { Ok = "count performance_counter: 11226302" }) 495 | (variant { Ok = "insert performance_counter: 361064" }) 496 | (variant { Ok = "query_by_id performance_counter: 265270" }) 497 | (variant { Ok = "query_by_name performance_counter: 314603" }) 498 | Error: (BFailed update call. 499 | Caused by: (BFailed update call. 500 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 501 | (variant { Ok = "query_by_limit_offset performance_counter: 1571253369" }) 502 | (variant { Ok = "update_by_name performance_counter: 238278" }) 503 | (variant { Ok = "update_by_id performance_counter: 390690" }) 504 | (variant { Ok = "delete performance_counter: 260938" }) 505 | --- 380000 --- 506 | (variant { Ok = "bench1_insert_person OK" }) 507 | (variant { Ok = "execute performance_counter: 2232082" }) 508 | (variant { Ok = "execute performance_counter: 1911831" }) 509 | (variant { Ok = "count performance_counter: 11523280" }) 510 | (variant { Ok = "insert performance_counter: 350611" }) 511 | (variant { Ok = "query_by_id performance_counter: 265610" }) 512 | (variant { Ok = "query_by_name performance_counter: 315150" }) 513 | Error: (BFailed update call. 514 | Caused by: (BFailed update call. 515 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 516 | (variant { Ok = "query_by_limit_offset performance_counter: 1613693124" }) 517 | (variant { Ok = "update_by_name performance_counter: 238772" }) 518 | (variant { Ok = "update_by_id performance_counter: 389514" }) 519 | (variant { Ok = "delete performance_counter: 418216" }) 520 | --- 390000 --- 521 | (variant { Ok = "bench1_insert_person OK" }) 522 | (variant { Ok = "execute performance_counter: 2281838" }) 523 | (variant { Ok = "execute performance_counter: 1938783" }) 524 | (variant { Ok = "count performance_counter: 11831320" }) 525 | (variant { Ok = "insert performance_counter: 350962" }) 526 | (variant { Ok = "query_by_id performance_counter: 267241" }) 527 | (variant { Ok = "query_by_name performance_counter: 316450" }) 528 | Error: (BFailed update call. 529 | Caused by: (BFailed update call. 530 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 531 | (variant { Ok = "query_by_limit_offset performance_counter: 1656133457" }) 532 | (variant { Ok = "update_by_name performance_counter: 239766" }) 533 | (variant { Ok = "update_by_id performance_counter: 389930" }) 534 | (variant { Ok = "delete performance_counter: 261321" }) 535 | --- 400000 --- 536 | (variant { Ok = "bench1_insert_person OK" }) 537 | (variant { Ok = "execute performance_counter: 2291936" }) 538 | (variant { Ok = "execute performance_counter: 1979945" }) 539 | (variant { Ok = "count performance_counter: 12137352" }) 540 | (variant { Ok = "insert performance_counter: 349785" }) 541 | (variant { Ok = "query_by_id performance_counter: 265459" }) 542 | (variant { Ok = "query_by_name performance_counter: 314658" }) 543 | Error: (BFailed update call. 544 | Caused by: (BFailed update call. 545 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 546 | (variant { Ok = "query_by_limit_offset performance_counter: 1698583244" }) 547 | (variant { Ok = "update_by_name performance_counter: 239397" }) 548 | (variant { Ok = "update_by_id performance_counter: 388031" }) 549 | (variant { Ok = "delete performance_counter: 418422" }) 550 | --- 410000 --- 551 | (variant { Ok = "bench1_insert_person OK" }) 552 | (variant { Ok = "execute performance_counter: 2318158" }) 553 | (variant { Ok = "execute performance_counter: 1992750" }) 554 | (variant { Ok = "count performance_counter: 12440294" }) 555 | (variant { Ok = "insert performance_counter: 352193" }) 556 | (variant { Ok = "query_by_id performance_counter: 267241" }) 557 | (variant { Ok = "query_by_name performance_counter: 316545" }) 558 | Error: (BFailed update call. 559 | Caused by: (BFailed update call. 560 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 561 | (variant { Ok = "query_by_limit_offset performance_counter: 1741023431" }) 562 | (variant { Ok = "update_by_name performance_counter: 240069" }) 563 | (variant { Ok = "update_by_id performance_counter: 390073" }) 564 | (variant { Ok = "delete performance_counter: 262197" }) 565 | --- 420000 --- 566 | (variant { Ok = "bench1_insert_person OK" }) 567 | (variant { Ok = "execute performance_counter: 2346813" }) 568 | (variant { Ok = "execute performance_counter: 2017814" }) 569 | (variant { Ok = "count performance_counter: 12746719" }) 570 | (variant { Ok = "insert performance_counter: 351207" }) 571 | (variant { Ok = "query_by_id performance_counter: 265302" }) 572 | (variant { Ok = "query_by_name performance_counter: 314965" }) 573 | Error: (BFailed update call. 574 | Caused by: (BFailed update call. 575 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 576 | (variant { Ok = "query_by_limit_offset performance_counter: 1783476972" }) 577 | (variant { Ok = "update_by_name performance_counter: 238761" }) 578 | (variant { Ok = "update_by_id performance_counter: 389894" }) 579 | (variant { Ok = "delete performance_counter: 419251" }) 580 | --- 430000 --- 581 | (variant { Ok = "bench1_insert_person OK" }) 582 | (variant { Ok = "execute performance_counter: 2373298" }) 583 | (variant { Ok = "execute performance_counter: 2049003" }) 584 | (variant { Ok = "count performance_counter: 13041678" }) 585 | (variant { Ok = "insert performance_counter: 479370" }) 586 | (variant { Ok = "query_by_id performance_counter: 266741" }) 587 | (variant { Ok = "query_by_name performance_counter: 316036" }) 588 | Error: (BFailed update call. 589 | Caused by: (BFailed update call. 590 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 591 | (variant { Ok = "query_by_limit_offset performance_counter: 1825919385" }) 592 | (variant { Ok = "update_by_name performance_counter: 239770" }) 593 | (variant { Ok = "update_by_id performance_counter: 391532" }) 594 | (variant { Ok = "delete performance_counter: 261272" }) 595 | --- 440000 --- 596 | (variant { Ok = "bench1_insert_person OK" }) 597 | (variant { Ok = "execute performance_counter: 2399629" }) 598 | (variant { Ok = "execute performance_counter: 2161067" }) 599 | (variant { Ok = "count performance_counter: 13353238" }) 600 | (variant { Ok = "insert performance_counter: 351164" }) 601 | (variant { Ok = "query_by_id performance_counter: 264738" }) 602 | (variant { Ok = "query_by_name performance_counter: 314485" }) 603 | Error: (BFailed update call. 604 | Caused by: (BFailed update call. 605 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 606 | (variant { Ok = "query_by_limit_offset performance_counter: 1868370532" }) 607 | (variant { Ok = "update_by_name performance_counter: 238394" }) 608 | (variant { Ok = "update_by_id performance_counter: 390616" }) 609 | (variant { Ok = "delete performance_counter: 418984" }) 610 | --- 450000 --- 611 | (variant { Ok = "bench1_insert_person OK" }) 612 | (variant { Ok = "execute performance_counter: 2430716" }) 613 | (variant { Ok = "execute performance_counter: 2102759" }) 614 | (variant { Ok = "count performance_counter: 13655335" }) 615 | (variant { Ok = "insert performance_counter: 351371" }) 616 | (variant { Ok = "query_by_id performance_counter: 265893" }) 617 | (variant { Ok = "query_by_name performance_counter: 316425" }) 618 | Error: (BFailed update call. 619 | Caused by: (BFailed update call. 620 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 621 | (variant { Ok = "query_by_limit_offset performance_counter: 1910817349" }) 622 | (variant { Ok = "update_by_name performance_counter: 239500" }) 623 | (variant { Ok = "update_by_id performance_counter: 391282" }) 624 | (variant { Ok = "delete performance_counter: 260888" }) 625 | --- 460000 --- 626 | (variant { Ok = "bench1_insert_person OK" }) 627 | (variant { Ok = "execute performance_counter: 2456962" }) 628 | (variant { Ok = "execute performance_counter: 2133459" }) 629 | (variant { Ok = "count performance_counter: 13957832" }) 630 | (variant { Ok = "insert performance_counter: 350965" }) 631 | (variant { Ok = "query_by_id performance_counter: 265509" }) 632 | (variant { Ok = "query_by_name performance_counter: 314791" }) 633 | Error: (BFailed update call. 634 | Caused by: (BFailed update call. 635 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 636 | (variant { Ok = "query_by_limit_offset performance_counter: 1953259477" }) 637 | (variant { Ok = "update_by_name performance_counter: 238838" }) 638 | (variant { Ok = "update_by_id performance_counter: 390072" }) 639 | (variant { Ok = "delete performance_counter: 419014" }) 640 | --- 470000 --- 641 | (variant { Ok = "bench1_insert_person OK" }) 642 | (variant { Ok = "execute performance_counter: 2483636" }) 643 | (variant { Ok = "execute performance_counter: 2157157" }) 644 | (variant { Ok = "count performance_counter: 14269488" }) 645 | (variant { Ok = "insert performance_counter: 367301" }) 646 | (variant { Ok = "query_by_id performance_counter: 266854" }) 647 | (variant { Ok = "query_by_name performance_counter: 316219" }) 648 | Error: (BFailed update call. 649 | Caused by: (BFailed update call. 650 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 651 | (variant { Ok = "query_by_limit_offset performance_counter: 1995697964" }) 652 | (variant { Ok = "update_by_name performance_counter: 240008" }) 653 | (variant { Ok = "update_by_id performance_counter: 391376" }) 654 | (variant { Ok = "delete performance_counter: 261391" }) 655 | --- 480000 --- 656 | (variant { Ok = "bench1_insert_person OK" }) 657 | (variant { Ok = "execute performance_counter: 2514561" }) 658 | (variant { Ok = "execute performance_counter: 2189537" }) 659 | (variant { Ok = "count performance_counter: 14568806" }) 660 | (variant { Ok = "insert performance_counter: 352426" }) 661 | (variant { Ok = "query_by_id performance_counter: 265231" }) 662 | (variant { Ok = "query_by_name performance_counter: 315100" }) 663 | Error: (BFailed update call. 664 | Caused by: (BFailed update call. 665 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 666 | (variant { Ok = "query_by_limit_offset performance_counter: 2038150814" }) 667 | (variant { Ok = "update_by_name performance_counter: 238459" }) 668 | (variant { Ok = "update_by_id performance_counter: 391219" }) 669 | (variant { Ok = "delete performance_counter: 419396" }) 670 | --- 490000 --- 671 | (variant { Ok = "bench1_insert_person OK" }) 672 | (variant { Ok = "execute performance_counter: 2615553" }) 673 | (variant { Ok = "execute performance_counter: 2214042" }) 674 | (variant { Ok = "count performance_counter: 14880739" }) 675 | (variant { Ok = "insert performance_counter: 350639" }) 676 | (variant { Ok = "query_by_id performance_counter: 266488" }) 677 | (variant { Ok = "query_by_name performance_counter: 315289" }) 678 | Error: (BFailed update call. 679 | Caused by: (BFailed update call. 680 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 681 | (variant { Ok = "query_by_limit_offset performance_counter: 2080593776" }) 682 | (variant { Ok = "update_by_name performance_counter: 238427" }) 683 | (variant { Ok = "update_by_id performance_counter: 390895" }) 684 | (variant { Ok = "delete performance_counter: 261798" }) 685 | --- 500000 --- 686 | (variant { Ok = "bench1_insert_person OK" }) 687 | (variant { Ok = "execute performance_counter: 2565609" }) 688 | (variant { Ok = "execute performance_counter: 2241730" }) 689 | (variant { Ok = "count performance_counter: 15183853" }) 690 | (variant { Ok = "insert performance_counter: 351731" }) 691 | (variant { Ok = "query_by_id performance_counter: 265345" }) 692 | (variant { Ok = "query_by_name performance_counter: 314666" }) 693 | Error: (BFailed update call. 694 | Caused by: (BFailed update call. 695 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 696 | (variant { Ok = "query_by_limit_offset performance_counter: 2123039769" }) 697 | (variant { Ok = "update_by_name performance_counter: 237993" }) 698 | (variant { Ok = "update_by_id performance_counter: 391599" }) 699 | (variant { Ok = "delete performance_counter: 419615" }) 700 | --- 510000 --- 701 | (variant { Ok = "bench1_insert_person OK" }) 702 | (variant { Ok = "execute performance_counter: 2591939" }) 703 | (variant { Ok = "execute performance_counter: 2337963" }) 704 | (variant { Ok = "count performance_counter: 15484845" }) 705 | (variant { Ok = "insert performance_counter: 350501" }) 706 | (variant { Ok = "query_by_id performance_counter: 266434" }) 707 | (variant { Ok = "query_by_name performance_counter: 315355" }) 708 | Error: (BFailed update call. 709 | Caused by: (BFailed update call. 710 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 711 | (variant { Ok = "query_by_limit_offset performance_counter: 2165474675" }) 712 | (variant { Ok = "update_by_name performance_counter: 238998" }) 713 | (variant { Ok = "update_by_id performance_counter: 389440" }) 714 | (variant { Ok = "delete performance_counter: 261453" }) 715 | --- 520000 --- 716 | (variant { Ok = "bench1_insert_person OK" }) 717 | (variant { Ok = "execute performance_counter: 2621801" }) 718 | (variant { Ok = "execute performance_counter: 2404049" }) 719 | (variant { Ok = "count performance_counter: 15786288" }) 720 | (variant { Ok = "insert performance_counter: 351782" }) 721 | (variant { Ok = "query_by_id performance_counter: 265601" }) 722 | (variant { Ok = "query_by_name performance_counter: 314913" }) 723 | Error: (BFailed update call. 724 | Caused by: (BFailed update call. 725 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 726 | (variant { Ok = "query_by_limit_offset performance_counter: 2207931250" }) 727 | (variant { Ok = "update_by_name performance_counter: 238510" }) 728 | (variant { Ok = "update_by_id performance_counter: 391067" }) 729 | (variant { Ok = "delete performance_counter: 420517" }) 730 | --- 530000 --- 731 | (variant { Ok = "bench1_insert_person OK" }) 732 | (variant { Ok = "execute performance_counter: 2769362" }) 733 | (variant { Ok = "execute performance_counter: 2321070" }) 734 | (variant { Ok = "count performance_counter: 16086152" }) 735 | (variant { Ok = "insert performance_counter: 474292" }) 736 | (variant { Ok = "query_by_id performance_counter: 264962" }) 737 | (variant { Ok = "query_by_name performance_counter: 314758" }) 738 | Error: (BFailed update call. 739 | Caused by: (BFailed update call. 740 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 741 | (variant { Ok = "query_by_limit_offset performance_counter: 2250378087" }) 742 | (variant { Ok = "update_by_name performance_counter: 238099" }) 743 | (variant { Ok = "update_by_id performance_counter: 391207" }) 744 | (variant { Ok = "delete performance_counter: 262230" }) 745 | --- 540000 --- 746 | (variant { Ok = "bench1_insert_person OK" }) 747 | (variant { Ok = "execute performance_counter: 2673729" }) 748 | (variant { Ok = "execute performance_counter: 2348671" }) 749 | (variant { Ok = "count performance_counter: 16392756" }) 750 | (variant { Ok = "insert performance_counter: 350257" }) 751 | (variant { Ok = "query_by_id performance_counter: 264478" }) 752 | (variant { Ok = "query_by_name performance_counter: 313762" }) 753 | Error: (BFailed update call. 754 | Caused by: (BFailed update call. 755 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 756 | (variant { Ok = "query_by_limit_offset performance_counter: 2292818196" }) 757 | (variant { Ok = "update_by_name performance_counter: 237178" }) 758 | (variant { Ok = "update_by_id performance_counter: 389260" }) 759 | (variant { Ok = "delete performance_counter: 419287" }) 760 | --- 550000 --- 761 | (variant { Ok = "bench1_insert_person OK" }) 762 | (variant { Ok = "execute performance_counter: 2698008" }) 763 | (variant { Ok = "execute performance_counter: 2374214" }) 764 | (variant { Ok = "count performance_counter: 16699955" }) 765 | (variant { Ok = "insert performance_counter: 351147" }) 766 | (variant { Ok = "query_by_id performance_counter: 265658" }) 767 | (variant { Ok = "query_by_name performance_counter: 314476" }) 768 | Error: (BFailed update call. 769 | Caused by: (BFailed update call. 770 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 771 | (variant { Ok = "query_by_limit_offset performance_counter: 2335259235" }) 772 | (variant { Ok = "update_by_name performance_counter: 238520" }) 773 | (variant { Ok = "update_by_id performance_counter: 390712" }) 774 | (variant { Ok = "delete performance_counter: 262365" }) 775 | --- 560000 --- 776 | (variant { Ok = "bench1_insert_person OK" }) 777 | (variant { Ok = "execute performance_counter: 2725674" }) 778 | (variant { Ok = "execute performance_counter: 2404843" }) 779 | (variant { Ok = "count performance_counter: 17001997" }) 780 | (variant { Ok = "insert performance_counter: 353464" }) 781 | (variant { Ok = "query_by_id performance_counter: 264277" }) 782 | (variant { Ok = "query_by_name performance_counter: 314148" }) 783 | Error: (BFailed update call. 784 | Caused by: (BFailed update call. 785 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 786 | (variant { Ok = "query_by_limit_offset performance_counter: 2377714621" }) 787 | (variant { Ok = "update_by_name performance_counter: 238402" }) 788 | (variant { Ok = "update_by_id performance_counter: 392789" }) 789 | (variant { Ok = "delete performance_counter: 419139" }) 790 | --- 570000 --- 791 | (variant { Ok = "bench1_insert_person OK" }) 792 | (variant { Ok = "execute performance_counter: 2763806" }) 793 | (variant { Ok = "execute performance_counter: 2428963" }) 794 | (variant { Ok = "count performance_counter: 17308301" }) 795 | (variant { Ok = "insert performance_counter: 351205" }) 796 | (variant { Ok = "query_by_id performance_counter: 266269" }) 797 | (variant { Ok = "query_by_name performance_counter: 316414" }) 798 | Error: (BFailed update call. 799 | Caused by: (BFailed update call. 800 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 801 | (variant { Ok = "query_by_limit_offset performance_counter: 2420158690" }) 802 | (variant { Ok = "update_by_name performance_counter: 239550" }) 803 | (variant { Ok = "update_by_id performance_counter: 391362" }) 804 | (variant { Ok = "delete performance_counter: 262380" }) 805 | --- 580000 --- 806 | (variant { Ok = "bench1_insert_person OK" }) 807 | (variant { Ok = "execute performance_counter: 2788320" }) 808 | (variant { Ok = "execute performance_counter: 2456574" }) 809 | (variant { Ok = "count performance_counter: 17607792" }) 810 | (variant { Ok = "insert performance_counter: 352334" }) 811 | (variant { Ok = "query_by_id performance_counter: 265878" }) 812 | (variant { Ok = "query_by_name performance_counter: 316066" }) 813 | Error: (BFailed update call. 814 | Caused by: (BFailed update call. 815 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 816 | (variant { Ok = "query_by_limit_offset performance_counter: 2462599948" }) 817 | (variant { Ok = "update_by_name performance_counter: 238360" }) 818 | (variant { Ok = "update_by_id performance_counter: 391110" }) 819 | (variant { Ok = "delete performance_counter: 419616" }) 820 | --- 590000 --- 821 | (variant { Ok = "bench1_insert_person OK" }) 822 | (variant { Ok = "execute performance_counter: 2814571" }) 823 | (variant { Ok = "execute performance_counter: 2486363" }) 824 | (variant { Ok = "count performance_counter: 17915563" }) 825 | (variant { Ok = "insert performance_counter: 433079" }) 826 | (variant { Ok = "query_by_id performance_counter: 266349" }) 827 | (variant { Ok = "query_by_name performance_counter: 316565" }) 828 | Error: (BFailed update call. 829 | Caused by: (BFailed update call. 830 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 831 | (variant { Ok = "query_by_limit_offset performance_counter: 2505042818" }) 832 | (variant { Ok = "update_by_name performance_counter: 238360" }) 833 | (variant { Ok = "update_by_id performance_counter: 391811" }) 834 | (variant { Ok = "delete performance_counter: 262818" }) 835 | --- 600000 --- 836 | (variant { Ok = "bench1_insert_person OK" }) 837 | (variant { Ok = "execute performance_counter: 2843235" }) 838 | (variant { Ok = "execute performance_counter: 2513723" }) 839 | (variant { Ok = "count performance_counter: 18217857" }) 840 | (variant { Ok = "insert performance_counter: 479588" }) 841 | (variant { Ok = "query_by_id performance_counter: 266805" }) 842 | (variant { Ok = "query_by_name performance_counter: 316748" }) 843 | Error: (BFailed update call. 844 | Caused by: (BFailed update call. 845 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 846 | (variant { Ok = "query_by_limit_offset performance_counter: 2547491515" }) 847 | (variant { Ok = "update_by_name performance_counter: 240013" }) 848 | (variant { Ok = "update_by_id performance_counter: 393854" }) 849 | (variant { Ok = "delete performance_counter: 421104" }) 850 | --- 610000 --- 851 | (variant { Ok = "bench1_insert_person OK" }) 852 | (variant { Ok = "execute performance_counter: 2868256" }) 853 | (variant { Ok = "execute performance_counter: 2542088" }) 854 | (variant { Ok = "count performance_counter: 18529359" }) 855 | (variant { Ok = "insert performance_counter: 352796" }) 856 | (variant { Ok = "query_by_id performance_counter: 267428" }) 857 | (variant { Ok = "query_by_name performance_counter: 316372" }) 858 | Error: (BFailed update call. 859 | Caused by: (BFailed update call. 860 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 861 | (variant { Ok = "query_by_limit_offset performance_counter: 2589933758" }) 862 | (variant { Ok = "update_by_name performance_counter: 239980" }) 863 | (variant { Ok = "update_by_id performance_counter: 391203" }) 864 | (variant { Ok = "delete performance_counter: 263663" }) 865 | --- 620000 --- 866 | (variant { Ok = "bench1_insert_person OK" }) 867 | (variant { Ok = "execute performance_counter: 2978398" }) 868 | (variant { Ok = "execute performance_counter: 2567430" }) 869 | (variant { Ok = "count performance_counter: 18828933" }) 870 | (variant { Ok = "insert performance_counter: 353321" }) 871 | (variant { Ok = "query_by_id performance_counter: 266814" }) 872 | (variant { Ok = "query_by_name performance_counter: 316938" }) 873 | Error: (BFailed update call. 874 | Caused by: (BFailed update call. 875 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 876 | (variant { Ok = "query_by_limit_offset performance_counter: 2632376466" }) 877 | (variant { Ok = "update_by_name performance_counter: 240371" }) 878 | (variant { Ok = "update_by_id performance_counter: 392308" }) 879 | (variant { Ok = "delete performance_counter: 422048" }) 880 | --- 630000 --- 881 | (variant { Ok = "bench1_insert_person OK" }) 882 | (variant { Ok = "execute performance_counter: 2927977" }) 883 | (variant { Ok = "execute performance_counter: 2596472" }) 884 | (variant { Ok = "count performance_counter: 19130833" }) 885 | (variant { Ok = "insert performance_counter: 353574" }) 886 | (variant { Ok = "query_by_id performance_counter: 265985" }) 887 | (variant { Ok = "query_by_name performance_counter: 315128" }) 888 | Error: (BFailed update call. 889 | Caused by: (BFailed update call. 890 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 891 | (variant { Ok = "query_by_limit_offset performance_counter: 2674826807" }) 892 | (variant { Ok = "update_by_name performance_counter: 239234" }) 893 | (variant { Ok = "update_by_id performance_counter: 392267" }) 894 | (variant { Ok = "delete performance_counter: 263597" }) 895 | --- 640000 --- 896 | (variant { Ok = "bench1_insert_person OK" }) 897 | (variant { Ok = "execute performance_counter: 2954189" }) 898 | (variant { Ok = "execute performance_counter: 2619126" }) 899 | (variant { Ok = "count performance_counter: 19441974" }) 900 | (variant { Ok = "insert performance_counter: 351594" }) 901 | (variant { Ok = "query_by_id performance_counter: 265475" }) 902 | (variant { Ok = "query_by_name performance_counter: 315101" }) 903 | Error: (BFailed update call. 904 | Caused by: (BFailed update call. 905 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 906 | (variant { Ok = "query_by_limit_offset performance_counter: 2717271191" }) 907 | (variant { Ok = "update_by_name performance_counter: 238574" }) 908 | (variant { Ok = "update_by_id performance_counter: 390285" }) 909 | (variant { Ok = "delete performance_counter: 421662" }) 910 | --- 650000 --- 911 | (variant { Ok = "bench1_insert_person OK" }) 912 | (variant { Ok = "execute performance_counter: 2984155" }) 913 | (variant { Ok = "execute performance_counter: 2649526" }) 914 | (variant { Ok = "count performance_counter: 19744363" }) 915 | (variant { Ok = "insert performance_counter: 352464" }) 916 | (variant { Ok = "query_by_id performance_counter: 265316" }) 917 | (variant { Ok = "query_by_name performance_counter: 315723" }) 918 | Error: (BFailed update call. 919 | Caused by: (BFailed update call. 920 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 921 | (variant { Ok = "query_by_limit_offset performance_counter: 2759723488" }) 922 | (variant { Ok = "update_by_name performance_counter: 238743" }) 923 | (variant { Ok = "update_by_id performance_counter: 392083" }) 924 | (variant { Ok = "delete performance_counter: 263756" }) 925 | --- 660000 --- 926 | (variant { Ok = "bench1_insert_person OK" }) 927 | (variant { Ok = "execute performance_counter: 3089458" }) 928 | (variant { Ok = "execute performance_counter: 2676011" }) 929 | (variant { Ok = "count performance_counter: 20045407" }) 930 | (variant { Ok = "insert performance_counter: 351518" }) 931 | (variant { Ok = "query_by_id performance_counter: 265081" }) 932 | (variant { Ok = "query_by_name performance_counter: 314855" }) 933 | Error: (BFailed update call. 934 | Caused by: (BFailed update call. 935 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 936 | (variant { Ok = "query_by_limit_offset performance_counter: 2802160786" }) 937 | (variant { Ok = "update_by_name performance_counter: 238011" }) 938 | (variant { Ok = "update_by_id performance_counter: 391050" }) 939 | (variant { Ok = "delete performance_counter: 421063" }) 940 | --- 670000 --- 941 | (variant { Ok = "bench1_insert_person OK" }) 942 | (variant { Ok = "execute performance_counter: 3037264" }) 943 | (variant { Ok = "execute performance_counter: 2705192" }) 944 | (variant { Ok = "count performance_counter: 20350581" }) 945 | (variant { Ok = "insert performance_counter: 352949" }) 946 | (variant { Ok = "query_by_id performance_counter: 265293" }) 947 | (variant { Ok = "query_by_name performance_counter: 316152" }) 948 | Error: (BFailed update call. 949 | Caused by: (BFailed update call. 950 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 951 | (variant { Ok = "query_by_limit_offset performance_counter: 2844607403" }) 952 | (variant { Ok = "update_by_name performance_counter: 238024" }) 953 | (variant { Ok = "update_by_id performance_counter: 391343" }) 954 | (variant { Ok = "delete performance_counter: 262166" }) 955 | --- 680000 --- 956 | (variant { Ok = "bench1_insert_person OK" }) 957 | (variant { Ok = "execute performance_counter: 3180755" }) 958 | (variant { Ok = "execute performance_counter: 2730455" }) 959 | (variant { Ok = "count performance_counter: 20657917" }) 960 | (variant { Ok = "insert performance_counter: 353896" }) 961 | (variant { Ok = "query_by_id performance_counter: 266179" }) 962 | (variant { Ok = "query_by_name performance_counter: 316075" }) 963 | Error: (BFailed update call. 964 | Caused by: (BFailed update call. 965 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 966 | (variant { Ok = "query_by_limit_offset performance_counter: 2887053661" }) 967 | (variant { Ok = "update_by_name performance_counter: 239710" }) 968 | (variant { Ok = "update_by_id performance_counter: 393177" }) 969 | (variant { Ok = "delete performance_counter: 419333" }) 970 | --- 690000 --- 971 | (variant { Ok = "bench1_insert_person OK" }) 972 | (variant { Ok = "execute performance_counter: 3208127" }) 973 | (variant { Ok = "execute performance_counter: 2757533" }) 974 | (variant { Ok = "count performance_counter: 20959150" }) 975 | (variant { Ok = "insert performance_counter: 479154" }) 976 | (variant { Ok = "query_by_id performance_counter: 266843" }) 977 | (variant { Ok = "query_by_name performance_counter: 316126" }) 978 | Error: (BFailed update call. 979 | Caused by: (BFailed update call. 980 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 981 | (variant { Ok = "query_by_limit_offset performance_counter: 2929506389" }) 982 | (variant { Ok = "update_by_name performance_counter: 239475" }) 983 | (variant { Ok = "update_by_id performance_counter: 390949" }) 984 | (variant { Ok = "delete performance_counter: 262477" }) 985 | --- 700000 --- 986 | (variant { Ok = "bench1_insert_person OK" }) 987 | (variant { Ok = "execute performance_counter: 3115822" }) 988 | (variant { Ok = "execute performance_counter: 2784713" }) 989 | (variant { Ok = "count performance_counter: 21261125" }) 990 | (variant { Ok = "insert performance_counter: 352282" }) 991 | (variant { Ok = "query_by_id performance_counter: 265545" }) 992 | (variant { Ok = "query_by_name performance_counter: 315054" }) 993 | Error: (BFailed update call. 994 | Caused by: (BFailed update call. 995 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 996 | (variant { Ok = "query_by_limit_offset performance_counter: 2971950402" }) 997 | (variant { Ok = "update_by_name performance_counter: 238982" }) 998 | (variant { Ok = "update_by_id performance_counter: 392363" }) 999 | (variant { Ok = "delete performance_counter: 419992" }) 1000 | --- 710000 --- 1001 | (variant { Ok = "bench1_insert_person OK" }) 1002 | (variant { Ok = "execute performance_counter: 3144879" }) 1003 | (variant { Ok = "execute performance_counter: 2812057" }) 1004 | (variant { Ok = "count performance_counter: 21562419" }) 1005 | (variant { Ok = "insert performance_counter: 353987" }) 1006 | (variant { Ok = "query_by_id performance_counter: 267231" }) 1007 | (variant { Ok = "query_by_name performance_counter: 316481" }) 1008 | Error: (BFailed update call. 1009 | Caused by: (BFailed update call. 1010 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1011 | (variant { Ok = "query_by_limit_offset performance_counter: 3014379444" }) 1012 | (variant { Ok = "update_by_name performance_counter: 239917" }) 1013 | (variant { Ok = "update_by_id performance_counter: 393641" }) 1014 | (variant { Ok = "delete performance_counter: 262710" }) 1015 | --- 720000 --- 1016 | (variant { Ok = "bench1_insert_person OK" }) 1017 | (variant { Ok = "execute performance_counter: 3178841" }) 1018 | (variant { Ok = "execute performance_counter: 2840174" }) 1019 | (variant { Ok = "count performance_counter: 21873488" }) 1020 | (variant { Ok = "insert performance_counter: 352965" }) 1021 | (variant { Ok = "query_by_id performance_counter: 266957" }) 1022 | (variant { Ok = "query_by_name performance_counter: 316306" }) 1023 | Error: (BFailed update call. 1024 | Caused by: (BFailed update call. 1025 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1026 | (variant { Ok = "query_by_limit_offset performance_counter: 3056836994" }) 1027 | (variant { Ok = "update_by_name performance_counter: 239262" }) 1028 | (variant { Ok = "update_by_id performance_counter: 392119" }) 1029 | (variant { Ok = "delete performance_counter: 420713" }) 1030 | --- 730000 --- 1031 | (variant { Ok = "bench1_insert_person OK" }) 1032 | (variant { Ok = "execute performance_counter: 3198172" }) 1033 | (variant { Ok = "execute performance_counter: 2866366" }) 1034 | (variant { Ok = "count performance_counter: 22176098" }) 1035 | (variant { Ok = "insert performance_counter: 354441" }) 1036 | (variant { Ok = "query_by_id performance_counter: 267367" }) 1037 | (variant { Ok = "query_by_name performance_counter: 317542" }) 1038 | Error: (BFailed update call. 1039 | Caused by: (BFailed update call. 1040 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1041 | (variant { Ok = "query_by_limit_offset performance_counter: 3099275778" }) 1042 | (variant { Ok = "update_by_name performance_counter: 240234" }) 1043 | (variant { Ok = "update_by_id performance_counter: 392893" }) 1044 | (variant { Ok = "delete performance_counter: 264479" }) 1045 | --- 740000 --- 1046 | (variant { Ok = "bench1_insert_person OK" }) 1047 | (variant { Ok = "execute performance_counter: 3231035" }) 1048 | (variant { Ok = "execute performance_counter: 2890833" }) 1049 | (variant { Ok = "count performance_counter: 22482431" }) 1050 | (variant { Ok = "insert performance_counter: 353721" }) 1051 | (variant { Ok = "query_by_id performance_counter: 267528" }) 1052 | (variant { Ok = "query_by_name performance_counter: 317134" }) 1053 | Error: (BFailed update call. 1054 | Caused by: (BFailed update call. 1055 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1056 | (variant { Ok = "query_by_limit_offset performance_counter: 3141729161" }) 1057 | (variant { Ok = "update_by_name performance_counter: 240109" }) 1058 | (variant { Ok = "update_by_id performance_counter: 393734" }) 1059 | (variant { Ok = "delete performance_counter: 421154" }) 1060 | --- 750000 --- 1061 | (variant { Ok = "bench1_insert_person OK" }) 1062 | (variant { Ok = "execute performance_counter: 3252717" }) 1063 | (variant { Ok = "execute performance_counter: 2926035" }) 1064 | (variant { Ok = "count performance_counter: 22784364" }) 1065 | (variant { Ok = "insert performance_counter: 355001" }) 1066 | (variant { Ok = "query_by_id performance_counter: 267367" }) 1067 | (variant { Ok = "query_by_name performance_counter: 317515" }) 1068 | Error: (BFailed update call. 1069 | Caused by: (BFailed update call. 1070 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1071 | (variant { Ok = "query_by_limit_offset performance_counter: 3184162573" }) 1072 | (variant { Ok = "update_by_name performance_counter: 240832" }) 1073 | (variant { Ok = "update_by_id performance_counter: 394429" }) 1074 | (variant { Ok = "delete performance_counter: 263559" }) 1075 | --- 760000 --- 1076 | (variant { Ok = "bench1_insert_person OK" }) 1077 | (variant { Ok = "execute performance_counter: 3288049" }) 1078 | (variant { Ok = "execute performance_counter: 2949355" }) 1079 | (variant { Ok = "count performance_counter: 23095954" }) 1080 | (variant { Ok = "insert performance_counter: 355033" }) 1081 | (variant { Ok = "query_by_id performance_counter: 267708" }) 1082 | (variant { Ok = "query_by_name performance_counter: 317766" }) 1083 | Error: (BFailed update call. 1084 | Caused by: (BFailed update call. 1085 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1086 | (variant { Ok = "query_by_limit_offset performance_counter: 3226616517" }) 1087 | (variant { Ok = "update_by_name performance_counter: 241197" }) 1088 | (variant { Ok = "update_by_id performance_counter: 391997" }) 1089 | (variant { Ok = "delete performance_counter: 422634" }) 1090 | --- 770000 --- 1091 | (variant { Ok = "bench1_insert_person OK" }) 1092 | (variant { Ok = "execute performance_counter: 3310758" }) 1093 | (variant { Ok = "execute performance_counter: 2976419" }) 1094 | (variant { Ok = "count performance_counter: 23402092" }) 1095 | (variant { Ok = "insert performance_counter: 354507" }) 1096 | (variant { Ok = "query_by_id performance_counter: 267108" }) 1097 | (variant { Ok = "query_by_name performance_counter: 316316" }) 1098 | Error: (BFailed update call. 1099 | Caused by: (BFailed update call. 1100 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1101 | (variant { Ok = "query_by_limit_offset performance_counter: 3269065126" }) 1102 | (variant { Ok = "update_by_name performance_counter: 240125" }) 1103 | (variant { Ok = "update_by_id performance_counter: 393450" }) 1104 | (variant { Ok = "delete performance_counter: 264032" }) 1105 | --- 780000 --- 1106 | (variant { Ok = "bench1_insert_person OK" }) 1107 | (variant { Ok = "execute performance_counter: 3339642" }) 1108 | (variant { Ok = "execute performance_counter: 3084511" }) 1109 | (variant { Ok = "count performance_counter: 23702698" }) 1110 | (variant { Ok = "insert performance_counter: 354072" }) 1111 | (variant { Ok = "query_by_id performance_counter: 266263" }) 1112 | (variant { Ok = "query_by_name performance_counter: 316405" }) 1113 | Error: (BFailed update call. 1114 | Caused by: (BFailed update call. 1115 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1116 | (variant { Ok = "query_by_limit_offset performance_counter: 3311507911" }) 1117 | (variant { Ok = "update_by_name performance_counter: 239920" }) 1118 | (variant { Ok = "update_by_id performance_counter: 393440" }) 1119 | (variant { Ok = "delete performance_counter: 423883" }) 1120 | --- 790000 --- 1121 | (variant { Ok = "bench1_insert_person OK" }) 1122 | (variant { Ok = "execute performance_counter: 3369513" }) 1123 | (variant { Ok = "execute performance_counter: 3032667" }) 1124 | (variant { Ok = "count performance_counter: 24003904" }) 1125 | (variant { Ok = "insert performance_counter: 352727" }) 1126 | (variant { Ok = "query_by_id performance_counter: 266200" }) 1127 | (variant { Ok = "query_by_name performance_counter: 316446" }) 1128 | Error: (BFailed update call. 1129 | Caused by: (BFailed update call. 1130 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1131 | (variant { Ok = "query_by_limit_offset performance_counter: 3353949252" }) 1132 | (variant { Ok = "update_by_name performance_counter: 239528" }) 1133 | (variant { Ok = "update_by_id performance_counter: 393510" }) 1134 | (variant { Ok = "delete performance_counter: 263631" }) 1135 | --- 800000 --- 1136 | (variant { Ok = "bench1_insert_person OK" }) 1137 | (variant { Ok = "execute performance_counter: 3393822" }) 1138 | (variant { Ok = "execute performance_counter: 3052909" }) 1139 | (variant { Ok = "count performance_counter: 24316181" }) 1140 | (variant { Ok = "insert performance_counter: 352502" }) 1141 | (variant { Ok = "query_by_id performance_counter: 266567" }) 1142 | (variant { Ok = "query_by_name performance_counter: 316207" }) 1143 | Error: (BFailed update call. 1144 | Caused by: (BFailed update call. 1145 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1146 | (variant { Ok = "query_by_limit_offset performance_counter: 3396396893" }) 1147 | (variant { Ok = "update_by_name performance_counter: 240004" }) 1148 | (variant { Ok = "update_by_id performance_counter: 392545" }) 1149 | (variant { Ok = "delete performance_counter: 421086" }) 1150 | --- 810000 --- 1151 | (variant { Ok = "bench1_insert_person OK" }) 1152 | (variant { Ok = "execute performance_counter: 3420414" }) 1153 | (variant { Ok = "execute performance_counter: 3077841" }) 1154 | (variant { Ok = "count performance_counter: 24611798" }) 1155 | (variant { Ok = "insert performance_counter: 352208" }) 1156 | (variant { Ok = "query_by_id performance_counter: 266278" }) 1157 | (variant { Ok = "query_by_name performance_counter: 315961" }) 1158 | Error: (BFailed update call. 1159 | Caused by: (BFailed update call. 1160 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1161 | (variant { Ok = "query_by_limit_offset performance_counter: 3438843325" }) 1162 | (variant { Ok = "update_by_name performance_counter: 239086" }) 1163 | (variant { Ok = "update_by_id performance_counter: 390982" }) 1164 | (variant { Ok = "delete performance_counter: 262785" }) 1165 | --- 820000 --- 1166 | (variant { Ok = "bench1_insert_person OK" }) 1167 | (variant { Ok = "execute performance_counter: 3520377" }) 1168 | (variant { Ok = "execute performance_counter: 3106031" }) 1169 | (variant { Ok = "count performance_counter: 24917194" }) 1170 | (variant { Ok = "insert performance_counter: 353174" }) 1171 | (variant { Ok = "query_by_id performance_counter: 266112" }) 1172 | (variant { Ok = "query_by_name performance_counter: 315319" }) 1173 | Error: (BFailed update call. 1174 | Caused by: (BFailed update call. 1175 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1176 | (variant { Ok = "query_by_limit_offset performance_counter: 3481287935" }) 1177 | (variant { Ok = "update_by_name performance_counter: 238548" }) 1178 | (variant { Ok = "update_by_id performance_counter: 392037" }) 1179 | (variant { Ok = "delete performance_counter: 420451" }) 1180 | --- 830000 --- 1181 | (variant { Ok = "bench1_insert_person OK" }) 1182 | (variant { Ok = "execute performance_counter: 3475428" }) 1183 | (variant { Ok = "execute performance_counter: 3136777" }) 1184 | (variant { Ok = "count performance_counter: 25219496" }) 1185 | (variant { Ok = "insert performance_counter: 353953" }) 1186 | (variant { Ok = "query_by_id performance_counter: 267801" }) 1187 | (variant { Ok = "query_by_name performance_counter: 316600" }) 1188 | Error: (BFailed update call. 1189 | Caused by: (BFailed update call. 1190 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1191 | (variant { Ok = "query_by_limit_offset performance_counter: 3523732039" }) 1192 | (variant { Ok = "update_by_name performance_counter: 239999" }) 1193 | (variant { Ok = "update_by_id performance_counter: 393586" }) 1194 | (variant { Ok = "delete performance_counter: 264337" }) 1195 | --- 840000 --- 1196 | (variant { Ok = "bench1_insert_person OK" }) 1197 | (variant { Ok = "execute performance_counter: 3616608" }) 1198 | (variant { Ok = "execute performance_counter: 3162328" }) 1199 | (variant { Ok = "count performance_counter: 25525418" }) 1200 | (variant { Ok = "insert performance_counter: 353324" }) 1201 | (variant { Ok = "query_by_id performance_counter: 267613" }) 1202 | (variant { Ok = "query_by_name performance_counter: 317307" }) 1203 | Error: (BFailed update call. 1204 | Caused by: (BFailed update call. 1205 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1206 | (variant { Ok = "query_by_limit_offset performance_counter: 3566183882" }) 1207 | (variant { Ok = "update_by_name performance_counter: 240772" }) 1208 | (variant { Ok = "update_by_id performance_counter: 393994" }) 1209 | (variant { Ok = "delete performance_counter: 422824" }) 1210 | --- 850000 --- 1211 | (variant { Ok = "bench1_insert_person OK" }) 1212 | (variant { Ok = "execute performance_counter: 3651474" }) 1213 | (variant { Ok = "execute performance_counter: 3194524" }) 1214 | (variant { Ok = "count performance_counter: 25832580" }) 1215 | (variant { Ok = "insert performance_counter: 353553" }) 1216 | (variant { Ok = "query_by_id performance_counter: 267078" }) 1217 | (variant { Ok = "query_by_name performance_counter: 316292" }) 1218 | Error: (BFailed update call. 1219 | Caused by: (BFailed update call. 1220 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1221 | (variant { Ok = "query_by_limit_offset performance_counter: 3608626671" }) 1222 | (variant { Ok = "update_by_name performance_counter: 240375" }) 1223 | (variant { Ok = "update_by_id performance_counter: 393192" }) 1224 | (variant { Ok = "delete performance_counter: 263201" }) 1225 | --- 860000 --- 1226 | (variant { Ok = "bench1_insert_person OK" }) 1227 | (variant { Ok = "execute performance_counter: 3565430" }) 1228 | (variant { Ok = "execute performance_counter: 3222938" }) 1229 | (variant { Ok = "count performance_counter: 26134035" }) 1230 | (variant { Ok = "insert performance_counter: 477560" }) 1231 | (variant { Ok = "query_by_id performance_counter: 267131" }) 1232 | (variant { Ok = "query_by_name performance_counter: 317261" }) 1233 | Error: (BFailed update call. 1234 | Caused by: (BFailed update call. 1235 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1236 | (variant { Ok = "query_by_limit_offset performance_counter: 3651067256" }) 1237 | (variant { Ok = "update_by_name performance_counter: 240737" }) 1238 | (variant { Ok = "update_by_id performance_counter: 392963" }) 1239 | (variant { Ok = "delete performance_counter: 421113" }) 1240 | --- 870000 --- 1241 | (variant { Ok = "bench1_insert_person OK" }) 1242 | (variant { Ok = "execute performance_counter: 3588995" }) 1243 | (variant { Ok = "execute performance_counter: 3248959" }) 1244 | (variant { Ok = "count performance_counter: 26439324" }) 1245 | (variant { Ok = "insert performance_counter: 352975" }) 1246 | (variant { Ok = "query_by_id performance_counter: 267235" }) 1247 | (variant { Ok = "query_by_name performance_counter: 316995" }) 1248 | Error: (BFailed update call. 1249 | Caused by: (BFailed update call. 1250 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1251 | (variant { Ok = "query_by_limit_offset performance_counter: 3693512880" }) 1252 | (variant { Ok = "update_by_name performance_counter: 240274" }) 1253 | (variant { Ok = "update_by_id performance_counter: 393351" }) 1254 | (variant { Ok = "delete performance_counter: 263922" }) 1255 | --- 880000 --- 1256 | (variant { Ok = "bench1_insert_person OK" }) 1257 | (variant { Ok = "execute performance_counter: 3615929" }) 1258 | (variant { Ok = "execute performance_counter: 3275749" }) 1259 | (variant { Ok = "count performance_counter: 26741943" }) 1260 | (variant { Ok = "insert performance_counter: 354109" }) 1261 | (variant { Ok = "query_by_id performance_counter: 267699" }) 1262 | (variant { Ok = "query_by_name performance_counter: 317785" }) 1263 | Error: (BFailed update call. 1264 | Caused by: (BFailed update call. 1265 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1266 | (variant { Ok = "query_by_limit_offset performance_counter: 3735958966" }) 1267 | (variant { Ok = "update_by_name performance_counter: 241659" }) 1268 | (variant { Ok = "update_by_id performance_counter: 394639" }) 1269 | (variant { Ok = "delete performance_counter: 421522" }) 1270 | --- 890000 --- 1271 | (variant { Ok = "bench1_insert_person OK" }) 1272 | (variant { Ok = "execute performance_counter: 3650311" }) 1273 | (variant { Ok = "execute performance_counter: 3303194" }) 1274 | (variant { Ok = "count performance_counter: 27042385" }) 1275 | (variant { Ok = "insert performance_counter: 353818" }) 1276 | (variant { Ok = "query_by_id performance_counter: 267777" }) 1277 | (variant { Ok = "query_by_name performance_counter: 318270" }) 1278 | Error: (BFailed update call. 1279 | Caused by: (BFailed update call. 1280 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1281 | (variant { Ok = "query_by_limit_offset performance_counter: 3778406538" }) 1282 | (variant { Ok = "update_by_name performance_counter: 240327" }) 1283 | (variant { Ok = "update_by_id performance_counter: 393857" }) 1284 | (variant { Ok = "delete performance_counter: 263681" }) 1285 | --- 900000 --- 1286 | (variant { Ok = "bench1_insert_person OK" }) 1287 | (variant { Ok = "execute performance_counter: 3667913" }) 1288 | (variant { Ok = "execute performance_counter: 3334501" }) 1289 | (variant { Ok = "count performance_counter: 27349954" }) 1290 | (variant { Ok = "insert performance_counter: 354334" }) 1291 | (variant { Ok = "query_by_id performance_counter: 267708" }) 1292 | (variant { Ok = "query_by_name performance_counter: 317550" }) 1293 | Error: (BFailed update call. 1294 | Caused by: (BFailed update call. 1295 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1296 | (variant { Ok = "query_by_limit_offset performance_counter: 3820842398" }) 1297 | (variant { Ok = "update_by_name performance_counter: 241761" }) 1298 | (variant { Ok = "update_by_id performance_counter: 392665" }) 1299 | (variant { Ok = "delete performance_counter: 422982" }) 1300 | --- 910000 --- 1301 | (variant { Ok = "bench1_insert_person OK" }) 1302 | (variant { Ok = "execute performance_counter: 3702656" }) 1303 | (variant { Ok = "execute performance_counter: 3356435" }) 1304 | (variant { Ok = "count performance_counter: 27650397" }) 1305 | (variant { Ok = "insert performance_counter: 569853" }) 1306 | (variant { Ok = "query_by_id performance_counter: 267963" }) 1307 | (variant { Ok = "query_by_name performance_counter: 318000" }) 1308 | Error: (BFailed update call. 1309 | Caused by: (BFailed update call. 1310 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1311 | (variant { Ok = "query_by_limit_offset performance_counter: 3863291675" }) 1312 | (variant { Ok = "update_by_name performance_counter: 240863" }) 1313 | (variant { Ok = "update_by_id performance_counter: 392922" }) 1314 | (variant { Ok = "delete performance_counter: 264265" }) 1315 | --- 920000 --- 1316 | (variant { Ok = "bench1_insert_person OK" }) 1317 | (variant { Ok = "execute performance_counter: 3729088" }) 1318 | (variant { Ok = "execute performance_counter: 3385552" }) 1319 | (variant { Ok = "count performance_counter: 27963239" }) 1320 | (variant { Ok = "insert performance_counter: 353402" }) 1321 | (variant { Ok = "query_by_id performance_counter: 267200" }) 1322 | (variant { Ok = "query_by_name performance_counter: 316853" }) 1323 | Error: (BFailed update call. 1324 | Caused by: (BFailed update call. 1325 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1326 | (variant { Ok = "query_by_limit_offset performance_counter: 3905742261" }) 1327 | (variant { Ok = "update_by_name performance_counter: 241555" }) 1328 | (variant { Ok = "update_by_id performance_counter: 393609" }) 1329 | (variant { Ok = "delete performance_counter: 421897" }) 1330 | --- 930000 --- 1331 | (variant { Ok = "bench1_insert_person OK" }) 1332 | (variant { Ok = "execute performance_counter: 3755921" }) 1333 | (variant { Ok = "execute performance_counter: 3413848" }) 1334 | (variant { Ok = "count performance_counter: 28264127" }) 1335 | (variant { Ok = "insert performance_counter: 353908" }) 1336 | (variant { Ok = "query_by_id performance_counter: 267445" }) 1337 | (variant { Ok = "query_by_name performance_counter: 317024" }) 1338 | Error: (BFailed update call. 1339 | Caused by: (BFailed update call. 1340 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1341 | (variant { Ok = "query_by_limit_offset performance_counter: 3948192035" }) 1342 | (variant { Ok = "update_by_name performance_counter: 240884" }) 1343 | (variant { Ok = "update_by_id performance_counter: 394279" }) 1344 | (variant { Ok = "delete performance_counter: 265056" }) 1345 | --- 940000 --- 1346 | (variant { Ok = "bench1_insert_person OK" }) 1347 | (variant { Ok = "execute performance_counter: 3860094" }) 1348 | (variant { Ok = "execute performance_counter: 3438626" }) 1349 | (variant { Ok = "count performance_counter: 28564812" }) 1350 | (variant { Ok = "insert performance_counter: 353280" }) 1351 | (variant { Ok = "query_by_id performance_counter: 267126" }) 1352 | (variant { Ok = "query_by_name performance_counter: 317288" }) 1353 | Error: (BFailed update call. 1354 | Caused by: (BFailed update call. 1355 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1356 | (variant { Ok = "query_by_limit_offset performance_counter: 3990628817" }) 1357 | (variant { Ok = "update_by_name performance_counter: 240207" }) 1358 | (variant { Ok = "update_by_id performance_counter: 393046" }) 1359 | (variant { Ok = "delete performance_counter: 421785" }) 1360 | --- 950000 --- 1361 | (variant { Ok = "bench1_insert_person OK" }) 1362 | (variant { Ok = "execute performance_counter: 3809551" }) 1363 | (variant { Ok = "execute performance_counter: 3464681" }) 1364 | (variant { Ok = "count performance_counter: 28871276" }) 1365 | (variant { Ok = "insert performance_counter: 353697" }) 1366 | (variant { Ok = "query_by_id performance_counter: 267352" }) 1367 | (variant { Ok = "query_by_name performance_counter: 317452" }) 1368 | Error: (BFailed update call. 1369 | Caused by: (BFailed update call. 1370 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1371 | (variant { Ok = "query_by_limit_offset performance_counter: 4033073167" }) 1372 | (variant { Ok = "update_by_name performance_counter: 240110" }) 1373 | (variant { Ok = "update_by_id performance_counter: 394604" }) 1374 | (variant { Ok = "delete performance_counter: 263973" }) 1375 | --- 960000 --- 1376 | (variant { Ok = "bench1_insert_person OK" }) 1377 | (variant { Ok = "execute performance_counter: 3844241" }) 1378 | (variant { Ok = "execute performance_counter: 3495659" }) 1379 | (variant { Ok = "count performance_counter: 29172020" }) 1380 | (variant { Ok = "insert performance_counter: 353325" }) 1381 | (variant { Ok = "query_by_id performance_counter: 267556" }) 1382 | (variant { Ok = "query_by_name performance_counter: 318507" }) 1383 | Error: (BFailed update call. 1384 | Caused by: (BFailed update call. 1385 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1386 | (variant { Ok = "query_by_limit_offset performance_counter: 4075524257" }) 1387 | (variant { Ok = "update_by_name performance_counter: 240648" }) 1388 | (variant { Ok = "update_by_id performance_counter: 391502" }) 1389 | (variant { Ok = "delete performance_counter: 421573" }) 1390 | --- 970000 --- 1391 | (variant { Ok = "bench1_insert_person OK" }) 1392 | (variant { Ok = "execute performance_counter: 3864963" }) 1393 | (variant { Ok = "execute performance_counter: 3519975" }) 1394 | (variant { Ok = "count performance_counter: 29472940" }) 1395 | (variant { Ok = "insert performance_counter: 353154" }) 1396 | (variant { Ok = "query_by_id performance_counter: 267781" }) 1397 | (variant { Ok = "query_by_name performance_counter: 318424" }) 1398 | Error: (BFailed update call. 1399 | Caused by: (BFailed update call. 1400 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1401 | (variant { Ok = "query_by_limit_offset performance_counter: 4117966440" }) 1402 | (variant { Ok = "update_by_name performance_counter: 240680" }) 1403 | (variant { Ok = "update_by_id performance_counter: 393933" }) 1404 | (variant { Ok = "delete performance_counter: 264686" }) 1405 | --- 980000 --- 1406 | (variant { Ok = "bench1_insert_person OK" }) 1407 | (variant { Ok = "execute performance_counter: 3970428" }) 1408 | (variant { Ok = "execute performance_counter: 3549171" }) 1409 | (variant { Ok = "count performance_counter: 29779850" }) 1410 | (variant { Ok = "insert performance_counter: 355015" }) 1411 | (variant { Ok = "query_by_id performance_counter: 266745" }) 1412 | (variant { Ok = "query_by_name performance_counter: 316823" }) 1413 | Error: (BFailed update call. 1414 | Caused by: (BFailed update call. 1415 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1416 | (variant { Ok = "query_by_limit_offset performance_counter: 4160418300" }) 1417 | (variant { Ok = "update_by_name performance_counter: 240616" }) 1418 | (variant { Ok = "update_by_id performance_counter: 396056" }) 1419 | (variant { Ok = "delete performance_counter: 422092" }) 1420 | --- 990000 --- 1421 | (variant { Ok = "bench1_insert_person OK" }) 1422 | (variant { Ok = "execute performance_counter: 3923469" }) 1423 | (variant { Ok = "execute performance_counter: 3577781" }) 1424 | (variant { Ok = "count performance_counter: 30086328" }) 1425 | (variant { Ok = "insert performance_counter: 354273" }) 1426 | (variant { Ok = "query_by_id performance_counter: 266414" }) 1427 | (variant { Ok = "query_by_name performance_counter: 316440" }) 1428 | Error: (BFailed update call. 1429 | Caused by: (BFailed update call. 1430 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1431 | (variant { Ok = "query_by_limit_offset performance_counter: 4202856598" }) 1432 | (variant { Ok = "update_by_name performance_counter: 240272" }) 1433 | (variant { Ok = "update_by_id performance_counter: 395302" }) 1434 | (variant { Ok = "delete performance_counter: 264303" }) 1435 | --- 1000000 --- 1436 | (variant { Ok = "bench1_insert_person OK" }) 1437 | (variant { Ok = "execute performance_counter: 4066020" }) 1438 | (variant { Ok = "execute performance_counter: 3601724" }) 1439 | (variant { Ok = "count performance_counter: 30392494" }) 1440 | (variant { Ok = "insert performance_counter: 355381" }) 1441 | (variant { Ok = "query_by_id performance_counter: 268112" }) 1442 | (variant { Ok = "query_by_name performance_counter: 319276" }) 1443 | Error: (BFailed update call. 1444 | Caused by: (BFailed update call. 1445 | The Replica returned an error: code 5, message: "Canister rrkah-fqaaa-aaaaa-aaaaq-cai exceeded the instruction limit for single message execution." 1446 | (variant { Ok = "query_by_limit_offset performance_counter: 4245307426" }) 1447 | (variant { Ok = "update_by_name performance_counter: 240998" }) 1448 | (variant { Ok = "update_by_id performance_counter: 394111" }) 1449 | (variant { Ok = "delete performance_counter: 423064" }) 1450 | -------------------------------------------------------------------------------- /examples/bench/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate ic_cdk_macros; 3 | #[macro_use] 4 | extern crate serde; 5 | 6 | use ic_cdk::api::call::RejectionCode; 7 | use candid::CandidType; 8 | 9 | #[update] 10 | fn execute(sql: String) -> Result { 11 | let conn = ic_sqlite::CONN.lock().unwrap(); 12 | return match conn.execute( 13 | &sql, 14 | [] 15 | ) { 16 | Ok(_) => Ok(format!("execute performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 17 | Err(err) => Err(Error::CanisterError {message: format!("execute: {:?}", err) }) 18 | } 19 | } 20 | 21 | #[query] 22 | fn count(table_name: String) -> Result { 23 | let conn = ic_sqlite::CONN.lock().unwrap(); 24 | let mut stmt = match conn.prepare(&format!("select count(*) from {:?}", table_name)) { 25 | Ok(e) => e, 26 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 27 | }; 28 | let mut iter = match stmt.query_map([], |row| { 29 | let count: u64 = row.get(0).unwrap(); 30 | Ok(count) 31 | }) { 32 | Ok(e) => e, 33 | Err(err) => return Err(Error::CanisterError {message: format!("count: {:?}", err) }) 34 | }; 35 | let count = iter.next().unwrap().unwrap(); 36 | ic_cdk::eprintln!("count: {:?}", count); 37 | Ok(format!("count performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 38 | } 39 | 40 | #[update] 41 | fn bench1_insert_person(offset: usize, count: usize) -> Result { 42 | let conn = ic_sqlite::CONN.lock().unwrap(); 43 | for i in 0..count { 44 | let id = offset + i + 1; 45 | match conn.execute( 46 | "insert into person (name, age, gender) values (?1, ?2, ?3);", 47 | (format!("person{:?}", id), 18 + id % 10, id % 2) 48 | ) { 49 | Ok(_) => {}, 50 | Err(err) => return Err(Error::CanisterError {message: format!("bench1_insert_person: {:?}", err) }) 51 | } 52 | } 53 | Ok(String::from("bench1_insert_person OK")) 54 | } 55 | 56 | #[update] 57 | fn bench1_insert_person_one(offset: usize) -> Result { 58 | let conn = ic_sqlite::CONN.lock().unwrap(); 59 | let id = offset + 1; 60 | match conn.execute( 61 | "insert into person (name, age, gender) values (?1, ?2, ?3);", 62 | (format!("person{:?}", id), 18 + id % 10, id % 2) 63 | ) { 64 | Ok(_) => Ok(format!("insert performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 65 | Err(err) => Err(Error::CanisterError {message: format!("insert: {:?}", err) }) 66 | } 67 | } 68 | 69 | #[query] 70 | fn bench1_query_person_by_id(offset: usize) -> Result { 71 | let conn = ic_sqlite::CONN.lock().unwrap(); 72 | let id = offset + 1; 73 | let mut stmt = match conn.prepare("select * from person where id=?1") { 74 | Ok(e) => e, 75 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_id: {:?}", err) }) 76 | }; 77 | let iter = match stmt.query_map((id,), |row| { 78 | Ok(Person { 79 | id: row.get(0).unwrap(), 80 | name: row.get(1).unwrap(), 81 | age: row.get(2).unwrap(), 82 | gender: row.get(3).unwrap() 83 | }) 84 | }) { 85 | Ok(e) => e, 86 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_id: {:?}", err) }) 87 | }; 88 | let mut arr = Vec::new(); 89 | for ite in iter { 90 | arr.push(ite.unwrap()); 91 | } 92 | let res = serde_json::to_string(&arr).unwrap(); 93 | ic_cdk::eprintln!("query_by_id: {:?}", res); 94 | Ok(format!("query_by_id performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 95 | } 96 | 97 | #[query] 98 | fn bench1_query_person_by_name(offset: usize) -> Result { 99 | let conn = ic_sqlite::CONN.lock().unwrap(); 100 | let name = format!("person{:?}", offset + 1); 101 | let mut stmt = match conn.prepare("select * from person where name=?1") { 102 | Ok(e) => e, 103 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_name: {:?}", err) }) 104 | }; 105 | let iter = match stmt.query_map((name,), |row| { 106 | Ok(Person { 107 | id: row.get(0).unwrap(), 108 | name: row.get(1).unwrap(), 109 | age: row.get(2).unwrap(), 110 | gender: row.get(3).unwrap() 111 | }) 112 | }) { 113 | Ok(e) => e, 114 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_name: {:?}", err) }) 115 | }; 116 | let mut arr = Vec::new(); 117 | for ite in iter { 118 | arr.push(ite.unwrap()); 119 | } 120 | let res = serde_json::to_string(&arr).unwrap(); 121 | ic_cdk::eprintln!("query_by_name: {:?}", res); 122 | Ok(format!("query_by_name performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 123 | } 124 | 125 | #[query] 126 | fn bench1_query_person_by_like_name(offset: usize) -> Result { 127 | let conn = ic_sqlite::CONN.lock().unwrap(); 128 | let name = format!("person{:?}", offset + 1); 129 | let mut stmt = match conn.prepare("select * from person where name like ?1") { 130 | Ok(e) => e, 131 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 132 | }; 133 | let iter = match stmt.query_map((format!("{:?}%", name),), |row| { 134 | Ok(Person { 135 | id: row.get(0).unwrap(), 136 | name: row.get(1).unwrap(), 137 | age: row.get(2).unwrap(), 138 | gender: row.get(3).unwrap() 139 | }) 140 | }) { 141 | Ok(e) => e, 142 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 143 | }; 144 | let mut arr = Vec::new(); 145 | for ite in iter { 146 | arr.push(ite.unwrap()); 147 | } 148 | let res = serde_json::to_string(&arr).unwrap(); 149 | ic_cdk::eprintln!("query_by_like_name: {:?}", res); 150 | Ok(format!("query_by_like_name performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 151 | } 152 | 153 | #[query] 154 | fn bench1_query_person_by_limit_offset(limit: usize, offset: usize) -> Result { 155 | let conn = ic_sqlite::CONN.lock().unwrap(); 156 | let mut stmt = match conn.prepare("select * from person limit ?1 offset ?2") { 157 | Ok(e) => e, 158 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_limit_offset: {:?}", err) }) 159 | }; 160 | let iter = match stmt.query_map((limit, offset), |row| { 161 | Ok(Person { 162 | id: row.get(0).unwrap(), 163 | name: row.get(1).unwrap(), 164 | age: row.get(2).unwrap(), 165 | gender: row.get(3).unwrap() 166 | }) 167 | }) { 168 | Ok(e) => e, 169 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_limit_offset: {:?}", err) }) 170 | }; 171 | let mut arr = Vec::new(); 172 | for ite in iter { 173 | arr.push(ite.unwrap()); 174 | } 175 | let res = serde_json::to_string(&arr).unwrap(); 176 | ic_cdk::eprintln!("query_by_limit_offset: {:?}", res); 177 | Ok(format!("query_by_limit_offset performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 178 | } 179 | 180 | #[update] 181 | fn bench1_update_person_by_id(offset: usize) -> Result { 182 | let conn = ic_sqlite::CONN.lock().unwrap(); 183 | let id = offset + 1; 184 | return match conn.execute( 185 | "update person set name=?1 where id=?2", 186 | (String::from("person_id"), id) 187 | ) { 188 | Ok(_) => Ok(format!("update_by_id performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 189 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 190 | } 191 | } 192 | 193 | #[update] 194 | fn bench1_update_person_by_name(offset: usize) -> Result { 195 | let conn = ic_sqlite::CONN.lock().unwrap(); 196 | let name = format!("{:?}", offset + 1); 197 | return match conn.execute( 198 | "update person set name=?1 where name=?2", 199 | (String::from("person_name"), name) 200 | ) { 201 | Ok(_) => Ok(format!("update_by_name performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 202 | Err(err) => Err(Error::CanisterError {message: format!("update_by_name: {:?}", err) }) 203 | } 204 | } 205 | 206 | #[update] 207 | fn bench1_delete_person_by_id(offset: usize) -> Result { 208 | let conn = ic_sqlite::CONN.lock().unwrap(); 209 | let id = offset + 1; 210 | return match conn.execute( 211 | "delete from person where id=?1", 212 | (id,) 213 | ) { 214 | Ok(_) => Ok(format!("delete performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 215 | Err(err) => Err(Error::CanisterError {message: format!("delete: {:?}", err) }) 216 | } 217 | } 218 | 219 | #[update] 220 | fn bench2_insert_person2(offset: usize, count: usize) -> Result { 221 | let conn = ic_sqlite::CONN.lock().unwrap(); 222 | for i in 0..count { 223 | let id = offset + i + 1; 224 | let data = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a"; 225 | match conn.execute( 226 | "insert into person2 (name, age, gender, data) values (?1, ?2, ?3, ?4);", 227 | (format!("person2{:?}", id), 18 + id % 10, id % 2, &data) 228 | ) { 229 | Ok(_) => {}, 230 | Err(err) => return Err(Error::CanisterError {message: format!("bench2_insert_person2: {:?}", err) }) 231 | } 232 | } 233 | Ok(String::from("bench2_insert_person2 OK")) 234 | } 235 | 236 | #[update] 237 | fn bench2_insert_person2_one(offset: usize) -> Result { 238 | let conn = ic_sqlite::CONN.lock().unwrap(); 239 | let id = offset + 1; 240 | let data = "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a"; 241 | match conn.execute( 242 | "insert into person2 (name, age, gender, data) values (?1, ?2, ?3, ?4);", 243 | (format!("person2{:?}", id), 18 + id % 10, id % 2, &data) 244 | ) { 245 | Ok(_) => Ok(format!("insert performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 246 | Err(err) => Err(Error::CanisterError {message: format!("insert: {:?}", err) }) 247 | } 248 | } 249 | 250 | #[query] 251 | fn bench2_query_person2_by_id(offset: usize) -> Result { 252 | let conn = ic_sqlite::CONN.lock().unwrap(); 253 | let id = offset + 1; 254 | let mut stmt = match conn.prepare("select * from person2 where id=?1") { 255 | Ok(e) => e, 256 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_id: {:?}", err) }) 257 | }; 258 | let iter = match stmt.query_map((id,), |row| { 259 | Ok(Person2 { 260 | id: row.get(0).unwrap(), 261 | name: row.get(1).unwrap(), 262 | age: row.get(2).unwrap(), 263 | gender: row.get(3).unwrap(), 264 | data: row.get(4).unwrap() 265 | }) 266 | }) { 267 | Ok(e) => e, 268 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_id: {:?}", err) }) 269 | }; 270 | let mut arr = Vec::new(); 271 | for ite in iter { 272 | arr.push(ite.unwrap()); 273 | } 274 | let res = serde_json::to_string(&arr).unwrap(); 275 | ic_cdk::eprintln!("query_by_id: {:?}", res); 276 | Ok(format!("query_by_id performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 277 | } 278 | 279 | #[query] 280 | fn bench2_query_person2_by_name(offset: usize) -> Result { 281 | let conn = ic_sqlite::CONN.lock().unwrap(); 282 | let name = format!("person2{:?}", offset + 1); 283 | let mut stmt = match conn.prepare("select * from person2 where name=?1") { 284 | Ok(e) => e, 285 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_name: {:?}", err) }) 286 | }; 287 | let iter = match stmt.query_map((name,), |row| { 288 | Ok(Person2 { 289 | id: row.get(0).unwrap(), 290 | name: row.get(1).unwrap(), 291 | age: row.get(2).unwrap(), 292 | gender: row.get(3).unwrap(), 293 | data: row.get(4).unwrap() 294 | }) 295 | }) { 296 | Ok(e) => e, 297 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_name: {:?}", err) }) 298 | }; 299 | let mut arr = Vec::new(); 300 | for ite in iter { 301 | arr.push(ite.unwrap()); 302 | } 303 | let res = serde_json::to_string(&arr).unwrap(); 304 | ic_cdk::eprintln!("query_by_name: {:?}", res); 305 | Ok(format!("query_by_name performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 306 | } 307 | 308 | #[query] 309 | fn bench2_query_person2_by_like_name(offset: usize) -> Result { 310 | let conn = ic_sqlite::CONN.lock().unwrap(); 311 | let name = format!("person2{:?}", offset + 1); 312 | let mut stmt = match conn.prepare("select * from person2 where name like ?1") { 313 | Ok(e) => e, 314 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 315 | }; 316 | let iter = match stmt.query_map((format!("{:?}%", name),), |row| { 317 | Ok(Person2 { 318 | id: row.get(0).unwrap(), 319 | name: row.get(1).unwrap(), 320 | age: row.get(2).unwrap(), 321 | gender: row.get(3).unwrap(), 322 | data: row.get(4).unwrap() 323 | }) 324 | }) { 325 | Ok(e) => e, 326 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 327 | }; 328 | let mut arr = Vec::new(); 329 | for ite in iter { 330 | arr.push(ite.unwrap()); 331 | } 332 | let res = serde_json::to_string(&arr).unwrap(); 333 | ic_cdk::eprintln!("query_by_like_name: {:?}", res); 334 | Ok(format!("query_by_like_name performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 335 | } 336 | 337 | #[query] 338 | fn bench2_query_person2_by_limit_offset(limit: usize, offset: usize) -> Result { 339 | let conn = ic_sqlite::CONN.lock().unwrap(); 340 | let mut stmt = match conn.prepare("select * from person2 limit ?1 offset ?2") { 341 | Ok(e) => e, 342 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_limit_offset: {:?}", err) }) 343 | }; 344 | let iter = match stmt.query_map((limit, offset), |row| { 345 | Ok(Person2 { 346 | id: row.get(0).unwrap(), 347 | name: row.get(1).unwrap(), 348 | age: row.get(2).unwrap(), 349 | gender: row.get(3).unwrap(), 350 | data: row.get(4).unwrap() 351 | }) 352 | }) { 353 | Ok(e) => e, 354 | Err(err) => return Err(Error::CanisterError {message: format!("query_by_limit_offset: {:?}", err) }) 355 | }; 356 | let mut arr = Vec::new(); 357 | for ite in iter { 358 | arr.push(ite.unwrap()); 359 | } 360 | let res = serde_json::to_string(&arr).unwrap(); 361 | ic_cdk::eprintln!("query_by_limit_offset: {:?}", res); 362 | Ok(format!("query_by_limit_offset performance_counter: {:?}", ic_cdk::api::performance_counter(0))) 363 | } 364 | 365 | #[update] 366 | fn bench2_update_person2_by_id(offset: usize) -> Result { 367 | let conn = ic_sqlite::CONN.lock().unwrap(); 368 | let id = offset + 1; 369 | return match conn.execute( 370 | "update person2 set name=?1 where id=?2", 371 | (String::from("person2_id"), id) 372 | ) { 373 | Ok(_) => Ok(format!("update_by_id performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 374 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 375 | } 376 | } 377 | 378 | #[update] 379 | fn bench2_update_person2_by_name(offset: usize) -> Result { 380 | let conn = ic_sqlite::CONN.lock().unwrap(); 381 | let name = format!("{:?}", offset + 1); 382 | return match conn.execute( 383 | "update person2 set name=?1 where name=?2", 384 | (String::from("person2_name"), name) 385 | ) { 386 | Ok(_) => Ok(format!("update_by_name performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 387 | Err(err) => Err(Error::CanisterError {message: format!("update_by_name: {:?}", err) }) 388 | } 389 | } 390 | 391 | #[update] 392 | fn bench2_delete_person2_by_id(offset: usize) -> Result { 393 | let conn = ic_sqlite::CONN.lock().unwrap(); 394 | let id = offset + 1; 395 | return match conn.execute( 396 | "delete from person2 where id=?1", 397 | (id,) 398 | ) { 399 | Ok(_) => Ok(format!("delete performance_counter: {:?}", ic_cdk::api::performance_counter(0))), 400 | Err(err) => Err(Error::CanisterError {message: format!("delete: {:?}", err) }) 401 | } 402 | } 403 | 404 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 405 | struct Person { 406 | id: u64, 407 | name: String, 408 | age: u32, 409 | gender: u8 410 | } 411 | 412 | #[derive(CandidType, Debug, Serialize, Deserialize, Default)] 413 | struct Person2 { 414 | id: u64, 415 | name: String, 416 | age: u32, 417 | gender: u8, 418 | data: String, 419 | } 420 | 421 | #[derive(CandidType, Deserialize)] 422 | enum Error { 423 | InvalidCanister, 424 | CanisterError { message: String }, 425 | } 426 | 427 | type Result = std::result::Result; 428 | 429 | impl From<(RejectionCode, String)> for Error { 430 | fn from((code, message): (RejectionCode, String)) -> Self { 431 | match code { 432 | RejectionCode::CanisterError => Self::CanisterError { message }, 433 | _ => Self::InvalidCanister, 434 | } 435 | } 436 | } -------------------------------------------------------------------------------- /examples/common/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "backend" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [lib] 9 | crate-type = ["cdylib"] 10 | 11 | [dependencies] 12 | candid = "0.7.14" 13 | ic-cdk = "0.5.2" 14 | ic-cdk-macros = "0.5.2" 15 | ic-sqlite = { path = "../../../ic-sqlite", version = "0.1.0" } 16 | rusqlite = { package = "rusqlite-ic", version = "0.28", features = ["bundled", "serde_json"]} 17 | serde = { version = "1", features = ["derive"] } 18 | serde_json = "1.0" 19 | hex = "0.4.3" -------------------------------------------------------------------------------- /examples/common/README.md: -------------------------------------------------------------------------------- 1 | ## Common Test Examples Container 2 | 3 | ## Summary 4 | Common Test Example of using ICSQLite in IC Canister 5 | 6 | ## Setup 7 | 8 | To build and install this code, you will need: 9 | 10 | - Git 11 | - [DFX] version 0.9.0 12 | - [Rust] version 1.55.0 or later 13 | 14 | ```sh 15 | git clone https://github.com/froghub-io/ic-sqlite.git 16 | cd examples/common 17 | ``` 18 | 19 | To start the local replica before installing the canister: 20 | 21 | ```sh 22 | dfx start --background --clean 23 | ``` 24 | 25 | Register, build and deploy the project. 26 | ```sh 27 | dfx deploy 28 | ``` 29 | 30 | Run run scripts 31 | ```sh 32 | bash run.sh 33 | ``` -------------------------------------------------------------------------------- /examples/common/backend.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/froghub-io/ic-sqlite/4efd51e47b16f115e4dfad721a0778a8b287c7e9/examples/common/backend.wasm -------------------------------------------------------------------------------- /examples/common/can.did: -------------------------------------------------------------------------------- 1 | type Error = variant { 2 | InvalidCanister; 3 | CanisterError : record { 4 | message : text; 5 | }; 6 | }; 7 | 8 | type Result = variant { 9 | Ok: text; 10 | Err : Error; 11 | }; 12 | 13 | type QueryResult = variant { 14 | Ok: vec vec text; 15 | Err : Error; 16 | }; 17 | 18 | service : { 19 | "balance": () -> (nat64); 20 | "instruction_counter": () -> (nat64); 21 | "execute": (text) -> (Result); 22 | "query": (text) -> (QueryResult) query; 23 | } 24 | -------------------------------------------------------------------------------- /examples/common/dfx.json: -------------------------------------------------------------------------------- 1 | { 2 | "canisters": { 3 | "backend": { 4 | "candid": "./can.did", 5 | "package": "backend", 6 | "type": "rust" 7 | } 8 | }, 9 | "dfx": "0.11.0", 10 | "networks": { 11 | "local": { 12 | "bind": "127.0.0.1:8000", 13 | "type": "ephemeral" 14 | } 15 | }, 16 | "version": 1 17 | } -------------------------------------------------------------------------------- /examples/common/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "--- create table person" 4 | dfx canister call backend execute 'create table person ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER, gender INTEGER )' 5 | 6 | echo "--- create person name index" 7 | dfx canister call backend execute 'create index name on person(name)' 8 | 9 | echo "--- insert person" 10 | dfx canister call backend execute 'insert into person (name, age, gender) values ("a", 15, 0);' 11 | dfx canister call backend execute 'insert into person (name, age, gender) values ("b", 16, 1);' 12 | dfx canister call backend execute 'insert into person (name, age, gender) values ("c", 17, 0);' 13 | 14 | echo "--- query person" 15 | dfx canister call backend query 'select * from person limit 10' 16 | 17 | echo "--- delete person with name=a" 18 | dfx canister call backend execute 'delete from person where name="a"' 19 | 20 | echo "--- update person with name=b" 21 | dfx canister call backend execute 'update person set name="abc" where name="b"' 22 | 23 | echo "--- query person" 24 | dfx canister call backend query 'select * from person limit 10' -------------------------------------------------------------------------------- /examples/common/src/lib.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate ic_cdk_macros; 3 | #[macro_use] 4 | extern crate serde; 5 | 6 | use ic_cdk::api::call::RejectionCode; 7 | use candid::CandidType; 8 | use rusqlite::types::Type; 9 | 10 | #[query] 11 | fn balance() -> u64 { 12 | ic_cdk::api::canister_balance() 13 | } 14 | 15 | #[query] 16 | fn instruction_counter() -> u64 { 17 | ic_cdk::api::instruction_counter() 18 | } 19 | 20 | #[update] 21 | fn execute(sql: String) -> Result { 22 | let conn = ic_sqlite::CONN.lock().unwrap(); 23 | return match conn.execute( 24 | &sql, 25 | [] 26 | ) { 27 | Ok(e) => Ok(format!("{:?}", e)), 28 | Err(err) => Err(Error::CanisterError {message: format!("{:?}", err) }) 29 | } 30 | } 31 | 32 | #[query] 33 | fn query(sql: String) -> QueryResult { 34 | let conn = ic_sqlite::CONN.lock().unwrap(); 35 | let mut stmt = conn.prepare(&sql).unwrap(); 36 | let cnt = stmt.column_count(); 37 | let mut rows = stmt.query([]).unwrap(); 38 | let mut res: Vec> = Vec::new(); 39 | loop { 40 | match rows.next() { 41 | Ok(row) => { 42 | match row { 43 | Some(row) => { 44 | let mut vec: Vec = Vec::new(); 45 | for idx in 0..cnt { 46 | let v = row.get_ref_unwrap(idx); 47 | match v.data_type() { 48 | Type::Null => { vec.push(String::from("")) } 49 | Type::Integer => { vec.push(v.as_i64().unwrap().to_string()) } 50 | Type::Real => { vec.push(v.as_f64().unwrap().to_string()) } 51 | Type::Text => { vec.push(v.as_str().unwrap().parse().unwrap()) } 52 | Type::Blob => { vec.push(hex::encode(v.as_blob().unwrap())) } 53 | } 54 | } 55 | res.push(vec) 56 | }, 57 | None => break 58 | } 59 | }, 60 | Err(err) => return Err(Error::CanisterError {message: format!("{:?}", err) }) 61 | } 62 | } 63 | Ok(res) 64 | } 65 | 66 | #[derive(CandidType, Deserialize)] 67 | enum Error { 68 | InvalidCanister, 69 | CanisterError { message: String }, 70 | } 71 | 72 | type Result = std::result::Result; 73 | 74 | type QueryResult>, E = Error> = std::result::Result; 75 | 76 | impl From<(RejectionCode, String)> for Error { 77 | fn from((code, message): (RejectionCode, String)) -> Self { 78 | match code { 79 | RejectionCode::CanisterError => Self::CanisterError { message }, 80 | _ => Self::InvalidCanister, 81 | } 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /examples/static/actions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/froghub-io/ic-sqlite/4efd51e47b16f115e4dfad721a0778a8b287c7e9/examples/static/actions.png -------------------------------------------------------------------------------- /examples/static/deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/froghub-io/ic-sqlite/4efd51e47b16f115e4dfad721a0778a8b287c7e9/examples/static/deploy.png -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod vfs; 2 | 3 | use std::sync::{Mutex, Arc}; 4 | use lazy_static::lazy_static; 5 | use rusqlite::{Connection, OpenFlags}; 6 | use sqlite_vfs::register; 7 | use ic_cdk::api::stable::{stable64_size, stable64_grow, StableMemoryError}; 8 | 9 | lazy_static! { 10 | pub static ref CONN: Arc> = { 11 | register("vfs", vfs::PagesVfs::default(), true).unwrap(); 12 | let conn = Connection::open_with_flags_and_vfs( 13 | "main.db", 14 | OpenFlags::SQLITE_OPEN_READ_WRITE 15 | | OpenFlags::SQLITE_OPEN_CREATE 16 | | OpenFlags::SQLITE_OPEN_NO_MUTEX, 17 | "vfs", 18 | ).unwrap(); 19 | conn.execute_batch( 20 | r#" 21 | PRAGMA page_size=4096; 22 | PRAGMA journal_mode=MEMORY; 23 | "#, 24 | ).unwrap(); 25 | 26 | return Arc::new(Mutex::new(conn)); 27 | }; 28 | } 29 | 30 | const WASM_PAGE_SIZE_IN_BYTES: u64 = 64 * 1024; // 64KB 31 | 32 | /// Gets capacity of the stable memory in bytes. 33 | pub fn stable_capacity() -> u64 { 34 | stable64_size() << 16 35 | } 36 | 37 | /// Attempts to grow the memory by adding new pages. 38 | pub fn stable_grow_bytes(size: u64) -> Result { 39 | let added_pages = (size as f64 / WASM_PAGE_SIZE_IN_BYTES as f64).ceil() as u64; 40 | stable64_grow(added_pages) 41 | } -------------------------------------------------------------------------------- /src/vfs.rs: -------------------------------------------------------------------------------- 1 | use std::io::{self, ErrorKind}; 2 | use std::sync::{Arc, Mutex}; 3 | use std::time::{Duration, Instant}; 4 | use ic_cdk::api::stable::{stable64_read, stable64_size, stable64_write}; 5 | 6 | use sqlite_vfs::{LockKind, OpenKind, OpenOptions, Vfs}; 7 | use crate::{stable_capacity, stable_grow_bytes}; 8 | 9 | const SQLITE_SIZE_IN_BYTES: u64 = 8; // 8 byte 10 | 11 | #[derive(Default)] 12 | pub struct PagesVfs { 13 | lock_state: Arc>, 14 | } 15 | 16 | #[derive(Debug, Default)] 17 | struct LockState { 18 | read: usize, 19 | write: Option, 20 | } 21 | 22 | pub struct Connection { 23 | lock_state: Arc>, 24 | lock: LockKind, 25 | } 26 | 27 | impl Vfs for PagesVfs { 28 | type Handle = Connection; 29 | 30 | fn open(&self, db: &str, opts: OpenOptions) -> Result { 31 | // Always open the same database for now. 32 | if db != "main.db" { 33 | return Err(io::Error::new( 34 | ErrorKind::NotFound, 35 | format!("unexpected database name `{}`; expected `main.db`", db), 36 | )); 37 | } 38 | // Only main databases supported right now (no journal, wal, temporary, ...) 39 | if opts.kind != OpenKind::MainDb { 40 | return Err(io::Error::new( 41 | ErrorKind::PermissionDenied, 42 | "only main database supported right now (no journal, wal, ...)", 43 | )); 44 | } 45 | 46 | Ok(Connection { 47 | lock_state: self.lock_state.clone(), 48 | lock: LockKind::None, 49 | }) 50 | } 51 | 52 | fn delete(&self, _db: &str) -> Result<(), io::Error> { 53 | Ok(()) 54 | } 55 | 56 | fn exists(&self, db: &str) -> Result { 57 | Ok(db == "main.db" && Connection::size() > 0) 58 | } 59 | 60 | fn temporary_name(&self) -> String { 61 | String::from("main.db") 62 | } 63 | 64 | fn random(&self, buffer: &mut [i8]) { 65 | let mut rng = rusqlite::ffi::Rand::new(); 66 | rng.fill_i8(buffer); 67 | } 68 | 69 | fn sleep(&self, duration: Duration) -> Duration { 70 | let now = Instant::now(); 71 | conn_sleep((duration.as_millis() as u32).max(1)); 72 | now.elapsed() 73 | } 74 | } 75 | 76 | impl sqlite_vfs::DatabaseHandle for Connection { 77 | type WalIndex = sqlite_vfs::WalDisabled; 78 | 79 | fn size(&self) -> Result { 80 | Ok(Self::size()) 81 | } 82 | 83 | fn read_exact_at(&mut self, buf: &mut [u8], offset: u64) -> Result<(), io::Error> { 84 | if stable64_size() > 0 { 85 | stable64_read(offset + SQLITE_SIZE_IN_BYTES, buf); 86 | } 87 | Ok(()) 88 | } 89 | 90 | fn write_all_at(&mut self, buf: &[u8], offset: u64) -> Result<(), io::Error> { 91 | let size = offset + buf.len() as u64; 92 | if size > Self::size() { 93 | stable64_write(0, &size.to_be_bytes()); 94 | } 95 | stable64_write(offset + SQLITE_SIZE_IN_BYTES, buf); 96 | Ok(()) 97 | } 98 | 99 | fn sync(&mut self, _data_only: bool) -> Result<(), io::Error> { 100 | // Everything is directly written to storage, so no extra steps necessary to sync. 101 | Ok(()) 102 | } 103 | 104 | fn set_len(&mut self, size: u64) -> Result<(), io::Error> { 105 | let capacity = if stable64_size() == 0 { 0 } else { stable_capacity() - SQLITE_SIZE_IN_BYTES }; 106 | if size > capacity { 107 | stable_grow_bytes(size - capacity).map_err(|err| { 108 | io::Error::new( 109 | ErrorKind::OutOfMemory, 110 | err, 111 | ) 112 | })?; 113 | stable64_write(0, &size.to_be_bytes()); 114 | } 115 | Ok(()) 116 | } 117 | 118 | fn lock(&mut self, lock: LockKind) -> Result { 119 | let ok = Self::lock(self, lock); 120 | Ok(ok) 121 | } 122 | 123 | fn reserved(&mut self) -> Result { 124 | Ok(Self::reserved(self)) 125 | } 126 | 127 | fn current_lock(&self) -> Result { 128 | Ok(self.lock) 129 | } 130 | 131 | fn wal_index(&self, _readonly: bool) -> Result { 132 | Ok(sqlite_vfs::WalDisabled::default()) 133 | } 134 | } 135 | 136 | impl Connection { 137 | fn size() -> u64 { 138 | if stable64_size() == 0 { 139 | return 0; 140 | } 141 | let mut buf = [0u8; SQLITE_SIZE_IN_BYTES as usize]; 142 | stable64_read(0, &mut buf); 143 | u64::from_be_bytes(buf) 144 | } 145 | 146 | fn lock(&mut self, to: LockKind) -> bool { 147 | if self.lock == to { 148 | return true; 149 | } 150 | 151 | let mut lock_state = self.lock_state.lock().unwrap(); 152 | 153 | match to { 154 | LockKind::None => { 155 | if self.lock == LockKind::Shared { 156 | lock_state.read -= 1; 157 | } else if self.lock > LockKind::Shared { 158 | lock_state.write = None; 159 | } 160 | self.lock = LockKind::None; 161 | true 162 | } 163 | 164 | LockKind::Shared => { 165 | if lock_state.write == Some(true) && self.lock <= LockKind::Shared { 166 | return false; 167 | } 168 | 169 | lock_state.read += 1; 170 | if self.lock > LockKind::Shared { 171 | lock_state.write = None; 172 | } 173 | self.lock = LockKind::Shared; 174 | true 175 | } 176 | 177 | LockKind::Reserved => { 178 | if lock_state.write.is_some() || self.lock != LockKind::Shared { 179 | return false; 180 | } 181 | 182 | if self.lock == LockKind::Shared { 183 | lock_state.read -= 1; 184 | } 185 | lock_state.write = Some(false); 186 | self.lock = LockKind::Reserved; 187 | true 188 | } 189 | 190 | LockKind::Pending => { 191 | // cannot be requested directly 192 | false 193 | } 194 | 195 | LockKind::Exclusive => { 196 | if lock_state.write.is_some() && self.lock <= LockKind::Shared { 197 | return false; 198 | } 199 | 200 | if self.lock == LockKind::Shared { 201 | lock_state.read -= 1; 202 | } 203 | 204 | lock_state.write = Some(true); 205 | if lock_state.read == 0 { 206 | self.lock = LockKind::Exclusive; 207 | true 208 | } else { 209 | self.lock = LockKind::Pending; 210 | false 211 | } 212 | } 213 | } 214 | } 215 | 216 | fn reserved(&self) -> bool { 217 | if self.lock > LockKind::Shared { 218 | return true; 219 | } 220 | 221 | let lock_state = self.lock_state.lock().unwrap(); 222 | lock_state.write.is_some() 223 | } 224 | } 225 | 226 | impl Drop for Connection { 227 | fn drop(&mut self) { 228 | if self.lock != LockKind::None { 229 | self.lock(LockKind::None); 230 | } 231 | } 232 | } 233 | 234 | fn conn_sleep(ms: u32) { 235 | std::thread::sleep(Duration::from_secs(ms.into())); 236 | } 237 | --------------------------------------------------------------------------------