Overview
This how-to provides instructions to upsert into Key-Value Map
(kv map
). Upsert means insert when the item doesn't already exist, and update the item if it already exists in the map.
Before you begin
Make sure you have the following prerequisites in place:
- An EOSIO development environment, for details consult the Get Started Guide
- A smart contract named
smrtcontract
- A user defined type,
struct
orclass
, which defines the data stored in the map, namedperson
- A
kv map
object, namemy_map
, which stores objects of typeperson
, with unique keys of typeint
Refer to the following reference implementation for your starting point:
smartcontract.hpp file
struct person {
eosio::name account_name;
std::string first_name;
std::string last_name;
};
class [[eosio::contract]] smartcontract : public eosio::contract {
using my_map_t = eosio::kv::map<"kvmap"_n, int, person>;
public:
using contract::contract;
smartcontract(eosio::name receiver, eosio::name code, eosio::datastream<const char*> ds)
: contract(receiver, code, ds) {}
private:
my_map_t my_map{};
};
Procedure
Complete the following steps to insert a new person
object with a given ID, if it doesn't exist already, or update it in the kv map
if the person
with the given ID already exists:
- Create a new action in your contract, named
upsert
, which takes as input parameters the personid
, anaccount_name
, afirst_name
and alast_name
. - Create an instance of the
person
class, namedperson_upsert
, based on the input parameters:account_name
,first_name
andlast_name
. - Use the
[]
operator defined for thekv::map
type, and set the newly createdperson_upsert
object as the value for theid
key.
Refer to the following reference implementation to insert a new person
object, and then update it, in the kv map
:
smartcontract.hpp file
struct person {
eosio::name account_name;
std::string first_name;
std::string last_name;
};
class [[eosio::contract]] smartcontract : public eosio::contract {
using my_map_t = eosio::kv::map<"kvmap"_n, int, person>;
public:
using contract::contract;
smartcontract(eosio::name receiver, eosio::name code, eosio::datastream<const char*> ds)
: contract(receiver, code, ds) {}
// inserts a person if not exists, or updates it if already exists.
// the payer for the resources consumed is the account that created the kv::map
// object in the first place, the account that owns this smart contract.
[[eosio::action]]
void upsert(int id,
eosio::name account_name,
std::string first_name,
std::string last_name);
private:
my_map_t my_map{};
};
smartcontract.cpp file
// inserts if not exists, or updates if already exists, a person
[[eosio::action]]
void smartcontract::upsert(
int id,
eosio::name account_name,
std::string first_name,
std::string last_name) {
// create the person object which will be stored in kv::map
const person& person_upsert = person{
account_name = account_name,
first_name = first_name,
last_name = last_name};
// upsert into kv::map
my_map[id] = person_upsert;
}
Summary
In conclusion, the above instructions show how to upsert into Key-Value Map
(kv map
).