javaapi
评论(0) 浏览量(184)

基本操作

ChainSQL jar

获取依赖jar包

a.如果本地有maven环境,将以下代码加入本地开发环境pom.xml文件进行jar包下载。
<dependency>
<groupId>com.peersafe</groupId>
<artifactId>chainsql</artifactId>
<version>1.0.0</version>
</dependency>
b.如果本地没有maven环境,直接下载项目依赖的jar包,在“buildPath”中选择“libraries”,再Add External Jars 添加相应的jar包。
项目依赖的jar包下载:libs.zip

c

Chainsql c = Chainsql.c;

ChainSQL的操作对象;

Example: 获取ChainSQL的操作对象;

import com.peersafe.chainsql.core.Chainsql;
import com.peersafe.chainsql.core.Table;

public static final Chainsql c= Chainsql.c;

connect

c.connect(url);

创建一个新的连接到ChainSQL节点;

如果无法建立连接,就会抛出ReqlDriverError;

Example:连接指定的路径的主机;

c.connect("ws://192.168.0.162:6006");

as

c.as(address,secret);

提供操作者的身份;

c.as("rEtepyQeAEgBLqXCaFRwZPK1LHArQfdKYr","snrJRLBSkThBXtaBYZW1zVMmThm1d");

use

c.use(address);

切换表的所有者(即后续操作的上下文),默认表的所有者为操作者;

c.use("rEtepyQeAEgBLqXCaFRwZPK1LHArQfdKYr");

setRestrict

c.setRestrict(true/false);

设置是否使用严格模式,默认为非严格模式;在严格模式下,语句共识通过的条件是期望的快照HASH与预期一致

Example:

c.setRestrict(true);

submit

c.submit();

submit有3个重载函数,对应异步和同步,客户可以根据需要填写参数。返回值均为JSON对象,指示成功或失败;

1. JSONObject  submit()

异步接口,参数为空

c.table("marvel").insert(args).submit();

提交操作,执行查询操作时,返回json类型;

Example:

c.table("marvel").insert(c.array("{'name': 'peera','age': 22}","{'name': 'peerb','age': 21}")).submit();

2. JSONObject  submit(Callback cb)

异步接口,参数为一回调函数

c.table("marvel").insert(args).submit(Callback cb);

Example:

c.table("marvel").insert(c.array("{'name': 'peera','age': 22}","{'name': 'peerb','age': 21}")).submit(new Callback(){public void called(JSONObject args) {System.out.println(data);}}));

3. JSONObject  submit(SyncCond cond)

同步接口,参数为一枚举类型

enum SyncCond { validate_success, db_success }

c.table("marvel").insert(args).submit(SyncCond.db_success);

Example:

c.table("marvel").insert(c.array("{'name': 'peera','age': 22}","{'name': 'peerb','age': 21}")).submit(SyncCond.db_success);

用户管理

generateAddress

c.generateAddress();

创建用户,返回JSON数据类型,包含:

secret:账户秘钥

account_id:账户地址

public_key:公钥

Example:

JSONObject json = c.generateAddress();

输出:

{

"public_key":"aBQJ83oG9GtWwSHHaziejQ7o7RnyVWdvMgLLAy61dMTucS3As7kR",

"account_id":"rH9VQWz2o6GmsWKoFymU6g6jLUZCHxeUmx",

"secret":"snqAWkwrvcZD3xdsCfj9pGVUDnLja"

}

点击试用

pay

c.pay(accountId,count);

为创建的用户转账,新创建的用户在转账成功之后才能正常使用;其中accountId表示转账的用户地址,count转账金额,count最小值20;

Example:accountId 等于 rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q 的用户转账20.

c.pay("rBuLBiHmssAMHWQMnEN7nXQXaVj7vhAv6Q","20")

点击试用

表操作

createTable

c.createTable(tableName,raw,confidential).submit(SyncCond.db_success);

tableName:所创建表名;raw:创建表的字段名称必须为Json格式数据;例如:

"{'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1,'AI':1}",

"{'field':'name','type':'varchar','length':50,'default':null}",

"{'field':'age','type':'int'}"

confidential:为boolean类型,表示创建的表是否为加密的表,true:创建加密表;如果不写,默认为false;

创建表参数说明:



field:表字段名
type:字段名类型,支持int/float/double/decimal/varchar/blob/text/datetime
length:字段值的字节长度
PK:值为1表示字段为主键
NN:值为1表示值不能为空,NOT NULL
UQ:值为1表示值唯一
AI:值为1表示值有自增特性
FK:值为1表示字段为某表的外键,必须配合REFERENCES使用
REFERENCES:值的格式为 {'table':'user','field':'id'}

c.createTable(tableName,raw).submit(SyncCond.db_success);

创建一个表。ChainSql表是一个JSON文档的集合;

Example:创建表 "dc_universe"

