瀏覽代碼

测试通过

qdy 3 月之前
父節點
當前提交
20ec0f7bb7
共有 5 個檔案被更改,包括 340 行新增159 行删除
  1. 4
    5
      functions/heath.go
  2. 5
    4
      functions/info.go
  3. 283
    0
      functions/init_table.go
  4. 48
    67
      main.go
  5. 0
    83
      routes/init_table.go

routes/heath.go → functions/heath.go 查看文件

@@ -1,20 +1,19 @@
1
-package routes
1
+package functions
2 2
 
3 3
 import (
4
-	"database/sql"
5 4
 	"time"
6 5
 
7 6
 	"github.com/gin-gonic/gin"
8 7
 
9 8
 	"git.x2erp.com/qdy/go-base/types"
10
-	"git.x2erp.com/qdy/go-db/factory"
9
+	"git.x2erp.com/qdy/go-db/factory/database"
11 10
 )
12 11
 
13 12
 // HealthHandler 返回一个处理函数
14
-func HealthHandler(db *sql.DB, dbType string) gin.HandlerFunc {
13
+func HealthHandler(dbFactory *database.DBFactory, dbType string) gin.HandlerFunc {
15 14
 	return func(c *gin.Context) {
16 15
 
17
-		err := factory.TestConnection(db, dbType)
16
+		err := dbFactory.TestConnection(dbType)
18 17
 		success := err == nil
19 18
 
20 19
 		status := "DOWN"

routes/info.go → functions/info.go 查看文件

@@ -1,18 +1,19 @@
1
-package routes
1
+package functions
2 2
 
3 3
 import (
4 4
 	"time"
5 5
 
6 6
 	"github.com/gin-gonic/gin"
7 7
 
8
+	"git.x2erp.com/qdy/go-base/config"
8 9
 	"git.x2erp.com/qdy/go-base/types"
9
-	"git.x2erp.com/qdy/go-db/factory"
10
+	"git.x2erp.com/qdy/go-db/factory/database"
10 11
 )
11 12
 
12 13
 // InfoHandler 数据库信息
13
-func InfoHandler(dbFactory *factory.DBFactory) gin.HandlerFunc {
14
+func InfoHandler(dbFactory *database.DBFactory) gin.HandlerFunc {
14 15
 	return func(c *gin.Context) {
15
-		config := dbFactory.GetConfig()
16
+		config := config.GetConfig()
16 17
 		drivers := dbFactory.GetAvailableDrivers()
17 18
 
18 19
 		c.JSON(200, &types.QueryResult{

+ 283
- 0
functions/init_table.go 查看文件

@@ -0,0 +1,283 @@
1
+package functions
2
+
3
+import (
4
+	"log"
5
+
6
+	"git.x2erp.com/qdy/go-base/types"
7
+	"git.x2erp.com/qdy/go-db/factory/database"
8
+	"github.com/gin-gonic/gin"
9
+)
10
+
11
+// 定义表结构
12
+type tableDDL struct {
13
+	TableName string
14
+	SQL       string
15
+}
16
+
17
+// 最简单的使用方式 - 直接在代码中维护
18
+func ExecuteDDLHandler(dbFactory *database.DBFactory) func(c *gin.Context) {
19
+	return func(c *gin.Context) {
20
+
21
+		tables := getTableDDLs()
22
+
23
+		success := []string{}
24
+		failures := map[string]string{}
25
+
26
+		// 直接遍历 tables 切片
27
+		for _, table := range tables {
28
+			if err := dbFactory.ExecuteDDL(table.SQL); err != nil {
29
+				failures[table.TableName] = err.Error()
30
+				log.Printf("[%s] 失败: %v", table.TableName, err)
31
+			} else {
32
+				success = append(success, table.TableName)
33
+				log.Printf("[%s] 成功", table.TableName)
34
+			}
35
+		}
36
+
37
+		successState := true
38
+		if len(failures) > 0 {
39
+			successState = false // 这里用 = 赋值,不是 :=
40
+		}
41
+
42
+		c.JSON(200, types.QueryResult{
43
+			Success: successState,
44
+
45
+			Data: gin.H{
46
+				"success":  success,
47
+				"failures": failures,
48
+			},
49
+		})
50
+	}
51
+}
52
+
53
+// 获取所有表定义
54
+func getTableDDLs() []tableDDL {
55
+	return []tableDDL{
56
+		{
57
+			TableName: "etl_service",
58
+			SQL: `
59
+                CREATE TABLE IF NOT EXISTS etl_service (
60
+				 	service_id VARCHAR(128) PRIMARY KEY,
61
+                    service_name VARCHAR(128) NOT NULL,
62
+                    service_ip VARCHAR(50) NOT NULL,
63
+                    service_port INTEGER NOT NULL,
64
+                    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
65
+                );
66
+            `,
67
+		},
68
+		{
69
+			TableName: "etl_agent",
70
+			SQL: `
71
+                CREATE TABLE IF NOT EXISTS etl_agent (
72
+                    agent_id  VARCHAR(50) PRIMARY KEY,
73
+                    agent_name VARCHAR(128) NOT NULL,
74
+                    agent_url VARCHAR(512)  NOT NULL,
75
+					agent_token VARCHAR(512)  NOT NULL,
76
+					agent_database_type VARCHAR(50)  NOT NULL,
77
+                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
78
+                );
79
+            `,
80
+		},
81
+		{
82
+			TableName: "etl_table",
83
+			SQL: `
84
+                CREATE TABLE IF NOT EXISTS etl_table (
85
+                    table_id  VARCHAR(50) PRIMARY KEY,
86
+                    table_tag VARCHAR(512) NOT NULL,
87
+                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
88
+                );
89
+            `,
90
+		},
91
+		{
92
+			TableName: "etl_table_field",
93
+			SQL: `
94
+                CREATE TABLE IF NOT EXISTS etl_table_field (
95
+                    system_id  VARCHAR(128) PRIMARY KEY,
96
+					table_id  VARCHAR(50) NOT NULL,
97
+					field_id  VARCHAR(50) NOT NULL,
98
+					field_type  VARCHAR(50) NOT NULL,
99
+					field_default  VARCHAR(50) NOT NULL,
100
+                    field_tag VARCHAR(512) NOT NULL,
101
+                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
102
+                );
103
+            `,
104
+		},
105
+
106
+		{
107
+			TableName: "etl_sql",
108
+			SQL: `
109
+                CREATE TABLE IF NOT EXISTS etl_sql (
110
+					sql_id  VARCHAR(128) PRIMARY KEY,
111
+					agent_id  VARCHAR(50) NOT NULL,
112
+					table_id  VARCHAR(50) NOT NULL,
113
+					where_field_name  VARCHAR(50) NOT NULL,
114
+					where_field_type  VARCHAR(50) NOT NULL,
115
+                    sql_tag VARCHAR(512)  NULL,
116
+            		data_sql  VARCHAR NOT NULL,
117
+					cunt_sql  VARCHAR NOT NULL,
118
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
119
+                );
120
+            `,
121
+		},
122
+
123
+		//参数配置表
124
+		{
125
+			TableName: "etl_config",
126
+			SQL: `
127
+                CREATE TABLE IF NOT EXISTS etl_config (
128
+					config_id  VARCHAR(50) PRIMARY KEY,
129
+					config_type  VARCHAR(50) NOT NULL,
130
+					config_value  VARCHAR(128) NOT NULL,
131
+					config_default_value  VARCHAR(128) NOT NULL,
132
+            		config_tag  VARCHAR(128) NOT NULL,
133
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
134
+                );
135
+            `,
136
+		},
137
+
138
+		//任务表-count
139
+		{
140
+			TableName: "etl_task_count",
141
+			SQL: `
142
+                CREATE TABLE IF NOT EXISTS etl_task_count (
143
+					task_id  VARCHAR(38) PRIMARY KEY,
144
+					sql_id  VARCHAR(50) NOT NULL,
145
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
146
+                );
147
+            `,
148
+		},
149
+
150
+		//任务表-data
151
+		{
152
+			TableName: "etl_task_data",
153
+			SQL: `
154
+                CREATE TABLE IF NOT EXISTS etl_task_data (
155
+					task_id  VARCHAR(38) PRIMARY KEY,
156
+					sql_id  VARCHAR(50) NOT NULL,
157
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
158
+                );
159
+            `,
160
+		},
161
+
162
+		//任务表-count_log
163
+		{
164
+			TableName: "etl_task_count_log",
165
+			SQL: `
166
+                CREATE TABLE IF NOT EXISTS etl_task_count_log (
167
+				    log_id  VARCHAR(50) PRIMARY KEY,
168
+					task_id  VARCHAR(38) NOT NULL,
169
+					sql_id  VARCHAR(50) NOT NULL,
170
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
171
+                );
172
+            `,
173
+		},
174
+
175
+		//任务表-data_log
176
+		{
177
+			TableName: "etl_task_data_log",
178
+			SQL: `
179
+                CREATE TABLE IF NOT EXISTS etl_task_data_log (
180
+				    log_id  VARCHAR(50) PRIMARY KEY,
181
+					task_id  VARCHAR(38) NOT NULL,
182
+					sql_id  VARCHAR(50) NOT NULL,
183
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
184
+                );
185
+            `,
186
+		},
187
+
188
+		//任务表-count_queue
189
+		{
190
+			TableName: "etl_task_queue",
191
+			SQL: `
192
+                CREATE TABLE IF NOT EXISTS etl_task_queue (
193
+				    system_id  VARCHAR(50) PRIMARY KEY,
194
+					task_id  VARCHAR(38) NOT NULL,
195
+					queue_id  VARCHAR(38) NOT NULL,
196
+					sql_id  VARCHAR(50) NOT NULL,
197
+					task_type  INTEGER NOT NULL,
198
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
199
+                );
200
+            `,
201
+		},
202
+
203
+		//任务表-count_queue
204
+		{
205
+			TableName: "etl_task_queue_log",
206
+			SQL: `
207
+                CREATE TABLE IF NOT EXISTS etl_task_queue_log (
208
+					system_id  VARCHAR(50) PRIMARY KEY,
209
+				    task_queue_id  VARCHAR(50) PRIMARY KEY,
210
+					task_id  VARCHAR(38) NOT NULL,
211
+					queue_id  VARCHAR(38) NOT NULL,
212
+					sql_id  VARCHAR(50) NOT NULL,
213
+					task_type  INTEGER NOT NULL,
214
+					task_data  VARCHAR NOT NULL,
215
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
216
+                );
217
+            `,
218
+		},
219
+
220
+		//任务表-count_queue
221
+		{
222
+			TableName: "etl_task_queue_success_log",
223
+			SQL: `
224
+                CREATE TABLE IF NOT EXISTS etl_task_queue_success_log (
225
+					system_id  VARCHAR(50) PRIMARY KEY,
226
+				    task_queue_id  VARCHAR(50) PRIMARY KEY,
227
+					task_id  VARCHAR(38) NOT NULL,
228
+					queue_id  VARCHAR(38) NOT NULL,
229
+					sql_id  VARCHAR(50) NOT NULL,
230
+					task_type  INTEGER NOT NULL,
231
+					task_data  VARCHAR NOT NULL,
232
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
233
+                );
234
+            `,
235
+		},
236
+		//任务表-count_queue
237
+		{
238
+			TableName: "etl_task_queue_failure_log",
239
+			SQL: `
240
+                CREATE TABLE IF NOT EXISTS etl_task_queue_failure_log (
241
+					system_id  VARCHAR(50) PRIMARY KEY,
242
+				    task_queue_id  VARCHAR(50) PRIMARY KEY,
243
+					task_id  VARCHAR(38) NOT NULL,
244
+					queue_id  VARCHAR(38) NOT NULL,
245
+					sql_id  VARCHAR(50) NOT NULL,
246
+					task_type  INTEGER NOT NULL,
247
+					task_data  VARCHAR NOT NULL,
248
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
249
+                );
250
+            `,
251
+		},
252
+
253
+		// 定时日志Timer
254
+		{
255
+			TableName: "etl_timer",
256
+			SQL: `
257
+                CREATE TABLE IF NOT EXISTS etl_timer (
258
+				    timer_id  VARCHAR(50) PRIMARY KEY,
259
+					timer_name  VARCHAR(50) NOT NULL,
260
+					timer_cron  VARCHAR(50) NOT NULL,
261
+					timer_tag  VARCHAR(50) NOT NULL,
262
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
263
+                );
264
+            `,
265
+		},
266
+
267
+		// 定时日志Timer
268
+		{
269
+			TableName: "etl_timer_log",
270
+			SQL: `
271
+                CREATE TABLE IF NOT EXISTS etl_timer_log (
272
+					system_id  VARCHAR(50) PRIMARY KEY,
273
+				    timer_id  VARCHAR(50) NOT NULL,
274
+					timer_name  VARCHAR(50) NOT NULL,
275
+					timer_cron  VARCHAR(50) NOT NULL,
276
+					timer_tag  VARCHAR(50) NOT NULL,
277
+			        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
278
+                );
279
+            `,
280
+		},
281
+		// 添加新表在这里插入新的 TableDDL
282
+	}
283
+}

+ 48
- 67
main.go 查看文件

@@ -1,75 +1,36 @@
1 1
 package main
2 2
 
3 3
 import (
4
-	"database/sql"
5 4
 	"fmt"
6 5
 	"log"
7 6
 	"net/http"
7
+	"os"
8
+	"os/signal"
8 9
 	"strings"
10
+	"syscall"
9 11
 	"time"
10 12
 
13
+	"git.x2erp.com/qdy/go-base/config"
11 14
 	"git.x2erp.com/qdy/go-base/types"
12
-	"git.x2erp.com/qdy/go-db/factory"
13
-	"git.x2erp.com/qdy/go-service-job/auth"
14
-	"git.x2erp.com/qdy/go-service-job/routes"
15
+	"git.x2erp.com/qdy/go-db/factory/database"
16
+	"git.x2erp.com/qdy/go-service-agent/auth"
17
+	"git.x2erp.com/qdy/go-service-agent/functions"
15 18
 	"github.com/gin-gonic/gin"
16 19
 )
17 20
 
18
-// 单例实例
19
-var (
20
-	dbFactory *factory.DBFactory
21
-	db        *sql.DB
22
-)
23
-
24
-// initDB 初始化数据库连接(单例)
25
-func initDB() error {
26
-	var err error
27
-
28
-	// 创建数据库工厂(单例)
29
-	if dbFactory == nil {
30
-		dbFactory, err = factory.NewDBFactory()
31
-		if err != nil {
32
-			return fmt.Errorf("failed to create DB factory: %v", err)
33
-		}
34
-	}
35
-
36
-	// 创建数据库连接(单例)
37
-	if db == nil {
38
-		db, err = dbFactory.CreateDB()
39
-		if err != nil {
40
-			return fmt.Errorf("failed to create database connection: %v", err)
41
-		}
42
-	}
43
-
44
-	// 测试连接
45
-	config := dbFactory.GetConfig()
46
-	if err := factory.TestConnection(db, config.GetDatabase().Type); err != nil {
47
-		return fmt.Errorf("database connection test failed: %v", err)
48
-	}
49
-
50
-	return nil
51
-}
52
-
53 21
 func main() {
54
-	// 1. 初始化数据库(单例)
55
-	if err := initDB(); err != nil {
56
-		log.Fatalf("Database initialization failed: %v", err)
57
-	}
58 22
 
59
-	// 2. 显示基础信息
60
-	drivers := dbFactory.GetAvailableDrivers()
61
-	config := dbFactory.GetConfig()
23
+	cfg := config.GetConfig()
62 24
 
63
-	log.Printf("Service Port: %d", config.GetService().Port)
64
-	log.Printf("Service IdleTimeout: %d", config.GetService().IdleTimeout)
65
-	log.Printf("Service ReadTimeout: %d", config.GetService().ReadTimeout)
66
-	log.Printf("Service WriteTimeout: %d", config.GetService().WriteTimeout)
67
-	log.Printf("Service TrustedProxies: %s", config.GetService().TrustedProxies)
25
+	log.Printf("Service Port: %d", cfg.GetService().Port)
26
+	log.Printf("Service IdleTimeout: %d", cfg.GetService().IdleTimeout)
27
+	log.Printf("Service ReadTimeout: %d", cfg.GetService().ReadTimeout)
28
+	log.Printf("Service WriteTimeout: %d", cfg.GetService().WriteTimeout)
29
+	log.Printf("Service TrustedProxies: %s", cfg.GetService().TrustedProxies)
68 30
 
69
-	log.Printf("Available database drivers: %v", drivers)
70
-	log.Printf("Using database type: %s", config.GetDatabase().Type)
71
-	log.Printf("Database host: %s:%d", config.GetDatabase().Host, config.GetDatabase().Port)
72
-	log.Printf("Database name: %s", config.GetDatabase().Database)
31
+	log.Printf("Using database type: %s", cfg.GetDatabase().Type)
32
+	log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port)
33
+	log.Printf("Database name: %s", cfg.GetDatabase().Database)
73 34
 	log.Println("Database connection test passed!")
74 35
 
75 36
 	// 3. 启动Gin HTTP服务
@@ -80,14 +41,26 @@ func main() {
80 41
 func startHTTPServer() {
81 42
 	//建立路由
82 43
 	router := gin.Default()
83
-	config := dbFactory.GetConfig()
84
-	serviceConfig := config.GetService()
44
+	cfg := config.GetConfig()
45
+	serviceConfig := cfg.GetService()
46
+
47
+	dbFactory, err := database.GetDBFactory()
48
+	if err != nil {
49
+		log.Fatalf("Failed to create DB factory: %v", err)
50
+	}
51
+	// 设置优雅关闭
52
+	setupGracefulShutdown(dbFactory)
53
+	defer func() {
54
+		dbFactory.Close()
55
+		log.Println("Database connection closed")
56
+	}()
85 57
 
86 58
 	// 核心路由
87
-	router.GET("/api/health", routes.HealthHandler(db, config.GetDatabase().Type))
88
-	router.POST("/api/init/table", auth.AuthMiddleware(), routes.ExecuteDDLHandler(db))
89
-	//router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(routes.QueryHandlerCSV(db)))
90
-	router.GET("/api/info", routes.InfoHandler(dbFactory))
59
+	router.GET("/api/health", functions.HealthHandler(dbFactory, cfg.GetDatabase().Type))
60
+	router.POST("/api/query", auth.AuthMiddleware(), withQueryRequest(functions.QueryToJSON(dbFactory)))
61
+	router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(functions.QueryToCSV(dbFactory)))
62
+	router.POST("/api/query/csv/param", auth.AuthMiddleware(), withQueryRequest(functions.QueryPositionalToCSV(dbFactory)))
63
+	router.GET("/api/info", functions.InfoHandler(dbFactory))
91 64
 
92 65
 	// 日志输出配置信息
93 66
 	log.Printf("Service Port: %d", serviceConfig.Port)
@@ -99,12 +72,6 @@ func startHTTPServer() {
99 72
 	// 设置可信代理
100 73
 	setupTrustedProxies(router, serviceConfig.TrustedProxies)
101 74
 
102
-	// 启动服务
103
-	log.Println("POST /api/query  - Execute SQL query to JSON")
104
-	log.Println("POST /api/query/csv  - Execute SQL query to CSV")
105
-	log.Println("GET  /api/health - Health check")
106
-	log.Println("GET  /api/info   - Database info")
107
-
108 75
 	// 创建HTTP服务器配置
109 76
 	server := &http.Server{
110 77
 		Addr:         fmt.Sprintf(":%d", serviceConfig.Port),
@@ -118,6 +85,7 @@ func startHTTPServer() {
118 85
 	if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
119 86
 		log.Fatalf("Failed to start server: %v", err)
120 87
 	}
88
+
121 89
 }
122 90
 
123 91
 // 参数绑定包装器
@@ -172,3 +140,16 @@ func setupTrustedProxiesRouter(router *gin.Engine, trimmedProxies []string) {
172 140
 	}
173 141
 
174 142
 }
143
+
144
+func setupGracefulShutdown(dbFactory *database.DBFactory) {
145
+	signalCh := make(chan os.Signal, 1)
146
+	signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
147
+
148
+	go func() {
149
+		<-signalCh
150
+		log.Println("\nReceived shutdown signal, closing database connection...")
151
+		dbFactory.Close()
152
+		log.Println("Database connection closed gracefully")
153
+		os.Exit(0)
154
+	}()
155
+}

+ 0
- 83
routes/init_table.go 查看文件

@@ -1,83 +0,0 @@
1
-package routes
2
-
3
-import (
4
-	"database/sql"
5
-	"log"
6
-
7
-	"git.x2erp.com/qdy/go-base/types"
8
-	"git.x2erp.com/qdy/go-db/factory"
9
-	"github.com/gin-gonic/gin"
10
-)
11
-
12
-// 定义表结构
13
-type tableDDL struct {
14
-	TableName string
15
-	SQL       string
16
-}
17
-
18
-// 最简单的使用方式 - 直接在代码中维护
19
-func ExecuteDDLHandler(db *sql.DB) func(c *gin.Context) {
20
-	return func(c *gin.Context) {
21
-
22
-		tables := getTableDDLs()
23
-
24
-		success := []string{}
25
-		failures := map[string]string{}
26
-
27
-		// 直接遍历 tables 切片
28
-		for _, table := range tables {
29
-			if err := factory.ExecuteDDL(db, table.SQL); err != nil {
30
-				failures[table.TableName] = err.Error()
31
-				log.Printf("[%s] 失败: %v", table.TableName, err)
32
-			} else {
33
-				success = append(success, table.TableName)
34
-				log.Printf("[%s] 成功", table.TableName)
35
-			}
36
-		}
37
-
38
-		successState := true
39
-		if len(failures) > 0 {
40
-			successState = false // 这里用 = 赋值,不是 :=
41
-		}
42
-
43
-		c.JSON(200, types.QueryResult{
44
-			Success: successState,
45
-
46
-			Data: gin.H{
47
-				"success":  success,
48
-				"failures": failures,
49
-			},
50
-		})
51
-	}
52
-}
53
-
54
-// 获取所有表定义
55
-func getTableDDLs() []tableDDL {
56
-	return []tableDDL{
57
-		{
58
-			TableName: "etl_service",
59
-			SQL: `
60
-                CREATE TABLE IF NOT EXISTS etl_service (
61
-                    etl_service_name VARCHAR(255) PRIMARY KEY,
62
-                    etl_ip VARCHAR(50) NOT NULL,
63
-                    etl_port INTEGER NOT NULL,
64
-                    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
65
-                );
66
-            `,
67
-		},
68
-		{
69
-			TableName: "etl_agent",
70
-			SQL: `
71
-                CREATE TABLE IF NOT EXISTS etl_agent (
72
-                    agent_id  VARCHAR(50) PRIMARY KEY,
73
-                    agent_name VARCHAR(100) NOT NULL,
74
-                    agent_url VARCHAR(512)  NOT NULL,
75
-					agent_token VARCHAR(512)  NOT NULL,
76
-                    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
77
-                );
78
-            `,
79
-		},
80
-
81
-		// 添加新表在这里插入新的 TableDDL
82
-	}
83
-}

Loading…
取消
儲存