fix update map with version #1448
|
@ -92,6 +92,7 @@ type EngineInterface interface {
|
||||||
Quote(string) string
|
Quote(string) string
|
||||||
SetCacher(string, core.Cacher)
|
SetCacher(string, core.Cacher)
|
||||||
SetConnMaxLifetime(time.Duration)
|
SetConnMaxLifetime(time.Duration)
|
||||||
|
SetColumnMapper(core.IMapper)
|
||||||
SetDefaultCacher(core.Cacher)
|
SetDefaultCacher(core.Cacher)
|
||||||
SetLogger(logger core.ILogger)
|
SetLogger(logger core.ILogger)
|
||||||
SetLogLevel(core.LogLevel)
|
SetLogLevel(core.LogLevel)
|
||||||
|
@ -99,6 +100,7 @@ type EngineInterface interface {
|
||||||
SetMaxOpenConns(int)
|
SetMaxOpenConns(int)
|
||||||
SetMaxIdleConns(int)
|
SetMaxIdleConns(int)
|
||||||
SetSchema(string)
|
SetSchema(string)
|
||||||
|
SetTableMapper(core.IMapper)
|
||||||
SetTZDatabase(tz *time.Location)
|
SetTZDatabase(tz *time.Location)
|
||||||
SetTZLocation(tz *time.Location)
|
SetTZLocation(tz *time.Location)
|
||||||
ShowExecTime(...bool)
|
ShowExecTime(...bool)
|
||||||
|
|
|
@ -300,22 +300,26 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
|
||||||
|
|
||||||
st := &session.statement
|
st := &session.statement
|
||||||
|
|
||||||
var sqlStr string
|
var (
|
||||||
var condArgs []interface{}
|
sqlStr string
|
||||||
var condSQL string
|
condArgs []interface{}
|
||||||
cond := session.statement.cond.And(autoCond)
|
condSQL string
|
||||||
|
cond = session.statement.cond.And(autoCond)
|
||||||
|
|
||||||
var doIncVer = (table != nil && table.Version != "" && session.statement.checkVersion)
|
doIncVer = isStruct && (table != nil && table.Version != "" && session.statement.checkVersion)
|
||||||
var verValue *reflect.Value
|
verValue *reflect.Value
|
||||||
|
)
|
||||||
if doIncVer {
|
if doIncVer {
|
||||||
verValue, err = table.VersionColumn().ValueOf(bean)
|
verValue, err = table.VersionColumn().ValueOf(bean)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if verValue != nil {
|
||||||
cond = cond.And(builder.Eq{session.engine.Quote(table.Version): verValue.Interface()})
|
cond = cond.And(builder.Eq{session.engine.Quote(table.Version): verValue.Interface()})
|
||||||
colNames = append(colNames, session.engine.Quote(table.Version)+" = "+session.engine.Quote(table.Version)+" + 1")
|
colNames = append(colNames, session.engine.Quote(table.Version)+" = "+session.engine.Quote(table.Version)+" + 1")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
condSQL, condArgs, err = builder.ToSQL(cond)
|
condSQL, condArgs, err = builder.ToSQL(cond)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1404,3 +1404,45 @@ func TestUpdateExprs2(t *testing.T) {
|
||||||
assert.EqualValues(t, 0, uer2.NumCommits)
|
assert.EqualValues(t, 0, uer2.NumCommits)
|
||||||
assert.EqualValues(t, "", uer2.Sha1)
|
assert.EqualValues(t, "", uer2.Sha1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateMap3(t *testing.T) {
|
||||||
|
assert.NoError(t, prepareEngine())
|
||||||
|
|
||||||
|
type UpdateMapUser struct {
|
||||||
|
Id uint64 `xorm:"PK autoincr"`
|
||||||
|
Name string `xorm:""`
|
||||||
|
Ver uint64 `xorm:"version"`
|
||||||
|
}
|
||||||
|
|
||||||
|
oldMapper := testEngine.GetColumnMapper()
|
||||||
|
defer func() {
|
||||||
|
testEngine.SetColumnMapper(oldMapper)
|
||||||
|
}()
|
||||||
|
|
||||||
|
mapper := core.NewPrefixMapper(core.SnakeMapper{}, "F")
|
||||||
|
testEngine.SetColumnMapper(mapper)
|
||||||
|
|
||||||
|
assertSync(t, new(UpdateMapUser))
|
||||||
|
|
||||||
|
_, err := testEngine.Table(new(UpdateMapUser)).Insert(map[string]interface{}{
|
||||||
|
"Fname": "first user name",
|
||||||
|
"Fver": 1,
|
||||||
|
})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
update := map[string]interface{}{
|
||||||
|
"Fname": "user name",
|
||||||
|
"Fver": 1,
|
||||||
|
}
|
||||||
|
rows, err := testEngine.Table(new(UpdateMapUser)).ID(1).Update(update)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, rows)
|
||||||
|
|
||||||
|
update = map[string]interface{}{
|
||||||
|
"Name": "user name",
|
||||||
|
"Ver": 1,
|
||||||
|
}
|
||||||
|
rows, err = testEngine.Table(new(UpdateMapUser)).ID(1).Update(update)
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.EqualValues(t, 0, rows)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user