From 1873461012c99801f364bd07fae2c218d245048e Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期一, 11 九月 2023 19:42:39 +0800
Subject: [PATCH] 修复bom第一启动时的全量上报

---
 kingdee/query.go |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 111 insertions(+), 3 deletions(-)

diff --git a/kingdee/query.go b/kingdee/query.go
index 9242abf..6bef988 100644
--- a/kingdee/query.go
+++ b/kingdee/query.go
@@ -1,8 +1,116 @@
 package kingdee
 
-import "fmt"
+import (
+	"encoding/json"
+	"errors"
+	"strings"
 
-func QueryMsgHandle(data []byte) error {
-	fmt.Println("recv msg ", string(data))
+	"kingdee-dbapi/config"
+	"kingdee-dbapi/logger"
+	"kingdee-dbapi/nsqclient"
+)
+
+// 閫氱敤sql鏌ヨ鎺ュ彛
+
+type SqlQueryMsg struct {
+	Key     string // 璇锋眰
+	Command string
+	Success bool
+	Message string
+	Result  []byte
+}
+
+func SqlQueryHandle(msg []byte) error {
+	var query SqlQueryMsg
+
+	if err := json.Unmarshal(msg, &query); err != nil {
+		logger.Warn("瑙f瀽璇锋眰澶辫触, err:%s, msg:%s", err.Error(), string(msg))
+		return err
+	}
+
+	var sql = query.Command
+	logger.Debug("鎺ユ敹鍒版煡璇㈣姹�,%s", sql)
+
+	if !sqlCheck(sql) {
+		query.Message = "鍗遍櫓鐨剆ql璇彞, 鎷掔粷鎵ц"
+		logger.Warn(query.Message)
+	} else {
+		result, err := execSqlCommand(sql)
+		if err != nil {
+			query.Message = err.Error()
+			logger.Warn("sql鎵ц澶辫触:%s", query.Message)
+		} else {
+			query.Result = result
+			query.Success = true
+			logger.Warn("sql鎵ц瀹屾垚.")
+		}
+	}
+
+	replyData, _ := json.Marshal(query)
+	ok := nsqclient.Produce(config.Options.SqlReplyTopic, replyData)
+	logger.Warn("搴旂瓟鏌ヨ璇锋眰缁撴灉:%t, key:%s", ok, query.Key)
+
 	return nil
 }
+
+func execSqlCommand(sql string) ([]byte, error) {
+	var result []interface{}
+
+	if db == nil {
+		return nil, errors.New("鏁版嵁搴撴湭杩炴帴")
+	}
+
+	rows, err := db.Raw(sql).Rows()
+	if err != nil {
+		return nil, err
+	}
+
+	var cols []string
+	for rows.Next() {
+		//鍏堣幏鍙栨墍鏈夌殑column
+		if cols == nil {
+			cols, _ = rows.Columns()
+		}
+
+		//寤虹珛淇╀釜interface鏁扮粍锛宑olumnPointers涓瓨鍦╟olumns鐨勫湴鍧�
+		columns := make([]interface{}, len(cols))
+		columnPointers := make([]interface{}, len(cols))
+		for i := 0; i < len(columns); i++ {
+			//璧嬪�煎湴鍧�
+			columnPointers[i] = &columns[i]
+		}
+
+		//鎵弿缁撴灉
+		err = rows.Scan(columnPointers...)
+		if err != nil {
+			return nil, err
+		}
+
+		m := make(map[string]interface{})
+		for i, colName := range cols {
+			val := columnPointers[i].(*interface{})
+			m[colName] = *val
+		}
+
+		result = append(result, m)
+	}
+
+	rb, _ := json.Marshal(result)
+
+	return rb, nil
+}
+
+// 绠�鍗曡繃婊や笅sql璇彞,鎷掔粷澧炲垹鏀规搷浣�
+func sqlCheck(sql string) bool {
+	var dangerousWords = []string{"INSERT", "UPDATE", "DELETE", "ALTER", "DROP", "DECLARE", "EXECUTE", "EXEC", "INTO", "TRANCATE"}
+
+	var upperStr = strings.ToUpper(sql)
+
+	for _, word := range dangerousWords {
+		if strings.Contains(upperStr, word) {
+			return false
+		}
+	}
+
+	return true
+}

--
Gitblit v1.8.0