Skip to content

Commit 22519ff

Browse files
committed
Increase version after save for generic
1 parent e922de8 commit 22519ff

File tree

3 files changed

+74
-5
lines changed

3 files changed

+74
-5
lines changed

adapter/adapter.go

+70
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,17 @@ func (a *Adapter[T]) Create(ctx context.Context, model T) (int64, error) {
8787
if err != nil {
8888
return -1, err
8989
}
90+
rowsAffected, err := res.RowsAffected()
91+
if err != nil {
92+
return rowsAffected, err
93+
}
94+
if rowsAffected > 0 && a.versionIndex >= 0 {
95+
vo := reflect.ValueOf(model)
96+
if vo.Kind() == reflect.Ptr {
97+
vo = reflect.Indirect(vo)
98+
}
99+
setVersion(vo, a.versionIndex)
100+
}
90101
return res.RowsAffected()
91102
}
92103
func (a *Adapter[T]) Update(ctx context.Context, model T) (int64, error) {
@@ -96,6 +107,18 @@ func (a *Adapter[T]) Update(ctx context.Context, model T) (int64, error) {
96107
if err != nil {
97108
return -1, err
98109
}
110+
rowsAffected, err := res.RowsAffected()
111+
if err != nil {
112+
return rowsAffected, err
113+
}
114+
if rowsAffected > 0 && a.versionIndex >= 0 {
115+
vo := reflect.ValueOf(model)
116+
if vo.Kind() == reflect.Ptr {
117+
vo = reflect.Indirect(vo)
118+
}
119+
currentVersion := vo.Field(a.versionIndex).Interface()
120+
increaseVersion(vo, a.versionIndex, currentVersion)
121+
}
99122
return res.RowsAffected()
100123
}
101124
func (a *Adapter[T]) Save(ctx context.Context, model T) (int64, error) {
@@ -108,6 +131,18 @@ func (a *Adapter[T]) Save(ctx context.Context, model T) (int64, error) {
108131
if err != nil {
109132
return -1, err
110133
}
134+
rowsAffected, err := res.RowsAffected()
135+
if err != nil {
136+
return rowsAffected, err
137+
}
138+
if rowsAffected > 0 && a.versionIndex >= 0 {
139+
vo := reflect.ValueOf(model)
140+
if vo.Kind() == reflect.Ptr {
141+
vo = reflect.Indirect(vo)
142+
}
143+
currentVersion := vo.Field(a.versionIndex).Interface()
144+
increaseVersion(vo, a.versionIndex, currentVersion)
145+
}
111146
return res.RowsAffected()
112147
}
113148
func (a *Adapter[T]) Patch(ctx context.Context, model map[string]interface{}) (int64, error) {
@@ -136,3 +171,38 @@ func handleDuplicate(db *sql.DB, err error) (int64, error) {
136171
}
137172
return 0, err
138173
}
174+
func increaseVersion(vo reflect.Value, versionIndex int, curVer interface{}) bool {
175+
versionType := vo.Field(versionIndex).Type().String()
176+
switch versionType {
177+
case "int32":
178+
nextVer := curVer.(int32) + 1
179+
vo.Field(versionIndex).Set(reflect.ValueOf(nextVer))
180+
return true
181+
case "int":
182+
nextVer := curVer.(int) + 1
183+
vo.Field(versionIndex).Set(reflect.ValueOf(nextVer))
184+
return true
185+
case "int64":
186+
nextVer := curVer.(int64) + 1
187+
vo.Field(versionIndex).Set(reflect.ValueOf(nextVer))
188+
return true
189+
default:
190+
return false
191+
}
192+
}
193+
func setVersion(vo reflect.Value, versionIndex int) bool {
194+
versionType := vo.Field(versionIndex).Type().String()
195+
switch versionType {
196+
case "int32":
197+
vo.Field(versionIndex).Set(reflect.ValueOf(int32(1)))
198+
return true
199+
case "int":
200+
vo.Field(versionIndex).Set(reflect.ValueOf(1))
201+
return true
202+
case "int64":
203+
vo.Field(versionIndex).Set(reflect.ValueOf(int64(1)))
204+
return true
205+
default:
206+
return false
207+
}
208+
}

adapter/generic_adapter.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func NewSqlGenericAdapterWithVersionAndArray[T any, K any](db *sql.DB, tableName
4949
if kType.Kind() == reflect.Map {
5050
idMap = true
5151
} else if kType.Kind() != reflect.Struct {
52-
return nil, errors.New("For composite keys, K must be a struct or a map")
52+
return nil, errors.New("for composite keys, K must be a struct or a map")
5353
}
5454
}
5555

adapter/search.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111

1212
type SearchAdapter[T any, K any, F any] struct {
1313
*GenericAdapter[T, K]
14-
DB *sql.DB
1514
BuildQuery func(F) (string, []interface{})
1615
Mp func(ctx context.Context, model interface{}) (interface{}, error)
1716
Map map[string]int
@@ -48,13 +47,13 @@ func NewSearchAdapterWithArray[T any, K any, F any](db *sql.DB, table string, bu
4847
if err != nil {
4948
return nil, err
5049
}
51-
builder := &SearchAdapter[T, K, F]{GenericAdapter: adapter, DB: db, Map: fieldsIndex, BuildQuery: buildQuery, Mp: mp, ToArray: toArray}
50+
builder := &SearchAdapter[T, K, F]{GenericAdapter: adapter, Map: fieldsIndex, BuildQuery: buildQuery, Mp: mp, ToArray: toArray}
5251
return builder, nil
5352
}
5453

5554
func (b *SearchAdapter[T, K, F]) Search(ctx context.Context, filter F, limit int64, offset int64) ([]T, int64, error) {
5655
var objs []T
57-
sql, params := b.BuildQuery(filter)
58-
total, er2 := q.BuildFromQuery(ctx, b.DB, b.Map, &objs, sql, params, limit, offset, b.ToArray, b.Mp)
56+
query, args := b.BuildQuery(filter)
57+
total, er2 := q.BuildFromQuery(ctx, b.DB, b.Map, &objs, query, args, limit, offset, b.ToArray, b.Mp)
5958
return objs, total, er2
6059
}

0 commit comments

Comments
 (0)