qdy 2 месяцев назад
Сommit
7d513ebecd

+ 20
- 19
factory/database/db_factory.go Просмотреть файл

2
 
2
 
3
 import (
3
 import (
4
 	"fmt"
4
 	"fmt"
5
+	"log"
5
 	"sync"
6
 	"sync"
6
 
7
 
7
 	"git.x2erp.com/qdy/go-base/config"
8
 	"git.x2erp.com/qdy/go-base/config"
9
+	"git.x2erp.com/qdy/go-base/ctx"
8
 	"git.x2erp.com/qdy/go-base/types"
10
 	"git.x2erp.com/qdy/go-base/types"
9
 	"git.x2erp.com/qdy/go-db/drivers"
11
 	"git.x2erp.com/qdy/go-db/drivers"
10
 	"git.x2erp.com/qdy/go-db/functions"
12
 	"git.x2erp.com/qdy/go-db/functions"
28
 
30
 
29
 	once.Do(func() {
31
 	once.Do(func() {
30
 		// 使用配置单例
32
 		// 使用配置单例
31
-		cfg := config.GetConfig()
33
+		cfg, err := config.GetConfig()
32
 
34
 
33
 		// 检查配置初始化是否有错误
35
 		// 检查配置初始化是否有错误
34
-		if err := config.GetInitError(); err != nil {
36
+		if err != nil {
35
 			initErr = fmt.Errorf("failed to load config: %v", err)
37
 			initErr = fmt.Errorf("failed to load config: %v", err)
36
 			return
38
 			return
37
 		}
39
 		}
44
 
46
 
45
 		// 显示所支持的数据库驱动
47
 		// 显示所支持的数据库驱动
46
 		driversStr := drivers.GetAllDrivers()
48
 		driversStr := drivers.GetAllDrivers()
47
-		fmt.Printf("Available database drivers: %v\n", driversStr)
49
+		log.Printf("Available database drivers: %v\n", driversStr)
48
 
50
 
49
 		dbConfig := cfg.GetDatabase()
51
 		dbConfig := cfg.GetDatabase()
50
 		dbType := dbConfig.Type
52
 		dbType := dbConfig.Type
91
 		return nil, initErr
93
 		return nil, initErr
92
 	}
94
 	}
93
 
95
 
94
-	fmt.Print(msg)
96
+	log.Print(msg)
95
 
97
 
96
 	return instanceDBFactory, nil
98
 	return instanceDBFactory, nil
97
 }
99
 }
106
 	if f.db != nil {
108
 	if f.db != nil {
107
 		err := f.db.Close()
109
 		err := f.db.Close()
108
 		f.db = nil
110
 		f.db = nil
109
-		fmt.Println("Database connection closed gracefully")
111
+		log.Println("Database connection closed gracefully")
110
 		return err
112
 		return err
111
 	}
113
 	}
112
 	return nil
114
 	return nil
114
 
116
 
115
 // GetDBType 得到当前使用数据库类型
117
 // GetDBType 得到当前使用数据库类型
116
 func (f *DBFactory) GetDBType() string {
118
 func (f *DBFactory) GetDBType() string {
117
-	cfg := config.GetConfig()
118
-	dbConfig := cfg.GetDatabase()
119
+	dbConfig := config.GetDatabase()
119
 	return dbConfig.Type
120
 	return dbConfig.Type
120
 }
121
 }
121
 
122
 
122
 // QueryToJSON 快捷查询,直接返回 JSON 字节流
123
 // QueryToJSON 快捷查询,直接返回 JSON 字节流
123
-func (f *DBFactory) QueryToJSON(sql string) *types.QueryResult {
124
-	return functions.QueryToJSON(f.db, sql)
124
+func (f *DBFactory) QueryToJSON(sql string, reqCtx *ctx.RequestContext) *types.QueryResult {
125
+	return functions.QueryToJSON(f.db, sql, reqCtx)
125
 }
126
 }
126
 
127
 
127
 // QueryParamsToJSON 位置参数查询并返回 JSON 字节数据
128
 // QueryParamsToJSON 位置参数查询并返回 JSON 字节数据
128
-func (f *DBFactory) QueryPositionalToJSON(sql string, params []interface{}) *types.QueryResult {
129
+func (f *DBFactory) QueryPositionalToJSON(sql string, params []interface{}, reqCtx *ctx.RequestContext) *types.QueryResult {
129
 
130
 
130
-	return functions.QueryPositionalToJSON(f.db, sql, params)
131
+	return functions.QueryPositionalToJSON(f.db, sql, params, reqCtx)
131
 }
132
 }
132
 
133
 
133
 // QueryParamsNameToJSON 命名参数查询并返回 JSON 字节数据
134
 // QueryParamsNameToJSON 命名参数查询并返回 JSON 字节数据
134
 // params 可以是 map[string]interface{} 或结构体
135
 // params 可以是 map[string]interface{} 或结构体
135
-func (f *DBFactory) QueryParamsNameToJSON(sql string, params map[string]interface{}) *types.QueryResult {
136
+func (f *DBFactory) QueryParamsNameToJSON(sql string, params map[string]interface{}, reqCtx *ctx.RequestContext) *types.QueryResult {
136
 
137
 
137
-	return functions.QueryParamsNameToJSON(f.db, sql, params)
138
+	return functions.QueryParamsNameToJSON(f.db, sql, params, reqCtx)
138
 }
139
 }
139
 
140
 
140
 // QueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
141
 // QueryToCSV 快捷查询,直接返回 CSV 字符串(包含表头)
141
-func (f *DBFactory) QueryToCSV(sql string, writerHeader bool) ([]byte, error) {
142
-	return functions.QueryToCSV(f.db, sql, writerHeader)
142
+func (f *DBFactory) QueryToCSV(sql string, writerHeader bool, reqCtx *ctx.RequestContext) ([]byte, error) {
143
+	return functions.QueryToCSV(f.db, sql, writerHeader, reqCtx)
143
 }
144
 }
144
 
145
 
145
 // QueryParamsToCSV 位置参数查询并返回 CSV 字节数据
146
 // QueryParamsToCSV 位置参数查询并返回 CSV 字节数据
146
-func (f *DBFactory) QueryPositionalToCSV(sql string, writerHeader bool, params []interface{}) ([]byte, error) {
147
+func (f *DBFactory) QueryPositionalToCSV(sql string, writerHeader bool, params []interface{}, reqCtx *ctx.RequestContext) ([]byte, error) {
147
 
148
 
148
-	return functions.QueryPositionalToCSV(f.db, sql, writerHeader, params)
149
+	return functions.QueryPositionalToCSV(f.db, sql, writerHeader, params, reqCtx)
149
 }
150
 }
150
 
151
 
151
 // QueryParamsNameToCSV 命名参数查询并返回 CSV 字节数据
152
 // QueryParamsNameToCSV 命名参数查询并返回 CSV 字节数据
152
 // params 可以是 map[string]interface{} 或结构体
153
 // params 可以是 map[string]interface{} 或结构体
153
-func (f *DBFactory) QueryParamsNameToCSV(sql string, writerHeader bool, params map[string]interface{}) ([]byte, error) {
154
+func (f *DBFactory) QueryParamsNameToCSV(sql string, writerHeader bool, params map[string]interface{}, reqCtx *ctx.RequestContext) ([]byte, error) {
154
 
155
 
155
-	return functions.QueryParamsNameToCSV(f.db, sql, writerHeader, params)
156
+	return functions.QueryParamsNameToCSV(f.db, sql, writerHeader, params, reqCtx)
156
 }
157
 }
157
 
158
 
158
 // ExecuteDDL 快捷执行DDL语句
159
 // ExecuteDDL 快捷执行DDL语句

+ 2
- 2
factory/doris/doris_factory.go Просмотреть файл

33
 func GetDorisFactory(httpFactory *http.HTTPFactory) (*DorisFactory, error) {
33
 func GetDorisFactory(httpFactory *http.HTTPFactory) (*DorisFactory, error) {
34
 	var initErr error
34
 	var initErr error
35
 	instanceOnce.Do(func() {
35
 	instanceOnce.Do(func() {
36
-		cfg := config.GetConfig()
36
+		cfg, err := config.GetConfig()
37
 
37
 
38
-		if err := config.GetInitError(); err != nil {
38
+		if err != nil {
39
 			initErr = fmt.Errorf("failed to load config: %v", err)
39
 			initErr = fmt.Errorf("failed to load config: %v", err)
40
 			return
40
 			return
41
 		}
41
 		}

+ 2
- 2
factory/http/http_factory.go Просмотреть файл

31
 // GetHTTPFactory 获取HTTP工厂单例实例
31
 // GetHTTPFactory 获取HTTP工厂单例实例
32
 func GetHTTPFactory() (*HTTPFactory, error) {
32
 func GetHTTPFactory() (*HTTPFactory, error) {
33
 	httpFactoryOnce.Do(func() {
33
 	httpFactoryOnce.Do(func() {
34
-		cfg := config.GetConfig()
34
+		cfg, err := config.GetConfig()
35
 
35
 
36
-		if err := config.GetInitError(); err != nil {
36
+		if err != nil {
37
 			httpFactoryInitErr = fmt.Errorf("failed to load config: %v", err)
37
 			httpFactoryInitErr = fmt.Errorf("failed to load config: %v", err)
38
 			return
38
 			return
39
 		}
39
 		}

+ 2
- 2
factory/rabbitmq/rabbitmq_factory.go Просмотреть файл

20
 
20
 
21
 // NewRabbitMQFactory 创建RabbitMQ工厂
21
 // NewRabbitMQFactory 创建RabbitMQ工厂
22
 func NewRabbitMQFactory() (*RabbitMQFactory, error) {
22
 func NewRabbitMQFactory() (*RabbitMQFactory, error) {
23
-	cfg := config.GetConfig()
23
+	cfg, err := config.GetConfig()
24
 
24
 
25
-	if err := config.GetInitError(); err != nil {
25
+	if err != nil {
26
 		return nil, fmt.Errorf("failed to load config: %v", err)
26
 		return nil, fmt.Errorf("failed to load config: %v", err)
27
 	}
27
 	}
28
 
28
 

+ 2
- 2
factory/redis/redis_factory.go Просмотреть файл

18
 
18
 
19
 // NewRedisFactory 创建Redis客户端工厂
19
 // NewRedisFactory 创建Redis客户端工厂
20
 func NewRedisFactory() (*RedisFactory, error) {
20
 func NewRedisFactory() (*RedisFactory, error) {
21
-	cfg := config.GetConfig()
21
+	cfg, err := config.GetConfig()
22
 
22
 
23
-	if err := config.GetInitError(); err != nil {
23
+	if err != nil {
24
 		return nil, fmt.Errorf("failed to load config: %v", err)
24
 		return nil, fmt.Errorf("failed to load config: %v", err)
25
 	}
25
 	}
26
 
26
 

+ 4
- 3
functions/query_csv.go Просмотреть файл

6
 	"fmt"
6
 	"fmt"
7
 	"strings"
7
 	"strings"
8
 
8
 
9
+	"git.x2erp.com/qdy/go-base/ctx"
9
 	"github.com/jmoiron/sqlx"
10
 	"github.com/jmoiron/sqlx"
10
 )
11
 )
11
 
12
 
12
 // QueryToCSV 无参数查询并返回 CSV 字节数据
13
 // QueryToCSV 无参数查询并返回 CSV 字节数据
13
-func QueryToCSV(db *sqlx.DB, sql string, writerHeader bool) ([]byte, error) {
14
+func QueryToCSV(db *sqlx.DB, sql string, writerHeader bool, reqCtx *ctx.RequestContext) ([]byte, error) {
14
 	if sql == "" {
15
 	if sql == "" {
15
 		return nil, fmt.Errorf("SQL query cannot be empty")
16
 		return nil, fmt.Errorf("SQL query cannot be empty")
16
 	}
17
 	}
24
 }
25
 }
25
 
26
 
26
 // QueryParamsToCSV 位置参数查询并返回 CSV 字节数据
27
 // QueryParamsToCSV 位置参数查询并返回 CSV 字节数据
27
-func QueryPositionalToCSV(db *sqlx.DB, sql string, writerHeader bool, params []interface{}) ([]byte, error) {
28
+func QueryPositionalToCSV(db *sqlx.DB, sql string, writerHeader bool, params []interface{}, reqCtx *ctx.RequestContext) ([]byte, error) {
28
 	if sql == "" {
29
 	if sql == "" {
29
 		return nil, fmt.Errorf("SQL query cannot be empty")
30
 		return nil, fmt.Errorf("SQL query cannot be empty")
30
 	}
31
 	}
39
 
40
 
40
 // QueryParamsNameToCSV 命名参数查询并返回 CSV 字节数据
41
 // QueryParamsNameToCSV 命名参数查询并返回 CSV 字节数据
41
 // params 可以是 map[string]interface{} 或结构体
42
 // params 可以是 map[string]interface{} 或结构体
42
-func QueryParamsNameToCSV(db *sqlx.DB, sql string, writerHeader bool, params map[string]interface{}) ([]byte, error) {
43
+func QueryParamsNameToCSV(db *sqlx.DB, sql string, writerHeader bool, params map[string]interface{}, reqCtx *ctx.RequestContext) ([]byte, error) {
43
 	if sql == "" {
44
 	if sql == "" {
44
 		return nil, fmt.Errorf("SQL query cannot be empty")
45
 		return nil, fmt.Errorf("SQL query cannot be empty")
45
 	}
46
 	}

+ 16
- 14
functions/query_json.go Просмотреть файл

6
 	"fmt"
6
 	"fmt"
7
 	"time"
7
 	"time"
8
 
8
 
9
+	"git.x2erp.com/qdy/go-base/ctx"
9
 	"git.x2erp.com/qdy/go-base/types"
10
 	"git.x2erp.com/qdy/go-base/types"
10
 	"github.com/jmoiron/sqlx"
11
 	"github.com/jmoiron/sqlx"
11
 )
12
 )
12
 
13
 
13
 // QueryParamsNameToJSON 执行带命名参数的查询
14
 // QueryParamsNameToJSON 执行带命名参数的查询
14
-func QueryParamsNameToJSON(db *sqlx.DB, sql string, params map[string]interface{}) *types.QueryResult {
15
+func QueryParamsNameToJSON(db *sqlx.DB, sql string, params map[string]interface{}, reqCtx *ctx.RequestContext) *types.QueryResult {
15
 	startTime := time.Now()
16
 	startTime := time.Now()
16
 
17
 
17
 	if sql == "" {
18
 	if sql == "" {
18
-		return createErrorResult("SQL query cannot be empty", startTime)
19
+		return createErrorResult("SQL query cannot be empty", startTime, reqCtx)
19
 	}
20
 	}
20
 
21
 
21
 	// 处理命名参数
22
 	// 处理命名参数
22
 	query, args, err := sqlx.Named(sql, params)
23
 	query, args, err := sqlx.Named(sql, params)
23
 	if err != nil {
24
 	if err != nil {
24
-		return createErrorResult(fmt.Sprintf("Failed to process named parameters: %v", err), startTime)
25
+		return createErrorResult(fmt.Sprintf("Failed to process named parameters: %v", err), startTime, reqCtx)
25
 	}
26
 	}
26
 
27
 
27
 	// 执行查询
28
 	// 执行查询
28
 	rows, err := db.Query(sqlx.Rebind(sqlx.DOLLAR, query), args...)
29
 	rows, err := db.Query(sqlx.Rebind(sqlx.DOLLAR, query), args...)
29
 	//rows, err := sqlx.NamedQuery(db, sql, params)
30
 	//rows, err := sqlx.NamedQuery(db, sql, params)
30
 	if err != nil {
31
 	if err != nil {
31
-		return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime)
32
+		return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime, reqCtx)
32
 	}
33
 	}
33
 	defer rows.Close()
34
 	defer rows.Close()
34
 
35
 
37
 }
38
 }
38
 
39
 
39
 // QueryPositionalToJSON 执行带位置参数的查询
40
 // QueryPositionalToJSON 执行带位置参数的查询
40
-func QueryPositionalToJSON(db *sqlx.DB, sql string, params []interface{}) *types.QueryResult {
41
+func QueryPositionalToJSON(db *sqlx.DB, sql string, params []interface{}, reqCtx *ctx.RequestContext) *types.QueryResult {
41
 	startTime := time.Now()
42
 	startTime := time.Now()
42
 
43
 
43
 	//fmt.Printf("positionalParams: %s", params)
44
 	//fmt.Printf("positionalParams: %s", params)
44
 	//fmt.Printf("sql: %s", sql)
45
 	//fmt.Printf("sql: %s", sql)
45
 	if sql == "" {
46
 	if sql == "" {
46
-		return createErrorResult("SQL query cannot be empty", startTime)
47
+		return createErrorResult("SQL query cannot be empty", startTime, reqCtx)
47
 	}
48
 	}
48
 
49
 
49
 	// 执行查询
50
 	// 执行查询
50
 	rows, err := db.Query(sql, params...)
51
 	rows, err := db.Query(sql, params...)
51
 	if err != nil {
52
 	if err != nil {
52
-		return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime)
53
+		return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime, reqCtx)
53
 	}
54
 	}
54
 	defer rows.Close()
55
 	defer rows.Close()
55
 
56
 
58
 }
59
 }
59
 
60
 
60
 // QueryToJSON 执行无参数的查询
61
 // QueryToJSON 执行无参数的查询
61
-func QueryToJSON(db *sqlx.DB, sql string) *types.QueryResult {
62
+func QueryToJSON(db *sqlx.DB, sql string, reqCtx *ctx.RequestContext) *types.QueryResult {
62
 	startTime := time.Now()
63
 	startTime := time.Now()
63
 
64
 
64
 	if sql == "" {
65
 	if sql == "" {
65
-		return createErrorResult("SQL query cannot be empty", startTime)
66
+		return createErrorResult("SQL query cannot be empty", startTime, reqCtx)
66
 	}
67
 	}
67
 
68
 
68
 	// 执行查询
69
 	// 执行查询
69
 	rows, err := db.Query(sql)
70
 	rows, err := db.Query(sql)
70
 	if err != nil {
71
 	if err != nil {
71
-		return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime)
72
+		return createErrorResult(fmt.Sprintf("Query execution failed: %v", err), startTime, reqCtx)
72
 	}
73
 	}
73
 	defer rows.Close()
74
 	defer rows.Close()
74
 
75
 
146
 }
147
 }
147
 
148
 
148
 // createErrorResult 创建错误结果的辅助函数
149
 // createErrorResult 创建错误结果的辅助函数
149
-func createErrorResult(errorMsg string, startTime time.Time) *types.QueryResult {
150
+func createErrorResult(errorMsg string, startTime time.Time, reqCtx *ctx.RequestContext) *types.QueryResult {
150
 	return &types.QueryResult{
151
 	return &types.QueryResult{
151
-		Success: false,
152
-		Error:   errorMsg,
153
-		Time:    time.Since(startTime).String(),
152
+		Success:  false,
153
+		Error:    errorMsg,
154
+		Time:     time.Since(startTime).String(),
155
+		Metadata: reqCtx,
154
 	}
156
 	}
155
 }
157
 }

+ 2
- 1
functions/testConnection.go Просмотреть файл

2
 
2
 
3
 import (
3
 import (
4
 	"fmt"
4
 	"fmt"
5
+	"log"
5
 
6
 
6
 	"github.com/jmoiron/sqlx"
7
 	"github.com/jmoiron/sqlx"
7
 )
8
 )
28
 		return fmt.Errorf("unexpected test result: %d", result)
29
 		return fmt.Errorf("unexpected test result: %d", result)
29
 	}
30
 	}
30
 
31
 
31
-	fmt.Println("test Connection  database is success.")
32
+	log.Println("test Connection  database is success.")
32
 	return nil
33
 	return nil
33
 }
34
 }

+ 4
- 2
myhandle/query_handler_bytes.go Просмотреть файл

3
 import (
3
 import (
4
 	"encoding/json"
4
 	"encoding/json"
5
 	"net/http"
5
 	"net/http"
6
+
7
+	"git.x2erp.com/qdy/go-base/ctx"
6
 )
8
 )
7
 
9
 
8
 // 最简单的 queryHandler,只处理 []byte 返回
10
 // 最简单的 queryHandler,只处理 []byte 返回
10
 	w http.ResponseWriter,
12
 	w http.ResponseWriter,
11
 	r *http.Request,
13
 	r *http.Request,
12
 	factory F,
14
 	factory F,
13
-	handlerFunc func(F, T) []byte,
15
+	handlerFunc func(F, T, *ctx.RequestContext) []byte,
14
 ) {
16
 ) {
15
 	// 解析请求参数
17
 	// 解析请求参数
16
 	var req T
18
 	var req T
24
 	}
26
 	}
25
 
27
 
26
 	// 调用业务逻辑函数
28
 	// 调用业务逻辑函数
27
-	csvData := handlerFunc(factory, req)
29
+	csvData := handlerFunc(factory, req, ctx.GetContext(r))
28
 
30
 
29
 	// 直接返回 CSV 数据(包含错误信息时也会被正确处理)
31
 	// 直接返回 CSV 数据(包含错误信息时也会被正确处理)
30
 	w.Header().Set("Content-Type", "text/csv")
32
 	w.Header().Set("Content-Type", "text/csv")

+ 3
- 2
myhandle/query_handler_json.go Просмотреть файл

5
 	"net/http"
5
 	"net/http"
6
 	"time"
6
 	"time"
7
 
7
 
8
+	"git.x2erp.com/qdy/go-base/ctx"
8
 	"git.x2erp.com/qdy/go-base/types"
9
 	"git.x2erp.com/qdy/go-base/types"
9
 )
10
 )
10
 
11
 
13
 	w http.ResponseWriter,
14
 	w http.ResponseWriter,
14
 	r *http.Request,
15
 	r *http.Request,
15
 	factory F,
16
 	factory F,
16
-	handlerFunc func(F, T) *types.QueryResult,
17
+	handlerFunc func(F, T, *ctx.RequestContext) *types.QueryResult,
17
 ) {
18
 ) {
18
 	// 解析请求参数
19
 	// 解析请求参数
19
 	var req T
20
 	var req T
29
 	}
30
 	}
30
 
31
 
31
 	// 执行业务逻辑
32
 	// 执行业务逻辑
32
-	result := handlerFunc(factory, req)
33
+	result := handlerFunc(factory, req, ctx.GetContext(r))
33
 
34
 
34
 	// 设置头,写入结果
35
 	// 设置头,写入结果
35
 	w.Header().Set("Content-Type", "application/json")
36
 	w.Header().Set("Content-Type", "application/json")

+ 7
- 1
test.go Просмотреть файл

11
 func main() {
11
 func main() {
12
 
12
 
13
 	// 显示当前使用的数据库配置
13
 	// 显示当前使用的数据库配置
14
-	config := config.GetConfig()
14
+	config, err := config.GetConfig()
15
+	if err != nil {
16
+		log.Fatalf("failed to load config: %v", err)
17
+
18
+		return
19
+	}
20
+
15
 	dbConfig := config.GetDatabase() // 通过接口方法获取数据库配置
21
 	dbConfig := config.GetDatabase() // 通过接口方法获取数据库配置
16
 	fmt.Printf("Using database type: %s\n", dbConfig.Type)
22
 	fmt.Printf("Using database type: %s\n", dbConfig.Type)
17
 	fmt.Printf("Database host: %s:%d\n", dbConfig.Host, dbConfig.Port)
23
 	fmt.Printf("Database host: %s:%d\n", dbConfig.Host, dbConfig.Port)

Загрузка…
Отмена
Сохранить