c.createTable("dc_universe",c.array(

"{'field':'id','type':'int','length':11,'PK':1,'NN':1,'UQ':1,'AI':1}",

"{'field':'name','type':'varchar','length':50,'default':null}",

"{'field':'age','type':'int'}"),false).submit(SyncCond.db_success);

点击试用

renameTable

c.renameTable(tableName, NewTableName).submit();

修改数据库中表的名字,tableName:表名;NewTableName:新的表名,两个名字都不能为空;

Example:  将表"dc_universe"改为"dc_name".

c.renameTable("dc_universe","dc_name").submit();

点击试用

dropTable

c.dropTable(tableName).submit();

从数据库删除一个表。表和它的所有数据将被删除;

Example: 删除表 "dc_universe".

c.dropTable("dc_universe").submit();

点击试用

数据操作

insert

c.table(tableName).insert(raw).submit(SyncCond.db_success);

向数据库中插入数据。raw类型必须都是例子中的json格式的数据类型;

Example: 向表"posts"中插入一条记录.

c.table("posts").insert(c.array("{'name': 'peera','age': 22}","{'name': 'peerb','age': 21}")).submit(SyncCond.db_success);

点击试用

update

c.table(tableName).get(raw).update(raw).submit(SyncCond.db_success);

更新表中数据。如果get添加为空,则更新表中所有记录;其中raw为json格式字符串;

Example: 更新 id 等于 1 的记录.

