Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Commit 3add351

Browse files
marshalyslunny
authored andcommitted
Add version uint type support (#1125)
* fix panic when use version with uint32 type * fix panic when use version with uint32 type * Code refactoring
1 parent 1f39c59 commit 3add351

File tree

4 files changed

+129
-6
lines changed

4 files changed

+129
-6
lines changed

session.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,3 +845,12 @@ func (session *Session) Unscoped() *Session {
845845
session.statement.Unscoped()
846846
return session
847847
}
848+
849+
func (session *Session) incrVersionFieldValue(fieldValue *reflect.Value) {
850+
switch fieldValue.Kind() {
851+
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
852+
fieldValue.SetInt(fieldValue.Int() + 1)
853+
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
854+
fieldValue.SetUint(fieldValue.Uint() + 1)
855+
}
856+
}

session_insert.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
397397
if err != nil {
398398
session.engine.logger.Error(err)
399399
} else if verValue.IsValid() && verValue.CanSet() {
400-
verValue.SetInt(1)
400+
session.incrVersionFieldValue(verValue)
401401
}
402402
}
403403

@@ -440,7 +440,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
440440
if err != nil {
441441
session.engine.logger.Error(err)
442442
} else if verValue.IsValid() && verValue.CanSet() {
443-
verValue.SetInt(1)
443+
session.incrVersionFieldValue(verValue)
444444
}
445445
}
446446

@@ -481,7 +481,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) {
481481
if err != nil {
482482
session.engine.logger.Error(err)
483483
} else if verValue.IsValid() && verValue.CanSet() {
484-
verValue.SetInt(1)
484+
session.incrVersionFieldValue(verValue)
485485
}
486486
}
487487

session_update.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string,
116116
} else {
117117
session.engine.logger.Debug("[cacheUpdate] set bean field", bean, colName, fieldValue.Interface())
118118
if col.IsVersion && session.statement.checkVersion {
119-
fieldValue.SetInt(fieldValue.Int() + 1)
119+
session.incrVersionFieldValue(fieldValue)
120120
} else {
121121
fieldValue.Set(reflect.ValueOf(args[idx]))
122122
}
@@ -357,7 +357,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
357357
return 0, err
358358
} else if doIncVer {
359359
if verValue != nil && verValue.IsValid() && verValue.CanSet() {
360-
verValue.SetInt(verValue.Int() + 1)
360+
session.incrVersionFieldValue(verValue)
361361
}
362362
}
363363

tag_version_test.go

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func TestVersion1(t *testing.T) {
8585
}
8686
fmt.Println(newVer)
8787
if newVer.Ver != 2 {
88-
err = errors.New("insert error")
88+
err = errors.New("update error")
8989
t.Error(err)
9090
panic(err)
9191
}
@@ -126,3 +126,117 @@ func TestVersion2(t *testing.T) {
126126
}
127127
}
128128
}
129+
130+
type VersionUintS struct {
131+
Id int64
132+
Name string
133+
Ver uint `xorm:"version"`
134+
Created time.Time `xorm:"created"`
135+
}
136+
137+
func TestVersion3(t *testing.T) {
138+
assert.NoError(t, prepareEngine())
139+
140+
err := testEngine.DropTables(new(VersionUintS))
141+
if err != nil {
142+
t.Error(err)
143+
panic(err)
144+
}
145+
146+
err = testEngine.CreateTables(new(VersionUintS))
147+
if err != nil {
148+
t.Error(err)
149+
panic(err)
150+
}
151+
152+
ver := &VersionUintS{Name: "sfsfdsfds"}
153+
_, err = testEngine.Insert(ver)
154+
if err != nil {
155+
t.Error(err)
156+
panic(err)
157+
}
158+
fmt.Println(ver)
159+
if ver.Ver != 1 {
160+
err = errors.New("insert error")
161+
t.Error(err)
162+
panic(err)
163+
}
164+
165+
newVer := new(VersionUintS)
166+
has, err := testEngine.ID(ver.Id).Get(newVer)
167+
if err != nil {
168+
t.Error(err)
169+
panic(err)
170+
}
171+
172+
if !has {
173+
t.Error(errors.New(fmt.Sprintf("no version id is %v", ver.Id)))
174+
panic(err)
175+
}
176+
fmt.Println(newVer)
177+
if newVer.Ver != 1 {
178+
err = errors.New("insert error")
179+
t.Error(err)
180+
panic(err)
181+
}
182+
183+
newVer.Name = "-------"
184+
_, err = testEngine.ID(ver.Id).Update(newVer)
185+
if err != nil {
186+
t.Error(err)
187+
panic(err)
188+
}
189+
if newVer.Ver != 2 {
190+
err = errors.New("update should set version back to struct")
191+
t.Error(err)
192+
}
193+
194+
newVer = new(VersionUintS)
195+
has, err = testEngine.ID(ver.Id).Get(newVer)
196+
if err != nil {
197+
t.Error(err)
198+
panic(err)
199+
}
200+
fmt.Println(newVer)
201+
if newVer.Ver != 2 {
202+
err = errors.New("update error")
203+
t.Error(err)
204+
panic(err)
205+
}
206+
}
207+
208+
func TestVersion4(t *testing.T) {
209+
assert.NoError(t, prepareEngine())
210+
211+
err := testEngine.DropTables(new(VersionUintS))
212+
if err != nil {
213+
t.Error(err)
214+
panic(err)
215+
}
216+
217+
err = testEngine.CreateTables(new(VersionUintS))
218+
if err != nil {
219+
t.Error(err)
220+
panic(err)
221+
}
222+
223+
var vers = []VersionUintS{
224+
{Name: "sfsfdsfds"},
225+
{Name: "xxxxx"},
226+
}
227+
_, err = testEngine.Insert(vers)
228+
if err != nil {
229+
t.Error(err)
230+
panic(err)
231+
}
232+
233+
fmt.Println(vers)
234+
235+
for _, v := range vers {
236+
if v.Ver != 1 {
237+
err := errors.New("version should be 1")
238+
t.Error(err)
239+
panic(err)
240+
}
241+
}
242+
}

0 commit comments

Comments
 (0)