@@ -87,6 +87,17 @@ func (a *Adapter[T]) Create(ctx context.Context, model T) (int64, error) {
87
87
if err != nil {
88
88
return - 1 , err
89
89
}
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
+ }
90
101
return res .RowsAffected ()
91
102
}
92
103
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) {
96
107
if err != nil {
97
108
return - 1 , err
98
109
}
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
+ }
99
122
return res .RowsAffected ()
100
123
}
101
124
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) {
108
131
if err != nil {
109
132
return - 1 , err
110
133
}
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
+ }
111
146
return res .RowsAffected ()
112
147
}
113
148
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) {
136
171
}
137
172
return 0 , err
138
173
}
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
+ }
0 commit comments