Skip to content

Commit bd20ffb

Browse files
committed
fix update map with version (go-xorm#1448)
fix test fix update map with version SetExpr support more go types (#1499) Improve tests SetExpr support more go types fix vet fix drone lint remove go1.10 test on drone Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499 fix vet fix drone lint remove go1.10 test on drone Fix update with Alias (go-xorm#1455) Reviewed-on: https://gitea.com/xorm/xorm/pulls/1448
1 parent c37aff9 commit bd20ffb

File tree

3 files changed

+57
-9
lines changed

3 files changed

+57
-9
lines changed

interface.go

+2
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,15 @@ type EngineInterface interface {
9292
Quote(string) string
9393
SetCacher(string, core.Cacher)
9494
SetConnMaxLifetime(time.Duration)
95+
SetColumnMapper(core.IMapper)
9596
SetDefaultCacher(core.Cacher)
9697
SetLogger(logger core.ILogger)
9798
SetLogLevel(core.LogLevel)
9899
SetMapper(core.IMapper)
99100
SetMaxOpenConns(int)
100101
SetMaxIdleConns(int)
101102
SetSchema(string)
103+
SetTableMapper(core.IMapper)
102104
SetTZDatabase(tz *time.Location)
103105
SetTZLocation(tz *time.Location)
104106
ShowExecTime(...bool)

session_update.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -300,21 +300,25 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
300300

301301
st := &session.statement
302302

303-
var sqlStr string
304-
var condArgs []interface{}
305-
var condSQL string
306-
cond := session.statement.cond.And(autoCond)
307-
308-
var doIncVer = (table != nil && table.Version != "" && session.statement.checkVersion)
309-
var verValue *reflect.Value
303+
var (
304+
sqlStr string
305+
condArgs []interface{}
306+
condSQL string
307+
cond = session.statement.cond.And(autoCond)
308+
309+
doIncVer = isStruct && (table != nil && table.Version != "" && session.statement.checkVersion)
310+
verValue *reflect.Value
311+
)
310312
if doIncVer {
311313
verValue, err = table.VersionColumn().ValueOf(bean)
312314
if err != nil {
313315
return 0, err
314316
}
315317

316-
cond = cond.And(builder.Eq{session.engine.Quote(table.Version): verValue.Interface()})
317-
colNames = append(colNames, session.engine.Quote(table.Version)+" = "+session.engine.Quote(table.Version)+" + 1")
318+
if verValue != nil {
319+
cond = cond.And(builder.Eq{session.engine.Quote(table.Version): verValue.Interface()})
320+
colNames = append(colNames, session.engine.Quote(table.Version)+" = "+session.engine.Quote(table.Version)+" + 1")
321+
}
318322
}
319323

320324
condSQL, condArgs, err = builder.ToSQL(cond)

session_update_test.go

+42
Original file line numberDiff line numberDiff line change
@@ -1404,3 +1404,45 @@ func TestUpdateExprs2(t *testing.T) {
14041404
assert.EqualValues(t, 0, uer2.NumCommits)
14051405
assert.EqualValues(t, "", uer2.Sha1)
14061406
}
1407+
1408+
func TestUpdateMap3(t *testing.T) {
1409+
assert.NoError(t, prepareEngine())
1410+
1411+
type UpdateMapUser struct {
1412+
Id uint64 `xorm:"PK autoincr"`
1413+
Name string `xorm:""`
1414+
Ver uint64 `xorm:"version"`
1415+
}
1416+
1417+
oldMapper := testEngine.GetColumnMapper()
1418+
defer func() {
1419+
testEngine.SetColumnMapper(oldMapper)
1420+
}()
1421+
1422+
mapper := core.NewPrefixMapper(core.SnakeMapper{}, "F")
1423+
testEngine.SetColumnMapper(mapper)
1424+
1425+
assertSync(t, new(UpdateMapUser))
1426+
1427+
_, err := testEngine.Table(new(UpdateMapUser)).Insert(map[string]interface{}{
1428+
"Fname": "first user name",
1429+
"Fver": 1,
1430+
})
1431+
assert.NoError(t, err)
1432+
1433+
update := map[string]interface{}{
1434+
"Fname": "user name",
1435+
"Fver": 1,
1436+
}
1437+
rows, err := testEngine.Table(new(UpdateMapUser)).ID(1).Update(update)
1438+
assert.NoError(t, err)
1439+
assert.EqualValues(t, 1, rows)
1440+
1441+
update = map[string]interface{}{
1442+
"Name": "user name",
1443+
"Ver": 1,
1444+
}
1445+
rows, err = testEngine.Table(new(UpdateMapUser)).ID(1).Update(update)
1446+
assert.Error(t, err)
1447+
assert.EqualValues(t, 0, rows)
1448+
}

0 commit comments

Comments
 (0)