Rust 原生接口
IoTDB 使用 Thrift 作为跨语言的 RPC 框架,因此可以通过 Thrift 提供的接口来实现对 IoTDB 的访问。本文档将介绍如何生成可访问 IoTDB 的原生 Rust 接口。
依赖
- JDK >= 1.8
- Rust >= 1.0.0
- thrift 0.14.1
- Linux、Macos 或其他类 unix 系统
- Windows+bash (下载 IoTDB Go client 需要 git ,通过 WSL、cygwin、Git Bash 任意一种方式均可)
必须安装 thrift(0.14.1 或更高版本)才能将 thrift 文件编译为 Rust 代码。下面是官方的安装教程,最终,您应该得到一个 thrift 可执行文件。
1. http://thrift.apache.org/docs/install/
编译 thrift 库,生成 Rust 原生接口
- 在 IoTDB 源代码文件夹的根目录中找到 pom.xml 文件。
- 打开 pom.xml 文件,找到以下内容:
1. <execution>
2. <id>generate-thrift-sources-java</id>
3. <phase>generate-sources</phase>
4. <goals>
5. <goal>compile</goal>
6. </goals>
7. <configuration>
8. <generator>java</generator>
9. <thriftExecutable>${thrift.exec.absolute.path}</thriftExecutable>
10. <thriftSourceRoot>${basedir}/src/main/thrift</thriftSourceRoot>
11. </configuration>
12. </execution>
- 参考该设置,在 pom.xml 文件中添加以下内容,用来生成 Rust 的原生接口:
1. <execution>
2. <id>generate-thrift-sources-rust</id>
3. <phase>generate-sources</phase>
4. <goals>
5. <goal>compile</goal>
6. </goals>
7. <configuration>
8. <generator>rs</generator>
9. <thriftExecutable>${thrift.exec.absolute.path}</thriftExecutable>
10. <thriftSourceRoot>${basedir}/src/main/thrift</thriftSourceRoot>
11. <includes>**/common.thrift,**/client.thrift</includes>
12. <outputDirectory>${project.build.directory}/generated-sources-rust</outputDirectory>
13. </configuration>
14. </execution>
- 在 IoTDB 源代码文件夹的根目录下,运行
mvn clean generate-sources,
这个指令将自动删除iotdb/iotdb-protocol/thrift/target 和 iotdb/iotdb-protocol/thrift-commons/target中的文件,并使用新生成的 thrift 文件重新填充该文件夹。
这个文件夹在 git 中会被忽略,并且永远不应该被推到 git 中!
注意不要将iotdb/iotdb-protocol/thrift/target 和 iotdb/iotdb-protocol/thrift-commons/target上传到 git 仓库中 !
使用 Rust 原生接口
将 iotdb/iotdb-protocol/thrift/target/generated-sources-rust/ 和 iotdb/iotdb-protocol/thrift-commons/target/generated-sources-rust/ 中的文件复制到您的项目中,即可使用。
支持的 rpc 接口
1. // 打开一个 session
2. TSOpenSessionResp openSession(1:TSOpenSessionReq req);
4. // 关闭一个 session
5. TSStatus closeSession(1:TSCloseSessionReq req);
7. // 执行一条 SQL 语句
8. TSExecuteStatementResp executeStatement(1:TSExecuteStatementReq req);
10. // 批量执行 SQL 语句
11. TSStatus executeBatchStatement(1:TSExecuteBatchStatementReq req);
13. // 执行查询 SQL 语句
14. TSExecuteStatementResp executeQueryStatement(1:TSExecuteStatementReq req);
16. // 执行插入、删除 SQL 语句
17. TSExecuteStatementResp executeUpdateStatement(1:TSExecuteStatementReq req);
19. // 向服务器取下一批查询结果
20. TSFetchResultsResp fetchResults(1:TSFetchResultsReq req)
22. // 获取元数据
23. TSFetchMetadataResp fetchMetadata(1:TSFetchMetadataReq req)
25. // 取消某次查询操作
26. TSStatus cancelOperation(1:TSCancelOperationReq req);
28. // 关闭查询操作数据集,释放资源
29. TSStatus closeOperation(1:TSCloseOperationReq req);
31. // 获取时区信息
32. TSGetTimeZoneResp getTimeZone(1:i64 sessionId);
34. // 设置时区
35. TSStatus setTimeZone(1:TSSetTimeZoneReq req);
37. // 获取服务端配置
38. ServerProperties getProperties();
40. // 设置 database
41. TSStatus setStorageGroup(1:i64 sessionId, 2:string storageGroup);
43. // 创建时间序列
44. TSStatus createTimeseries(1:TSCreateTimeseriesReq req);
46. // 创建多条时间序列
47. TSStatus createMultiTimeseries(1:TSCreateMultiTimeseriesReq req);
49. // 删除时间序列
50. TSStatus deleteTimeseries(1:i64 sessionId, 2:list<string> path)
52. // 删除 database
53. TSStatus deleteStorageGroups(1:i64 sessionId, 2:list<string> storageGroup);
55. // 按行插入数据
56. TSStatus insertRecord(1:TSInsertRecordReq req);
58. // 按 String 格式插入一条数据
59. TSStatus insertStringRecord(1:TSInsertStringRecordReq req);
61. // 按列插入数据
62. TSStatus insertTablet(1:TSInsertTabletReq req);
64. // 按列批量插入数据
65. TSStatus insertTablets(1:TSInsertTabletsReq req);
67. // 按行批量插入数据
68. TSStatus insertRecords(1:TSInsertRecordsReq req);
70. // 按行批量插入同属于某个设备的数据
71. TSStatus insertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
73. // 按 String 格式批量按行插入数据
74. TSStatus insertStringRecords(1:TSInsertStringRecordsReq req);
76. // 测试按列插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
77. TSStatus testInsertTablet(1:TSInsertTabletReq req);
79. // 测试批量按列插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
80. TSStatus testInsertTablets(1:TSInsertTabletsReq req);
82. // 测试按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
83. TSStatus testInsertRecord(1:TSInsertRecordReq req);
85. // 测试按 String 格式按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
86. TSStatus testInsertStringRecord(1:TSInsertStringRecordReq req);
88. // 测试按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
89. TSStatus testInsertRecords(1:TSInsertRecordsReq req);
91. // 测试按行批量插入同属于某个设备的数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
92. TSStatus testInsertRecordsOfOneDevice(1:TSInsertRecordsOfOneDeviceReq req);
94. // 测试按 String 格式批量按行插入数据的延迟,注意:该接口不真实插入数据,只用来测试网络延迟
95. TSStatus testInsertStringRecords(1:TSInsertStringRecordsReq req);
97. // 删除数据
98. TSStatus deleteData(1:TSDeleteDataReq req);
100. // 执行原始数据查询
101. TSExecuteStatementResp executeRawDataQuery(1:TSRawDataQueryReq req);
103. // 向服务器申请一个查询语句 ID
104. i64 requestStatementId(1:i64 sessionId);
