Merge pull request #31 from nashtsai/nullvalues

implemented ddl import
This commit is contained in:
lunny 2013-12-04 04:19:54 -08:00
commit 0226ed6879
4 changed files with 101 additions and 3 deletions

View File

@ -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) {

View File

@ -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"
@ -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
}

View File

@ -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 {

4
tests/mysql_ddl.sql Normal file
View File

@ -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;