Primary Index
Overview
This guide provides instructions to define a primary index for a multi-index table.
Procedure
Complete the following steps to define a primary index for the multi-index table datatable
.
1. Preparation And Initialization
Include the inery.hpp
header and use the using
directive to access the inery
namespace.
#include <inery/inery.hpp>
using namespace inery;
2. Define The Table Data Structure
Define the data structure for the multi-index table.
struct [[inery::table]] data_structure {
};
Add the data structure data members. Each data member corresponds to a field of the multi-index table. A primary key is required when defining a multi-index table structure, therefore you need to know which is the multi-index table field that is the primary key for your multi-index table. The corresponding data member for the primary key field must store unique values. In this case it is the test_primary
data member of type inery::name
.
// the data structure which defines each row of the table
struct [[inery::table]] data_structure {
+ // this data member stores a name for each row of the multi-index table
+ name test_primary;
+ // additional data stored in table row, e.g. an uint64_t type data
+ uint64_t datum;
};
3. Define The Primary Index
Add the definition of the primary index for the multi-index table. The primary index type must be uint64_t, it must be unique and must be named primary_key()
, otherwise the compiler (inery-cpp) will generate an error saying it can not find the field to use as the primary key:
// the data structure which defines each row of the table
struct [[inery::table]] data_structure {
// this data member stores a name for each row of the multi-index table
name test_primary;
// additional data stored in table row
uint64_t datum;
+ // mandatory definition for primary key getter
+ uint64_t primary_key( ) const { return test_primary.value; }
};
Secondary indexes may be defined which are not unique. There can be up to 16 secondary indexes. Secondary indices support the following types:
- uint64_t
- uint128_t
- uint256_t
- double
- long double
4. Using A Multi-Index Type Alias
For ease of use, define a type alias data_structure_t
based on the inery::multi_index
template type, parametarized with a random name "datatable"
and the data_structure
data structure. The names must adhere to INERY
account name restrictions.
// the data structure which defines each row of the table
struct [[inery::table]] data_structure {
// this data member stores a name for each row of the multi-index table
name test_primary;
// additional data stored in table row
uint64_t datum;
// mandatory definition for primary key getter
uint64_t primary_key( ) const { return test_primary.value; }
};
+ typedef inery::multi_index<"datatable"_n, data_structure> data_structure_t;
5. Instantiate The Multi-Index Table
Declare the datatable
multi-index table as a data member of type data_structure_t
.
// the data structure which defines each row of the table
struct [[inery::table]] data_structure {
// this data member stores a name for each row of the multi-index table
name test_primary;
// additional data stored in table row
uint64_t datum;
// mandatory definition for primary key getter
uint64_t primary_key( ) const { return test_primary.value; }
};
typedef inery::multi_index<"datatable"_n, data_structure> data_structure_t;
+ data_structure_t datatable;
Now you have instantiated a multi-index table, and assigned to datatable
variable, which has a primary index defined for its test_primary
data member.
Summary
In conclusion, the above instructions show how to define a primary index for a multi-index table.