欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EOSIO 升级数据表结构

程序员文章站 2022-05-30 23:18:12
...
#include <eosiolib/eosio.hpp>
#include <eosiolib/transaction.hpp>
#include <eosiolib/datastream.hpp>
using namespace eosio;

class hello : public eosio::contract
{
 public:
   using contract::contract;

   /// @abi action
   void hi(account_name user)
   {
      print("Hello, ", name{user});
   }

   /// @abi action
   void addstu(int64_t id)
   {
      students t(_self, _self);
      auto existing = t.find(id);
      eosio_assert(existing == t.end(), "id already exists");
      t.emplace(_self, [&](auto &r) {
         r.id = id;
      });
   }

   /// @abi action
   void update(std::string name)
   {
      students t(_self, _self);
      auto r = t.begin();
      if (r == t.end())
      {
         return; // 所有记录都已经更新完毕
      }

      students2 t2(_self, _self);
      auto existing = t2.find(r->id);
      if (existing == t2.end())
      {
         t2.emplace(_self, [&](auto &r2) {
            r2.id = r->id;
            r2.name = name;
         });
      }

      auto id = r->id; // 构造有效的id

      t.erase(r); // 删除对应的记录

      transaction trx; // 构造新的 trx
      trx.actions.emplace_back(std::move(action{permission_level{_self, N(active)}, _self, eosio::string_to_name("update"), std::tuple<std::string>{name}}));

      constexpr size_t max_stack_buffer_size = 512;
      size_t size = pack_size(trx);
      char *buff = (char *)(size < max_stack_buffer_size ? malloc(size) : alloca(size));
      datastream<const char *> ds(buff, size);
      ds << trx;

      send_deferred((uint128_t(id) << 64) | id, _self, buff, size); // 更新下一条记录
   }

 private:
   /// @abi table student i64
   struct student
   {
      int64_t id;

      auto primary_key() const { return id; }
   };

   /// @abi table student2 i64
   struct student2
   {
      int64_t id;
      std::string name;
      auto primary_key() const { return id; }
   };

   typedef eosio::multi_index<N(student), student> students;
   typedef eosio::multi_index<N(student2), student2> students2;
};

EOSIO_ABI(hello, (hi)(addstu)(update))

转载于:https://www.jianshu.com/p/c33d7123ca24