From 9cf19aaa359ea6f11691f5efe507020560a096ea Mon Sep 17 00:00:00 2001 From: Gerhard Gruber Date: Tue, 7 Sep 2021 20:59:42 +0200 Subject: [PATCH] Added GetSQL method --- expression_ext.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/expression_ext.go b/expression_ext.go index 060e5555..8052a6be 100644 --- a/expression_ext.go +++ b/expression_ext.go @@ -451,3 +451,65 @@ func (db *DB) FormatDate(e *expr, format string) *expr { func (db *DB) FormatDateColumn(e *expr, format string) string { return db.FormatDate(e, format).expr } + +func (db *DB) GetSQL() string { + scope := db.NewScope(db.Value) + + scope.prepareQuerySQL() + + stmt := scope.SQL + for _, arg := range scope.SQLVars { + stmt = strings.Replace(stmt, "?", "'"+escape(fmt.Sprintf("%v", arg))+"'", 1) + } + + return stmt +} + +func escape(source string) string { + var j int = 0 + if len(source) == 0 { + return "" + } + tempStr := source[:] + desc := make([]byte, len(tempStr)*2) + for i := 0; i < len(tempStr); i++ { + flag := false + var escape byte + switch tempStr[i] { + case '\r': + flag = true + escape = '\r' + + case '\n': + flag = true + escape = '\n' + + case '\\': + flag = true + escape = '\\' + + case '\'': + flag = true + escape = '\'' + + case '"': + flag = true + escape = '"' + + case '\032': + flag = true + escape = 'Z' + + default: + } + if flag { + desc[j] = '\\' + desc[j+1] = escape + j = j + 2 + } else { + desc[j] = tempStr[i] + j = j + 1 + } + } + return string(desc[0:j]) +}