c.table("posts").get(c.array("{'id': 1}").update("{'age':52,'name':'lisi'}").submit(SyncCond.db_success);

点击试用

delete

c.table(tableName).get(raw).delete().submit(SyncCond.db_success);

从表中删除符合条件的记录。如果get条件为空,则删除所有记录;

Example: 删除id等于1的记录.

c.table("comments").get(c.array("{'id': 1}")).delete().submit(SyncCond.db_success);

点击试用

数据查询

get

c.table(tableName).get(raw).submit();

从数据库查询数据,返回所有符合条件的数据,后面可以进行其他操作,如updata,delete等;

Example: 查询name等于aa的记录.

c.table("posts").get(c.array("{'name': 'aa'}")).submit();

c.table("posts").get(c.array("{'name': 'aa'}")).withFields([]).submit();

点击试用

limit

c.table(tableName).get(raw).limit("{index:0,total:10}").withFields([]).submit();

对数据库进行分页查询.返回对应条件的数据;

Example: 查询name等于aa的前10条记录.

c.table("posts").get(c.array("{'name': 'aa'}")).limit("{index:0,total:10}").withFields([]).submit();

点击试用

order

c.table(tableName).get(raw).order(["{id:1}","{name:-1}"]).withFields([]).submit()

对查询的数据按指定字段进行排序;

Example: 按 id 升序,name 的降序排序;

c.table("posts").get(c.array("{'name': 'aa'}")).order(c.array("{id:1}","{name:-1}")).withFields([]).submit();

点击试用

withFields

c.table(tableName).get(raw).withFields([field1,field2…]).submit();

从数据库查询数据,并返回指定字段,必须个get配合使用;

Example:  查询name等于aa的记录.

c.table("posts").get(c.array("{'name': 'aa'}")).withFields("['name','age']").submit();

点击试用

权限管理

grant

c.grant(tableName,user,rightInfo).submit(SyncCond.validate_success);

向用户授予数据表操作权限;

tableName:授权的表名;

user:被授权用户地址;

rightInfo为授权字符串,例如:{select: true, insert: true, udpate: true,delete:true};

如果是加密的表:

c.grant(tableName,userPublicKey,user,rightInfo).submit(SyncCond.validate_success);

userPublicKey:被授权用户公钥,进行授权操作要填写该参数;

用户权限有以下几种:select、insert、update、delete;

Example1: 向用户授予Insert、Delete操作权限.

c.grant("Table", "rEtepyQeAEgBLqXCaFRwZPK1LHArQfdKYr","{insert:true,delete:true}").submit(SyncCond.validate_success);

Example1: 取消用户Insert、Delete操作权限.

c.grant("Table", "rEtepyQeAEgBLqXCaFRwZPK1LHArQfdKYr","{insert:false,delete:false}").submit(SyncCond.validate_success);

点击试用

事务相关

beginTran

c.beginTran();

事务开始;

在事务开始和结束之间的insert,update,delete,assert语句会包装在一个原子执行

在事务上下文中,不在支持单个语句的submit

点击试用

sqlAssert

c.table(tableName).get(jsonObj1).sqlAssert(jsonObj2);

事务中的断言操作,sqlAssert为true则继续,false则回滚事务;

jsonObj1:查询条件;

jsonObj2:断言表达;

Example: 判断id等于1的记录age是否等于52并且name等于lisi,如果是则继续,如果有一个条件不满足或记录不存在,则回滚事务

c.table("posts").get({id: 1}).sqlAssert({age:'52',name:'lisi'});

Example: 判断id等于1的记录集的行数是否等于1,如果是则继续,如果不是或表不存在,则回滚事务

c.table("posts").get({id: 1}).sqlAssert({$rowcount:'1'});

Example: 判断表posts是否存在,如果有则继续,如果不存在,则回滚事务

c.table("posts").sqlAssert({$IsExisted:'1'});

点击试用

commit

c.commit();

提交事务;

本次事务期间的所有操作都会打包提交到区块链网络

Example: 

c.beginTran();
c.table("posts").insert({name: 'peera',age: 22},{name: 'peerb',age: 21});
c.table("posts").get({id: 1}).assert({age:22,name:'peera'});
c.table("posts").get({id: 1}).update({age:'52',name:'lisi'});
c.table("comments").delete({id: 1});
c.commit();

点击试用

区块信息

getLedger

1.接口原型:JSONObject getLedger()

返回值:成功返回最新区块信息,失败为null;

2. JSONObject getLedger(int ledger_index);

参数:ledger序号;返回值:成功为JSONObject,失败为null;

点击试用

getTransaction

查询某个hash下的交易信息;

接口原型:

同步:JSONObject getTransaction (String hash);

异步:void getTransaction(String hash,Callback cb);

参数说明:Hash:交易哈希值

同步接口返回值:成功为交易信息,失败为null

点击试用

getTransactions

查询某账户相关的所有交易

接口原型:

同步:JSONObject getTransactions(String address);

异步:void getTransactions(String address,Callback cb);

参数说明:要查询的账户地址 address:

同步接口返回值:成功为交易信息数组,失败为null

点击试用

事件订阅

subscribeTable

c.subscribeTable(owner, tablename, callback);

1.订阅某张表

owner为表的所有者地址;

tablename为表名;

Callback回调函数;

注:callback回调函数参数说明:

{ "owner":"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",

"status":"validate_success",

"tablename":"sub_message1", "transaction":{… },

"type":"table"

}

Example: 用户订阅TestName表信息.

c.event.subscribeTable("rsadxc3pw976e3hfaxUijhbR3ye2orJS6x", "TestName",(data)->{//do something here}));

点击试用

unsubcribeTable

c.unsubcribeTable(owner, tablename);

2.取消订阅某张表

owner为表的所有者地址;

tablename为表名;

Example: 用户取消订阅TestName表信息.

c.event.unsubcribeTable("rsadxc3pw976e3hfaxUijhbR3ye2orJS6x");

点击试用

subscribeTx

c.subscribeTx(txid, callback);

3.订阅某个交易

txid:交易Hash

Callback回调函数;

注:callback回调函数参数说明:

{ "status":"validate_success",

"transaction":{ … },

"type":"singleTransaction" }

Example: 用户订阅交易Hash信息.

c.event.subscribeTx(txid,(data)->{//do something here}));

unsubscribeTx

c.unsubscribeTx(txid);

4.取消订阅某个交易

txid:交易Hash

Example: 用户取消订阅交易Hash信息.

c.event.unsubscribeTx(txid);

运算符

comparison operators

比较运算符

$eq     等于                      {<field>:{$eq:<value>}} or {<field>:<value>}

$ne     不等于                    {<field>:{$ne:<value>}}

$lt     小于                      {<field>:{$lt:<value>}}

$le     小于等于                  {<field>:{$le:<value>}}

$gt     大于                      {<field>:{$gt:<value>}}

$ge     大于等于                  {<field>:{$ge:<value>}}

$in     字段值在指定的数组中      {<field>:{$in:[<value1>,<value2>,...,<valueN>]}}

$nin    字段值不在指定的数组中    {<field>:{$in:[<value1>,<value2>,...,<valueN>]}}

logical operators

逻辑符

$and 逻辑与                   {$and:[{express1},{express2},...,{expressN}]}

$or     逻辑或                    {$or:[{express1},{express2},...,{expressN}]}

fuzzy matching

模糊匹配

$regex  like "%value%"            { <field>:{$regex: </value/>}}

$regex  like "%value"             { <field>:{$regex: </^value/>}}

例子:

where id > 10 and id < 100

{$and:[{id:{$gt:10}},{id:{$lt:100}}]}


where name = 'peersafe' or name = 'zongxiang'

{$or:[{name:{$eq:'peersafe'}},{name:{$eq:zongxiang}}]}


where (id > 10 and name = 'peersafe') or name = 'zongxiang'

{$or:[{$and:[{id:{$gt:10}},{name:'peersafe'}]},{name:'zongxiang'}]}


where name like '%peersafe%'

{name:{$regex:'/peersafe/'}}


where name like '%peersafe'

{name:{$regex:'/^peersafe/'}}

没有登录不能评论