implemented ddl import
This commit is contained in:
parent
18c40097a0
commit
ec06be3197
|
@ -655,7 +655,7 @@ func transaction(engine *Engine, t *testing.T) {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
panic(err)
|
// panic(err) !nashtsai! should remove this
|
||||||
}
|
}
|
||||||
|
|
||||||
func combineTransaction(engine *Engine, t *testing.T) {
|
func combineTransaction(engine *Engine, t *testing.T) {
|
||||||
|
|
54
engine.go
54
engine.go
|
@ -1,10 +1,13 @@
|
||||||
package xorm
|
package xorm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -277,14 +280,14 @@ func (engine *Engine) Before(closures func(interface{})) *Session {
|
||||||
session := engine.NewSession()
|
session := engine.NewSession()
|
||||||
session.IsAutoClose = true
|
session.IsAutoClose = true
|
||||||
return session.Before(closures)
|
return session.Before(closures)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply after insert Processor, affected bean is passed to closure arg
|
// Apply after insert Processor, affected bean is passed to closure arg
|
||||||
func (engine *Engine) After(closures func(interface{})) *Session {
|
func (engine *Engine) After(closures func(interface{})) *Session {
|
||||||
session := engine.NewSession()
|
session := engine.NewSession()
|
||||||
session.IsAutoClose = true
|
session.IsAutoClose = true
|
||||||
return session.After(closures)
|
return session.After(closures)
|
||||||
}
|
}
|
||||||
|
|
||||||
// set charset when create table, only support mysql now
|
// set charset when create table, only support mysql now
|
||||||
func (engine *Engine) Charset(charset string) *Session {
|
func (engine *Engine) Charset(charset string) *Session {
|
||||||
|
@ -924,3 +927,50 @@ func (engine *Engine) Count(bean interface{}) (int64, error) {
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
return session.Count(bean)
|
return session.Count(bean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Import SQL DDL file
|
||||||
|
func (engine *Engine) Import(ddlPath string) ([]sql.Result, error) {
|
||||||
|
|
||||||
|
file, err := os.Open(ddlPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
var results []sql.Result
|
||||||
|
var lastError error
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
semiColSpliter := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||||
|
if atEOF && len(data) == 0 {
|
||||||
|
return 0, nil, nil
|
||||||
|
}
|
||||||
|
if i := bytes.IndexByte(data, ';'); i >= 0 {
|
||||||
|
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)
|
||||||
|
|
||||||
|
session := engine.NewSession()
|
||||||
|
session.IsAutoClose = false
|
||||||
|
for scanner.Scan() {
|
||||||
|
query := scanner.Text()
|
||||||
|
query = strings.Trim(query, " \t")
|
||||||
|
if len(query) > 0 {
|
||||||
|
result, err := session.Exec(query)
|
||||||
|
results = append(results, result)
|
||||||
|
if err != nil {
|
||||||
|
lastError = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
session.Close()
|
||||||
|
return results, lastError
|
||||||
|
}
|
||||||
|
|
|
@ -13,6 +13,11 @@ utf8 COLLATE utf8_general_ci;
|
||||||
var showTestSql bool = true
|
var showTestSql bool = true
|
||||||
|
|
||||||
func TestMyMysql(t *testing.T) {
|
func TestMyMysql(t *testing.T) {
|
||||||
|
err := mysqlDdlImport()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
engine, err := NewEngine("mymysql", "xorm_test/root/")
|
engine, err := NewEngine("mymysql", "xorm_test/root/")
|
||||||
defer engine.Close()
|
defer engine.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -24,11 +29,19 @@ func TestMyMysql(t *testing.T) {
|
||||||
engine.ShowWarn = showTestSql
|
engine.ShowWarn = showTestSql
|
||||||
engine.ShowDebug = showTestSql
|
engine.ShowDebug = showTestSql
|
||||||
|
|
||||||
|
sqlResults, _ := engine.Import("tests/mysql_ddl.sql")
|
||||||
|
engine.LogDebug("sql results: %v", sqlResults)
|
||||||
|
|
||||||
testAll(engine, t)
|
testAll(engine, t)
|
||||||
testAll2(engine, t)
|
testAll2(engine, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMyMysqlWithCache(t *testing.T) {
|
func TestMyMysqlWithCache(t *testing.T) {
|
||||||
|
err := mysqlDdlImport()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
engine, err := NewEngine("mymysql", "xorm_test2/root/")
|
engine, err := NewEngine("mymysql", "xorm_test2/root/")
|
||||||
defer engine.Close()
|
defer engine.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -41,11 +54,36 @@ func TestMyMysqlWithCache(t *testing.T) {
|
||||||
engine.ShowWarn = showTestSql
|
engine.ShowWarn = showTestSql
|
||||||
engine.ShowDebug = showTestSql
|
engine.ShowDebug = showTestSql
|
||||||
|
|
||||||
|
sqlResults, _ := engine.Import("tests/mysql_ddl.sql")
|
||||||
|
engine.LogDebug("sql results: %v", sqlResults)
|
||||||
|
|
||||||
testAll(engine, t)
|
testAll(engine, t)
|
||||||
testAll2(engine, t)
|
testAll2(engine, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func mysqlDdlImport() error {
|
||||||
|
engine, err := NewEngine("mymysql", "/root/")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
engine.ShowSQL = showTestSql
|
||||||
|
engine.ShowErr = showTestSql
|
||||||
|
engine.ShowWarn = showTestSql
|
||||||
|
engine.ShowDebug = showTestSql
|
||||||
|
|
||||||
|
sqlResults, _ := engine.Import("tests/mysql_ddl.sql")
|
||||||
|
engine.LogDebug("sql results: %v", sqlResults)
|
||||||
|
engine.Close()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkMyMysqlNoCache(t *testing.B) {
|
func BenchmarkMyMysqlNoCache(t *testing.B) {
|
||||||
|
err := mysqlDdlImport()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
engine, err := NewEngine("mymysql", "xorm_test2/root/")
|
engine, err := NewEngine("mymysql", "xorm_test2/root/")
|
||||||
defer engine.Close()
|
defer engine.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -57,6 +95,12 @@ func BenchmarkMyMysqlNoCache(t *testing.B) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkMyMysqlCache(t *testing.B) {
|
func BenchmarkMyMysqlCache(t *testing.B) {
|
||||||
|
err := mysqlDdlImport()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
engine, err := NewEngine("mymysql", "xorm_test2/root/")
|
engine, err := NewEngine("mymysql", "xorm_test2/root/")
|
||||||
defer engine.Close()
|
defer engine.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
--DROP DATABASE xorm_test;
|
||||||
|
--DROP DATABASE xorm_test2;
|
||||||
|
CREATE DATABASE IF NOT EXISTS xorm_test CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
CREATE DATABASE IF NOT EXISTS xorm_test2 CHARACTER SET utf8 COLLATE utf8_general_ci;
|
Loading…
Reference in New Issue