From 50ecc06f707e0bfa3a150add2a18d98e2d36fb46 Mon Sep 17 00:00:00 2001
From: Kingkazuma <1991377542@qq.com>
Date: Tue, 3 Jun 2025 13:02:55 +0000
Subject: [PATCH] =?UTF-8?q?!242=20feat:=20=E4=BC=98=E5=8C=96starRocks?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E6=89=B9=E9=87=8F=E5=86=99=E5=85=A5?=
=?UTF-8?q?=20*=20Merge=20branch=20'master'=20of=20gitee.com:dromara/dbswi?=
=?UTF-8?q?tch=20into=20zsj=20*=20feat:=20=E4=BC=98=E5=8C=96starRocks?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=86=99=E5=85=A5=EF=BC=8C=E5=B0=86=E5=86=99?=
=?UTF-8?q?=E5=85=A5=E6=9B=B4=E6=96=B0=E6=93=8D=E4=BD=9C=E4=BB=8Esql?=
=?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=88=87=E6=8D=A2=E6=88=90stream=20load?=
=?UTF-8?q?=E6=A8=A1=E5=BC=8F=EF=BC=8C=E6=8F=90=E9=AB=98=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E3=80=81=E6=96=B0=E5=A2=9E=E6=95=88=E7=8E=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
dbswitch-core/pom.xml | 5 +
.../dbswitch/product/sr/FrontendEntity.java | 13 ++
.../dbswitch/product/sr/StarRocksUtils.java | 153 ++++++++++++++++--
.../product/sr/StarrocksFactoryProvider.java | 4 +-
.../sr/StarrocksMetadataQueryProvider.java | 5 +-
.../sr/StarrocksTableDataSynchronizer.java | 108 +++++++++++++
.../sr/StarrocksTableDataWriteProvider.java | 50 ++++++
pom.xml | 6 +
8 files changed, 323 insertions(+), 21 deletions(-)
create mode 100644 dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/FrontendEntity.java
create mode 100644 dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarrocksTableDataSynchronizer.java
create mode 100644 dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarrocksTableDataWriteProvider.java
diff --git a/dbswitch-core/pom.xml b/dbswitch-core/pom.xml
index aa353168..41bbf79e 100644
--- a/dbswitch-core/pom.xml
+++ b/dbswitch-core/pom.xml
@@ -33,6 +33,11 @@
spring-boot-starter-jdbc
+
+ org.apache.httpcomponents
+ httpclient
+
+
\ No newline at end of file
diff --git a/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/FrontendEntity.java b/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/FrontendEntity.java
new file mode 100644
index 00000000..5b73d9bd
--- /dev/null
+++ b/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/FrontendEntity.java
@@ -0,0 +1,13 @@
+package org.dromara.dbswitch.product.sr;
+
+
+import lombok.Data;
+
+@Data
+public class FrontendEntity {
+ String ip;
+ String httpport;
+ Boolean alive;
+ Boolean join;
+ String role;
+}
diff --git a/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarRocksUtils.java b/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarRocksUtils.java
index 39d74c2f..319e9623 100644
--- a/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarRocksUtils.java
+++ b/dbswitch-product/dbswitch-product-starrocks/src/main/java/org/dromara/dbswitch/product/sr/StarRocksUtils.java
@@ -9,25 +9,148 @@
/////////////////////////////////////////////////////////////
package org.dromara.dbswitch.product.sr;
-import org.dromara.dbswitch.core.provider.meta.MetadataProvider;
-import org.dromara.dbswitch.core.schema.ColumnDescription;
-import org.dromara.dbswitch.core.util.GenerateSqlUtils;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ReUtil;
+import cn.hutool.db.Db;
+import cn.hutool.db.Entity;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHeaders;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.dromara.dbswitch.common.entity.CloseableDataSource;
-import java.sql.Connection;
-import java.util.List;
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.stream.Collectors;
+@Slf4j
public final class StarRocksUtils {
- public static String getTableDDL(MetadataProvider provider, Connection connection, String schema,
- String table) {
- List columnDescriptions = provider.queryTableColumnMeta(connection, schema, table);
- List pks = provider.queryTablePrimaryKeys(connection, schema, table);
- return GenerateSqlUtils.getDDLCreateTableSQL(
- provider, columnDescriptions, pks, schema, table, false);
- }
- private StarRocksUtils() {
- throw new IllegalStateException();
- }
+ private String indexName;
+ private volatile String dbName;
+ private volatile String tbName;
+ private volatile String host;
+ private volatile String username;
+ private volatile String password;
+ private volatile CloseableDataSource dataSource;
+ private volatile String httpPort;
+
+ public void init(String schemaName, String tableName, DataSource dataSource) {
+ this.getHttpPort(dataSource);
+ this.dataSource = (CloseableDataSource) dataSource;
+ this.indexName = tableName;
+ this.host = ReUtil.extractMulti("jdbc:mysql://(.*):[0-9]{2,8}/", this.dataSource.getJdbcUrl(), "$1");
+ this.username = this.dataSource.getUserName();
+ this.password = this.dataSource.getPassword();
+ this.tbName = tableName;
+ this.dbName = schemaName;
+ }
+
+ public void getHttpPort(DataSource dataSource) {
+ Db use = Db.use(dataSource);
+ try {
+ List frontends = use.query("SHOW FRONTENDS");
+ List frontendEntities = BeanUtil.copyToList(frontends, FrontendEntity.class);
+ List leader = frontendEntities.stream().filter(i -> i.getRole().equals("LEADER")).collect(Collectors.toList());
+ FrontendEntity frontendEntity = leader.get(0);
+ this.httpPort = frontendEntity.getHttpport();
+ } catch (Exception e) {
+ log.error(e.getMessage());
+ }
+ }
+
+ public long addOrUpdateData(List fieldNames, List