Fix bug
This commit is contained in:
parent
9c55057ef2
commit
d5a638544e
52
engine.go
52
engine.go
|
@ -5,7 +5,6 @@
|
|||
package xorm
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
|
@ -1163,55 +1162,16 @@ func (engine *Engine) SumsInt(bean interface{}, colNames ...string) ([]int64, er
|
|||
|
||||
// ImportFile SQL DDL file
|
||||
func (engine *Engine) ImportFile(ddlPath string) ([]sql.Result, error) {
|
||||
file, err := os.Open(ddlPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
return engine.Import(file)
|
||||
session := engine.NewSession()
|
||||
defer session.Close()
|
||||
return session.ImportFile(ddlPath)
|
||||
}
|
||||
|
||||
// Import SQL DDL from io.Reader
|
||||
func (engine *Engine) Import(r io.Reader) ([]sql.Result, error) {
|
||||
var results []sql.Result
|
||||
var lastError error
|
||||
scanner := bufio.NewScanner(r)
|
||||
|
||||
var inSingleQuote bool
|
||||
semiColSpliter := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||
if atEOF && len(data) == 0 {
|
||||
return 0, nil, nil
|
||||
}
|
||||
for i, b := range data {
|
||||
if b == '\'' {
|
||||
inSingleQuote = !inSingleQuote
|
||||
}
|
||||
if !inSingleQuote && b == ';' {
|
||||
return i + 1, data[0:i], nil
|
||||
}
|
||||
}
|
||||
// If we're at EOF, we have a final, non-terminated line. Return it.
|
||||
if atEOF {
|
||||
return len(data), data, nil
|
||||
}
|
||||
// Request more data.
|
||||
return 0, nil, nil
|
||||
}
|
||||
|
||||
scanner.Split(semiColSpliter)
|
||||
|
||||
for scanner.Scan() {
|
||||
query := strings.Trim(scanner.Text(), " \t\n\r")
|
||||
if len(query) > 0 {
|
||||
result, err := engine.DB().ExecContext(engine.defaultContext, query)
|
||||
results = append(results, result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results, lastError
|
||||
session := engine.NewSession()
|
||||
defer session.Close()
|
||||
return session.Import(r)
|
||||
}
|
||||
|
||||
// nowTime return current time
|
||||
|
|
|
@ -90,6 +90,10 @@ func TestDump(t *testing.T) {
|
|||
|
||||
assert.NoError(t, prepareEngine())
|
||||
|
||||
_, err := testEngine.ImportFile(fp)
|
||||
sess := testEngine.NewSession()
|
||||
defer sess.Close()
|
||||
assert.NoError(t, sess.Begin())
|
||||
_, err := sess.ImportFile(fp)
|
||||
assert.NoError(t, err)
|
||||
assert.NoError(t, sess.Commit())
|
||||
}
|
||||
|
|
|
@ -5,8 +5,11 @@
|
|||
package xorm
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"xorm.io/xorm/internal/utils"
|
||||
|
@ -432,3 +435,56 @@ func (session *Session) Sync2(beans ...interface{}) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ImportFile SQL DDL file
|
||||
func (session *Session) ImportFile(ddlPath string) ([]sql.Result, error) {
|
||||
file, err := os.Open(ddlPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
return session.Import(file)
|
||||
}
|
||||
|
||||
// Import SQL DDL from io.Reader
|
||||
func (session *Session) Import(r io.Reader) ([]sql.Result, error) {
|
||||
var results []sql.Result
|
||||
var lastError error
|
||||
scanner := bufio.NewScanner(r)
|
||||
|
||||
var inSingleQuote bool
|
||||
semiColSpliter := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||
if atEOF && len(data) == 0 {
|
||||
return 0, nil, nil
|
||||
}
|
||||
for i, b := range data {
|
||||
if b == '\'' {
|
||||
inSingleQuote = !inSingleQuote
|
||||
}
|
||||
if !inSingleQuote && b == ';' {
|
||||
return i + 1, data[0:i], nil
|
||||
}
|
||||
}
|
||||
// If we're at EOF, we have a final, non-terminated line. Return it.
|
||||
if atEOF {
|
||||
return len(data), data, nil
|
||||
}
|
||||
// Request more data.
|
||||
return 0, nil, nil
|
||||
}
|
||||
|
||||
scanner.Split(semiColSpliter)
|
||||
|
||||
for scanner.Scan() {
|
||||
query := strings.Trim(scanner.Text(), " \t\n\r")
|
||||
if len(query) > 0 {
|
||||
result, err := session.Exec(query)
|
||||
results = append(results, result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results, lastError
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue