Skip to content

Commit 3545b44

Browse files
check KVTable and sync some minor diff from dev
1 parent 45bdcc8 commit 3545b44

6 files changed

Lines changed: 238 additions & 91 deletions

File tree

bcos3sdk/bcos3callbackfuture.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class BcosCallbackFuture:
2020

2121

2222
def __init__(self, context_name=None, context_msg=None):
23-
self.response_queue = queue.Queue(100)
23+
self.response_queue = queue.Queue(1)
2424
if context_name is not None or context_msg is not None:
2525
self.context = BcosReqContext(self.next_seq(), context_name, context_msg)
2626

@@ -40,7 +40,8 @@ def is_empty(self):
4040
def bcos_callback(self, c_resp):
4141
if c_resp is None:
4242
return
43-
# print("bcos_callback-->",resp)
43+
# print("bcos_callback-->",c_resp)
44+
4445
resp = BcosResponse(c_resp)
4546

4647
#if(resp.context is not None):

bcos3sdk/bcos3datadef.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,22 @@ def __init__(self, c_resp):
4444
def extract_response(self, c_resp):
4545
if c_resp == None:
4646
return
47+
#print("1)extract_response:",c_resp.contents.get_size())
4748
self.size = c_resp.contents.get_size()
4849
pool = create_string_buffer(c_resp.contents.size)
4950
memmove(pool, c_resp.contents.data, c_resp.contents.size)
51+
#print("2)after memmove:",pool)
5052
self.data = b2s(pool.value)
53+
#print("2-1)data:", self.data)
5154
self.error = c_resp.contents.get_error()
55+
#print("3)error:", self.error)
5256
if self.error != 0:
5357
self.desc = b2s(c_resp.contents.desc)
5458
else:
5559
self.desc = ""
60+
#print("4)desc:", self.desc)
5661
self.context = c_resp.contents.get_context()
62+
#print("5)context:", self.context)
5763
return self
5864

5965
def detail(self):

contracts/KVTableTest.sol

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,49 @@
1-
pragma solidity ^0.4.24;
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity >=0.6.10 <0.8.20;
3+
pragma experimental ABIEncoderV2;
4+
25
import "./Table.sol";
36

