mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-05 00:40:24 +08:00
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
|
|
package sqlparser
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bufio"
|
||
|
|
"io"
|
||
|
|
"mayfly-go/internal/db/dbm/sqlparser/sqlstmt"
|
||
|
|
"regexp"
|
||
|
|
)
|
||
|
|
|
||
|
|
type DbDialect string
|
||
|
|
|
||
|
|
// const (
|
||
|
|
// mysql DbDialect = "mysql"
|
||
|
|
// pgsql DbDialect = "pgsql"
|
||
|
|
// )
|
||
|
|
|
||
|
|
type SqlParser interface {
|
||
|
|
|
||
|
|
// sql解析
|
||
|
|
// @param stmt sql语句
|
||
|
|
Parse(stmt string) ([]sqlstmt.Stmt, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
// var (
|
||
|
|
// parsers = make(map[string]SqlParser)
|
||
|
|
// )
|
||
|
|
|
||
|
|
// // 注册数据库类型与dbmeta
|
||
|
|
// func Register(dialect string, parser SqlParser) {
|
||
|
|
// parsers[dialect] = parser
|
||
|
|
// }
|
||
|
|
|
||
|
|
// func getParser(dialect string) (SqlParser, error) {
|
||
|
|
// parser, ok := parsers[dialect]
|
||
|
|
// if !ok {
|
||
|
|
// return nil, errors.New("不存在该parser")
|
||
|
|
// }
|
||
|
|
// return parser, nil
|
||
|
|
// }
|
||
|
|
|
||
|
|
// 解析sql
|
||
|
|
// @param dialect 方言
|
||
|
|
// @param stmt sql语句
|
||
|
|
// func Parse(dialect string, stmt string) ([]sqlstmt.Stmt, error) {
|
||
|
|
// if parser, err := getParser(dialect); err != nil {
|
||
|
|
// return nil, err
|
||
|
|
// } else {
|
||
|
|
// return parser.Parse(stmt)
|
||
|
|
// }
|
||
|
|
// }
|
||
|
|
|
||
|
|
var sqlSplitRegexp = regexp.MustCompile(`\s*;\s*\n`)
|
||
|
|
|
||
|
|
// SplitSqls 根据;\n切割sql
|
||
|
|
func SplitSqls(r io.Reader) *bufio.Scanner {
|
||
|
|
scanner := bufio.NewScanner(r)
|
||
|
|
|
||
|
|
scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||
|
|
if atEOF && len(data) == 0 {
|
||
|
|
return 0, nil, io.EOF
|
||
|
|
}
|
||
|
|
|
||
|
|
match := sqlSplitRegexp.FindIndex(data)
|
||
|
|
|
||
|
|
if match != nil {
|
||
|
|
// 如果找到了";\n",判断是否为最后一行
|
||
|
|
if match[1] == len(data) {
|
||
|
|
// 如果是最后一行,则返回完整的切片
|
||
|
|
return len(data), data, nil
|
||
|
|
}
|
||
|
|
// 否则,返回到";\n"之后,并且包括";\n"本身
|
||
|
|
return match[1], data[:match[1]], nil
|
||
|
|
}
|
||
|
|
|
||
|
|
if atEOF {
|
||
|
|
return len(data), data, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0, nil, nil
|
||
|
|
})
|
||
|
|
|
||
|
|
return scanner
|
||
|
|
}
|