qdy пре 2 месеци
родитељ
комит
0f56978e53
4 измењених фајлова са 132 додато и 104 уклоњено
  1. 1
    0
      .gitignore
  2. 15
    18
      functions/query_csv.go
  3. 16
    86
      main.go
  4. 100
    0
      test/my_post_query_test.go

+ 1
- 0
.gitignore Прегледај датотеку

@@ -0,0 +1 @@
1
+logs/

+ 15
- 18
functions/query_csv.go Прегледај датотеку

@@ -1,40 +1,37 @@
1 1
 package functions
2 2
 
3 3
 import (
4
-	"log"
5
-
6 4
 	"git.x2erp.com/qdy/go-base/ctx"
7 5
 	"git.x2erp.com/qdy/go-base/types"
8 6
 	"git.x2erp.com/qdy/go-db/factory/database"
9 7
 )
10 8
 
11 9
 // 执行查询,返回CSV数据格式。无参数查询
12
-func QueryToCSV(dbFactory *database.DBFactory, req types.QueryRequest, reqCtx *ctx.RequestContext) []byte {
10
+func QueryToCSV(dbFactory *database.DBFactory, req types.QueryRequest, reqCtx *ctx.RequestContext) ([]byte, error) {
13 11
 	csvData, err := dbFactory.QueryToCSV(req.SQL, req.WriterHeader, reqCtx)
14
-	if err != nil {
15
-		log.Fatalf("QueryToCSV error: %v", err)
16
-
17
-	}
18
-	return csvData
12
+	//if err != nil {
13
+	//	logger.ErrorC(reqCtx, "QueryToCSV error: %v", err)
14
+	//}
15
+	return csvData, err
19 16
 }
20 17
 
21 18
 // 执行查询,返回CSV数据格式。带参数名称进行查询
22
-func QueryParamNameToCSV(dbFactory *database.DBFactory, req types.QueryRequest, reqCtx *ctx.RequestContext) []byte {
19
+func QueryParamNameToCSV(dbFactory *database.DBFactory, req types.QueryRequest, reqCtx *ctx.RequestContext) ([]byte, error) {
23 20
 
24 21
 	csvData, err := dbFactory.QueryParamsNameToCSV(req.SQL, req.WriterHeader, req.Params, reqCtx)
25
-	if err != nil {
26
-		log.Fatalf("QueryParamNameToCSV Error: %v", err)
22
+	//if err != nil {
23
+	//	logger.ErrorC(reqCtx, "QueryParamsNameToCSV error: %v", err)
27 24
 
28
-	}
29
-	return csvData
25
+	//}
26
+	return csvData, err
30 27
 }
31 28
 
32 29
 // 执行查询,返回CSV数据格式。带占位参数进行查询
33
-func QueryPositionalToCSV(dbFactory *database.DBFactory, req types.QueryRequest, reqCtx *ctx.RequestContext) []byte {
30
+func QueryPositionalToCSV(dbFactory *database.DBFactory, req types.QueryRequest, reqCtx *ctx.RequestContext) ([]byte, error) {
34 31
 	csvData, err := dbFactory.QueryPositionalToCSV(req.SQL, req.WriterHeader, req.PositionalParams, reqCtx)
35
-	if err != nil {
36
-		log.Fatalf("QueryParamNameToCSV Error: %v", err)
32
+	//if err != nil {
33
+	//	logger.ErrorC(reqCtx, "QueryPositionalToCSV error: %v", err)
37 34
 
38
-	}
39
-	return csvData
35
+	//}
36
+	return csvData, err
40 37
 }

+ 16
- 86
main.go Прегледај датотеку

@@ -1,92 +1,38 @@
1 1
 package main
2 2
 
3 3
 import (
4
-	"log"
5 4
 	"net/http"
6
-	"os"
7
-	"os/signal"
8
-	"syscall"
9 5
 
10
-	"git.x2erp.com/qdy/go-base/config"
6
+	"git.x2erp.com/qdy/go-base/bootstraps"
11 7
 	"git.x2erp.com/qdy/go-base/middleware"
12
-	"git.x2erp.com/qdy/go-base/myservice"
13 8
 	"git.x2erp.com/qdy/go-db/factory/database"
14 9
 	"git.x2erp.com/qdy/go-db/myhandle"
15 10
 	"git.x2erp.com/qdy/go-svc-agent/functions"
16 11
 	"go-micro.dev/v4/web"
17 12
 )
18 13
 
19
-func main() {
20
-	cfg, err := config.GetConfig()
21
-	if err != nil {
22
-		log.Printf("failed to load config: %v", err)
23
-		return
24
-	}
25
-
26
-	serviceConfig := cfg.GetService()
27
-
28
-	log.Printf("Service Port: %d", serviceConfig.Port)
29
-	log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
30
-	log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
31
-	log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
32
-	log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
33
-
34
-	log.Printf("Using database type: %s", cfg.GetDatabase().Type)
35
-	log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port)
36
-	log.Printf("Database name: %s", cfg.GetDatabase().Database)
37
-	log.Println("Database connection test passed!")
38
-
39
-	// 启动微服务
40
-	startMicroService(cfg)
41
-}
42
-
43
-// 启动微服务
44
-func startMicroService(cfg config.IConfig) {
45
-
46
-	serviceConfig := cfg.GetService()
47
-
48
-	// 初始化数据库
49
-	dbFactory, err := database.GetDBFactory()
50
-	if err != nil {
51
-		log.Fatalf("Failed to create DB factory: %v", err)
52
-	}
53
-	defer func() {
54
-		if err := dbFactory.Close(); err != nil {
55
-			log.Printf("Database close error: %v", err)
56
-		}
57
-	}()
14
+var (
15
+	serviceName    = "svc-agent"
16
+	serviceVersion = "1.0.0"
17
+)
58 18
 
59
-	// 设置优雅关闭
60
-	setupGracefulShutdown(dbFactory)
19
+func main() {
61 20
 
62
-	webService := myservice.StartStandalone(cfg)
21
+	// 创建服务启动器
22
+	bootstrapper := bootstraps.NewServiceBootstrapper(serviceName, serviceVersion)
63 23
 
64
-	// 注册HTTP路由到webService
65
-	registerRoutes(webService, dbFactory)
24
+	//加载配置
25
+	bootstrapper.InitConfig()
66 26
 
67
-	// 等待服务运行
68
-	log.Printf("Service started successfully")
69
-	log.Printf("   • Service: %s", serviceConfig.ServiceName)
70
-	log.Printf("   • Port: %d", serviceConfig.Port)
71
-	log.Printf("   • Mode: %s", getServiceMode(cfg))
27
+	//构建数据库工厂
28
+	bootstrapper.InitDatabase()
29
+	defer bootstrapper.CleanupDatabase()
72 30
 
73
-	// 保持主程序运行
74
-	select {}
75
-}
31
+	//dbFactory := bootstrapper.DbFactory
76 32
 
77
-// 判断是否使用注册中心
78
-func shouldUseRegistry(cfg config.IConfig) bool {
79
-	microConfig := cfg.GetMicro()
80
-	// 如果有配置注册中心地址且不为空,则使用注册中心
81
-	return microConfig.RegistryAddress != ""
82
-}
33
+	// 启动服务,传入路由注册函数
34
+	bootstrapper.Run(registerRoutes)
83 35
 
84
-// 获取服务模式描述
85
-func getServiceMode(cfg config.IConfig) string {
86
-	if shouldUseRegistry(cfg) {
87
-		return "With Service Discovery"
88
-	}
89
-	return "Standalone"
90 36
 }
91 37
 
92 38
 // 注册所有路由
@@ -107,19 +53,3 @@ func registerRoutes(webService web.Service, dbFactory *database.DBFactory) {
107 53
 		myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryPositionalToCSV)
108 54
 	})))
