#include <eosiolib/eosio.hpp>
using namespace eosio;
class [[eosio::contract("addressbook")]] addressbook : public eosio::contract {
public:
using contract::contract;
addressbook(name receiver, name code, datastream<const char*> ds): contract(receiver, code, ds) {}
[[eosio::action]]
void upsert(name user, uint64_t id, std::string name, std::string x, std::string y) {
address_index addresses(_code, _code.value);
auto iterator = addresses.find(id);
if( iterator == addresses.end() )
{
addresses.emplace(user, [&]( auto& row ) {
row.id = id;
row.name = name;
row.x = x;
row.y = y;
});
}
}
private:
struct [[eosio::table]] names {
uint64_t id;
std::string name;
std::string x;
std::string y;
uint64_t primary_key() const { return id; }
};
typedef eosio::multi_index<"names"_n, names> address_index;
};
EOSIO_DISPATCH( addressbook, (upsert))
How do I search by name instead of id so I know when to create a new row? How can I make id autoincrement instead of a parameter?
EDIT:
bool found = false;
for(auto itr = addresses.begin(); itr != addresses.end() && found!=true;) {
if(itr->did == did) {
found = true;
}
}
if(found == false) {
addresses.emplace(user, [&]( auto& row ) {
row.id = addresses.available_primary_key();
row.did = did;
row.x = x;
row.y = y;
});
}