47
contract KVTableTest {
5-
event SetResult(int256 count);
68

7-
KVTableFactory tableFactory;
8-
string constant TABLE_NAME = "t_kvtest";
9+
TableManager tm;
10+
KVTable table;
11+
string constant tableName = "t_kv_test";
12+
event SetEvent(int256 count);
13+
constructor () public{
14+
tm = TableManager(address(0x1002));
15+
16+
// create table
17+
tm.createKVTable(tableName, "id", "item_name");
18+
19+
// get table address
20+
address t_address = tm.openTable(tableName);
21+
table = KVTable(t_address);
22+
}
923

10-
constructor() public {
11-
//The fixed address is 0x1010 for KVTableFactory
12-
tableFactory = KVTableFactory(0x1010);
13-
// the parameters of createTable are tableName,keyField,"vlaueFiled1,vlaueFiled2,vlaueFiled3,..."
14-
tableFactory.createTable(TABLE_NAME, "id", "item_price,item_name");
24+
function desc() public view returns(string memory, string memory){
25+
TableInfo memory tf = tm.desc(tableName);
26+
return (tf.keyColumn, tf.valueColumns[0]);
1527
}
1628

17-
//get record
18-
function get(string id) public view returns (bool, int256, string) {
19-
KVTable table = tableFactory.openTable(TABLE_NAME);
29+
function get(string memory id) public view returns (bool, string memory) {
2030
bool ok = false;
21-
Entry entry;
22-
(ok, entry) = table.get(id);
23-
int256 item_price;
24-
string memory item_name;
25-
if (ok) {
26-
item_price = entry.getInt("item_price");
27-
item_name = entry.getString("item_name");
28-
}
29-
return (ok, item_price, item_name);
31+
string memory value;
32+
(ok, value) = table.get(id);
33+
return (ok, value);
3034
}
3135

32-
//set record
33-
function set(string id, int256 item_price, string item_name)
34-
public
35-
returns (int256)
36+
function set(string memory id, string memory item_name)
37+
public
38+
returns (int32)
3639
{
37-
KVTable table = tableFactory.openTable(TABLE_NAME);
38-
Entry entry = table.newEntry();
39-
// the length of entry's field value should < 16MB
40-
entry.set("id", id);
41-
entry.set("item_price", item_price);
42-
entry.set("item_name", item_name);
43-
// the first parameter length of set should <= 255B
44-
int256 count = table.set(id, entry);
45-
emit SetResult(count);
46-
return count;
40+
int32 result = table.set(id,item_name);
41+
emit SetEvent(result);
42+
return result;
43+
}
44+
45+
function createKVTableTest(string memory _tableName,string memory keyName,string memory fieldName) public returns(int32){
46+
int32 result = tm.createKVTable(_tableName, keyName, fieldName);
47+
return result;
4748
}
48-
}
49+
}

contracts/KVTableTest20.sol

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
pragma solidity ^0.4.24;
2+
import "./Table20.sol";
3+
4+
contract KVTableTest20 {
5+
event SetResult(int256 count);
6+
7+
KVTableFactory tableFactory;
8+
string constant TABLE_NAME = "t_kvtest";
9+
10+
constructor() public {
11+
//The fixed address is 0x1010 for KVTableFactory
12+
tableFactory = KVTableFactory20(0x1010);
13+
// the parameters of createTable are tableName,keyField,"vlaueFiled1,vlaueFiled2,vlaueFiled3,..."
14+
tableFactory.createTable(TABLE_NAME, "id", "item_price,item_name");
15+
}
16+
17+
//get record
18+
function get(string id) public view returns (bool, int256, string) {
19+
KVTable table = tableFactory.openTable(TABLE_NAME);
20+
bool ok = false;
21+
Entry entry;
22+
(ok, entry) = table.get(id);
23+
int256 item_price;
24+
string memory item_name;
25+
if (ok) {
26+
item_price = entry.getInt("item_price");
27+
item_name = entry.getString("item_name");
28+
}
29+
return (ok, item_price, item_name);
30+
}
31+
32+
//set record
33+
function set(string id, int256 item_price, string item_name)
34+
public
35+
returns (int256)
36+
{
37+
KVTable table = tableFactory.openTable(TABLE_NAME);
38+
Entry entry = table.newEntry();
39+
// the length of entry's field value should < 16MB
40+
entry.set("id", id);
41+
entry.set("item_price", item_price);
42+
entry.set("item_name", item_name);
43+
// the first parameter length of set should <= 255B
44+
int256 count = table.set(id, entry);
45+
emit SetResult(count);
46+
return count;
47+
}
48+
}

contracts/Table.sol

Lines changed: 78 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,91 @@
1-
contract TableFactory {
2-
function openTable(string memory) public view returns (Table); //open table
3-
function createTable(string, string, string) public returns (int256); //create table
4-
}
1+
// SPDX-License-Identifier: Apache-2.0
2+
// 该接口文件定义了FISCO BCOS v3.1.0及以前版本的接口,使用时需要将该文件放在合约目录下
3+
// 若要使用FISCO BCOS v3.2.0及以后版本的接口,请使用TableV320.sol,旧合约仍然能在新节点中使用
4+
pragma solidity >=0.6.10 <0.8.20;
5+
pragma experimental ABIEncoderV2;
56

6-
//select condition
7-
contract Condition {
8-
function EQ(string, int256) public;
9-
function EQ(string, string) public;
7+
// KeyOrder指定Key的排序规则,字典序和数字序,如果指定为数字序,key只能为数字
8+
// enum KeyOrder {Lexicographic, Numerical}
9+
struct TableInfo {
10+
string keyColumn;
11+
string[] valueColumns;
12+
}
1013

11-
function NE(string, int256) public;
12-
function NE(string, string) public;
14+
// 记录,用于select和insert
15+
struct Entry {
16+
string key;
17+
string[] fields; // 考虑2.0的Entry接口,临时Precompiled的问题,考虑加工具类接口
18+
}
1319

14-
function GT(string, int256) public;
15-
function GE(string, int256) public;
20+
// 更新字段,用于update
21+
struct UpdateField {
22+
string columnName;
23+
// 考虑工具类
24+
string value;
25+
}
1626

17-
function LT(string, int256) public;
18-
function LE(string, int256) public;
27+
// 筛选条件,大于、大于等于、小于、小于等于
28+
enum ConditionOP {GT, GE, LT, LE}
29+
struct Condition {
30+
ConditionOP op;
31+
// string field;
32+
string value;
33+
}
1934

20-
function limit(int256) public;
21-
function limit(int256, int256) public;
22-
}
35+
// 数量限制
36+
struct Limit {
37+
uint32 offset;
38+
// count limit max is 500
39+
uint32 count;
40+
}
2341

24-
//one record
25-
contract Entry {
26-
function getInt(string) public view returns (int256);
27-
function getUInt(string) public view returns (int256);
28-
function getAddress(string) public view returns (address);
29-
function getBytes64(string) public view returns (bytes1[64]);
30-
function getBytes32(string) public view returns (bytes32);
31-
function getString(string) public view returns (string);
32-
33-
function set(string, int256) public;
34-
function set(string, uint256) public;
35-
function set(string, string) public;
36-
function set(string, address) public;
37-
}
42+
// 表管理合约,是静态Precompiled,有固定的合约地址
43+
abstract contract TableManager {
44+
// 创建表,传入TableInfo
45+
function createTable(string memory path, TableInfo memory tableInfo) public virtual returns (int32);
3846

39-
//record sets
40-
contract Entries {
41-
function get(int256) public view returns (Entry);
42-
function size() public view returns (int256);
43-
}
47+
// 创建KV表,传入key和value字段名
48+
function createKVTable(string memory tableName, string memory keyField, string memory valueField) public virtual returns (int32);
4449

45-
//Table main contract
46-
contract Table {
47-
function select(string, Condition) public view returns (Entries);
48-
function insert(string, Entry) public returns (int256);
49-
function update(string, Entry, Condition) public returns (int256);
50-
function remove(string, Condition) public returns (int256);
50+
// 只提供给Solidity合约调用时使用
51+
function openTable(string memory path) public view virtual returns (address);
5152

52-
function newEntry() public view returns (Entry);
53-
function newCondition() public view returns (Condition);
54-
}
53+
// 变更表字段
54+
// 只能新增字段,不能删除字段,新增的字段默认值为空,不能与原有字段重复
55+
function appendColumns(string memory path, string[] memory newColumns) public virtual returns (int32);
5556

56-
contract KVTableFactory {
57-
function openTable(string) public view returns (KVTable);
58-
function createTable(string, string, string) public returns (int256);
57+
// 获取表信息
58+
function desc(string memory tableName) public view virtual returns (TableInfo memory);
5959
}
6060

61-
//KVTable per permiary key has only one Entry
62-
contract KVTable {
63-
function get(string) public view returns (bool, Entry);
64-
function set(string, Entry) public returns (int256);
65-
function newEntry() public view returns (Entry);
61+
// 表合约,是动态Precompiled,TableManager创建时指定地址
62+
abstract contract Table {
63+
// 按key查询entry
64+
function select(string memory key) public virtual view returns (Entry memory);
65+
66+
// 按条件批量查询entry,condition为空则查询所有记录
67+
function select(Condition[] memory conditions, Limit memory limit) public virtual view returns (Entry[] memory);
68+
69+
// 按照条件查询count数据
70+
function count(Condition[] memory conditions) public virtual view returns (uint32);
71+
72+
// 插入数据
73+
function insert(Entry memory entry) public virtual returns (int32);
74+
75+
// 按key更新entry
76+
function update(string memory key, UpdateField[] memory updateFields) public virtual returns (int32);
77+
78+
// 按条件批量更新entry,condition为空则更新所有记录
79+
function update(Condition[] memory conditions, Limit memory limit, UpdateField[] memory updateFields) public virtual returns (int32);
80+
81+
// 按key删除entry
82+
function remove(string memory key) public virtual returns (int32);
83+
// 按条件批量删除entry,condition为空则删除所有记录
84+
function remove(Condition[] memory conditions, Limit memory limit) public virtual returns (int32);
6685
}
86+
87+
abstract contract KVTable {
88+
function get(string memory key) public view virtual returns (bool, string memory);
89+
90+
function set(string memory key, string memory value) public virtual returns (int32);
91+
}

contracts/Table20.sol

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
contract TableFactory20 {
2+
function openTable(string memory) public view returns (Table); //open table
3+
function createTable(string, string, string) public returns (int256); //create table
4+
}
5+
6+
//select condition
7+
contract Condition {
8+
function EQ(string, int256) public;
9+
function EQ(string, string) public;
10+
11+
function NE(string, int256) public;
12+
function NE(string, string) public;
13+
14+
function GT(string, int256) public;
15+
function GE(string, int256) public;
16+
17+
function LT(string, int256) public;
18+
function LE(string, int256) public;
19+
20+
function limit(int256) public;
21+
function limit(int256, int256) public;
22+
}
23+
24+
//one record
25+
contract Entry {
26+
function getInt(string) public view returns (int256);
27+
function getUInt(string) public view returns (int256);
28+
function getAddress(string) public view returns (address);
29+
function getBytes64(string) public view returns (bytes1[64]);
30+
function getBytes32(string) public view returns (bytes32);
31+
function getString(string) public view returns (string);
32+
33+
function set(string, int256) public;
34+
function set(string, uint256) public;
35+
function set(string, string) public;
36+
function set(string, address) public;
37+
}
38+
39+
//record sets
40+
contract Entries {
41+
function get(int256) public view returns (Entry);
42+
function size() public view returns (int256);
43+
}
44+
45+
//Table main contract
46+
contract Table {
47+
function select(string, Condition) public view returns (Entries);
48+
function insert(string, Entry) public returns (int256);
49+
function update(string, Entry, Condition) public returns (int256);
50+
function remove(string, Condition) public returns (int256);
51+
52+
function newEntry() public view returns (Entry);
53+
function newCondition() public view returns (Condition);
54+
}
55+
56+
contract KVTableFactory {
57+
function openTable(string) public view returns (KVTable);
58+
function createTable(string, string, string) public returns (int256);
59+
}
60+
61+
//KVTable per permiary key has only one Entry
62+
contract KVTable {
63+
function get(string) public view returns (bool, Entry);
64+
function set(string, Entry) public returns (int256);
65+
function newEntry() public view returns (Entry);
66+
}

0 commit comments

Comments
 (0)