テーブルコントラクト
これは、Table 上の Solidity スマート コントラクトです。このスマート コントラクトは、表形式のデータの作成、操作、および管理に使用できるいくつかの重要なエンティティとメソッドを定義します。
1 つ目は、テーブルを作成して開くために使用されるTableFactory
コントラクト。を含む:
openTable(string)
このメソッドは、既存のフォームを開き、フォーム インスタンスを返すために使用されます。Table
createTable(string, string, string)
このメソッドは、新しいテーブルを作成するために使用され、テーブル名、主キー名、ストレージ エンジン タイプの 3 つのパラメーターを渡す必要があります。
次に、クエリ条件を設定するためのCondition
コントラクト。を含む:
- 等しい (等しい)
- 等しくない (等しくない)
- より大きい (より大きい)
- 以上 (以上)
- 未満 (未満)
- 以下 (Less or Equal)
- 返されるレコードの数を制限する (制限)
次に、テーブル内のデータ レコードの行を表すEntry
コントラクト。整数、符号なし整数、アドレス、文字列など、さまざまなタイプのデータ値を取得および設定するメソッドを提供します。
最後に、次のメソッドを含むTable
コントラクト:
select(string, Condition)
このメソッドは、クエリ条件に従ってテーブル内のデータ レコードを選択するために使用されます。insert(string, Entry)
このメソッドは、新しいデータ レコードをテーブルに挿入するために使用されます。update(string, Entry, Condition)
このメソッドは、指定されたクエリ条件に従ってテーブル内のデータ レコードを更新するために使用されます。remove(string, Condition)
このメソッドは、指定されたクエリ条件に従ってテーブル内のデータ レコードを削除するために使用されます。newEntry()
新しいデータ レコード インスタンスの作成に使用されるメソッドnewCondition()
メソッドは、新しいクエリ条件インスタンスを作成するために使用されます
KVTableFactory
キー値テーブルを作成して開くための契約もあります。を含む:
openTable(string)
このメソッドは、既存のキー値テーブルを開き、テーブル インスタンスを返すために使用されます。KVTable
createTable(string, string, string)
このメソッドは、新しいキー値テーブルを作成するために使用され、テーブル名、主キー名、ストレージ エンジン タイプの 3 つのパラメーターを渡す必要があります。
最後はKVTable
コントラクト、キー値テーブルのデータ レコードの行を表します。キーと値のペアのデータを取得および設定するためのメソッドを提供します。ここで、キーは string 型で、値は 型ですEntry
。
pragma solidity ^0.4.24;
contract TableFactory {
function openTable(string) public view returns (Table); //open table
function createTable(string, string, string) public returns (int256); //create table
}
//select condition
contract Condition {
function EQ(string, int256) public view;
function EQ(string, string) public view;
function EQ(string, address) public view;
function NE(string, int256) public view;
function NE(string, string) public view;
function GT(string, int256) public view;
function GE(string, int256) public view;
function LT(string, int256) public view;
function LE(string, int256) public view;
function limit(int256) public view;
function limit(int256, int256) public view;
}
//one record
contract Entry {
function getInt(string) public view returns (int256);
function getUInt(string) public view returns (uint256);
function getAddress(string) public view returns (address);
function getBytes64(string) public view returns (bytes1[64]);
function getBytes32(string) public view returns (bytes32);
function getString(string) public view returns (string);
function set(string, int256) public;
function set(string, uint256) public;
function set(string, string) public;
function set(string, address) public;
}
//record sets
contract Entries {
function get(int256) public view returns (Entry);
function size() public view returns (int256);
}
//Table main contract
contract Table {
function select(string, Condition) public view returns (Entries);
function insert(string, Entry) public returns (int256);
function update(string, Entry, Condition) public returns (int256);
function remove(string, Condition) public returns (int256);
function newEntry() public view returns (Entry);
function newCondition() public view returns (Condition);
}
contract KVTableFactory {
function openTable(string) public view returns (KVTable);
function createTable(string, string, string) public returns (int256);
}
//KVTable per permiary key has only one Entry
contract KVTable {
function get(string) public view returns (bool, Entry);
function set(string, Entry) public returns (int256);
function newEntry() public view returns (Entry);
}
Write Table コントラクト ツール クラス
Solidity 言語で記述されたツール クラスは、指定されたTable
コントラクト。これには、テーブル内のデータに対する CRUD 操作が含まれます。
ユーティリティ クラスには、次のメソッドが含まれています。
constructor
: ツール クラス インスタンスの初期化に使用されるコンストラクターは、TableFactory
インスタンス。テーブル名と主キー名でテーブル インスタンスを開きます。createTable
: 新しいテーブルを作成し、現在のデータベースに新しいテーブルを作成します。ストレージ エンジンの種類を渡し、新しく作成されたテーブルの ID を返す必要があります。selectByID
: 指定された主キー ID に従ってテーブル データをクエリし、クエリ結果のデータ レコードの最初の行を返します。selectByCondition
: 指定されたクエリ条件に従ってテーブル データをクエリし、条件を満たすすべてのデータ レコードを返します。insertEntry
注: テーブルに新しいデータ レコードを挿入するには、データ レコード インスタンスを渡し、新しく追加されたレコードの ID を返す必要があります。updateByID
: 指定された主キー ID に従ってテーブル内のデータ レコードを更新します。更新するデータ レコード インスタンスを渡す必要があり、影響を受けるレコードの数を返します。removeByID
: 指定された主キー ID に従ってテーブル内のデータ レコードを削除し、影響を受けたレコードの数を返します。
メソッドを呼び出す前に、正しいテーブル インスタンスが開かれており、正しいテーブル名と主キー名が渡されていることを確認する必要があることに注意してください。
pragma solidity ^0.8.0;
import "./Table.sol";
contract TableUtils {
TableFactory private tableFactory;
Table private table;
string private tableName;
string private primaryKey;
// 构造函数,用于初始化工具类实例
constructor(TableFactory factory, string memory name, string memory key) {
tableFactory = factory;
tableName = name;
primaryKey = key;
// 打开表格实例
table = tableFactory.openTable(tableName);
}
// 获取当前打开的表格实例
function getTable() external view returns (Table) {
return table;
}
// 在当前数据库中创建一张新表格
function createTable(string memory engineType) external returns (int256) {
return tableFactory.createTable(tableName, primaryKey, engineType);
}
// 根据给定的主键 ID 查询表格数据,返回查询结果的第一行数据记录
function selectByID(int256 id) external view returns (Entry memory) {
Condition condition = table.newCondition();
condition.EQ(primaryKey, id);
Entries entries = table.select("", condition);
require(entries.size() == 1, "Record not found");
return entries.get(0);
}
// 根据给定的查询条件查询表格数据,返回符合条件的所有数据记录
function selectByCondition(Condition condition) external view returns (Entries memory) {
return table.select("", condition);
}
// 向表格中插入一条新的数据记录,需要传入数据记录实例,返回新增记录的 ID
function insertEntry(Entry memory entry) external returns (int256) {
return table.insert("", entry);
}
// 根据给定的主键 ID 更新表格中的数据记录,需要传入需要更新的数据记录实例,返回影响的记录数
function updateByID(int256 id, Entry memory entry) external returns (int256) {
Condition condition = table.newCondition();
condition.EQ(primaryKey, id);
return table.update("", entry, condition);
}
// 根据给定的主键 ID 删除表格中的数据记录,返回影响的记录数
function removeByID(int256 id) external returns (int256) {
Condition condition = table.newCondition();
condition.EQ(primaryKey, id);
return table.remove("", condition);
}
}
TableUtils の使用
TableUtils
ユーティリティクラスを使用した例。まず、コントラクトでインスタンス化し、正しいパラメーターを渡す必要があります。
pragma solidity ^0.8.0;
import "./TableFactory.sol";
import "./TableUtils.sol";
contract MyContract {
TableFactory private tableFactory;
TableUtils private utils;
// 构造函数,用于初始化合约实例和工具类实例
constructor(TableFactory factory) {
tableFactory = factory;
utils = new TableUtils(tableFactory, "my_table", "id");
}
// 创建新表格,并返回新建表的 ID
function createTable() external returns (int256) {
return utils.createTable("BASIC");
}
// 向表格中插入一条新的数据记录,并返回新增记录的 ID
function insertData(string memory name, uint256 value) external returns (int256) {
Entry memory entry = utils.getTable().newEntry();
entry.set("name", name);
entry.set("value", int256(value));
return utils.insertEntry(entry);
}
// 根据给定的主键 ID 更新表格中的数据记录,需要传入需要更新的数据记录实例,返回影响的记录数
function updateData(int256 id, string memory name, uint256 value) external returns (int256) {
Entry memory entry = utils.getTable().newEntry();
entry.set("name", name);
entry.set("value", int256(value));
return utils.updateByID(id, entry);
}
// 根据给定的主键 ID 删除表格中的数据记录,返回影响的记录数
function removeData(int256 id) external returns (int256) {
return utils.removeByID(id);
}
// 根据给定的主键 ID 查询表格中的数据记录,并返回查询结果
function getDataByID(int256 id) external view returns (string memory, uint256) {
Entry memory entry = utils.selectByID(id);
return (entry.getString("name"), uint256(entry.getInt("value")));
}
// 根据给定的查询条件查询表格中的数据记录,并返回查询结果
function getDataByCondition() external view returns (string[] memory, uint256[] memory) {
Condition condition = utils.getTable().newCondition();
Entries entries = utils.selectByCondition(condition);
string[] memory names = new string[](uint256(entries.size()));
uint256[] memory values = new uint256[](uint256(entries.size()));
for (int256 i = 0; i < entries.size(); i++) {
Entry memory entry = entries.get(i);
names[uint256(i)] = entry.getString("name");
values[uint256(i)] = uint256(entry.getInt("value"));
}
return (names, values);
}
}
この例では、最初にMyContract
という、コンストラクターで初期化し、TableFactory
のインスタンスを渡します。次に、このファクトリ インスタンスでmy_table
という名前の、 という名前の主キーを指定しますid
。
次に、表形式のデータに対して CRUD 操作を実行するためのメソッドがいくつか定義されています。たとえば、insertData
メソッドは新しいデータ レコードをテーブルに挿入し、新しく追加されたデータの ID を返すことができます。getDataByID
メソッドは、指定された主キー ID に従ってテーブル内のデータ レコードをクエリし、クエリ結果を返すことができます。
テーブル データの操作に関連するすべてのメソッドは、TableUtils
ツール。各方法では、最初に正しいテーブル インスタンスを取得し、必要に応じてデータ レコード インスタンスを作成、設定、および読み取る必要があります。最後に、データ レコード インスタンスをパラメーターとして使用して、データ操作用の対応するメソッドを呼び出します。