109 55
 }
110
-
111
-// 设置优雅关闭
112
-func setupGracefulShutdown(dbFactory *database.DBFactory) {
113
-	signalCh := make(chan os.Signal, 1)
114
-	signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
115
-
116
-	go func() {
117
-		<-signalCh
118
-		log.Println("\nReceived shutdown signal, closing database connection...")
119
-		if err := dbFactory.Close(); err != nil {
120
-			log.Printf("Error closing database: %v", err)
121
-		}
122
-		log.Println("Database connection closed gracefully")
123
-		os.Exit(0)
124
-	}()
125
-}

+ 100
- 0
test/my_post_query_test.go Прегледај датотеку

@@ -0,0 +1,100 @@
1
+package main
2
+
3
+import (
4
+	"fmt"
5
+	"log"
6
+	"testing"
7
+
8
+	"git.x2erp.com/qdy/go-base/types"
9
+	"git.x2erp.com/qdy/go-db/factory/http"
10
+)
11
+
12
+func TestQuery(t *testing.T) {
13
+	// 记录总开始时间
14
+	//totalStartTime := time.Now()
15
+
16
+	// 1. 获取HTTP工厂实例
17
+	httpFactory, err := http.GetHTTPFactory()
18
+	if err != nil {
19
+		t.Fatalf("Failed to get HTTP factory: %v", err)
20
+	}
21
+	fmt.Println("HTTP factory created successfully")
22
+
23
+	// 7. 获取Doris工厂实例
24
+	//dorisFactory1, err := doris.GetDorisFactory(httpFactory)
25
+	if err != nil {
26
+		t.Fatalf("Failed to get Doris factory: %v", err)
27
+	}
28
+	fmt.Println("Doris factory created successfully")
29
+
30
+	// 获取Doris配置
31
+	//cfg, err := config.GetConfig()
32
+	if err != nil {
33
+		t.Fatalf("failed to load config: %v", err)
34
+		return
35
+	}
36
+
37
+	sql, queryParams := getSQLWithPaginationSQL(0, 10)
38
+	// 准备查询请求
39
+	queryRequest := types.QueryRequest{
40
+		SQL:              sql,
41
+		PositionalParams: queryParams,
42
+		WriterHeader:     false,
43
+	}
44
+
45
+	httpClient := httpFactory.CreateClient()
46
+	// 发送POST请求到 /api/query/csv 获取CSV格式数据
47
+	resp, err := httpClient.PostWithAuth(
48
+		"http://localhost:8080/api/query/csv/param",
49
+		queryRequest,
50
+		"123", // Bearer Token
51
+		nil,
52
+	)
53
+
54
+	if err != nil {
55
+		csvData := string(resp.Body())
56
+		log.Printf("查询失败:%v", err)
57
+		log.Printf("csvData--err:%s", csvData)
58
+
59
+		return
60
+	}
61
+
62
+	if resp.StatusCode() != 200 {
63
+		log.Printf("\n 询请求失败, 状态码: %d", resp.StatusCode())
64
+	}
65
+
66
+	// 获取CSV数据
67
+	csvData := string(resp.Body())
68
+
69
+	log.Printf("\n csvData:%s", csvData)
70
+
71
+}
72
+
73
+// getSQLWithPagination 生成带分页的SQL语句(参数模式)
74
+// 返回SQL语句和参数映射
75
+func getSQLWithPaginationSQL(startRow, endRow int) (string, []interface{}) {
76
+	sql := `SELECT
77
+    CLOTHING_ID,
78
+    CLOTHING_YEAR,
79
+    CLOTHING_NAME
80
+
81
+   FROM (
82
+    SELECT a.*, ROWNUM as rn
83
+    FROM (
84
+        SELECT *
85
+        FROM X6_STOCK_DEV.A3_CLOTHING 
86
+     
87
+        ORDER BY CLOTHING_ID
88
+    ) a
89
+    WHERE ROWNUM <= :1
90
+)
91
+WHERE rn > :2`
92
+
93
+	// 创建参数映射
94
+	params := []interface{}{
95
+		endRow,
96
+		startRow - 1, // WHERE rn > :start_row 所以是startRow-1
97
+	}
98
+
99
+	return sql, params
100
+}

Loading…
Откажи
Сачувај