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