Exec support conversion data
This commit is contained in:
parent
5240459858
commit
a90e59d8cd
|
@ -10,6 +10,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"xorm.io/xorm/convert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestExecAndQuery(t *testing.T) {
|
func TestExecAndQuery(t *testing.T) {
|
||||||
|
@ -65,3 +66,49 @@ func TestExecTime(t *testing.T) {
|
||||||
assert.True(t, has)
|
assert.True(t, has)
|
||||||
assert.EqualValues(t, now.In(testEngine.GetTZLocation()).Format("2006-01-02 15:04:05"), uet.Created.Format("2006-01-02 15:04:05"))
|
assert.EqualValues(t, now.In(testEngine.GetTZLocation()).Format("2006-01-02 15:04:05"), uet.Created.Format("2006-01-02 15:04:05"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ConversionData struct {
|
||||||
|
MyData string
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ convert.Conversion = new(ConversionData)
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c ConversionData) ToDB() ([]byte, error) {
|
||||||
|
return []byte(c.MyData), nil
|
||||||
|
}
|
||||||
|
func (c *ConversionData) FromDB(bs []byte) error {
|
||||||
|
if bs != nil {
|
||||||
|
c.MyData = string(bs)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExecCustomTypes(t *testing.T) {
|
||||||
|
assert.NoError(t, PrepareEngine())
|
||||||
|
|
||||||
|
type UserinfoExec struct {
|
||||||
|
Uid int
|
||||||
|
Name string
|
||||||
|
Data string
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.NoError(t, testEngine.Sync2(new(UserinfoExec)))
|
||||||
|
|
||||||
|
res, err := testEngine.Exec("INSERT INTO "+testEngine.TableName("`userinfo_exec`", true)+" (uid, name,data) VALUES (?, ?, ?)",
|
||||||
|
1, "user", ConversionData{"data"})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
cnt, err := res.RowsAffected()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, cnt)
|
||||||
|
|
||||||
|
results, err := testEngine.QueryString("select * from " + testEngine.TableName("userinfo_exec", true))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, len(results))
|
||||||
|
id, err := strconv.Atoi(results[0]["uid"])
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, id)
|
||||||
|
assert.Equal(t, "user", results[0]["name"])
|
||||||
|
assert.EqualValues(t, "data", results[0]["data"])
|
||||||
|
}
|
||||||
|
|
|
@ -16,11 +16,21 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ConversionFrom is an inteface to allow retrieve data from database
|
||||||
|
type ConversionFrom interface {
|
||||||
|
FromDB([]byte) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConversionTo is an interface to allow store data to database
|
||||||
|
type ConversionTo interface {
|
||||||
|
ToDB() ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
// Conversion is an interface. A type implements Conversion will according
|
// Conversion is an interface. A type implements Conversion will according
|
||||||
// the custom method to fill into database and retrieve from database.
|
// the custom method to fill into database and retrieve from database.
|
||||||
type Conversion interface {
|
type Conversion interface {
|
||||||
FromDB([]byte) error
|
ConversionFrom
|
||||||
ToDB() ([]byte, error)
|
ConversionTo
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrNilPtr represents an error
|
// ErrNilPtr represents an error
|
||||||
|
|
|
@ -968,6 +968,12 @@ func (statement *Statement) convertSQLOrArgs(sqlOrArgs ...interface{}) (string,
|
||||||
newArgs = append(newArgs, v.In(statement.defaultTimeZone).Format("2006-01-02 15:04:05"))
|
newArgs = append(newArgs, v.In(statement.defaultTimeZone).Format("2006-01-02 15:04:05"))
|
||||||
} else if v, ok := arg.(time.Time); ok {
|
} else if v, ok := arg.(time.Time); ok {
|
||||||
newArgs = append(newArgs, v.In(statement.defaultTimeZone).Format("2006-01-02 15:04:05"))
|
newArgs = append(newArgs, v.In(statement.defaultTimeZone).Format("2006-01-02 15:04:05"))
|
||||||
|
} else if v, ok := arg.(convert.ConversionTo); ok {
|
||||||
|
r, err := v.ToDB()
|
||||||
|
if err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
newArgs = append(newArgs, r)
|
||||||
} else {
|
} else {
|
||||||
newArgs = append(newArgs, arg)
|
newArgs = append(newArgs, arg)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue