diff --git a/docs/en/14-reference/05-connectors/10-cpp.mdx b/docs/en/14-reference/05-connectors/10-cpp.mdx
index b429afde97..79ff00fd5b 100644
--- a/docs/en/14-reference/05-connectors/10-cpp.mdx
+++ b/docs/en/14-reference/05-connectors/10-cpp.mdx
@@ -64,64 +64,20 @@ In the above example code, `taos_connect()` establishes a connection to port 603
## Sample program
-This section shows sample code for standard access methods to TDengine clusters using the client driver.
+This section shows sample code for standard access methods to TDengine clusters using the client driver.
-### Synchronous query example
+- [Synchronous query example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/demo.c)
-
-Synchronous query
+- [Asynchronous query example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/asyncdemo.c)
-```c
-{{#include examples/c/demo.c}}
-```
+- [Parameter binding example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/prepare.c)
-
+- [Schemaless writing example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/schemaless.c)
-### Asynchronous query example
-
-
-Asynchronous queries
-
-```c
-{{#include examples/c/asyncdemo.c}}
-```
-
-
-
-### Parameter binding example
-
-
-Parameter Binding
-
-```c
-{{#include examples/c/prepare.c}}
-```
-
-
-
-### Pattern-free writing example
-
-
-Mode free write
-
-```c
-{{#include examples/c/schemaless.c}}
-```
-
-
-
-### Subscription and consumption example
-
-
-Subscribe and consume
-
-```c
-```
-
-
+- [Subscription and consumption example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/tmq.c)
:::info
-More example code and downloads are available at [GitHub](https://github.com/taosdata/TDengine/tree/develop/examples/c).
+More example code and downloads are available at [GitHub](https://github.com/taosdata/TDengine/tree/develop/docs/examples/c).
You can find it in the installation directory under the `examples/c` path. This directory has a makefile and can be compiled under Linux/macOS by executing `make` directly.
**Hint:** When compiling in an ARM environment, please remove `-msse4.2` from the makefile. This option is only supported on the x64/x86 hardware platforms.
@@ -311,7 +267,7 @@ Starting with versions 2.1.1.0 and 2.1.2.0, TDengine has significantly improved
Note: If `taos_stmt_execute()` succeeds, you can reuse the parsed result of `taos_stmt_prepare()` to bind new data in steps 3 to 6 if you don't need to change the SQL command. However, if there is an execution error, it is not recommended to continue working in the current context but release the resources and start again with `taos_stmt_init()` steps.
-The specific functions related to the interface are as follows (see also the [prepare.c](https://github.com/taosdata/TDengine/blob/develop/examples/c/prepare.c) file for the way to use the corresponding functions)
+The specific functions related to the interface are as follows (see also the [prepare.c](https://github.com/taosdata/TDengine/blob/develop/docs/examples/c/prepare.c) file for the way to use the corresponding functions)
- `TAOS_STMT* taos_stmt_init(TAOS *taos)`
@@ -661,4 +617,4 @@ In addition to writing data using the SQL method or the parameter binding API, w
- tmq_get_table_name : table name of result, NULL if failed
- tmq_get_res_type : result type tmq_res_t
- tmq_get_topic_name : topic name of result, NULL if failed
- - tmq_get_db_name : db name of result, NULL if failed
\ No newline at end of file
+ - tmq_get_db_name : db name of result, NULL if failed
diff --git a/docs/en/14-reference/05-connectors/14-java.mdx b/docs/en/14-reference/05-connectors/14-java.mdx
index 8192807c6d..46b13409a3 100644
--- a/docs/en/14-reference/05-connectors/14-java.mdx
+++ b/docs/en/14-reference/05-connectors/14-java.mdx
@@ -662,7 +662,7 @@ Example usage is as follows.
### More sample programs
-The source code of the sample application is under `TDengine/examples/JDBC`:
+The source code of the sample application is under `TDengine/docs/examples/JDBC`:
- JDBCDemo: JDBC sample source code.
- connectionPools: using taos-jdbcdriver in connection pools such as HikariCP, Druid, dbcp, c3p0, etc.
@@ -671,7 +671,7 @@ The source code of the sample application is under `TDengine/examples/JDBC`:
- springbootdemo: using taos-jdbcdriver in Springboot.
- consumer-demo: consumer TDengine data example, the consumption rate can be controlled by parameters.
-[JDBC example](https://github.com/taosdata/TDengine/tree/3.0/examples/JDBC)
+[JDBC example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/JDBC)
## Frequently Asked Questions
diff --git a/docs/en/14-reference/05-connectors/26-rust.mdx b/docs/en/14-reference/05-connectors/26-rust.mdx
index 92a8e24dbb..68770a40e6 100644
--- a/docs/en/14-reference/05-connectors/26-rust.mdx
+++ b/docs/en/14-reference/05-connectors/26-rust.mdx
@@ -437,9 +437,9 @@ let taos = pool.get()?;
### More sample programs
-The source code of the sample application is under `TDengine/examples/rust` :
+The source code of the sample application is under `TDengine/docs/examples/rust` :
-[rust example](https://github.com/taosdata/TDengine/tree/3.0/examples/rust)
+[rust example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/rust)
## Frequently Asked Questions
diff --git a/examples/JDBC/JDBCDemo/README-jdbc-windows.md b/docs/examples/JDBC/JDBCDemo/README-jdbc-windows.md
similarity index 100%
rename from examples/JDBC/JDBCDemo/README-jdbc-windows.md
rename to docs/examples/JDBC/JDBCDemo/README-jdbc-windows.md
diff --git a/examples/JDBC/JDBCDemo/pom.xml b/docs/examples/JDBC/JDBCDemo/pom.xml
similarity index 100%
rename from examples/JDBC/JDBCDemo/pom.xml
rename to docs/examples/JDBC/JDBCDemo/pom.xml
diff --git a/examples/JDBC/JDBCDemo/readme.md b/docs/examples/JDBC/JDBCDemo/readme.md
similarity index 100%
rename from examples/JDBC/JDBCDemo/readme.md
rename to docs/examples/JDBC/JDBCDemo/readme.md
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ConsumerLoop.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ConsumerLoop.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ConsumerLoop.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ConsumerLoop.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/GeometryDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/GeometryDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/GeometryDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/GeometryDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcBasicDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcBasicDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcBasicDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcBasicDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/JdbcRestfulDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingFullDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingFullDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingFullDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/ParameterBindingFullDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/Util.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/Util.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/Util.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/Util.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingDemo.java
diff --git a/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingFullDemo.java b/docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingFullDemo.java
similarity index 100%
rename from examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingFullDemo.java
rename to docs/examples/JDBC/JDBCDemo/src/main/java/com/taosdata/example/WSParameterBindingFullDemo.java
diff --git a/examples/JDBC/SpringJdbcTemplate/.gitignore b/docs/examples/JDBC/SpringJdbcTemplate/.gitignore
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/.gitignore
rename to docs/examples/JDBC/SpringJdbcTemplate/.gitignore
diff --git a/examples/JDBC/SpringJdbcTemplate/pom.xml b/docs/examples/JDBC/SpringJdbcTemplate/pom.xml
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/pom.xml
rename to docs/examples/JDBC/SpringJdbcTemplate/pom.xml
diff --git a/examples/JDBC/SpringJdbcTemplate/readme.md b/docs/examples/JDBC/SpringJdbcTemplate/readme.md
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/readme.md
rename to docs/examples/JDBC/SpringJdbcTemplate/readme.md
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/App.java b/docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/App.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/App.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/App.java
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatement.java b/docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatement.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatement.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatement.java
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatementImpl.java b/docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatementImpl.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatementImpl.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/ExecuteAsStatementImpl.java
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDao.java b/docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDao.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDao.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDao.java
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDaoImpl.java b/docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDaoImpl.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDaoImpl.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/dao/WeatherDaoImpl.java
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/domain/Weather.java b/docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/domain/Weather.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/domain/Weather.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/java/com/taosdata/example/jdbcTemplate/domain/Weather.java
diff --git a/examples/JDBC/SpringJdbcTemplate/src/main/resources/applicationContext.xml b/docs/examples/JDBC/SpringJdbcTemplate/src/main/resources/applicationContext.xml
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/main/resources/applicationContext.xml
rename to docs/examples/JDBC/SpringJdbcTemplate/src/main/resources/applicationContext.xml
diff --git a/examples/JDBC/SpringJdbcTemplate/src/test/java/com/taosdata/example/jdbcTemplate/BatcherInsertTest.java b/docs/examples/JDBC/SpringJdbcTemplate/src/test/java/com/taosdata/example/jdbcTemplate/BatcherInsertTest.java
similarity index 100%
rename from examples/JDBC/SpringJdbcTemplate/src/test/java/com/taosdata/example/jdbcTemplate/BatcherInsertTest.java
rename to docs/examples/JDBC/SpringJdbcTemplate/src/test/java/com/taosdata/example/jdbcTemplate/BatcherInsertTest.java
diff --git a/examples/JDBC/connectionPools/README-cn.md b/docs/examples/JDBC/connectionPools/README-cn.md
similarity index 100%
rename from examples/JDBC/connectionPools/README-cn.md
rename to docs/examples/JDBC/connectionPools/README-cn.md
diff --git a/examples/JDBC/connectionPools/pom.xml b/docs/examples/JDBC/connectionPools/pom.xml
similarity index 100%
rename from examples/JDBC/connectionPools/pom.xml
rename to docs/examples/JDBC/connectionPools/pom.xml
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ConnectionPoolDemo.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ConnectionPoolDemo.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ConnectionPoolDemo.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ConnectionPoolDemo.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/DruidDemo.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/HikariDemo.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ProxoolDemo.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ProxoolDemo.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ProxoolDemo.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/ProxoolDemo.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/common/InsertTask.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/common/InsertTask.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/common/InsertTask.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/common/InsertTask.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/C3p0Builder.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/C3p0Builder.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/C3p0Builder.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/C3p0Builder.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DbcpBuilder.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DbcpBuilder.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DbcpBuilder.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DbcpBuilder.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/DruidPoolBuilder.java
diff --git a/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java b/docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java
rename to docs/examples/JDBC/connectionPools/src/main/java/com/taosdata/example/pool/HikariCpBuilder.java
diff --git a/examples/JDBC/connectionPools/src/main/resources/log4j.properties b/docs/examples/JDBC/connectionPools/src/main/resources/log4j.properties
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/resources/log4j.properties
rename to docs/examples/JDBC/connectionPools/src/main/resources/log4j.properties
diff --git a/examples/JDBC/connectionPools/src/main/resources/proxool.xml b/docs/examples/JDBC/connectionPools/src/main/resources/proxool.xml
similarity index 100%
rename from examples/JDBC/connectionPools/src/main/resources/proxool.xml
rename to docs/examples/JDBC/connectionPools/src/main/resources/proxool.xml
diff --git a/examples/JDBC/consumer-demo/pom.xml b/docs/examples/JDBC/consumer-demo/pom.xml
similarity index 100%
rename from examples/JDBC/consumer-demo/pom.xml
rename to docs/examples/JDBC/consumer-demo/pom.xml
diff --git a/examples/JDBC/consumer-demo/readme.md b/docs/examples/JDBC/consumer-demo/readme.md
similarity index 100%
rename from examples/JDBC/consumer-demo/readme.md
rename to docs/examples/JDBC/consumer-demo/readme.md
diff --git a/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Bean.java b/docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Bean.java
similarity index 100%
rename from examples/JDBC/consumer-demo/src/main/java/com/taosdata/Bean.java
rename to docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Bean.java
diff --git a/examples/JDBC/consumer-demo/src/main/java/com/taosdata/BeanDeserializer.java b/docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/BeanDeserializer.java
similarity index 100%
rename from examples/JDBC/consumer-demo/src/main/java/com/taosdata/BeanDeserializer.java
rename to docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/BeanDeserializer.java
diff --git a/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Config.java b/docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Config.java
similarity index 100%
rename from examples/JDBC/consumer-demo/src/main/java/com/taosdata/Config.java
rename to docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Config.java
diff --git a/examples/JDBC/consumer-demo/src/main/java/com/taosdata/ConsumerDemo.java b/docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/ConsumerDemo.java
similarity index 100%
rename from examples/JDBC/consumer-demo/src/main/java/com/taosdata/ConsumerDemo.java
rename to docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/ConsumerDemo.java
diff --git a/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Worker.java b/docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Worker.java
similarity index 100%
rename from examples/JDBC/consumer-demo/src/main/java/com/taosdata/Worker.java
rename to docs/examples/JDBC/consumer-demo/src/main/java/com/taosdata/Worker.java
diff --git a/examples/JDBC/mybatisplus-demo/.gitignore b/docs/examples/JDBC/mybatisplus-demo/.gitignore
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/.gitignore
rename to docs/examples/JDBC/mybatisplus-demo/.gitignore
diff --git a/examples/JDBC/mybatisplus-demo/.mvn/wrapper/MavenWrapperDownloader.java b/docs/examples/JDBC/mybatisplus-demo/.mvn/wrapper/MavenWrapperDownloader.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/.mvn/wrapper/MavenWrapperDownloader.java
rename to docs/examples/JDBC/mybatisplus-demo/.mvn/wrapper/MavenWrapperDownloader.java
diff --git a/examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.jar b/docs/examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.jar
rename to docs/examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.jar
diff --git a/examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.properties b/docs/examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.properties
rename to docs/examples/JDBC/mybatisplus-demo/.mvn/wrapper/maven-wrapper.properties
diff --git a/examples/JDBC/mybatisplus-demo/mvnw b/docs/examples/JDBC/mybatisplus-demo/mvnw
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/mvnw
rename to docs/examples/JDBC/mybatisplus-demo/mvnw
diff --git a/examples/JDBC/mybatisplus-demo/mvnw.cmd b/docs/examples/JDBC/mybatisplus-demo/mvnw.cmd
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/mvnw.cmd
rename to docs/examples/JDBC/mybatisplus-demo/mvnw.cmd
diff --git a/examples/JDBC/mybatisplus-demo/pom.xml b/docs/examples/JDBC/mybatisplus-demo/pom.xml
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/pom.xml
rename to docs/examples/JDBC/mybatisplus-demo/pom.xml
diff --git a/examples/JDBC/mybatisplus-demo/readme b/docs/examples/JDBC/mybatisplus-demo/readme
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/readme
rename to docs/examples/JDBC/mybatisplus-demo/readme
diff --git a/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/MybatisplusDemoApplication.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/MybatisplusDemoApplication.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/MybatisplusDemoApplication.java
rename to docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/MybatisplusDemoApplication.java
diff --git a/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/config/MybatisPlusConfig.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/config/MybatisPlusConfig.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/config/MybatisPlusConfig.java
rename to docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/config/MybatisPlusConfig.java
diff --git a/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Temperature.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Temperature.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Temperature.java
rename to docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Temperature.java
diff --git a/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Weather.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Weather.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Weather.java
rename to docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/domain/Weather.java
diff --git a/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapper.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapper.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapper.java
rename to docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapper.java
diff --git a/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapper.java b/docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapper.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapper.java
rename to docs/examples/JDBC/mybatisplus-demo/src/main/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapper.java
diff --git a/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml b/docs/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/main/resources/application.yml
rename to docs/examples/JDBC/mybatisplus-demo/src/main/resources/application.yml
diff --git a/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapperTest.java b/docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapperTest.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapperTest.java
rename to docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/TemperatureMapperTest.java
diff --git a/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapperTest.java b/docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapperTest.java
similarity index 100%
rename from examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapperTest.java
rename to docs/examples/JDBC/mybatisplus-demo/src/test/java/com/taosdata/example/mybatisplusdemo/mapper/WeatherMapperTest.java
diff --git a/examples/JDBC/readme.md b/docs/examples/JDBC/readme.md
similarity index 100%
rename from examples/JDBC/readme.md
rename to docs/examples/JDBC/readme.md
diff --git a/examples/JDBC/springbootdemo/.gitignore b/docs/examples/JDBC/springbootdemo/.gitignore
similarity index 100%
rename from examples/JDBC/springbootdemo/.gitignore
rename to docs/examples/JDBC/springbootdemo/.gitignore
diff --git a/examples/JDBC/springbootdemo/mvnw b/docs/examples/JDBC/springbootdemo/mvnw
similarity index 100%
rename from examples/JDBC/springbootdemo/mvnw
rename to docs/examples/JDBC/springbootdemo/mvnw
diff --git a/examples/JDBC/springbootdemo/mvnw.cmd b/docs/examples/JDBC/springbootdemo/mvnw.cmd
similarity index 100%
rename from examples/JDBC/springbootdemo/mvnw.cmd
rename to docs/examples/JDBC/springbootdemo/mvnw.cmd
diff --git a/examples/JDBC/springbootdemo/pom.xml b/docs/examples/JDBC/springbootdemo/pom.xml
similarity index 100%
rename from examples/JDBC/springbootdemo/pom.xml
rename to docs/examples/JDBC/springbootdemo/pom.xml
diff --git a/examples/JDBC/springbootdemo/readme.md b/docs/examples/JDBC/springbootdemo/readme.md
similarity index 100%
rename from examples/JDBC/springbootdemo/readme.md
rename to docs/examples/JDBC/springbootdemo/readme.md
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/SpringbootdemoApplication.java b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/SpringbootdemoApplication.java
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/SpringbootdemoApplication.java
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/SpringbootdemoApplication.java
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/controller/WeatherController.java b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/controller/WeatherController.java
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/controller/WeatherController.java
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/controller/WeatherController.java
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.java b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.java
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.java
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.java
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.xml b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.xml
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.xml
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/dao/WeatherMapper.xml
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/domain/Weather.java b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/domain/Weather.java
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/domain/Weather.java
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/domain/Weather.java
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/service/WeatherService.java b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/service/WeatherService.java
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/service/WeatherService.java
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/service/WeatherService.java
diff --git a/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/util/TaosAspect.java b/docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/util/TaosAspect.java
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/util/TaosAspect.java
rename to docs/examples/JDBC/springbootdemo/src/main/java/com/taosdata/example/springbootdemo/util/TaosAspect.java
diff --git a/examples/JDBC/springbootdemo/src/main/resources/application.properties b/docs/examples/JDBC/springbootdemo/src/main/resources/application.properties
similarity index 100%
rename from examples/JDBC/springbootdemo/src/main/resources/application.properties
rename to docs/examples/JDBC/springbootdemo/src/main/resources/application.properties
diff --git a/examples/JDBC/taosdemo/.gitignore b/docs/examples/JDBC/taosdemo/.gitignore
similarity index 100%
rename from examples/JDBC/taosdemo/.gitignore
rename to docs/examples/JDBC/taosdemo/.gitignore
diff --git a/examples/JDBC/taosdemo/.mvn/wrapper/MavenWrapperDownloader.java b/docs/examples/JDBC/taosdemo/.mvn/wrapper/MavenWrapperDownloader.java
similarity index 100%
rename from examples/JDBC/taosdemo/.mvn/wrapper/MavenWrapperDownloader.java
rename to docs/examples/JDBC/taosdemo/.mvn/wrapper/MavenWrapperDownloader.java
diff --git a/examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.jar b/docs/examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.jar
rename to docs/examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.jar
diff --git a/examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.properties b/docs/examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.properties
rename to docs/examples/JDBC/taosdemo/.mvn/wrapper/maven-wrapper.properties
diff --git a/examples/JDBC/taosdemo/mvnw b/docs/examples/JDBC/taosdemo/mvnw
similarity index 100%
rename from examples/JDBC/taosdemo/mvnw
rename to docs/examples/JDBC/taosdemo/mvnw
diff --git a/examples/JDBC/taosdemo/mvnw.cmd b/docs/examples/JDBC/taosdemo/mvnw.cmd
similarity index 100%
rename from examples/JDBC/taosdemo/mvnw.cmd
rename to docs/examples/JDBC/taosdemo/mvnw.cmd
diff --git a/examples/JDBC/taosdemo/pom.xml b/docs/examples/JDBC/taosdemo/pom.xml
similarity index 100%
rename from examples/JDBC/taosdemo/pom.xml
rename to docs/examples/JDBC/taosdemo/pom.xml
diff --git a/examples/JDBC/taosdemo/readme.md b/docs/examples/JDBC/taosdemo/readme.md
similarity index 100%
rename from examples/JDBC/taosdemo/readme.md
rename to docs/examples/JDBC/taosdemo/readme.md
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/TaosDemoApplication.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/TaosDemoApplication.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/TaosDemoApplication.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/TaosDemoApplication.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/DataSourceFactory.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/DataSourceFactory.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/DataSourceFactory.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/DataSourceFactory.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JdbcTaosdemoConfig.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JdbcTaosdemoConfig.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JdbcTaosdemoConfig.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JdbcTaosdemoConfig.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JsonConfig.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JsonConfig.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JsonConfig.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/components/JsonConfig.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapper.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapper.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapper.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapper.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapperImpl.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapperImpl.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapperImpl.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/DatabaseMapperImpl.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapper.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapper.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapper.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapper.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapperImpl.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapperImpl.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapperImpl.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SubTableMapperImpl.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapper.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapper.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapper.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapper.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapperImpl.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapperImpl.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapperImpl.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/SuperTableMapperImpl.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapper.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapper.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapper.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapper.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapperImpl.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapperImpl.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapperImpl.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/dao/TableMapperImpl.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldMeta.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldMeta.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldMeta.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldMeta.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldValue.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldValue.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldValue.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/FieldValue.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/RowValue.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/RowValue.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/RowValue.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/RowValue.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableMeta.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableMeta.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableMeta.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableMeta.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableValue.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableValue.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableValue.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SubTableValue.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SuperTableMeta.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SuperTableMeta.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SuperTableMeta.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/SuperTableMeta.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableMeta.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableMeta.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableMeta.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableMeta.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableValue.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableValue.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableValue.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TableValue.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagMeta.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagMeta.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagMeta.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagMeta.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagValue.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagValue.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagValue.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/domain/TagValue.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/AbstractService.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/AbstractService.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/AbstractService.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/AbstractService.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/DatabaseService.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/DatabaseService.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/DatabaseService.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/DatabaseService.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/QueryService.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/QueryService.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/QueryService.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/QueryService.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SqlExecuteTask.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SqlExecuteTask.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SqlExecuteTask.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SqlExecuteTask.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SubTableService.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SubTableService.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SubTableService.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SubTableService.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SuperTableService.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SuperTableService.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SuperTableService.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/SuperTableService.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/TableService.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/TableService.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/TableService.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/TableService.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/FieldValueGenerator.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/FieldValueGenerator.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/FieldValueGenerator.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/FieldValueGenerator.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableMetaGenerator.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableMetaGenerator.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableMetaGenerator.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableMetaGenerator.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableValueGenerator.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableValueGenerator.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableValueGenerator.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SubTableValueGenerator.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SuperTableMetaGenerator.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SuperTableMetaGenerator.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SuperTableMetaGenerator.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/SuperTableMetaGenerator.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/TagValueGenerator.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/TagValueGenerator.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/TagValueGenerator.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/service/data/TagValueGenerator.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/DataGenerator.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/DataGenerator.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/DataGenerator.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/DataGenerator.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/Printer.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/Printer.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/Printer.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/Printer.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/SqlSpeller.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/SqlSpeller.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/SqlSpeller.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/SqlSpeller.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TaosConstants.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TaosConstants.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TaosConstants.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TaosConstants.java
diff --git a/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TimeStampUtil.java b/docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TimeStampUtil.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TimeStampUtil.java
rename to docs/examples/JDBC/taosdemo/src/main/java/com/taosdata/taosdemo/utils/TimeStampUtil.java
diff --git a/examples/JDBC/taosdemo/src/main/resources/application.properties b/docs/examples/JDBC/taosdemo/src/main/resources/application.properties
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/resources/application.properties
rename to docs/examples/JDBC/taosdemo/src/main/resources/application.properties
diff --git a/examples/JDBC/taosdemo/src/main/resources/insert.json b/docs/examples/JDBC/taosdemo/src/main/resources/insert.json
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/resources/insert.json
rename to docs/examples/JDBC/taosdemo/src/main/resources/insert.json
diff --git a/examples/JDBC/taosdemo/src/main/resources/log4j.properties b/docs/examples/JDBC/taosdemo/src/main/resources/log4j.properties
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/resources/log4j.properties
rename to docs/examples/JDBC/taosdemo/src/main/resources/log4j.properties
diff --git a/examples/JDBC/taosdemo/src/main/resources/query.json b/docs/examples/JDBC/taosdemo/src/main/resources/query.json
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/resources/query.json
rename to docs/examples/JDBC/taosdemo/src/main/resources/query.json
diff --git a/examples/JDBC/taosdemo/src/main/resources/templates/index.html b/docs/examples/JDBC/taosdemo/src/main/resources/templates/index.html
similarity index 100%
rename from examples/JDBC/taosdemo/src/main/resources/templates/index.html
rename to docs/examples/JDBC/taosdemo/src/main/resources/templates/index.html
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/DatabaseServiceTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/DatabaseServiceTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/DatabaseServiceTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/DatabaseServiceTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/QueryServiceTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/QueryServiceTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/QueryServiceTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/QueryServiceTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SubTableServiceTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SubTableServiceTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SubTableServiceTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SubTableServiceTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SuperTableServiceTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SuperTableServiceTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SuperTableServiceTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/SuperTableServiceTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/FieldValueGeneratorTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/FieldValueGeneratorTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/FieldValueGeneratorTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/FieldValueGeneratorTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SubTableMetaGeneratorTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SubTableMetaGeneratorTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SubTableMetaGeneratorTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SubTableMetaGeneratorTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SuperTableMetaGeneratorImplTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SuperTableMetaGeneratorImplTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SuperTableMetaGeneratorImplTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/SuperTableMetaGeneratorImplTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/TagValueGeneratorTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/TagValueGeneratorTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/TagValueGeneratorTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/service/data/TagValueGeneratorTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/DataGeneratorTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/DataGeneratorTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/DataGeneratorTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/DataGeneratorTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/SqlSpellerTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/SqlSpellerTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/SqlSpellerTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/SqlSpellerTest.java
diff --git a/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/TimeStampUtilTest.java b/docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/TimeStampUtilTest.java
similarity index 100%
rename from examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/TimeStampUtilTest.java
rename to docs/examples/JDBC/taosdemo/src/test/java/com/taosdata/taosdemo/utils/TimeStampUtilTest.java
diff --git a/docs/examples/c/asyncdemo.c b/docs/examples/c/asyncdemo.c
new file mode 100644
index 0000000000..91ec6f24b1
--- /dev/null
+++ b/docs/examples/c/asyncdemo.c
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+// TAOS asynchronous API example
+// this example opens multiple tables, insert/retrieve multiple tables
+// it is used by TAOS internally for one performance testing
+// to compiple: gcc -o asyncdemo asyncdemo.c -ltaos
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "taos.h"
+
+int points = 5;
+int numOfTables = 3;
+int tablesInsertProcessed = 0;
+int tablesSelectProcessed = 0;
+int64_t st, et;
+
+typedef struct {
+ int id;
+ TAOS *taos;
+ char name[32];
+ time_t timeStamp;
+ int value;
+ int rowsInserted;
+ int rowsTried;
+ int rowsRetrieved;
+} STable;
+
+void taos_insert_call_back(void *param, TAOS_RES *tres, int code);
+void taos_select_call_back(void *param, TAOS_RES *tres, int code);
+void shellPrintError(TAOS *taos);
+
+static void queryDB(TAOS *taos, char *command) {
+ int i;
+ TAOS_RES *pSql = NULL;
+ int32_t code = -1;
+
+ for (i = 0; i < 5; i++) {
+ if (NULL != pSql) {
+ taos_free_result(pSql);
+ pSql = NULL;
+ }
+
+ pSql = taos_query(taos, command);
+ code = taos_errno(pSql);
+ if (0 == code) {
+ break;
+ }
+ }
+
+ if (code != 0) {
+ fprintf(stderr, "Failed to run %s, reason: %s\n", command, taos_errstr(pSql));
+ taos_free_result(pSql);
+ taos_close(taos);
+ taos_cleanup();
+ exit(EXIT_FAILURE);
+ }
+
+ taos_free_result(pSql);
+}
+
+int main(int argc, char *argv[])
+{
+ TAOS *taos;
+ struct timeval systemTime;
+ int i;
+ char sql[1024] = { 0 };
+ char prefix[20] = { 0 };
+ char db[128] = { 0 };
+ STable *tableList;
+
+ if (argc != 5) {
+ printf("usage: %s server-ip dbname rowsPerTable numOfTables\n", argv[0]);
+ exit(0);
+ }
+
+ // a simple way to parse input parameters
+ if (argc >= 3) strncpy(db, argv[2], sizeof(db) - 1);
+ if (argc >= 4) points = atoi(argv[3]);
+ if (argc >= 5) numOfTables = atoi(argv[4]);
+
+ size_t size = sizeof(STable) * (size_t)numOfTables;
+ tableList = (STable *)malloc(size);
+ memset(tableList, 0, size);
+
+ taos = taos_connect(argv[1], "root", "taosdata", NULL, 0);
+ if (taos == NULL)
+ shellPrintError(taos);
+
+ printf("success to connect to server\n");
+
+ sprintf(sql, "drop database if exists %s", db);
+ queryDB(taos, sql);
+
+ sprintf(sql, "create database %s", db);
+ queryDB(taos, sql);
+
+ sprintf(sql, "use %s", db);
+ queryDB(taos, sql);
+
+ strcpy(prefix, "asytbl_");
+ for (i = 0; i < numOfTables; ++i) {
+ tableList[i].id = i;
+ tableList[i].taos = taos;
+ sprintf(tableList[i].name, "%s%d", prefix, i);
+ sprintf(sql, "create table %s%d (ts timestamp, volume bigint)", prefix, i);
+ queryDB(taos, sql);
+ }
+
+ gettimeofday(&systemTime, NULL);
+ for (i = 0; i < numOfTables; ++i)
+ tableList[i].timeStamp = (time_t)(systemTime.tv_sec) * 1000 + systemTime.tv_usec / 1000;
+
+ printf("success to create tables, press any key to insert\n");
+ getchar();
+
+ printf("start to insert...\n");
+ gettimeofday(&systemTime, NULL);
+ st = systemTime.tv_sec * 1000000 + systemTime.tv_usec;
+
+ tablesInsertProcessed = 0;
+ tablesSelectProcessed = 0;
+
+ for (i = 0; irowsTried++;
+
+ if (code < 0) {
+ printf("%s insert failed, code:%d, rows:%d\n", pTable->name, code, pTable->rowsTried);
+ }
+ else if (code == 0) {
+ printf("%s not inserted\n", pTable->name);
+ }
+ else {
+ pTable->rowsInserted++;
+ }
+
+ if (pTable->rowsTried < points) {
+ // for this demo, insert another record
+ sprintf(sql, "insert into %s values(%ld, %d)", pTable->name, 1546300800000+pTable->rowsTried*1000, pTable->rowsTried);
+ taos_query_a(pTable->taos, sql, taos_insert_call_back, (void *)pTable);
+ }
+ else {
+ printf("%d rows data are inserted into %s\n", points, pTable->name);
+ tablesInsertProcessed++;
+ if (tablesInsertProcessed >= numOfTables) {
+ gettimeofday(&systemTime, NULL);
+ et = systemTime.tv_sec * 1000000 + systemTime.tv_usec;
+ printf("%" PRId64 " mseconds to insert %d data points\n", (et - st) / 1000, points*numOfTables);
+ }
+ }
+
+ taos_free_result(tres);
+}
+
+void taos_retrieve_call_back(void *param, TAOS_RES *tres, int numOfRows)
+{
+ STable *pTable = (STable *)param;
+ struct timeval systemTime;
+
+ if (numOfRows > 0) {
+
+ for (int i = 0; irowsRetrieved += numOfRows;
+
+ // retrieve next batch of rows
+ taos_fetch_rows_a(tres, taos_retrieve_call_back, pTable);
+
+ }
+ else {
+ if (numOfRows < 0)
+ printf("%s retrieve failed, code:%d\n", pTable->name, numOfRows);
+
+ //taos_free_result(tres);
+ printf("%d rows data retrieved from %s\n", pTable->rowsRetrieved, pTable->name);
+
+ tablesSelectProcessed++;
+ if (tablesSelectProcessed >= numOfTables) {
+ gettimeofday(&systemTime, NULL);
+ et = systemTime.tv_sec * 1000000 + systemTime.tv_usec;
+ printf("%" PRId64 " mseconds to query %d data rows\n", (et - st) / 1000, points * numOfTables);
+ }
+
+ taos_free_result(tres);
+ }
+
+
+}
+
+void taos_select_call_back(void *param, TAOS_RES *tres, int code)
+{
+ STable *pTable = (STable *)param;
+
+ if (code == 0 && tres) {
+ // asynchronous API to fetch a batch of records
+ taos_fetch_rows_a(tres, taos_retrieve_call_back, pTable);
+ }
+ else {
+ printf("%s select failed, code:%d\n", pTable->name, code);
+ taos_free_result(tres);
+ taos_cleanup();
+ exit(1);
+ }
+}
diff --git a/docs/examples/c/demo.c b/docs/examples/c/demo.c
new file mode 100644
index 0000000000..0351aecbd1
--- /dev/null
+++ b/docs/examples/c/demo.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+// TAOS standard API example. The same syntax as MySQL, but only a subset
+// to compile: gcc -o demo demo.c -ltaos
+
+#include
+#include
+#include
+#include
+#include "taos.h" // TAOS header file
+
+static void queryDB(TAOS *taos, char *command) {
+ int i;
+ TAOS_RES *pSql = NULL;
+ int32_t code = -1;
+
+ for (i = 0; i < 5; i++) {
+ if (NULL != pSql) {
+ taos_free_result(pSql);
+ pSql = NULL;
+ }
+
+ pSql = taos_query(taos, command);
+ code = taos_errno(pSql);
+ if (0 == code) {
+ break;
+ }
+ }
+
+ if (code != 0) {
+ fprintf(stderr, "Failed to run %s, reason: %s\n", command, taos_errstr(pSql));
+ taos_free_result(pSql);
+ taos_close(taos);
+ exit(EXIT_FAILURE);
+ }
+
+ taos_free_result(pSql);
+}
+
+void Test(TAOS *taos, char *qstr, int i);
+
+int main(int argc, char *argv[]) {
+ char qstr[1024];
+
+ // connect to server
+ if (argc < 2) {
+ printf("please input server-ip \n");
+ return 0;
+ }
+
+ TAOS *taos = taos_connect(argv[1], "root", "taosdata", NULL, 0);
+ if (taos == NULL) {
+ printf("failed to connect to server, reason:%s\n", taos_errstr(NULL));
+ exit(1);
+ }
+ for (int i = 0; i < 100; i++) {
+ Test(taos, qstr, i);
+ }
+ taos_close(taos);
+ taos_cleanup();
+}
+void Test(TAOS *taos, char *qstr, int index) {
+ printf("==================test at %d\n================================", index);
+ queryDB(taos, "drop database if exists demo");
+ queryDB(taos, "create database demo");
+ TAOS_RES *result;
+ queryDB(taos, "use demo");
+
+ queryDB(taos, "create table m1 (ts timestamp, ti tinyint, si smallint, i int, bi bigint, f float, d double, b binary(10))");
+ printf("success to create table\n");
+
+ int i = 0;
+ for (i = 0; i < 10; ++i) {
+ sprintf(qstr, "insert into m1 values (%" PRId64 ", %d, %d, %d, %d, %f, %lf, '%s')", (uint64_t)(1546300800000 + i * 1000), i, i, i, i*10000000, i*1.0, i*2.0, "hello");
+ printf("qstr: %s\n", qstr);
+
+ // note: how do you wanna do if taos_query returns non-NULL
+ // if (taos_query(taos, qstr)) {
+ // printf("insert row: %i, reason:%s\n", i, taos_errstr(taos));
+ // }
+ TAOS_RES *result1 = taos_query(taos, qstr);
+ if (result1 == NULL || taos_errno(result1) != 0) {
+ printf("failed to insert row, reason:%s\n", taos_errstr(result1));
+ taos_free_result(result1);
+ exit(1);
+ } else {
+ printf("insert row: %i\n", i);
+ }
+ taos_free_result(result1);
+ }
+ printf("success to insert rows, total %d rows\n", i);
+
+ // query the records
+ sprintf(qstr, "SELECT * FROM m1");
+ result = taos_query(taos, qstr);
+ if (result == NULL || taos_errno(result) != 0) {
+ printf("failed to select, reason:%s\n", taos_errstr(result));
+ taos_free_result(result);
+ exit(1);
+ }
+
+ TAOS_ROW row;
+ int rows = 0;
+ int num_fields = taos_field_count(result);
+ TAOS_FIELD *fields = taos_fetch_fields(result);
+
+ printf("num_fields = %d\n", num_fields);
+ printf("select * from table, result:\n");
+ // fetch the records row by row
+ while ((row = taos_fetch_row(result))) {
+ char temp[1024] = {0};
+ rows++;
+ taos_print_row(temp, row, fields, num_fields);
+ printf("%s\n", temp);
+ }
+
+ taos_free_result(result);
+ printf("====demo end====\n\n");
+}
+
diff --git a/docs/examples/c/prepare.c b/docs/examples/c/prepare.c
new file mode 100644
index 0000000000..aee8400663
--- /dev/null
+++ b/docs/examples/c/prepare.c
@@ -0,0 +1,235 @@
+// TAOS standard API example. The same syntax as MySQL, but only a subet
+// to compile: gcc -o prepare prepare.c -ltaos
+
+#include
+#include
+#include
+#include "taos.h"
+
+void taosMsleep(int mseconds);
+
+int main(int argc, char *argv[])
+{
+ TAOS *taos;
+ TAOS_RES *result;
+ int code;
+ TAOS_STMT *stmt;
+
+ // connect to server
+ if (argc < 2) {
+ printf("please input server ip \n");
+ return 0;
+ }
+
+ taos = taos_connect(argv[1], "root", "taosdata", NULL, 0);
+ if (taos == NULL) {
+ printf("failed to connect to db, reason:%s\n", taos_errstr(taos));
+ exit(1);
+ }
+
+ result = taos_query(taos, "drop database demo");
+ taos_free_result(result);
+
+ result = taos_query(taos, "create database demo");
+ code = taos_errno(result);
+ if (code != 0) {
+ printf("failed to create database, reason:%s\n", taos_errstr(result));
+ taos_free_result(result);
+ exit(1);
+ }
+ taos_free_result(result);
+
+ result = taos_query(taos, "use demo");
+ taos_free_result(result);
+
+ // create table
+ const char* sql = "create table m1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin binary(40), blob nchar(10), varbin varbinary(16))";
+ result = taos_query(taos, sql);
+ code = taos_errno(result);
+ if (code != 0) {
+ printf("failed to create table, reason:%s\n", taos_errstr(result));
+ taos_free_result(result);
+ exit(1);
+ }
+ taos_free_result(result);
+
+ // sleep for one second to make sure table is created on data node
+ // taosMsleep(1000);
+
+ // insert 10 records
+ struct {
+ int64_t ts;
+ int8_t b;
+ int8_t v1;
+ int16_t v2;
+ int32_t v4;
+ int64_t v8;
+ float f4;
+ double f8;
+ char bin[40];
+ char blob[80];
+ int8_t varbin[16];
+ } v = {0};
+
+ int32_t boolLen = sizeof(int8_t);
+ int32_t sintLen = sizeof(int16_t);
+ int32_t intLen = sizeof(int32_t);
+ int32_t bintLen = sizeof(int64_t);
+ int32_t floatLen = sizeof(float);
+ int32_t doubleLen = sizeof(double);
+ int32_t binLen = sizeof(v.bin);
+ int32_t ncharLen = 30;
+
+ stmt = taos_stmt_init(taos);
+ TAOS_MULTI_BIND params[11];
+ params[0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
+ params[0].buffer_length = sizeof(v.ts);
+ params[0].buffer = &v.ts;
+ params[0].length = &bintLen;
+ params[0].is_null = NULL;
+ params[0].num = 1;
+
+ params[1].buffer_type = TSDB_DATA_TYPE_BOOL;
+ params[1].buffer_length = sizeof(v.b);
+ params[1].buffer = &v.b;
+ params[1].length = &boolLen;
+ params[1].is_null = NULL;
+ params[1].num = 1;
+
+ params[2].buffer_type = TSDB_DATA_TYPE_TINYINT;
+ params[2].buffer_length = sizeof(v.v1);
+ params[2].buffer = &v.v1;
+ params[2].length = &boolLen;
+ params[2].is_null = NULL;
+ params[2].num = 1;
+
+ params[3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
+ params[3].buffer_length = sizeof(v.v2);
+ params[3].buffer = &v.v2;
+ params[3].length = &sintLen;
+ params[3].is_null = NULL;
+ params[3].num = 1;
+
+ params[4].buffer_type = TSDB_DATA_TYPE_INT;
+ params[4].buffer_length = sizeof(v.v4);
+ params[4].buffer = &v.v4;
+ params[4].length = &intLen;
+ params[4].is_null = NULL;
+ params[4].num = 1;
+
+ params[5].buffer_type = TSDB_DATA_TYPE_BIGINT;
+ params[5].buffer_length = sizeof(v.v8);
+ params[5].buffer = &v.v8;
+ params[5].length = &bintLen;
+ params[5].is_null = NULL;
+ params[5].num = 1;
+
+ params[6].buffer_type = TSDB_DATA_TYPE_FLOAT;
+ params[6].buffer_length = sizeof(v.f4);
+ params[6].buffer = &v.f4;
+ params[6].length = &floatLen;
+ params[6].is_null = NULL;
+ params[6].num = 1;
+
+ params[7].buffer_type = TSDB_DATA_TYPE_DOUBLE;
+ params[7].buffer_length = sizeof(v.f8);
+ params[7].buffer = &v.f8;
+ params[7].length = &doubleLen;
+ params[7].is_null = NULL;
+ params[7].num = 1;
+
+ params[8].buffer_type = TSDB_DATA_TYPE_BINARY;
+ params[8].buffer_length = sizeof(v.bin);
+ params[8].buffer = v.bin;
+ params[8].length = &binLen;
+ params[8].is_null = NULL;
+ params[8].num = 1;
+
+ strcpy(v.blob, "一二三四五六七八九十");
+ params[9].buffer_type = TSDB_DATA_TYPE_NCHAR;
+ params[9].buffer_length = sizeof(v.blob);
+ params[9].buffer = v.blob;
+ params[9].length = &ncharLen;
+ params[9].is_null = NULL;
+ params[9].num = 1;
+
+ int8_t tmp[16] = {'a', 0, 1, 13, '1'};
+ int32_t vbinLen = 5;
+ memcpy(v.varbin, tmp, sizeof(v.varbin));
+ params[10].buffer_type = TSDB_DATA_TYPE_VARBINARY;
+ params[10].buffer_length = sizeof(v.varbin);
+ params[10].buffer = v.varbin;
+ params[10].length = &vbinLen;
+ params[10].is_null = NULL;
+ params[10].num = 1;
+
+ char is_null = 1;
+
+ sql = "insert into m1 values(?,?,?,?,?,?,?,?,?,?,?)";
+ code = taos_stmt_prepare(stmt, sql, 0);
+ if (code != 0){
+ printf("failed to execute taos_stmt_prepare. code:0x%x\n", code);
+ }
+ v.ts = 1591060628000;
+ for (int i = 0; i < 10; ++i) {
+ v.ts += 1;
+ for (int j = 1; j < 11; ++j) {
+ params[j].is_null = ((i == j) ? &is_null : 0);
+ }
+ v.b = (int8_t)i % 2;
+ v.v1 = (int8_t)i;
+ v.v2 = (int16_t)(i * 2);
+ v.v4 = (int32_t)(i * 4);
+ v.v8 = (int64_t)(i * 8);
+ v.f4 = (float)(i * 40);
+ v.f8 = (double)(i * 80);
+ for (int j = 0; j < sizeof(v.bin); ++j) {
+ v.bin[j] = (char)(i + '0');
+ }
+
+ taos_stmt_bind_param(stmt, params);
+ taos_stmt_add_batch(stmt);
+ }
+ if (taos_stmt_execute(stmt) != 0) {
+ printf("failed to execute insert statement.\n");
+ exit(1);
+ }
+ taos_stmt_close(stmt);
+
+ // query the records
+ stmt = taos_stmt_init(taos);
+ taos_stmt_prepare(stmt, "SELECT * FROM m1 WHERE v1 > ? AND v2 < ?", 0);
+ v.v1 = 5;
+ v.v2 = 15;
+ taos_stmt_bind_param(stmt, params + 2);
+ if (taos_stmt_execute(stmt) != 0) {
+ printf("failed to execute select statement.\n");
+ exit(1);
+ }
+
+ result = taos_stmt_use_result(stmt);
+
+ TAOS_ROW row;
+ int rows = 0;
+ int num_fields = taos_num_fields(result);
+ TAOS_FIELD *fields = taos_fetch_fields(result);
+
+ // fetch the records row by row
+ while ((row = taos_fetch_row(result))) {
+ char temp[256] = {0};
+ rows++;
+ taos_print_row(temp, row, fields, num_fields);
+ printf("%s\n", temp);
+ }
+ if (rows == 2) {
+ printf("two rows are fetched as expectation\n");
+ } else {
+ printf("expect two rows, but %d rows are fetched\n", rows);
+ }
+
+// taos_free_result(result);
+ taos_stmt_close(stmt);
+
+ return 0;
+}
+
diff --git a/docs/examples/c/schemaless.c b/docs/examples/c/schemaless.c
new file mode 100644
index 0000000000..328a663ae7
--- /dev/null
+++ b/docs/examples/c/schemaless.c
@@ -0,0 +1,73 @@
+#include "taos.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+int numSuperTables = 8;
+int numChildTables = 4;
+int numRowsPerChildTable = 2048;
+
+static int64_t getTimeInUs() {
+ struct timeval systemTime;
+ gettimeofday(&systemTime, NULL);
+ return (int64_t)systemTime.tv_sec * 1000000L + (int64_t)systemTime.tv_usec;
+}
+
+int main(int argc, char* argv[]) {
+ TAOS_RES *result;
+ const char* host = "127.0.0.1";
+ const char* user = "root";
+ const char* passwd = "taosdata";
+
+ taos_options(TSDB_OPTION_TIMEZONE, "GMT-8");
+ TAOS* taos = taos_connect(host, user, passwd, "", 0);
+ if (taos == NULL) {
+ printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
+ exit(1);
+ }
+
+ const char* info = taos_get_server_info(taos);
+ printf("server info: %s\n", info);
+ info = taos_get_client_info(taos);
+ printf("client info: %s\n", info);
+ result = taos_query(taos, "drop database if exists db;");
+ taos_free_result(result);
+ usleep(100000);
+ result = taos_query(taos, "create database db precision 'ms';");
+ taos_free_result(result);
+ usleep(100000);
+
+ (void)taos_select_db(taos, "db");
+
+ time_t ct = time(0);
+ int64_t ts = ct * 1000;
+ char* lineFormat = "sta%d,t0=true,t1=127i8,t2=32767i16,t3=%di32,t4=9223372036854775807i64,t9=11.12345f32,t10=22.123456789f64,t11=\"binaryTagValue\",t12=L\"ncharTagValue\" c0=true,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=254u8,c6=32770u16,c7=2147483699u32,c8=9223372036854775899u64,c9=11.12345f32,c10=22.123456789f64,c11=\"binaryValue\",c12=L\"ncharValue\" %" PRId64;
+
+ int lineNum = numSuperTables * numChildTables * numRowsPerChildTable;
+ char** lines = calloc((size_t)lineNum, sizeof(char*));
+ int l = 0;
+ for (int i = 0; i < numSuperTables; ++i) {
+ for (int j = 0; j < numChildTables; ++j) {
+ for (int k = 0; k < numRowsPerChildTable; ++k) {
+ char* line = calloc(512, 1);
+ snprintf(line, 512, lineFormat, i, j, ts + 10 * l);
+ lines[l] = line;
+ ++l;
+ }
+ }
+ }
+
+ printf("%s\n", "begin taos_insert_lines");
+ int64_t begin = getTimeInUs();
+ TAOS_RES *res = taos_schemaless_insert(taos, lines, lineNum, TSDB_SML_LINE_PROTOCOL, TSDB_SML_TIMESTAMP_MILLI_SECONDS);
+ int64_t end = getTimeInUs();
+ printf("code: %s. time used: %" PRId64 "\n", taos_errstr(res), end-begin);
+ taos_free_result(res);
+
+ return 0;
+}
diff --git a/docs/examples/c/stream_demo.c b/docs/examples/c/stream_demo.c
new file mode 100644
index 0000000000..46107c7e13
--- /dev/null
+++ b/docs/examples/c/stream_demo.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+// clang-format off
+#include
+#include
+#include
+#include
+#include "taos.h"
+
+int32_t init_env() {
+ TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
+ if (pConn == NULL) {
+ return -1;
+ }
+
+ TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2");
+ if (taos_errno(pRes) != 0) {
+ printf("error in create db, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+#if 0
+ pRes = taos_query(pConn, "create database if not exists abc2 vgroups 20");
+ if (taos_errno(pRes) != 0) {
+ printf("error in create db, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+#endif
+
+ pRes = taos_query(pConn, "use abc1");
+ if (taos_errno(pRes) != 0) {
+ printf("error in use db, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int, j varchar(20)) tags(a varchar(20))");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create table if not exists tu1 using st1 tags('c1')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create table if not exists tu2 using st1 tags('c2')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create child table tu2, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create table if not exists tu3 using st1 tags('c3')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create child table tu3, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ return 0;
+}
+
+int32_t create_stream() {
+ printf("create stream\n");
+ TAOS_RES* pRes;
+ TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
+ if (pConn == NULL) {
+ return -1;
+ }
+
+ pRes = taos_query(pConn, "use abc1");
+ if (taos_errno(pRes) != 0) {
+ printf("error in use db, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn,
+ /*"create stream stream1 trigger at_once watermark 10s into outstb as select _wstart start, avg(k) from st1 partition by tbname interval(10s)");*/
+ "create stream stream2 into outstb subtable(concat(concat(concat('prefix_', tname), '_suffix_'), cast(k1 as varchar(20)))) as select _wstart wstart, avg(k) from st1 partition by tbname tname, a k1 interval(10s);");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create stream stream1, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+ taos_close(pConn);
+ return 0;
+}
+
+int main(int argc, char* argv[]) {
+ if (argc > 1) {
+ printf("env init\n");
+ int code = init_env();
+ if (code) {
+ return code;
+ }
+
+ }
+ create_stream();
+}
diff --git a/docs/examples/c/tmq.c b/docs/examples/c/tmq.c
new file mode 100644
index 0000000000..46dd3bb551
--- /dev/null
+++ b/docs/examples/c/tmq.c
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 2019 TAOS Data, Inc.
+ *
+ * This program is free software: you can use, redistribute, and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3
+ * or later ("AGPL"), as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include "taos.h"
+
+static int running = 1;
+const char* topic_name = "topicname";
+
+static int32_t msg_process(TAOS_RES* msg) {
+ char buf[1024];
+ int32_t rows = 0;
+
+ const char* topicName = tmq_get_topic_name(msg);
+ const char* dbName = tmq_get_db_name(msg);
+ int32_t vgroupId = tmq_get_vgroup_id(msg);
+
+ printf("topic: %s\n", topicName);
+ printf("db: %s\n", dbName);
+ printf("vgroup id: %d\n", vgroupId);
+
+ while (1) {
+ TAOS_ROW row = taos_fetch_row(msg);
+ if (row == NULL) break;
+
+ TAOS_FIELD* fields = taos_fetch_fields(msg);
+ int32_t numOfFields = taos_field_count(msg);
+ // int32_t* length = taos_fetch_lengths(msg);
+ int32_t precision = taos_result_precision(msg);
+ rows++;
+ taos_print_row(buf, row, fields, numOfFields);
+ printf("precision: %d, row content: %s\n", precision, buf);
+ }
+
+ return rows;
+}
+
+static int32_t init_env() {
+ TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
+ if (pConn == NULL) {
+ return -1;
+ }
+
+ TAOS_RES* pRes;
+ // drop database if exists
+ printf("create database\n");
+ pRes = taos_query(pConn, "drop topic topicname");
+ if (taos_errno(pRes) != 0) {
+ printf("error in drop topicname, reason:%s\n", taos_errstr(pRes));
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "drop database if exists tmqdb");
+ if (taos_errno(pRes) != 0) {
+ printf("error in drop tmqdb, reason:%s\n", taos_errstr(pRes));
+ }
+ taos_free_result(pRes);
+
+ // create database
+ pRes = taos_query(pConn, "create database tmqdb precision 'ns' WAL_RETENTION_PERIOD 3600");
+ if (taos_errno(pRes) != 0) {
+ printf("error in create tmqdb, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ // create super table
+ printf("create super table\n");
+ pRes = taos_query(
+ pConn, "create table tmqdb.stb (ts timestamp, c1 int, c2 float, c3 varchar(16)) tags(t1 int, t3 varchar(16))");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create super table stb, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ // create sub tables
+ printf("create sub tables\n");
+ pRes = taos_query(pConn, "create table tmqdb.ctb0 using tmqdb.stb tags(0, 'subtable0')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create super table ctb0, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create table tmqdb.ctb1 using tmqdb.stb tags(1, 'subtable1')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create super table ctb1, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create table tmqdb.ctb2 using tmqdb.stb tags(2, 'subtable2')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create super table ctb2, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create table tmqdb.ctb3 using tmqdb.stb tags(3, 'subtable3')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create super table ctb3, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ // insert data
+ printf("insert data into sub tables\n");
+ pRes = taos_query(pConn, "insert into tmqdb.ctb0 values(now, 0, 0, 'a0')(now+1s, 0, 0, 'a00')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to insert into ctb0, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "insert into tmqdb.ctb1 values(now, 1, 1, 'a1')(now+1s, 11, 11, 'a11')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to insert into ctb0, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "insert into tmqdb.ctb2 values(now, 2, 2, 'a1')(now+1s, 22, 22, 'a22')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to insert into ctb0, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "insert into tmqdb.ctb3 values(now, 3, 3, 'a1')(now+1s, 33, 33, 'a33')");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to insert into ctb0, reason:%s\n", taos_errstr(pRes));
+ goto END;
+ }
+ taos_free_result(pRes);
+ taos_close(pConn);
+ return 0;
+
+END:
+ taos_free_result(pRes);
+ taos_close(pConn);
+ return -1;
+}
+
+int32_t create_topic() {
+ printf("create topic\n");
+ TAOS_RES* pRes;
+ TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
+ if (pConn == NULL) {
+ return -1;
+ }
+
+ pRes = taos_query(pConn, "use tmqdb");
+ if (taos_errno(pRes) != 0) {
+ printf("error in use tmqdb, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ pRes = taos_query(pConn, "create topic topicname as select ts, c1, c2, c3, tbname from tmqdb.stb where c1 > 1");
+ if (taos_errno(pRes) != 0) {
+ printf("failed to create topic topicname, reason:%s\n", taos_errstr(pRes));
+ return -1;
+ }
+ taos_free_result(pRes);
+
+ taos_close(pConn);
+ return 0;
+}
+
+void tmq_commit_cb_print(tmq_t* tmq, int32_t code, void* param) {
+ printf("tmq_commit_cb_print() code: %d, tmq: %p, param: %p\n", code, tmq, param);
+}
+
+tmq_t* build_consumer() {
+ tmq_conf_res_t code;
+ tmq_t* tmq = NULL;
+
+ tmq_conf_t* conf = tmq_conf_new();
+ code = tmq_conf_set(conf, "enable.auto.commit", "true");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+ code = tmq_conf_set(conf, "auto.commit.interval.ms", "1000");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+ code = tmq_conf_set(conf, "group.id", "cgrpName");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+ code = tmq_conf_set(conf, "client.id", "user defined name");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+ code = tmq_conf_set(conf, "td.connect.user", "root");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+ code = tmq_conf_set(conf, "td.connect.pass", "taosdata");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+ code = tmq_conf_set(conf, "auto.offset.reset", "earliest");
+ if (TMQ_CONF_OK != code) {
+ tmq_conf_destroy(conf);
+ return NULL;
+ }
+
+ tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL);
+ tmq = tmq_consumer_new(conf, NULL, 0);
+
+_end:
+ tmq_conf_destroy(conf);
+ return tmq;
+}
+
+tmq_list_t* build_topic_list() {
+ tmq_list_t* topicList = tmq_list_new();
+ int32_t code = tmq_list_append(topicList, topic_name);
+ if (code) {
+ tmq_list_destroy(topicList);
+ return NULL;
+ }
+ return topicList;
+}
+
+void basic_consume_loop(tmq_t* tmq) {
+ int32_t totalRows = 0;
+ int32_t msgCnt = 0;
+ int32_t timeout = 5000;
+ while (running) {
+ TAOS_RES* tmqmsg = tmq_consumer_poll(tmq, timeout);
+ if (tmqmsg) {
+ msgCnt++;
+ totalRows += msg_process(tmqmsg);
+ taos_free_result(tmqmsg);
+ } else {
+ break;
+ }
+ }
+
+ fprintf(stderr, "%d msg consumed, include %d rows\n", msgCnt, totalRows);
+}
+
+void consume_repeatly(tmq_t* tmq) {
+ int32_t numOfAssignment = 0;
+ tmq_topic_assignment* pAssign = NULL;
+
+ int32_t code = tmq_get_topic_assignment(tmq, topic_name, &pAssign, &numOfAssignment);
+ if (code != 0) {
+ fprintf(stderr, "failed to get assignment, reason:%s", tmq_err2str(code));
+ }
+
+ // seek to the earliest offset
+ for(int32_t i = 0; i < numOfAssignment; ++i) {
+ tmq_topic_assignment* p = &pAssign[i];
+
+ code = tmq_offset_seek(tmq, topic_name, p->vgId, p->begin);
+ if (code != 0) {
+ fprintf(stderr, "failed to seek to %d, reason:%s", (int)p->begin, tmq_err2str(code));
+ }
+ }
+
+ tmq_free_assignment(pAssign);
+
+ // let's do it again
+ basic_consume_loop(tmq);
+}
+
+int main(int argc, char* argv[]) {
+ int32_t code;
+
+ if (init_env() < 0) {
+ return -1;
+ }
+
+ if (create_topic() < 0) {
+ return -1;
+ }
+
+ tmq_t* tmq = build_consumer();
+ if (NULL == tmq) {
+ fprintf(stderr, "build_consumer() fail!\n");
+ return -1;
+ }
+
+ tmq_list_t* topic_list = build_topic_list();
+ if (NULL == topic_list) {
+ return -1;
+ }
+
+ if ((code = tmq_subscribe(tmq, topic_list))) {
+ fprintf(stderr, "Failed to tmq_subscribe(): %s\n", tmq_err2str(code));
+ }
+
+ tmq_list_destroy(topic_list);
+
+ basic_consume_loop(tmq);
+
+ consume_repeatly(tmq);
+
+ code = tmq_consumer_close(tmq);
+ if (code) {
+ fprintf(stderr, "Failed to close consumer: %s\n", tmq_err2str(code));
+ } else {
+ fprintf(stderr, "Consumer closed\n");
+ }
+
+ return 0;
+}
diff --git a/docs/examples/rust/nativeexample/examples/bind-tags.rs b/docs/examples/rust/nativeexample/examples/bind-tags.rs
new file mode 100644
index 0000000000..a1f7286625
--- /dev/null
+++ b/docs/examples/rust/nativeexample/examples/bind-tags.rs
@@ -0,0 +1,80 @@
+use anyhow::Result;
+use serde::Deserialize;
+use taos::*;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let taos = TaosBuilder::from_dsn("taos://")?.build()?;
+ taos.exec_many([
+ "drop database if exists test",
+ "create database test keep 36500",
+ "use test",
+ "create table tb1 (ts timestamp, c1 bool, c2 tinyint, c3 smallint, c4 int, c5 bigint,
+ c6 tinyint unsigned, c7 smallint unsigned, c8 int unsigned, c9 bigint unsigned,
+ c10 float, c11 double, c12 varchar(100), c13 nchar(100)) tags(t1 varchar(100))",
+ ])
+ .await?;
+ let mut stmt = Stmt::init(&taos)?;
+ stmt.prepare(
+ "insert into ? using tb1 tags(?) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ )?;
+ stmt.set_tbname("d0")?;
+ stmt.set_tags(&[Value::VarChar("涛思".to_string())])?;
+
+ let params = vec![
+ ColumnView::from_millis_timestamp(vec![164000000000]),
+ ColumnView::from_bools(vec![true]),
+ ColumnView::from_tiny_ints(vec![i8::MAX]),
+ ColumnView::from_small_ints(vec![i16::MAX]),
+ ColumnView::from_ints(vec![i32::MAX]),
+ ColumnView::from_big_ints(vec![i64::MAX]),
+ ColumnView::from_unsigned_tiny_ints(vec![u8::MAX]),
+ ColumnView::from_unsigned_small_ints(vec![u16::MAX]),
+ ColumnView::from_unsigned_ints(vec![u32::MAX]),
+ ColumnView::from_unsigned_big_ints(vec![u64::MAX]),
+ ColumnView::from_floats(vec![f32::MAX]),
+ ColumnView::from_doubles(vec![f64::MAX]),
+ ColumnView::from_varchar(vec!["ABC"]),
+ ColumnView::from_nchar(vec!["涛思数据"]),
+ ];
+ let rows = stmt.bind(¶ms)?.add_batch()?.execute()?;
+ assert_eq!(rows, 1);
+
+ #[derive(Debug, Deserialize)]
+ #[allow(dead_code)]
+ struct Row {
+ ts: String,
+ c1: bool,
+ c2: i8,
+ c3: i16,
+ c4: i32,
+ c5: i64,
+ c6: u8,
+ c7: u16,
+ c8: u32,
+ c9: u64,
+ c10: Option,
+ c11: f64,
+ c12: String,
+ c13: String,
+ t1: serde_json::Value,
+ }
+
+ let rows: Vec = taos
+ .query("select * from tb1")
+ .await?
+ .deserialize()
+ .try_collect()
+ .await?;
+ let row = &rows[0];
+ dbg!(&row);
+ assert_eq!(row.c5, i64::MAX);
+ assert_eq!(row.c8, u32::MAX);
+ assert_eq!(row.c9, u64::MAX);
+ assert_eq!(row.c10.unwrap(), f32::MAX);
+ // assert_eq!(row.c11, f64::MAX);
+ assert_eq!(row.c12, "ABC");
+ assert_eq!(row.c13, "涛思数据");
+
+ Ok(())
+}
diff --git a/docs/examples/rust/nativeexample/examples/bind.rs b/docs/examples/rust/nativeexample/examples/bind.rs
new file mode 100644
index 0000000000..194938a319
--- /dev/null
+++ b/docs/examples/rust/nativeexample/examples/bind.rs
@@ -0,0 +1,74 @@
+use anyhow::Result;
+use serde::Deserialize;
+use taos::*;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let taos = TaosBuilder::from_dsn("taos://")?.build()?;
+ taos.exec_many([
+ "drop database if exists test_bindable",
+ "create database test_bindable keep 36500",
+ "use test_bindable",
+ "create table tb1 (ts timestamp, c1 bool, c2 tinyint, c3 smallint, c4 int, c5 bigint,
+ c6 tinyint unsigned, c7 smallint unsigned, c8 int unsigned, c9 bigint unsigned,
+ c10 float, c11 double, c12 varchar(100), c13 nchar(100))",
+ ])
+ .await?;
+ let mut stmt = Stmt::init(&taos)?;
+ stmt.prepare("insert into tb1 values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")?;
+ let params = vec![
+ ColumnView::from_millis_timestamp(vec![0]),
+ ColumnView::from_bools(vec![true]),
+ ColumnView::from_tiny_ints(vec![i8::MAX]),
+ ColumnView::from_small_ints(vec![i16::MAX]),
+ ColumnView::from_ints(vec![i32::MAX]),
+ ColumnView::from_big_ints(vec![i64::MAX]),
+ ColumnView::from_unsigned_tiny_ints(vec![u8::MAX]),
+ ColumnView::from_unsigned_small_ints(vec![u16::MAX]),
+ ColumnView::from_unsigned_ints(vec![u32::MAX]),
+ ColumnView::from_unsigned_big_ints(vec![u64::MAX]),
+ ColumnView::from_floats(vec![f32::MAX]),
+ ColumnView::from_doubles(vec![f64::MAX]),
+ ColumnView::from_varchar(vec!["ABC"]),
+ ColumnView::from_nchar(vec!["涛思数据"]),
+ ];
+ let rows = stmt.bind(¶ms)?.add_batch()?.execute()?;
+ assert_eq!(rows, 1);
+
+ #[derive(Debug, Deserialize)]
+ #[allow(dead_code)]
+ struct Row {
+ ts: String,
+ c1: bool,
+ c2: i8,
+ c3: i16,
+ c4: i32,
+ c5: i64,
+ c6: u8,
+ c7: u16,
+ c8: u32,
+ c9: u64,
+ c10: Option,
+ c11: f64,
+ c12: String,
+ c13: String,
+ }
+
+ let rows: Vec = taos
+ .query("select * from tb1")
+ .await?
+ .deserialize()
+ .try_collect()
+ .await?;
+ let row = &rows[0];
+ dbg!(&row);
+ assert_eq!(row.c5, i64::MAX);
+ assert_eq!(row.c8, u32::MAX);
+ assert_eq!(row.c9, u64::MAX);
+ assert_eq!(row.c10.unwrap(), f32::MAX);
+ // assert_eq!(row.c11, f64::MAX);
+ assert_eq!(row.c12, "ABC");
+ assert_eq!(row.c13, "涛思数据");
+
+ Ok(())
+}
diff --git a/docs/examples/rust/nativeexample/examples/query2.rs b/docs/examples/rust/nativeexample/examples/query2.rs
new file mode 100644
index 0000000000..016b291abc
--- /dev/null
+++ b/docs/examples/rust/nativeexample/examples/query2.rs
@@ -0,0 +1,106 @@
+use std::time::Duration;
+
+use chrono::{DateTime, Local};
+use taos::*;
+
+#[tokio::main]
+async fn main() -> anyhow::Result<()> {
+ let dsn = "taos://";
+
+ let opts = PoolBuilder::new()
+ .max_size(5000) // max connections
+ .max_lifetime(Some(Duration::from_secs(60 * 60))) // lifetime of each connection
+ .min_idle(Some(1000)) // minimal idle connections
+ .connection_timeout(Duration::from_secs(2));
+
+ let pool = TaosBuilder::from_dsn(dsn)?.with_pool_builder(opts)?;
+
+ let taos = pool.get()?;
+
+ let db = "query";
+
+ // prepare database
+ taos.exec_many([
+ format!("DROP DATABASE IF EXISTS `{db}`"),
+ format!("CREATE DATABASE `{db}`"),
+ format!("USE `{db}`"),
+ ])
+ .await?;
+
+ let inserted = taos.exec_many([
+ // create super table
+ "CREATE TABLE `meters` (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT) TAGS (`groupid` INT, `location` BINARY(16))",
+ // create child table
+ "CREATE TABLE `d0` USING `meters` TAGS(0, 'Los Angles')",
+ // insert into child table
+ "INSERT INTO `d0` values(now - 10s, 10, 116, 0.32)",
+ // insert with NULL values
+ "INSERT INTO `d0` values(now - 8s, NULL, NULL, NULL)",
+ // insert and automatically create table with tags if not exists
+ "INSERT INTO `d1` USING `meters` TAGS(1, 'San Francisco') values(now - 9s, 10.1, 119, 0.33)",
+ // insert many records in a single sql
+ "INSERT INTO `d1` values (now-8s, 10, 120, 0.33) (now - 6s, 10, 119, 0.34) (now - 4s, 11.2, 118, 0.322)",
+ ]).await?;
+
+ assert_eq!(inserted, 6);
+ loop {
+ let count: usize = taos
+ .query_one("select count(*) from `meters`")
+ .await?
+ .unwrap_or_default();
+
+ if count >= 6 {
+ break;
+ } else {
+ println!("waiting for data");
+ }
+ }
+
+ let mut result = taos.query("select tbname, * from `meters`").await?;
+
+ for field in result.fields() {
+ println!("got field: {}", field.name());
+ }
+
+ // Query option 1, use rows stream.
+ let mut rows = result.rows();
+ let mut nrows = 0;
+ while let Some(row) = rows.try_next().await? {
+ for (col, (name, value)) in row.enumerate() {
+ println!(
+ "[{}] got value in col {} (named `{:>8}`): {}",
+ nrows, col, name, value
+ );
+ }
+ nrows += 1;
+ }
+
+ // Query options 2, use deserialization with serde.
+ #[derive(Debug, serde::Deserialize)]
+ #[allow(dead_code)]
+ struct Record {
+ tbname: String,
+ // deserialize timestamp to chrono::DateTime
+ ts: DateTime,
+ // float to f32
+ current: Option,
+ // int to i32
+ voltage: Option,
+ phase: Option,
+ groupid: i32,
+ // binary/varchar to String
+ location: String,
+ }
+
+ let records: Vec = taos
+ .query("select tbname, * from `meters`")
+ .await?
+ .deserialize()
+ .try_collect()
+ .await?;
+
+ dbg!(result.summary());
+ assert_eq!(records.len(), 6);
+ dbg!(records);
+ Ok(())
+}
diff --git a/docs/examples/rust/nativeexample/examples/subscribe.rs b/docs/examples/rust/nativeexample/examples/subscribe.rs
new file mode 100644
index 0000000000..9e2e890405
--- /dev/null
+++ b/docs/examples/rust/nativeexample/examples/subscribe.rs
@@ -0,0 +1,103 @@
+use std::time::Duration;
+
+use chrono::{DateTime, Local};
+use taos::*;
+
+// Query options 2, use deserialization with serde.
+#[derive(Debug, serde::Deserialize)]
+#[allow(dead_code)]
+struct Record {
+ // deserialize timestamp to chrono::DateTime
+ ts: DateTime,
+ // float to f32
+ current: Option,
+ // int to i32
+ voltage: Option,
+ phase: Option,
+}
+
+async fn prepare(taos: Taos) -> anyhow::Result<()> {
+ let inserted = taos.exec_many([
+ // create child table
+ "CREATE TABLE `d0` USING `meters` TAGS(0, 'Los Angles')",
+ // insert into child table
+ "INSERT INTO `d0` values(now - 10s, 10, 116, 0.32)",
+ // insert with NULL values
+ "INSERT INTO `d0` values(now - 8s, NULL, NULL, NULL)",
+ // insert and automatically create table with tags if not exists
+ "INSERT INTO `d1` USING `meters` TAGS(1, 'San Francisco') values(now - 9s, 10.1, 119, 0.33)",
+ // insert many records in a single sql
+ "INSERT INTO `d1` values (now-8s, 10, 120, 0.33) (now - 6s, 10, 119, 0.34) (now - 4s, 11.2, 118, 0.322)",
+ ]).await?;
+ assert_eq!(inserted, 6);
+ Ok(())
+}
+
+#[tokio::main]
+async fn main() -> anyhow::Result<()> {
+ // std::env::set_var("RUST_LOG", "debug");
+ pretty_env_logger::init();
+ let dsn = "taos://localhost:6030";
+ let builder = TaosBuilder::from_dsn(dsn)?;
+
+ let taos = builder.build()?;
+ let db = "tmq";
+
+ // prepare database
+ taos.exec_many([
+ "DROP TOPIC IF EXISTS tmq_meters".to_string(),
+ format!("DROP DATABASE IF EXISTS `{db}`"),
+ format!("CREATE DATABASE `{db}`"),
+ format!("USE `{db}`"),
+ // create super table
+ "CREATE TABLE `meters` (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT) TAGS (`groupid` INT, `location` BINARY(16))".to_string(),
+ // create topic for subscription
+ format!("CREATE TOPIC tmq_meters with META AS DATABASE {db}")
+ ])
+ .await?;
+
+ let task = tokio::spawn(prepare(taos));
+
+ tokio::time::sleep(Duration::from_secs(1)).await;
+
+ // subscribe
+ let tmq = TmqBuilder::from_dsn("taos://localhost:6030/?group.id=test")?;
+
+ let mut consumer = tmq.build()?;
+ consumer.subscribe(["tmq_meters"]).await?;
+
+ {
+ let mut stream = consumer.stream();
+
+ while let Some((offset, message)) = stream.try_next().await? {
+ // get information from offset
+
+ // the topic
+ let topic = offset.topic();
+ // the vgroup id, like partition id in kafka.
+ let vgroup_id = offset.vgroup_id();
+ println!("* in vgroup id {vgroup_id} of topic {topic}\n");
+
+ if let Some(data) = message.into_data() {
+ while let Some(block) = data.fetch_raw_block().await? {
+ // one block for one table, get table name if needed
+ let name = block.table_name();
+ let records: Vec = block.deserialize().try_collect()?;
+ println!(
+ "** table: {}, got {} records: {:#?}\n",
+ name.unwrap(),
+ records.len(),
+ records
+ );
+ }
+ }
+ consumer.commit(offset).await?;
+ }
+ }
+
+ consumer.unsubscribe().await;
+
+ task.await??;
+
+ Ok(())
+}
diff --git a/docs/examples/rust/nativeexample/examples/tmq.rs b/docs/examples/rust/nativeexample/examples/tmq.rs
index 800b66e8fe..d5feec1150 100644
--- a/docs/examples/rust/nativeexample/examples/tmq.rs
+++ b/docs/examples/rust/nativeexample/examples/tmq.rs
@@ -1,9 +1,9 @@
-use std::time::Duration;
-use std::str::FromStr;
-use chrono::Local;
use chrono::DateTime;
-use taos::*;
+use chrono::Local;
+use std::str::FromStr;
use std::thread;
+use std::time::Duration;
+use taos::*;
use tokio::runtime::Runtime;
#[tokio::main]
@@ -12,7 +12,7 @@ async fn main() -> anyhow::Result<()> {
.filter_level(log::LevelFilter::Info)
.init();
use taos_query::prelude::*;
- // ANCHOR: create_consumer_dsn
+ // ANCHOR: create_consumer_dsn
let dsn = "taos://localhost:6030".to_string();
println!("dsn: {}", dsn);
let mut dsn = Dsn::from_str(&dsn)?;
@@ -41,17 +41,25 @@ async fn main() -> anyhow::Result<()> {
// ANCHOR: create_consumer_ac
let group_id = "group1".to_string();
let client_id = "client1".to_string();
- dsn.params.insert("auto.offset.reset".to_string(), "latest".to_string());
- dsn.params.insert("msg.with.table.name".to_string(), "true".to_string());
- dsn.params.insert("enable.auto.commit".to_string(), "true".to_string());
- dsn.params.insert("auto.commit.interval.ms".to_string(), "1000".to_string());
+ dsn.params
+ .insert("auto.offset.reset".to_string(), "latest".to_string());
+ dsn.params
+ .insert("msg.with.table.name".to_string(), "true".to_string());
+ dsn.params
+ .insert("enable.auto.commit".to_string(), "true".to_string());
+ dsn.params
+ .insert("auto.commit.interval.ms".to_string(), "1000".to_string());
dsn.params.insert("group.id".to_string(), group_id.clone());
- dsn.params.insert("client.id".to_string(), client_id.clone());
+ dsn.params
+ .insert("client.id".to_string(), client_id.clone());
let builder = TmqBuilder::from_dsn(&dsn)?;
- let mut consumer = match builder.build().await{
+ let mut consumer = match builder.build().await {
Ok(consumer) => {
- println!("Create consumer successfully, dsn: {}, groupId: {}, clientId: {}.", dsn, group_id, client_id);
+ println!(
+ "Create consumer successfully, dsn: {}, groupId: {}, clientId: {}.",
+ dsn, group_id, client_id
+ );
consumer
}
Err(err) => {
@@ -61,10 +69,10 @@ async fn main() -> anyhow::Result<()> {
};
// ANCHOR_END: create_consumer_ac
- thread::spawn(move || {
+ let handle = thread::spawn(move || {
let rt = Runtime::new().unwrap();
-
rt.block_on(async {
+ tokio::time::sleep(Duration::from_secs(1)).await;
let taos_insert = TaosBuilder::from_dsn(&dsn).unwrap().build().await.unwrap();
for i in 0..50 {
let insert_sql = format!(r#"INSERT INTO
@@ -77,16 +85,17 @@ async fn main() -> anyhow::Result<()> {
tokio::time::sleep(Duration::from_millis(10)).await;
}
});
-
- }).join().unwrap();
-
+ });
// ANCHOR: consume
let topic = "topic_meters";
- match consumer.subscribe([topic]).await{
+ match consumer.subscribe([topic]).await {
Ok(_) => println!("Subscribe topics successfully."),
Err(err) => {
- eprintln!("Failed to subscribe topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}", topic, group_id, client_id, err);
+ eprintln!(
+ "Failed to subscribe topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}",
+ topic, group_id, client_id, err
+ );
return Err(err.into());
}
}
@@ -107,32 +116,36 @@ async fn main() -> anyhow::Result<()> {
}
consumer
- .stream()
- .try_for_each(|(offset, message)| async move {
- let topic = offset.topic();
- // the vgroup id, like partition id in kafka.
- let vgroup_id = offset.vgroup_id();
- println!("* in vgroup id {vgroup_id} of topic {topic}\n");
+ .stream_with_timeout(Timeout::from_secs(10))
+ .try_for_each(|(offset, message)| async move {
+ let topic = offset.topic();
+ // the vgroup id, like partition id in kafka.
+ let vgroup_id = offset.vgroup_id();
+ println!("* in vgroup id {vgroup_id} of topic {topic}\n");
- if let Some(data) = message.into_data() {
- while let Some(block) = data.fetch_raw_block().await? {
- let records: Vec = block.deserialize().try_collect()?;
- // Add your data processing logic here
- println!("** read {} records: {:#?}\n", records.len(), records);
+ if let Some(data) = message.into_data() {
+ while let Some(block) = data.fetch_raw_block().await? {
+ let records: Vec = block.deserialize().try_collect()?;
+ // Add your data processing logic here
+ println!("** read {} records: {:#?}\n", records.len(), records);
+ }
}
- }
- Ok(())
- })
- .await.map_err(|e| {
- eprintln!("Failed to poll data, topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}", topic, group_id, client_id, e);
- e
- })?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| {
+ eprintln!(
+ "Failed to poll data, topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}",
+ topic, group_id, client_id, e
+ );
+ e
+ })?;
// ANCHOR_END: consume
- // ANCHOR: consumer_commit_manually
+ // ANCHOR: consumer_commit_manually
consumer
- .stream()
+ .stream_with_timeout(Timeout::from_secs(10))
.try_for_each(|(offset, message)| async {
// the vgroup id, like partition id in kafka.
let vgroup_id = offset.vgroup_id();
@@ -162,12 +175,14 @@ async fn main() -> anyhow::Result<()> {
})?;
// ANCHOR_END: consumer_commit_manually
-
// ANCHOR: seek_offset
- let assignments = match consumer.assignments().await{
+ let assignments = match consumer.assignments().await {
Some(assignments) => assignments,
None => {
- let error_message = format!("Failed to get assignments. topic: {}, groupId: {}, clientId: {}", topic, group_id, client_id);
+ let error_message = format!(
+ "Failed to get assignments. topic: {}, groupId: {}, clientId: {}",
+ topic, group_id, client_id
+ );
eprintln!("{}", error_message);
return Err(anyhow::anyhow!(error_message));
}
@@ -185,14 +200,10 @@ async fn main() -> anyhow::Result<()> {
let end = assignment.end();
println!(
"topic: {}, vgroup_id: {}, current offset: {}, begin {}, end: {}",
- topic,
- vgroup_id,
- current,
- begin,
- end
+ topic, vgroup_id, current, begin, end
);
- match consumer.offset_seek(topic, vgroup_id, begin).await{
+ match consumer.offset_seek(topic, vgroup_id, begin).await {
Ok(_) => (),
Err(err) => {
eprintln!("Failed to seek offset, topic: {}, groupId: {}, clientId: {}, vGroupId: {}, begin: {}, ErrMessage: {:?}",
@@ -207,10 +218,13 @@ async fn main() -> anyhow::Result<()> {
}
println!("Assignment seek to beginning successfully.");
// after seek offset
- let assignments = match consumer.assignments().await{
+ let assignments = match consumer.assignments().await {
Some(assignments) => assignments,
None => {
- let error_message = format!("Failed to get assignments. topic: {}, groupId: {}, clientId: {}", topic, group_id, client_id);
+ let error_message = format!(
+ "Failed to get assignments. topic: {}, groupId: {}, clientId: {}",
+ topic, group_id, client_id
+ );
eprintln!("{}", error_message);
return Err(anyhow::anyhow!(error_message));
}
@@ -225,10 +239,9 @@ async fn main() -> anyhow::Result<()> {
tokio::time::sleep(Duration::from_secs(1)).await;
- taos.exec_many([
- "drop topic topic_meters",
- "drop database power",
- ])
- .await?;
+ handle.join().unwrap();
+
+ taos.exec_many(["drop topic topic_meters", "drop database power"])
+ .await?;
Ok(())
}
diff --git a/docs/examples/rust/restexample/examples/tmq.rs b/docs/examples/rust/restexample/examples/tmq.rs
index 0a41025955..61416133e3 100644
--- a/docs/examples/rust/restexample/examples/tmq.rs
+++ b/docs/examples/rust/restexample/examples/tmq.rs
@@ -1,9 +1,9 @@
-use std::time::Duration;
-use std::str::FromStr;
-use chrono::Local;
use chrono::DateTime;
-use taos::*;
+use chrono::Local;
+use std::str::FromStr;
use std::thread;
+use std::time::Duration;
+use taos::*;
use tokio::runtime::Runtime;
#[tokio::main]
@@ -12,7 +12,7 @@ async fn main() -> anyhow::Result<()> {
.filter_level(log::LevelFilter::Info)
.init();
use taos_query::prelude::*;
- // ANCHOR: create_consumer_dsn
+ // ANCHOR: create_consumer_dsn
let dsn = "ws://localhost:6041".to_string();
println!("dsn: {}", dsn);
let mut dsn = Dsn::from_str(&dsn)?;
@@ -41,17 +41,25 @@ async fn main() -> anyhow::Result<()> {
// ANCHOR: create_consumer_ac
let group_id = "group1".to_string();
let client_id = "client1".to_string();
- dsn.params.insert("auto.offset.reset".to_string(), "latest".to_string());
- dsn.params.insert("msg.with.table.name".to_string(), "true".to_string());
- dsn.params.insert("enable.auto.commit".to_string(), "true".to_string());
- dsn.params.insert("auto.commit.interval.ms".to_string(), "1000".to_string());
+ dsn.params
+ .insert("auto.offset.reset".to_string(), "latest".to_string());
+ dsn.params
+ .insert("msg.with.table.name".to_string(), "true".to_string());
+ dsn.params
+ .insert("enable.auto.commit".to_string(), "true".to_string());
+ dsn.params
+ .insert("auto.commit.interval.ms".to_string(), "1000".to_string());
dsn.params.insert("group.id".to_string(), group_id.clone());
- dsn.params.insert("client.id".to_string(), client_id.clone());
+ dsn.params
+ .insert("client.id".to_string(), client_id.clone());
let builder = TmqBuilder::from_dsn(&dsn)?;
- let mut consumer = match builder.build().await{
+ let mut consumer = match builder.build().await {
Ok(consumer) => {
- println!("Create consumer successfully, dsn: {}, groupId: {}, clientId: {}.", dsn, group_id, client_id);
+ println!(
+ "Create consumer successfully, dsn: {}, groupId: {}, clientId: {}.",
+ dsn, group_id, client_id
+ );
consumer
}
Err(err) => {
@@ -61,10 +69,10 @@ async fn main() -> anyhow::Result<()> {
};
// ANCHOR_END: create_consumer_ac
- thread::spawn(move || {
+ let handle = thread::spawn(move || {
let rt = Runtime::new().unwrap();
-
rt.block_on(async {
+ tokio::time::sleep(Duration::from_secs(1)).await;
let taos_insert = TaosBuilder::from_dsn(&dsn).unwrap().build().await.unwrap();
for i in 0..50 {
let insert_sql = format!(r#"INSERT INTO
@@ -75,18 +83,20 @@ async fn main() -> anyhow::Result<()> {
eprintln!("Failed to execute insert: {:?}", e);
}
tokio::time::sleep(Duration::from_millis(10)).await;
+ println!("Succed to execute insert 1 row");
}
});
-
- }).join().unwrap();
-
+ });
// ANCHOR: consume
let topic = "topic_meters";
- match consumer.subscribe([topic]).await{
+ match consumer.subscribe([topic]).await {
Ok(_) => println!("Subscribe topics successfully."),
Err(err) => {
- eprintln!("Failed to subscribe topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}", topic, group_id, client_id, err);
+ eprintln!(
+ "Failed to subscribe topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}",
+ topic, group_id, client_id, err
+ );
return Err(err.into());
}
}
@@ -107,32 +117,36 @@ async fn main() -> anyhow::Result<()> {
}
consumer
- .stream()
- .try_for_each(|(offset, message)| async move {
- let topic = offset.topic();
- // the vgroup id, like partition id in kafka.
- let vgroup_id = offset.vgroup_id();
- println!("* in vgroup id {vgroup_id} of topic {topic}\n");
+ .stream_with_timeout(Timeout::from_secs(10))
+ .try_for_each(|(offset, message)| async move {
+ let topic = offset.topic();
+ // the vgroup id, like partition id in kafka.
+ let vgroup_id = offset.vgroup_id();
+ println!("* in vgroup id {vgroup_id} of topic {topic}\n");
- if let Some(data) = message.into_data() {
- while let Some(block) = data.fetch_raw_block().await? {
- let records: Vec = block.deserialize().try_collect()?;
- // Add your data processing logic here
- println!("** read {} records: {:#?}\n", records.len(), records);
+ if let Some(data) = message.into_data() {
+ while let Some(block) = data.fetch_raw_block().await? {
+ let records: Vec = block.deserialize().try_collect()?;
+ // Add your data processing logic here
+ println!("** read {} records: {:#?}\n", records.len(), records);
+ }
}
- }
- Ok(())
- })
- .await.map_err(|e| {
- eprintln!("Failed to poll data, topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}", topic, group_id, client_id, e);
- e
- })?;
+ Ok(())
+ })
+ .await
+ .map_err(|e| {
+ eprintln!(
+ "Failed to poll data, topic: {}, groupId: {}, clientId: {}, ErrMessage: {:?}",
+ topic, group_id, client_id, e
+ );
+ e
+ })?;
// ANCHOR_END: consume
- // ANCHOR: consumer_commit_manually
+ // ANCHOR: consumer_commit_manually
consumer
- .stream()
+ .stream_with_timeout(Timeout::from_secs(10))
.try_for_each(|(offset, message)| async {
// the vgroup id, like partition id in kafka.
let vgroup_id = offset.vgroup_id();
@@ -162,12 +176,14 @@ async fn main() -> anyhow::Result<()> {
})?;
// ANCHOR_END: consumer_commit_manually
-
// ANCHOR: seek_offset
- let assignments = match consumer.assignments().await{
+ let assignments = match consumer.assignments().await {
Some(assignments) => assignments,
None => {
- let error_message = format!("Failed to get assignments. topic: {}, groupId: {}, clientId: {}", topic, group_id, client_id);
+ let error_message = format!(
+ "Failed to get assignments. topic: {}, groupId: {}, clientId: {}",
+ topic, group_id, client_id
+ );
eprintln!("{}", error_message);
return Err(anyhow::anyhow!(error_message));
}
@@ -185,14 +201,10 @@ async fn main() -> anyhow::Result<()> {
let end = assignment.end();
println!(
"topic: {}, vgroup_id: {}, current offset: {}, begin {}, end: {}",
- topic,
- vgroup_id,
- current,
- begin,
- end
+ topic, vgroup_id, current, begin, end
);
- match consumer.offset_seek(topic, vgroup_id, begin).await{
+ match consumer.offset_seek(topic, vgroup_id, begin).await {
Ok(_) => (),
Err(err) => {
eprintln!("Failed to seek offset, topic: {}, groupId: {}, clientId: {}, vGroupId: {}, begin: {}, ErrMessage: {:?}",
@@ -207,10 +219,13 @@ async fn main() -> anyhow::Result<()> {
}
println!("Assignment seek to beginning successfully.");
// after seek offset
- let assignments = match consumer.assignments().await{
+ let assignments = match consumer.assignments().await {
Some(assignments) => assignments,
None => {
- let error_message = format!("Failed to get assignments. topic: {}, groupId: {}, clientId: {}", topic, group_id, client_id);
+ let error_message = format!(
+ "Failed to get assignments. topic: {}, groupId: {}, clientId: {}",
+ topic, group_id, client_id
+ );
eprintln!("{}", error_message);
return Err(anyhow::anyhow!(error_message));
}
@@ -225,10 +240,9 @@ async fn main() -> anyhow::Result<()> {
tokio::time::sleep(Duration::from_secs(1)).await;
- taos.exec_many([
- "drop topic topic_meters",
- "drop database power",
- ])
- .await?;
+ handle.join().unwrap();
+
+ taos.exec_many(["drop topic topic_meters", "drop database power"])
+ .await?;
Ok(())
}
diff --git a/docs/zh/07-operation/12-multi.md b/docs/zh/07-operation/12-multi.md
index 9b91a47e39..e156af55f8 100644
--- a/docs/zh/07-operation/12-multi.md
+++ b/docs/zh/07-operation/12-multi.md
@@ -16,7 +16,7 @@ toc_max_heading_level: 4
### 配置方式
-多级存储支持 3 级,每级最多可配置 16 个挂载点。
+多级存储支持 3 级,每级最多可配置 128 个挂载点。
**Tips** 典型的配置方案有:0 级配置多个挂载点,每个挂载点对应单块 SAS 硬盘;1 级配置多个挂载点,每个挂载点对应单块或多块 SATA 硬盘;2 级可配置 S3 存储或其他廉价网络存储。
@@ -110,4 +110,4 @@ s3migrate database ;
| :--- | :----------- | :----- | :----- | :------ | :----------------------------------------------------------- |
| 1 | s3_keeplocal | 3650 | 1 | 365000 | 数据在本地保留的天数,即 data 文件在本地磁盘保留多长时间后可以上传到 S3。默认单位:天,支持 m(分钟)、h(小时)和 d(天)三个单位 |
| 2 | s3_chunksize | 262144 | 131072 | 1048576 | 上传对象的大小阈值,与 TSDB_PAGESIZE 参数一样,不可修改,单位为 TSDB 页 |
-| 3 | s3_compact | 0 | 0 | 1 | TSDB 文件组首次上传 S3 时,是否自动进行 compact 操作。 |
\ No newline at end of file
+| 3 | s3_compact | 0 | 0 | 1 | TSDB 文件组首次上传 S3 时,是否自动进行 compact 操作。 |
diff --git a/docs/zh/14-reference/01-components/01-taosd.md b/docs/zh/14-reference/01-components/01-taosd.md
index 3746a16c54..ba17126a92 100644
--- a/docs/zh/14-reference/01-components/01-taosd.md
+++ b/docs/zh/14-reference/01-components/01-taosd.md
@@ -53,7 +53,7 @@ taosd 命令行参数如下
| :--------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| queryPolicy | 查询策略,1: 只使用 vnode,不使用 qnode; 2: 没有扫描算子的子任务在 qnode 执行,带扫描算子的子任务在 vnode 执行; 3: vnode 只运行扫描算子,其余算子均在 qnode 执行 ;缺省值:1 |
| maxNumOfDistinctRes | 允许返回的 distinct 结果最大行数,默认值 10 万,最大允许值 1 亿 |
-| countAlwaysReturnValue | ount/hyperloglog函数在输入数据为空或者NULL的情况下是否返回值,0: 返回空行,1: 返回;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了TSMA时, 且相应的组或窗口内数据为空或者NULL, 对应的组或窗口将不返回查询结果. 注意此参数客户端和服务端值应保持一致. |
+| countAlwaysReturnValue | count/hyperloglog函数在输入数据为空或者NULL的情况下是否返回值,0: 返回空行,1: 返回;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了TSMA时, 且相应的组或窗口内数据为空或者NULL, 对应的组或窗口将不返回查询结果. 注意此参数客户端和服务端值应保持一致. |
### 区域相关
diff --git a/docs/zh/14-reference/05-connector/10-cpp.mdx b/docs/zh/14-reference/05-connector/10-cpp.mdx
index be7e44812c..e25cef1bf0 100644
--- a/docs/zh/14-reference/05-connector/10-cpp.mdx
+++ b/docs/zh/14-reference/05-connector/10-cpp.mdx
@@ -40,151 +40,18 @@ TDengine 客户端驱动的版本号与 TDengine 服务端的版本号是一一
本节展示了使用客户端驱动访问 TDengine 集群的常见访问方式的示例代码。
-### 同步查询示例
+- 同步查询示例:[同步查询](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/demo.c)
-
-同步查询
+- 异步查询示例:[异步查询](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/asyncdemo.c)
-```c
-{{#include examples/c/demo.c}}
-```
-格式化输出不同类型字段函数 taos_print_row
-```c
-int taos_print_row(char *str, TAOS_ROW row, TAOS_FIELD *fields, int num_fields) {
- int32_t len = 0;
- for (int i = 0; i < num_fields; ++i) {
- if (i > 0) {
- str[len++] = ' ';
- }
+- 参数绑定示例:[参数绑定](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/prepare.c)
- if (row[i] == NULL) {
- len += sprintf(str + len, "%s", TSDB_DATA_NULL_STR);
- continue;
- }
+- 无模式写入示例:[无模式写入](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/schemaless.c)
- switch (fields[i].type) {
- case TSDB_DATA_TYPE_TINYINT:
- len += sprintf(str + len, "%d", *((int8_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_UTINYINT:
- len += sprintf(str + len, "%u", *((uint8_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_SMALLINT:
- len += sprintf(str + len, "%d", *((int16_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_USMALLINT:
- len += sprintf(str + len, "%u", *((uint16_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_INT:
- len += sprintf(str + len, "%d", *((int32_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_UINT:
- len += sprintf(str + len, "%u", *((uint32_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_BIGINT:
- len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_UBIGINT:
- len += sprintf(str + len, "%" PRIu64, *((uint64_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_FLOAT: {
- float fv = 0;
- fv = GET_FLOAT_VAL(row[i]);
- len += sprintf(str + len, "%f", fv);
- } break;
-
- case TSDB_DATA_TYPE_DOUBLE: {
- double dv = 0;
- dv = GET_DOUBLE_VAL(row[i]);
- len += sprintf(str + len, "%lf", dv);
- } break;
-
- case TSDB_DATA_TYPE_BINARY:
- case TSDB_DATA_TYPE_NCHAR: {
- int32_t charLen = varDataLen((char *)row[i] - VARSTR_HEADER_SIZE);
- if (fields[i].type == TSDB_DATA_TYPE_BINARY) {
- assert(charLen <= fields[i].bytes && charLen >= 0);
- } else {
- assert(charLen <= fields[i].bytes * TSDB_NCHAR_SIZE && charLen >= 0);
- }
-
- memcpy(str + len, row[i], charLen);
- len += charLen;
- } break;
-
- case TSDB_DATA_TYPE_TIMESTAMP:
- len += sprintf(str + len, "%" PRId64, *((int64_t *)row[i]));
- break;
-
- case TSDB_DATA_TYPE_BOOL:
- len += sprintf(str + len, "%d", *((int8_t *)row[i]));
- default:
- break;
- }
- }
- str[len] = 0;
-
- return len;
-}
-
-```
-
-
-
-### 异步查询示例
-
-
-异步查询
-
-```c
-{{#include examples/c/asyncdemo.c}}
-```
-
-
-
-### 参数绑定示例
-
-
-参数绑定
-
-```c
-{{#include examples/c/prepare.c}}
-```
-
-
-
-### 无模式写入示例
-
-
-无模式写入
-
-```c
-{{#include examples/c/schemaless.c}}
-```
-
-
-
-### 订阅和消费示例
-
-
-订阅和消费
-
-```c
- {{#include examples/c/tmq.c}}
-```
-
-
+- 订阅和消费示例:[订阅和消费](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/c/tmq.c)
:::info
-更多示例代码及下载请见 [GitHub](https://github.com/taosdata/TDengine/tree/develop/examples/c)。
+更多示例代码及下载请见 [GitHub](https://github.com/taosdata/TDengine/tree/develop/docs/examples/c)。
也可以在安装目录下的 `examples/c` 路径下找到。 该目录下有 makefile,在 Linux/macOS 环境下,直接执行 make 就可以编译得到执行文件。
**提示:**在 ARM 环境下编译时,请将 makefile 中的 `-msse4.2` 去掉,这个选项只有在 x64/x86 硬件平台上才能支持。
@@ -403,7 +270,7 @@ TDengine 的异步 API 均采用非阻塞调用模式。应用程序可以用多
说明:如果 `taos_stmt_execute()` 执行成功,假如不需要改变 SQL 语句的话,那么是可以复用 `taos_stmt_prepare()` 的解析结果,直接进行第 3 ~ 6 步绑定新数据的。但如果执行出错,那么并不建议继续在当前的环境上下文下继续工作,而是建议释放资源,然后从 `taos_stmt_init()` 步骤重新开始。
-接口相关的具体函数如下(也可以参考 [prepare.c](https://github.com/taosdata/TDengine/blob/develop/examples/c/prepare.c) 文件中使用对应函数的方式):
+接口相关的具体函数如下(也可以参考 [prepare.c](https://github.com/taosdata/TDengine/blob/develop/docs/examples/c/prepare.c) 文件中使用对应函数的方式):
- `TAOS_STMT* taos_stmt_init(TAOS *taos)`
- **接口说明**:初始化一个预编译的 SQL 语句对象。
diff --git a/docs/zh/14-reference/05-connector/14-java.mdx b/docs/zh/14-reference/05-connector/14-java.mdx
index a752867b3f..42322139a9 100644
--- a/docs/zh/14-reference/05-connector/14-java.mdx
+++ b/docs/zh/14-reference/05-connector/14-java.mdx
@@ -145,7 +145,7 @@ WKB规范请参考[Well-Known Binary (WKB)](https://libgeos.org/specifications/w
## 示例程序汇总
-示例程序源码位于 `TDengine/examples/JDBC` 下:
+示例程序源码位于 `TDengine/docs/examples/JDBC` 下:
- JDBCDemo:JDBC 示例源程序。
- connectionPools:HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdbcdriver。
@@ -154,7 +154,7 @@ WKB规范请参考[Well-Known Binary (WKB)](https://libgeos.org/specifications/w
- springbootdemo: Springboot 中使用 taos-jdbcdriver。
- consumer-demo:Consumer 消费 TDengine 数据示例,可通过参数控制消费速度。
-请参考:[JDBC example](https://github.com/taosdata/TDengine/tree/3.0/examples/JDBC)
+请参考:[JDBC example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/JDBC)
## 常见问题
diff --git a/docs/zh/14-reference/05-connector/26-rust.mdx b/docs/zh/14-reference/05-connector/26-rust.mdx
index 6b0ec4a68d..25a90d4fab 100644
--- a/docs/zh/14-reference/05-connector/26-rust.mdx
+++ b/docs/zh/14-reference/05-connector/26-rust.mdx
@@ -85,9 +85,7 @@ TDengine 目前支持时间戳、数字、字符、布尔类型,与 Rust 对
## 示例程序汇总
-示例程序源码位于 `TDengine/examples/rust` 下:
-
-请参考:[rust example](https://github.com/taosdata/TDengine/tree/3.0/examples/rust)
+示例程序源码请参考:[rust example](https://github.com/taosdata/TDengine/tree/3.0/docs/examples/rust)
## 常见问题
diff --git a/examples/c/makefile b/examples/c/makefile
deleted file mode 100644
index 244d13fad7..0000000000
--- a/examples/c/makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (c) 2017 by TAOS Technologies, Inc.
-# todo: library dependency, header file dependency
-
-ROOT=./
-TARGET=exe
-LFLAGS = '-Wl,-rpath,/usr/local/taos/driver/' -ltaos -lpthread -lm -lrt
-CFLAGS = -O3 -g -Wall -Wno-deprecated -fPIC -Wno-unused-result -Wconversion \
- -Wno-char-subscripts -D_REENTRANT -Wno-format -D_REENTRANT -DLINUX \
- -Wno-unused-function -D_M_X64 -I/usr/local/taos/include -std=gnu99 \
- -I/usr/local/include/cjson
-all: $(TARGET)
-
-exe:
- gcc $(CFLAGS) ./asyncdemo.c -o $(ROOT)asyncdemo $(LFLAGS)
- gcc $(CFLAGS) ./demo.c -o $(ROOT)demo $(LFLAGS)
- gcc $(CFLAGS) ./prepare.c -o $(ROOT)prepare $(LFLAGS)
- gcc $(CFLAGS) ./stream_demo.c -o $(ROOT)stream_demo $(LFLAGS)
- gcc $(CFLAGS) ./tmq.c -o $(ROOT)tmq $(LFLAGS)
- gcc $(CFLAGS) ./schemaless.c -o $(ROOT)schemaless $(LFLAGS)
-
-clean:
- rm $(ROOT)asyncdemo
- rm $(ROOT)demo
- rm $(ROOT)prepare
- rm $(ROOT)stream_demo
- rm $(ROOT)tmq
- rm $(ROOT)schemaless
diff --git a/include/util/taoserror.h b/include/util/taoserror.h
index a0898fa94b..c33d19a1bd 100644
--- a/include/util/taoserror.h
+++ b/include/util/taoserror.h
@@ -531,6 +531,7 @@ int32_t taosGetErrSize();
#define TSDB_CODE_VND_COLUMN_COMPRESS_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0536)
#define TSDB_CODE_VND_ARB_NOT_SYNCED TAOS_DEF_ERROR_CODE(0, 0x0537) // internal
#define TSDB_CODE_VND_WRITE_DISABLED TAOS_DEF_ERROR_CODE(0, 0x0538) // internal
+#define TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION TAOS_DEF_ERROR_CODE(0, 0x0539) // internal
// tsdb
#define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600)
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index 9dd13de293..039e17fd87 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -2937,7 +2937,7 @@ void taosAsyncFetchImpl(SRequestObj* pRequest, __taos_async_fn_t fp, void* param
int32_t code = schedulerFetchRows(pRequest->body.queryJob, &req);
if (TSDB_CODE_SUCCESS != code) {
tscError("0x%" PRIx64 " failed to schedule fetch rows", pRequest->requestId);
- pRequest->body.fetchFp(param, pRequest, code);
+ //pRequest->body.fetchFp(param, pRequest, code);
}
}
diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c
index f726a5430e..1df68b5389 100644
--- a/source/common/src/tdataformat.c
+++ b/source/common/src/tdataformat.c
@@ -1403,7 +1403,6 @@ void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
pVal->val = pSrc->pks[i].val;
} else {
pVal->nData = pSrc->pks[i].nData;
- ASSERT(pSrc->pks[i].pData != NULL);
(void)memcpy(pVal->pData, pSrc->pks[i].pData, pVal->nData);
}
}
@@ -2517,7 +2516,7 @@ static FORCE_INLINE int32_t tColDataUpdateValue70(SColData *pColData, uint8_t *p
return tColDataPutValue(pColData, pData, nData);
}
} else {
- ASSERT(0);
+ return TSDB_CODE_INVALID_PARA;
}
return 0;
}
@@ -2760,7 +2759,9 @@ int32_t tColDataCompress(SColData *colData, SColDataCompressInfo *info, SBuffer
int32_t code;
SBuffer local;
- ASSERT(colData->nVal > 0);
+ if (!(colData->nVal > 0)) {
+ return TSDB_CODE_INVALID_PARA;
+ }
(*info) = (SColDataCompressInfo){
.cmprAlg = info->cmprAlg,
@@ -3217,7 +3218,6 @@ void tColDataArrGetRowKey(SColData *aColData, int32_t nColData, int32_t iRow, SR
for (int i = 1; i < nColData; i++) {
if (aColData[i].cflag & COL_IS_KEY) {
- ASSERT(aColData->flag == HAS_VALUE);
tColDataGetValue4(&aColData[i], iRow, &cv);
key->pks[key->numOfPKs++] = cv.value;
} else {
@@ -3379,8 +3379,6 @@ static void tColDataMergeImpl(SColData *pColData, int32_t iStart, int32_t iEnd /
iv < (pColData->nVal - 1) ? pColData->aOffset[iv + 1] - pColData->aOffset[iv]
: pColData->nData - pColData->aOffset[iv]);
}
- // TODO
- ASSERT(0);
} else {
if (iv != iStart) {
(void)memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * iStart],
diff --git a/source/dnode/vnode/src/meta/metaTtl.c b/source/dnode/vnode/src/meta/metaTtl.c
index cd1aa7bcad..0b5b9280df 100644
--- a/source/dnode/vnode/src/meta/metaTtl.c
+++ b/source/dnode/vnode/src/meta/metaTtl.c
@@ -408,7 +408,7 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
int64_t startNs = taosGetTimestampNs();
int64_t endNs = startNs;
- metaTrace("%s, ttl mgr flush start. dirty uids:%d", pTtlMgr->logPrefix, taosHashGetSize(pTtlMgr->pDirtyUids));
+ metaTrace("%s, ttl mgr flush start. num of dirty uids:%d", pTtlMgr->logPrefix, taosHashGetSize(pTtlMgr->pDirtyUids));
int32_t code = TSDB_CODE_SUCCESS;
@@ -419,13 +419,8 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
STtlCacheEntry *cacheEntry = taosHashGet(pTtlMgr->pTtlCache, pUid, sizeof(*pUid));
if (cacheEntry == NULL) {
- metaInfo("%s, ttlMgr flush failed to get ttl cache, uid: %" PRId64 ", type: %d", pTtlMgr->logPrefix, *pUid,
+ metaError("%s, ttlMgr flush failed to get ttl cache, uid: %" PRId64 ", type: %d", pTtlMgr->logPrefix, *pUid,
pEntry->type);
- code = taosHashRemove(pTtlMgr->pDirtyUids, pUid, sizeof(*pUid));
- if (TSDB_CODE_SUCCESS != code) {
- metaError("%s, ttlMgr flush failed to remove dirty uid since %s", pTtlMgr->logPrefix, tstrerror(code));
- goto _out;
- }
continue;
}
@@ -437,31 +432,35 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
if (pEntry->type == ENTRY_TYPE_UPSERT) {
// delete old key & upsert new key
- (void)tdbTbDelete(pTtlMgr->pTtlIdx, &ttlKey, sizeof(ttlKey), pTxn); // maybe first insert, ignore error
+ code = tdbTbDelete(pTtlMgr->pTtlIdx, &ttlKey, sizeof(ttlKey), pTxn); // maybe first insert, ignore error
+ if (TSDB_CODE_SUCCESS != code && TSDB_CODE_NOT_FOUND != code) {
+ metaError("%s, ttlMgr flush failed to delete since %s", pTtlMgr->logPrefix, tstrerror(code));
+ continue;
+ }
code = tdbTbUpsert(pTtlMgr->pTtlIdx, &ttlKeyDirty, sizeof(ttlKeyDirty), &cacheEntry->ttlDaysDirty,
sizeof(cacheEntry->ttlDaysDirty), pTxn);
if (TSDB_CODE_SUCCESS != code) {
metaError("%s, ttlMgr flush failed to upsert since %s", pTtlMgr->logPrefix, tstrerror(code));
- goto _out;
+ continue;
}
cacheEntry->ttlDays = cacheEntry->ttlDaysDirty;
cacheEntry->changeTimeMs = cacheEntry->changeTimeMsDirty;
} else if (pEntry->type == ENTRY_TYPE_DELETE) {
code = tdbTbDelete(pTtlMgr->pTtlIdx, &ttlKey, sizeof(ttlKey), pTxn);
- if (TSDB_CODE_SUCCESS != code) {
+ if (TSDB_CODE_SUCCESS != code && TSDB_CODE_NOT_FOUND != code) {
metaError("%s, ttlMgr flush failed to delete since %s", pTtlMgr->logPrefix, tstrerror(code));
- goto _out;
+ continue;
}
code = taosHashRemove(pTtlMgr->pTtlCache, pUid, sizeof(*pUid));
if (TSDB_CODE_SUCCESS != code) {
metaError("%s, ttlMgr flush failed to remove cache since %s", pTtlMgr->logPrefix, tstrerror(code));
- goto _out;
+ continue;
}
} else {
metaError("%s, ttlMgr flush failed, unknown type: %d", pTtlMgr->logPrefix, pEntry->type);
- goto _out;
+ continue;
}
metaDebug("isdel:%d", pEntry->type == ENTRY_TYPE_DELETE);
@@ -471,11 +470,18 @@ int32_t ttlMgrFlush(STtlManger *pTtlMgr, TXN *pTxn) {
code = taosHashRemove(pTtlMgr->pDirtyUids, pUid, sizeof(*pUid));
if (TSDB_CODE_SUCCESS != code) {
metaError("%s, ttlMgr flush failed to remove dirty uid since %s", pTtlMgr->logPrefix, tstrerror(code));
- goto _out;
+ continue;
}
}
- taosHashClear(pTtlMgr->pDirtyUids);
+ int32_t count = taosHashGetSize(pTtlMgr->pDirtyUids);
+ if (count != 0) {
+ taosHashClear(pTtlMgr->pDirtyUids);
+ metaError("%s, ttlMgr flush failed, dirty uids not empty, count: %d", pTtlMgr->logPrefix, count);
+ code = TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION;
+
+ goto _out;
+ }
code = TSDB_CODE_SUCCESS;
diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapInfo.c b/source/dnode/vnode/src/tsdb/tsdbSnapInfo.c
index decf276bc6..4a73f53c77 100644
--- a/source/dnode/vnode/src/tsdb/tsdbSnapInfo.c
+++ b/source/dnode/vnode/src/tsdb/tsdbSnapInfo.c
@@ -92,7 +92,6 @@ static int32_t tsdbTFileSetToFSetPartition(STFileSet* fset, STsdbFSetPartition**
for (int32_t ftype = TSDB_FTYPE_MIN; ftype < TSDB_FTYPE_MAX; ++ftype) {
if (fset->farr[ftype] == NULL) continue;
typ = tsdbFTypeToFRangeType(ftype);
- ASSERT(typ < TSDB_FSET_RANGE_TYP_MAX);
STFile* f = fset->farr[ftype]->f;
if (f->maxVer > fset->maxVerValid) {
corrupt = true;
@@ -103,8 +102,7 @@ static int32_t tsdbTFileSetToFSetPartition(STFileSet* fset, STsdbFSetPartition**
}
count++;
SVersionRange vr = {.minVer = f->minVer, .maxVer = f->maxVer};
- code = TARRAY2_SORT_INSERT(&p->verRanges[typ], vr, tVersionRangeCmprFn);
- ASSERT(code == 0);
+ (void)TARRAY2_SORT_INSERT(&p->verRanges[typ], vr, tVersionRangeCmprFn);
}
typ = TSDB_FSET_RANGE_TYP_STT;
@@ -122,14 +120,12 @@ static int32_t tsdbTFileSetToFSetPartition(STFileSet* fset, STsdbFSetPartition**
}
count++;
SVersionRange vr = {.minVer = f->minVer, .maxVer = f->maxVer};
- code = TARRAY2_SORT_INSERT(&p->verRanges[typ], vr, tVersionRangeCmprFn);
- ASSERT(code == 0);
+ (void)TARRAY2_SORT_INSERT(&p->verRanges[typ], vr, tVersionRangeCmprFn);
}
}
if (corrupt && count == 0) {
SVersionRange vr = {.minVer = VERSION_MIN, .maxVer = fset->maxVerValid};
- code = TARRAY2_SORT_INSERT(&p->verRanges[typ], vr, tVersionRangeCmprFn);
- ASSERT(code == 0);
+ (void)TARRAY2_SORT_INSERT(&p->verRanges[typ], vr, tVersionRangeCmprFn);
}
ppSP[0] = p;
return 0;
@@ -186,8 +182,7 @@ int32_t tsdbFSetPartListToRangeDiff(STsdbFSetPartList* pList, TFileSetRangeArray
r->sver = maxVerValid + 1;
r->ever = VERSION_MAX;
tsdbDebug("range diff fid:%" PRId64 ", sver:%" PRId64 ", ever:%" PRId64, part->fid, r->sver, r->ever);
- int32_t code = TARRAY2_SORT_INSERT(pDiff, r, tsdbTFileSetRangeCmprFn);
- ASSERT(code == 0);
+ (void)TARRAY2_SORT_INSERT(pDiff, r, tsdbTFileSetRangeCmprFn);
}
ppRanges[0] = pDiff;
@@ -360,9 +355,7 @@ static STsdbFSetPartList* tsdbSnapGetFSetPartList(STFileSystem* fs) {
terrno = code;
break;
}
- ASSERT(pItem != NULL);
- code = TARRAY2_SORT_INSERT(pList, pItem, tsdbFSetPartCmprFn);
- ASSERT(code == 0);
+ (void)TARRAY2_SORT_INSERT(pList, pItem, tsdbFSetPartCmprFn);
}
(void)taosThreadMutexUnlock(&fs->tsdb->mutex);
@@ -400,7 +393,9 @@ static int32_t tsdbPartitionInfoInit(SVnode* pVnode, STsdbPartitionInfo* pInfo)
pInfo->vgId = TD_VID(pVnode);
pInfo->tsdbMaxCnt = (!VND_IS_RSMA(pVnode) ? 1 : TSDB_RETENTION_MAX);
- ASSERT(sizeof(pInfo->subTyps) == sizeof(subTyps));
+ if (!(sizeof(pInfo->subTyps) == sizeof(subTyps))) {
+ return TSDB_CODE_INVALID_PARA;
+ }
memcpy(pInfo->subTyps, (char*)subTyps, sizeof(subTyps));
// fset partition list
@@ -437,8 +432,7 @@ static int32_t tsdbPartitionInfoSerialize(STsdbPartitionInfo* pInfo, uint8_t* bu
for (int32_t j = 0; j < pInfo->tsdbMaxCnt; ++j) {
SSyncTLV* pSubHead = (void*)((char*)buf + offset);
int32_t valOffset = offset + sizeof(*pSubHead);
- ASSERT(pSubHead->val == (char*)buf + valOffset);
- int32_t code = tSerializeTsdbFSetPartList(pSubHead->val, bufLen - valOffset, pInfo->pLists[j], &tlen);
+ int32_t code = tSerializeTsdbFSetPartList(pSubHead->val, bufLen - valOffset, pInfo->pLists[j], &tlen);
if (code) {
tsdbError("vgId:%d, failed to serialize fset partition list of tsdb %d since %s", pInfo->vgId, j, terrstr());
return code;
@@ -574,7 +568,6 @@ static int32_t tsdbSnapPrepDealWithSnapInfo(SVnode* pVnode, SSnapshot* pSnap, ST
}
int32_t tsdbSnapPrepDescription(SVnode* pVnode, SSnapshot* pSnap) {
- ASSERT(pSnap->type == TDMT_SYNC_PREP_SNAPSHOT || pSnap->type == TDMT_SYNC_PREP_SNAPSHOT_REPLY);
STsdbPartitionInfo partitionInfo = {0};
int code = 0;
STsdbPartitionInfo* pInfo = &partitionInfo;
@@ -616,7 +609,6 @@ int32_t tsdbSnapPrepDescription(SVnode* pVnode, SSnapshot* pSnap) {
goto _out;
}
offset += tlen;
- ASSERT(offset <= bufLen);
if ((tlen = tsdbRepOptsSerialize(&opts, buf + offset, bufLen - offset)) < 0) {
code = tlen;
@@ -624,7 +616,6 @@ int32_t tsdbSnapPrepDescription(SVnode* pVnode, SSnapshot* pSnap) {
goto _out;
}
offset += tlen;
- ASSERT(offset <= bufLen);
// set header of info data
SSyncTLV* pHead = pSnap->data;
diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshotRAW.c b/source/dnode/vnode/src/tsdb/tsdbSnapshotRAW.c
index 5b69638b36..55ddf64421 100644
--- a/source/dnode/vnode/src/tsdb/tsdbSnapshotRAW.c
+++ b/source/dnode/vnode/src/tsdb/tsdbSnapshotRAW.c
@@ -170,11 +170,8 @@ static int64_t tsdbSnapRAWReadPeek(SDataFileRAWReader* reader) {
}
static SDataFileRAWReader* tsdbSnapRAWReaderIterNext(STsdbSnapRAWReader* reader) {
- ASSERT(reader->dataIter->idx <= reader->dataIter->count);
-
while (reader->dataIter->idx < reader->dataIter->count) {
SDataFileRAWReader* dataReader = TARRAY2_GET(reader->dataReaderArr, reader->dataIter->idx);
- ASSERT(dataReader);
if (dataReader->ctx->offset < dataReader->config->file.size) {
return dataReader;
}
@@ -196,7 +193,6 @@ static int32_t tsdbSnapRAWReadNext(STsdbSnapRAWReader* reader, SSnapDataHdr** pp
// prepare
int64_t dataLength = tsdbSnapRAWReadPeek(dataReader);
- ASSERT(dataLength > 0);
void* pBuf = taosMemoryCalloc(1, sizeof(SSnapDataHdr) + sizeof(STsdbDataRAWBlockHeader) + dataLength);
if (pBuf == NULL) {
@@ -217,7 +213,6 @@ static int32_t tsdbSnapRAWReadNext(STsdbSnapRAWReader* reader, SSnapDataHdr** pp
// finish
dataReader->ctx->offset += pBlock->dataLength;
- ASSERT(dataReader->ctx->offset <= dataReader->config->file.size);
ppData[0] = pBuf;
_exit:
@@ -247,8 +242,6 @@ static int32_t tsdbSnapRAWReadBegin(STsdbSnapRAWReader* reader) {
int32_t code = 0;
int32_t lino = 0;
- ASSERT(reader->ctx->fset == NULL);
-
if (reader->ctx->fsetArrIdx < TARRAY2_SIZE(reader->fsetArr)) {
reader->ctx->fset = TARRAY2_GET(reader->fsetArr, reader->ctx->fsetArrIdx++);
reader->ctx->isDataDone = false;
@@ -409,8 +402,6 @@ static int32_t tsdbSnapRAWWriteFileSetBegin(STsdbSnapRAWWriter* writer, int32_t
int32_t code = 0;
int32_t lino = 0;
- ASSERT(writer->ctx->fsetWriteBegin == false);
-
STFileSet* fset = &(STFileSet){.fid = fid};
writer->ctx->fid = fid;
@@ -555,8 +546,6 @@ _exit:
}
int32_t tsdbSnapRAWWrite(STsdbSnapRAWWriter* writer, SSnapDataHdr* hdr) {
- ASSERT(hdr->type == SNAP_DATA_RAW);
-
int32_t code = 0;
int32_t lino = 0;
diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c
index f70b0aad26..8820a026e9 100644
--- a/source/dnode/vnode/src/tsdb/tsdbUtil.c
+++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c
@@ -403,8 +403,6 @@ static const int32_t BLOCK_WITH_ALG_VER = 2;
int32_t tPutBlockCol(SBuffer *buffer, const SBlockCol *pBlockCol, int32_t ver, uint32_t defaultCmprAlg) {
int32_t code;
- ASSERT(pBlockCol->flag && (pBlockCol->flag != HAS_NONE));
-
if ((code = tBufferPutI16v(buffer, pBlockCol->cid))) return code;
if ((code = tBufferPutI8(buffer, pBlockCol->type))) return code;
if ((code = tBufferPutI8(buffer, pBlockCol->cflag))) return code;
@@ -443,8 +441,6 @@ int32_t tGetBlockCol(SBufferReader *br, SBlockCol *pBlockCol, int32_t ver, uint3
if ((code = tBufferGetI8(br, &pBlockCol->flag))) return code;
if ((code = tBufferGetI32v(br, &pBlockCol->szOrigin))) return code;
- ASSERT(pBlockCol->flag && (pBlockCol->flag != HAS_NONE));
-
pBlockCol->szBitmap = 0;
pBlockCol->szOffset = 0;
pBlockCol->szValue = 0;
@@ -647,7 +643,6 @@ void tColRowGetPrimaryKey(SBlockData *pBlock, int32_t irow, SRowKey *key) {
if (pColData->cflag & COL_IS_KEY) {
SColVal cv;
tColDataGetValue(pColData, irow, &cv);
- ASSERT(COL_VAL_IS_VALUE(&cv));
key->pks[key->numOfPKs] = cv.value;
key->numOfPKs++;
} else {
@@ -748,8 +743,6 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
jCol = 0;
pTColumn = &pTSchema->columns[jCol++];
- ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP);
-
*pColVal = COL_VAL_VALUE(pTColumn->colId, ((SValue){.type = pTColumn->type, .val = key.ts}));
if (taosArrayPush(pMerger->pArray, pColVal) == NULL) {
code = terrno;
@@ -800,8 +793,6 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
pMerger->version = key.version;
return 0;
} else {
- ASSERT(((SColVal *)pMerger->pArray->pData)->value.val == key.ts);
-
for (iCol = 1; iCol < pMerger->pTSchema->numOfCols && jCol < pTSchema->numOfCols; ++iCol) {
pTColumn = &pMerger->pTSchema->columns[iCol];
if (pTSchema->columns[jCol].colId < pTColumn->colId) {
@@ -852,7 +843,7 @@ int32_t tsdbRowMergerAdd(SRowMerger *pMerger, TSDBROW *pRow, STSchema *pTSchema)
}
}
} else {
- ASSERT(0 && "dup versions not allowed");
+ return TSDB_CODE_INVALID_PARA;
}
}
@@ -1164,7 +1155,9 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
while (pTColumn->colId < aCid[iCid]) {
iColumn++;
- ASSERT(iColumn < pTSchema->numOfCols);
+ if (!(iColumn < pTSchema->numOfCols)) {
+ return TSDB_CODE_INVALID_PARA;
+ }
pTColumn = &pTSchema->columns[iColumn];
}
@@ -1272,7 +1265,9 @@ _exit:
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid) {
int32_t code = 0;
- ASSERT(pBlockData->suid || pBlockData->uid);
+ if (!(pBlockData->suid || pBlockData->uid)) {
+ return TSDB_CODE_INVALID_PARA;
+ }
// uid
if (pBlockData->uid == 0) {
@@ -1299,7 +1294,7 @@ int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTS
code = tBlockDataUpsertBlockRow(pBlockData, pRow->pBlockData, pRow->iRow, 0 /* append */);
if (code) goto _exit;
} else {
- ASSERT(0);
+ return TSDB_CODE_INVALID_PARA;
}
pBlockData->nRow++;
@@ -1357,7 +1352,6 @@ int32_t tBlockDataUpsertRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTS
#endif
SColData *tBlockDataGetColData(SBlockData *pBlockData, int16_t cid) {
- ASSERT(cid != PRIMARYKEY_TIMESTAMP_COL_ID);
int32_t lidx = 0;
int32_t ridx = pBlockData->nColData - 1;
@@ -1627,7 +1621,9 @@ static int32_t tBlockDataCompressKeyPart(SBlockData *bData, SDiskDataHdr *hdr, S
// primary keys
for (hdr->numOfPKs = 0; hdr->numOfPKs < bData->nColData; hdr->numOfPKs++) {
- ASSERT(hdr->numOfPKs <= TD_MAX_PK_COLS);
+ if (!(hdr->numOfPKs <= TD_MAX_PK_COLS)) {
+ return TSDB_CODE_INVALID_PARA;
+ }
SBlockCol *blockCol = &hdr->primaryBlockCols[hdr->numOfPKs];
SColData *colData = tBlockDataGetColDataByIdx(bData, hdr->numOfPKs);
@@ -1762,8 +1758,12 @@ int32_t tBlockDataDecompressKeyPart(const SDiskDataHdr *hdr, SBufferReader *br,
for (int i = 0; i < hdr->numOfPKs; i++) {
const SBlockCol *blockCol = &hdr->primaryBlockCols[i];
- ASSERT(blockCol->flag == HAS_VALUE);
- ASSERT(blockCol->cflag & COL_IS_KEY);
+ if (!(blockCol->flag == HAS_VALUE)) {
+ TSDB_CHECK_CODE(code = TSDB_CODE_FILE_CORRUPTED, lino, _exit);
+ }
+ if (!(blockCol->cflag & COL_IS_KEY)) {
+ TSDB_CHECK_CODE(code = TSDB_CODE_FILE_CORRUPTED, lino, _exit);
+ }
code = tBlockDataDecompressColData(hdr, blockCol, br, blockData, assist);
TSDB_CHECK_CODE(code, lino, _exit);
diff --git a/source/dnode/vnode/src/vnd/vnodeCfg.c b/source/dnode/vnode/src/vnd/vnodeCfg.c
index e2791d8a00..d90badc34c 100644
--- a/source/dnode/vnode/src/vnd/vnodeCfg.c
+++ b/source/dnode/vnode/src/vnd/vnodeCfg.c
@@ -248,7 +248,6 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) {
}
for (int32_t i = 0; i < nRetention; ++i) {
SJson *pNodeRetention = tjsonGetArrayItem(pNodeRetentions, i);
- ASSERT(pNodeRetention != NULL);
tjsonGetNumberValue(pNodeRetention, "freq", (pCfg->tsdbCfg.retentions)[i].freq, code);
if (code) return code;
tjsonGetNumberValue(pNodeRetention, "freqUnit", (pCfg->tsdbCfg.retentions)[i].freqUnit, code);
diff --git a/source/dnode/vnode/src/vnd/vnodeSnapshot.c b/source/dnode/vnode/src/vnd/vnodeSnapshot.c
index 28e7ae97ca..9a5b98e31b 100644
--- a/source/dnode/vnode/src/vnd/vnodeSnapshot.c
+++ b/source/dnode/vnode/src/vnd/vnodeSnapshot.c
@@ -73,7 +73,10 @@ struct SVSnapReader {
};
static TFileSetRangeArray **vnodeSnapReaderGetTsdbRanges(SVSnapReader *pReader, int32_t tsdbTyp) {
- ASSERTS(sizeof(pReader->pRsmaRanges) / sizeof(pReader->pRsmaRanges[0]) == 2, "Unexpected array size");
+ if (!(sizeof(pReader->pRsmaRanges) / sizeof(pReader->pRsmaRanges[0]) == 2)) {
+ terrno = TSDB_CODE_INVALID_PARA;
+ return NULL;
+ }
switch (tsdbTyp) {
case SNAP_DATA_TSDB:
return &pReader->pRanges;
@@ -147,7 +150,6 @@ static int32_t vnodeSnapReaderDealWithSnapInfo(SVSnapReader *pReader, SSnapshotP
pReader->tsdbRAWDone = true;
}
- ASSERT(pReader->tsdbDone != pReader->tsdbRAWDone);
vInfo("vgId:%d, vnode snap writer enabled replication mode: %s", TD_VID(pVnode),
(pReader->tsdbDone ? "raw" : "normal"));
}
@@ -177,7 +179,6 @@ int32_t vnodeSnapReaderOpen(SVnode *pVnode, SSnapshotParam *pParam, SVSnapReader
// open tsdb snapshot raw reader
if (!pReader->tsdbRAWDone) {
- ASSERT(pReader->sver == 0);
code = tsdbSnapRAWReaderOpen(pVnode->pTsdb, ever, SNAP_DATA_RAW, &pReader->pTsdbRAWReader);
if (code) goto _exit;
}
@@ -339,7 +340,6 @@ int32_t vnodeSnapRead(SVSnapReader *pReader, uint8_t **ppData, uint32_t *nData)
if (!pReader->tsdbRAWDone) {
// open if not
if (pReader->pTsdbRAWReader == NULL) {
- ASSERT(pReader->sver == 0);
code = tsdbSnapRAWReaderOpen(pReader->pVnode->pTsdb, pReader->ever, SNAP_DATA_RAW, &pReader->pTsdbRAWReader);
TSDB_CHECK_CODE(code, lino, _exit);
}
@@ -518,7 +518,6 @@ struct SVSnapWriter {
};
TFileSetRangeArray **vnodeSnapWriterGetTsdbRanges(SVSnapWriter *pWriter, int32_t tsdbTyp) {
- ASSERTS(sizeof(pWriter->pRsmaRanges) / sizeof(pWriter->pRsmaRanges[0]) == 2, "Unexpected array size");
switch (tsdbTyp) {
case SNAP_DATA_TSDB:
return &pWriter->pRanges;
@@ -674,7 +673,6 @@ int32_t vnodeSnapWriterClose(SVSnapWriter *pWriter, int8_t rollback, SSnapshot *
// commit json
if (!rollback) {
- ASSERT(pVnode->config.vgId == pWriter->info.config.vgId);
pWriter->info.state.committed = pWriter->ever;
pVnode->config = pWriter->info.config;
pVnode->state = (SVState){.committed = pWriter->info.state.committed,
@@ -794,7 +792,9 @@ int32_t vnodeSnapWrite(SVSnapWriter *pWriter, uint8_t *pData, uint32_t nData) {
SSnapDataHdr *pHdr = (SSnapDataHdr *)pData;
SVnode *pVnode = pWriter->pVnode;
- ASSERT(pHdr->size + sizeof(SSnapDataHdr) == nData);
+ if (!(pHdr->size + sizeof(SSnapDataHdr) == nData)) {
+ return TSDB_CODE_INVALID_PARA;
+ }
if (pHdr->index != pWriter->index + 1) {
vError("vgId:%d, unexpected vnode snapshot msg. index:%" PRId64 ", expected index:%" PRId64, TD_VID(pVnode),
@@ -837,7 +837,6 @@ int32_t vnodeSnapWrite(SVSnapWriter *pWriter, uint8_t *pData, uint32_t nData) {
case SNAP_DATA_RAW: {
// tsdb
if (pWriter->pTsdbSnapRAWWriter == NULL) {
- ASSERT(pWriter->sver == 0);
code = tsdbSnapRAWWriterOpen(pVnode->pTsdb, pWriter->ever, &pWriter->pTsdbSnapRAWWriter);
TSDB_CHECK_CODE(code, lino, _exit);
}
diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c
index aae3da7ec4..75db6e2925 100644
--- a/source/dnode/vnode/src/vnd/vnodeSvr.c
+++ b/source/dnode/vnode/src/vnd/vnodeSvr.c
@@ -540,8 +540,13 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg
TD_VID(pVnode), TMSG_INFO(pMsg->msgType), ver, pVnode->state.applied, pVnode->state.applyTerm,
pMsg->info.conn.applyTerm);
- ASSERT(pVnode->state.applyTerm <= pMsg->info.conn.applyTerm);
- ASSERTS(pVnode->state.applied + 1 == ver, "applied:%" PRId64 ", ver:%" PRId64, pVnode->state.applied, ver);
+ if (!(pVnode->state.applyTerm <= pMsg->info.conn.applyTerm)) {
+ return terrno = TSDB_CODE_INTERNAL_ERROR;
+ }
+
+ if (!(pVnode->state.applied + 1 == ver)) {
+ return terrno = TSDB_CODE_INTERNAL_ERROR;
+ }
atomic_store_64(&pVnode->state.applied, ver);
atomic_store_64(&pVnode->state.applyTerm, pMsg->info.conn.applyTerm);
@@ -981,7 +986,10 @@ static int32_t vnodeProcessFetchTtlExpiredTbs(SVnode *pVnode, int64_t ver, void
goto _end;
}
- ASSERT(ttlReq.nUids == taosArrayGetSize(ttlReq.pTbUids));
+ if (!(ttlReq.nUids == taosArrayGetSize(ttlReq.pTbUids))) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ goto _end;
+ }
tb_uid_t suid;
char ctbName[TSDB_TABLE_NAME_LEN];
diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c
index 31e44f5912..8c41ceba57 100644
--- a/source/dnode/vnode/src/vnd/vnodeSync.c
+++ b/source/dnode/vnode/src/vnd/vnodeSync.c
@@ -117,7 +117,9 @@ static int32_t inline vnodeProposeMsg(SVnode *pVnode, SRpcMsg *pMsg, bool isWeak
int32_t code = syncPropose(pVnode->sync, pMsg, isWeak, &seq);
bool wait = (code == 0 && vnodeIsMsgBlock(pMsg->msgType));
if (wait) {
- ASSERT(!pVnode->blocked);
+ if (pVnode->blocked) {
+ return TSDB_CODE_INTERNAL_ERROR;
+ }
pVnode->blocked = true;
pVnode->blockSec = taosGetTimestampSec();
pVnode->blockSeq = seq;
@@ -175,7 +177,6 @@ static void inline vnodeProposeBatchMsg(SVnode *pVnode, SRpcMsg **pMsgArr, bool
int32_t code = syncProposeBatch(pVnode->sync, pMsgArr, pIsWeakArr, *arrSize);
bool wait = (code == 0 && vnodeIsBlockMsg(pLastMsg->msgType));
if (wait) {
- ASSERT(!pVnode->blocked);
pVnode->blocked = true;
}
(void)taosThreadMutexUnlock(&pVnode->lock);
@@ -543,7 +544,11 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm, const SyncIndex commitIdx)
do {
appliedIdx = vnodeSyncAppliedIndex(pFsm);
- ASSERT(appliedIdx <= commitIdx);
+ if (appliedIdx > commitIdx) {
+ vError("vgId:%d, restore failed since applied-index:%" PRId64 " is larger than commit-index:%" PRId64, vgId,
+ appliedIdx, commitIdx);
+ break;
+ }
if (appliedIdx == commitIdx) {
vInfo("vgId:%d, no items to be applied, restore finish", pVnode->config.vgId);
break;
@@ -555,7 +560,6 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm, const SyncIndex commitIdx)
}
} while (true);
- ASSERT(commitIdx == vnodeSyncAppliedIndex(pFsm));
(void)walApplyVer(pVnode->pWal, commitIdx);
pVnode->restored = true;
diff --git a/source/libs/scheduler/src/schJob.c b/source/libs/scheduler/src/schJob.c
index 58a0706223..9c9cce7516 100644
--- a/source/libs/scheduler/src/schJob.c
+++ b/source/libs/scheduler/src/schJob.c
@@ -519,7 +519,7 @@ void schPostJobRes(SSchJob *pJob, SCH_OP_TYPE op) {
goto _return;
}
- if (op && pJob->opStatus.op != op) {
+ if (SCH_OP_NULL != op && pJob->opStatus.op != op) {
SCH_JOB_ELOG("job in operation %s mis-match with expected %s", schGetOpStr(pJob->opStatus.op), schGetOpStr(op));
goto _return;
}
@@ -547,9 +547,10 @@ _return:
int32_t schProcessOnJobFailure(SSchJob *pJob, int32_t errCode) {
if (TSDB_CODE_SCH_IGNORE_ERROR == errCode) {
+ schPostJobRes(pJob, 0);
return TSDB_CODE_SCH_IGNORE_ERROR;
}
-
+
schUpdateJobErrCode(pJob, errCode);
int32_t code = atomic_load_32(&pJob->errCode);
diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c
index db1d61a023..d0c7dea451 100644
--- a/source/libs/wal/src/walMeta.c
+++ b/source/libs/wal/src/walMeta.c
@@ -357,7 +357,10 @@ static int32_t walLogEntriesComplete(const SWal* pWal) {
static int32_t walTrimIdxFile(SWal* pWal, int32_t fileIdx) {
SWalFileInfo* pFileInfo = taosArrayGet(pWal->fileInfoSet, fileIdx);
- ASSERT(pFileInfo != NULL);
+ if (!pFileInfo) {
+ TAOS_RETURN(TSDB_CODE_FAILED);
+ }
+
char fnameStr[WAL_FILE_LEN];
walBuildIdxName(pWal, pFileInfo->firstVer, fnameStr);
diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c
index 9979ddd0b0..52af3e8528 100644
--- a/source/libs/wal/src/walWrite.c
+++ b/source/libs/wal/src/walWrite.c
@@ -371,8 +371,11 @@ static FORCE_INLINE int32_t walCheckAndRoll(SWal *pWal) {
int32_t walBeginSnapshot(SWal *pWal, int64_t ver, int64_t logRetention) {
int32_t code = 0;
+ if (logRetention < 0) {
+ TAOS_RETURN(TSDB_CODE_FAILED);
+ }
+
TAOS_UNUSED(taosThreadMutexLock(&pWal->mutex));
- ASSERT(logRetention >= 0);
pWal->vers.verInSnapshotting = ver;
pWal->vers.logRetention = logRetention;
@@ -438,7 +441,10 @@ int32_t walEndSnapshot(SWal *pWal) {
if (pInfo) {
wDebug("vgId:%d, wal search found file info. ver:%" PRId64 ", first:%" PRId64 " last:%" PRId64, pWal->cfg.vgId, ver,
pInfo->firstVer, pInfo->lastVer);
- ASSERT(ver <= pInfo->lastVer);
+ if (ver > pInfo->lastVer) {
+ TAOS_CHECK_GOTO(TSDB_CODE_FAILED, &lino, _exit);
+ }
+
if (ver == pInfo->lastVer) {
pInfo++;
}
diff --git a/source/util/src/terror.c b/source/util/src/terror.c
index a58baf5883..1c72509331 100644
--- a/source/util/src/terror.c
+++ b/source/util/src/terror.c
@@ -57,8 +57,8 @@ TAOS_DEFINE_ERROR(TSDB_CODE_RPC_MAX_SESSIONS, "rpc open too many ses
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_NETWORK_ERROR, "rpc network error")
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_NETWORK_BUSY, "rpc network busy")
TAOS_DEFINE_ERROR(TSDB_CODE_HTTP_MODULE_QUIT, "http-report already quit")
-TAOS_DEFINE_ERROR(TSDB_CODE_RPC_MODULE_QUIT, "rpc module already quit")
-TAOS_DEFINE_ERROR(TSDB_CODE_RPC_ASYNC_MODULE_QUIT, "rpc async module already quit")
+TAOS_DEFINE_ERROR(TSDB_CODE_RPC_MODULE_QUIT, "rpc module already quit")
+TAOS_DEFINE_ERROR(TSDB_CODE_RPC_ASYNC_MODULE_QUIT, "rpc async module already quit")
//common & util
TAOS_DEFINE_ERROR(TSDB_CODE_TIME_UNSYNCED, "Client and server's time is not synchronized")
@@ -412,6 +412,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_VND_META_DATA_UNSAFE_DELETE, "Single replica vnode
TAOS_DEFINE_ERROR(TSDB_CODE_VND_ARB_NOT_SYNCED, "Vgroup peer is not synced")
TAOS_DEFINE_ERROR(TSDB_CODE_VND_WRITE_DISABLED, "Vnode write is disabled for snapshot")
TAOS_DEFINE_ERROR(TSDB_CODE_VND_COLUMN_COMPRESS_ALREADY_EXIST,"Same with old param")
+TAOS_DEFINE_ERROR(TSDB_CODE_VND_TTL_FLUSH_INCOMPLETION, "Failed to flush all ttl modification to tdb")
// tsdb
diff --git a/source/util/src/tlrucache.c b/source/util/src/tlrucache.c
index 9c783f0cf6..ddcf4aebfa 100644
--- a/source/util/src/tlrucache.c
+++ b/source/util/src/tlrucache.c
@@ -87,14 +87,11 @@ struct SLRUEntry {
#define TAOS_LRU_ENTRY_REF(h) (++(h)->refs)
static bool taosLRUEntryUnref(SLRUEntry *entry) {
- // ASSERT(entry->refs > 0);
--entry->refs;
return entry->refs == 0;
}
static void taosLRUEntryFree(SLRUEntry *entry) {
- // ASSERT(entry->refs == 0);
-
if (entry->deleter) {
(*entry->deleter)(entry->keyData, entry->keyLength, entry->value, entry->ud);
}
@@ -129,7 +126,6 @@ static void taosLRUEntryTableApply(SLRUEntryTable *table, _taos_lru_table_func_t
SLRUEntry *h = table->list[i];
while (h) {
SLRUEntry *n = h->nextHash;
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(h));
func(h);
h = n;
}
@@ -155,7 +151,6 @@ static int taosLRUEntryTableApplyF(SLRUEntryTable *table, _taos_lru_functor_t fu
SLRUEntry *h = table->list[i];
while (h) {
SLRUEntry *n = h->nextHash;
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(h));
ret = functor(h->keyData, h->keyLength, h->value, ud);
if (ret) {
return ret;
@@ -205,7 +200,6 @@ static void taosLRUEntryTableResize(SLRUEntryTable *table) {
++count;
}
}
- // ASSERT(table->elems == count);
taosMemoryFree(table->list);
table->list = newList;
@@ -261,17 +255,13 @@ struct SLRUCacheShard {
static void taosLRUCacheShardMaintainPoolSize(SLRUCacheShard *shard) {
while (shard->highPriPoolUsage > shard->highPriPoolCapacity) {
shard->lruLowPri = shard->lruLowPri->next;
- // ASSERT(shard->lruLowPri != &shard->lru);
TAOS_LRU_ENTRY_SET_IN_HIGH_POOL(shard->lruLowPri, false);
- // ASSERT(shard->highPriPoolUsage >= shard->lruLowPri->totalCharge);
shard->highPriPoolUsage -= shard->lruLowPri->totalCharge;
}
}
static void taosLRUCacheShardLRUInsert(SLRUCacheShard *shard, SLRUEntry *e) {
- // ASSERT(e->next == NULL && e->prev == NULL);
-
if (shard->highPriPoolRatio > 0 && (TAOS_LRU_ENTRY_IS_HIGH_PRI(e) || TAOS_LRU_ENTRY_HAS_HIT(e))) {
e->next = &shard->lru;
e->prev = shard->lru.prev;
@@ -297,8 +287,6 @@ static void taosLRUCacheShardLRUInsert(SLRUCacheShard *shard, SLRUEntry *e) {
}
static void taosLRUCacheShardLRURemove(SLRUCacheShard *shard, SLRUEntry *e) {
- // ASSERT(e->next && e->prev);
-
if (shard->lruLowPri == e) {
shard->lruLowPri = e->prev;
}
@@ -306,10 +294,8 @@ static void taosLRUCacheShardLRURemove(SLRUCacheShard *shard, SLRUEntry *e) {
e->prev->next = e->next;
e->prev = e->next = NULL;
- // ASSERT(shard->lruUsage >= e->totalCharge);
shard->lruUsage -= e->totalCharge;
if (TAOS_LRU_ENTRY_IN_HIGH_POOL(e)) {
- // ASSERT(shard->highPriPoolUsage >= e->totalCharge);
shard->highPriPoolUsage -= e->totalCharge;
}
}
@@ -317,13 +303,11 @@ static void taosLRUCacheShardLRURemove(SLRUCacheShard *shard, SLRUEntry *e) {
static void taosLRUCacheShardEvictLRU(SLRUCacheShard *shard, size_t charge, SArray *deleted) {
while (shard->usage + charge > shard->capacity && shard->lru.next != &shard->lru) {
SLRUEntry *old = shard->lru.next;
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(old) && !TAOS_LRU_ENTRY_HAS_REFS(old));
taosLRUCacheShardLRURemove(shard, old);
(void)taosLRUEntryTableRemove(&shard->table, old->keyData, old->keyLength, old->hash);
TAOS_LRU_ENTRY_SET_IN_CACHE(old, false);
- // ASSERT(shard->usage >= old->totalCharge);
shard->usage -= old->totalCharge;
(void)taosArrayPush(deleted, &old);
@@ -414,11 +398,9 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
if (old != NULL) {
status = TAOS_LRU_STATUS_OK_OVERWRITTEN;
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(old));
TAOS_LRU_ENTRY_SET_IN_CACHE(old, false);
if (!TAOS_LRU_ENTRY_HAS_REFS(old)) {
taosLRUCacheShardLRURemove(shard, old);
- // ASSERT(shard->usage >= old->totalCharge);
shard->usage -= old->totalCharge;
(void)taosArrayPush(lastReferenceList, &old);
@@ -479,7 +461,6 @@ static LRUHandle *taosLRUCacheShardLookup(SLRUCacheShard *shard, const void *key
(void)taosThreadMutexLock(&shard->mutex);
e = taosLRUEntryTableLookup(&shard->table, key, keyLen, hash);
if (e != NULL) {
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(e));
if (!TAOS_LRU_ENTRY_HAS_REFS(e)) {
taosLRUCacheShardLRURemove(shard, e);
}
@@ -498,12 +479,10 @@ static void taosLRUCacheShardErase(SLRUCacheShard *shard, const void *key, size_
SLRUEntry *e = taosLRUEntryTableRemove(&shard->table, key, keyLen, hash);
if (e != NULL) {
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(e));
TAOS_LRU_ENTRY_SET_IN_CACHE(e, false);
if (!TAOS_LRU_ENTRY_HAS_REFS(e)) {
taosLRUCacheShardLRURemove(shard, e);
- // ASSERT(shard->usage >= e->totalCharge);
shard->usage -= e->totalCharge;
lastReference = true;
}
@@ -535,11 +514,9 @@ static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
while (shard->lru.next != &shard->lru) {
SLRUEntry *old = shard->lru.next;
- // ASSERT(TAOS_LRU_ENTRY_IN_CACHE(old) && !TAOS_LRU_ENTRY_HAS_REFS(old));
taosLRUCacheShardLRURemove(shard, old);
(void)taosLRUEntryTableRemove(&shard->table, old->keyData, old->keyLength, old->hash);
TAOS_LRU_ENTRY_SET_IN_CACHE(old, false);
- // ASSERT(shard->usage >= old->totalCharge);
shard->usage -= old->totalCharge;
(void)taosArrayPush(lastReferenceList, &old);
@@ -560,7 +537,6 @@ static bool taosLRUCacheShardRef(SLRUCacheShard *shard, LRUHandle *handle) {
SLRUEntry *e = (SLRUEntry *)handle;
(void)taosThreadMutexLock(&shard->mutex);
- // ASSERT(TAOS_LRU_ENTRY_HAS_REFS(e));
TAOS_LRU_ENTRY_REF(e);
(void)taosThreadMutexUnlock(&shard->mutex);
@@ -581,8 +557,6 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
lastReference = taosLRUEntryUnref(e);
if (lastReference && TAOS_LRU_ENTRY_IN_CACHE(e)) {
if (shard->usage > shard->capacity || eraseIfLastRef) {
- // ASSERT(shard->lru.next == &shard->lru || eraseIfLastRef);
-
(void)taosLRUEntryTableRemove(&shard->table, e->keyData, e->keyLength, e->hash);
TAOS_LRU_ENTRY_SET_IN_CACHE(e, false);
} else {
@@ -593,7 +567,6 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
}
if (lastReference && e->value) {
- // ASSERT(shard->usage >= e->totalCharge);
shard->usage -= e->totalCharge;
}
@@ -631,7 +604,6 @@ static size_t taosLRUCacheShardGetPinnedUsage(SLRUCacheShard *shard) {
(void)taosThreadMutexLock(&shard->mutex);
- // ASSERT(shard->usage >= shard->lruUsage);
usage = shard->usage - shard->lruUsage;
(void)taosThreadMutexUnlock(&shard->mutex);
@@ -723,7 +695,6 @@ void taosLRUCacheCleanup(SLRUCache *cache) {
if (cache) {
if (cache->shards) {
int numShards = cache->numShards;
- // ASSERT(numShards > 0);
for (int i = 0; i < numShards; ++i) {
taosLRUCacheShardCleanup(&cache->shards[i]);
}