Skip to content

Commit e5fb7d2

Browse files
committed
Refactor code
1 parent 38f7e4f commit e5fb7d2

File tree

2 files changed

+73
-20
lines changed

2 files changed

+73
-20
lines changed

sequence/sequence.go

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,25 @@ func NewSequenceAdapter(db *sql.DB, buildParam func(int) string, options ...stri
4242
BuildParam: buildParam,
4343
}
4444
}
45-
func (s *SequenceAdapter) Next(ctx context.Context, id string) (int64, error) {
46-
query := fmt.Sprintf(`select %s from %s where %s = %s`, s.Sequence, s.Tables, s.Table, s.BuildParam(1))
47-
tx, err := s.DB.Begin()
45+
func (s *SequenceAdapter) Next(ctx context.Context, seqName string) (int64, error) {
46+
seq, err := s.next(ctx, seqName)
4847
if err != nil {
49-
return -1, err
48+
return seq, err
49+
}
50+
for {
51+
if seq == -2 {
52+
seq, err := s.next(ctx, seqName)
53+
if err != nil {
54+
return seq, err
55+
}
56+
} else {
57+
return seq, nil
58+
}
5059
}
51-
rows, err := tx.QueryContext(ctx, query, id)
60+
}
61+
func (s *SequenceAdapter) next(ctx context.Context, seqName string) (int64, error) {
62+
query := fmt.Sprintf(`select %s from %s where %s = %s`, s.Sequence, s.Tables, s.Table, s.BuildParam(1))
63+
rows, err := s.DB.QueryContext(ctx, query, seqName)
5264
if err != nil {
5365
return -1, err
5466
}
@@ -58,34 +70,29 @@ func (s *SequenceAdapter) Next(ctx context.Context, id string) (int64, error) {
5870
if err := rows.Scan(&seq); err != nil {
5971
return -1, err
6072
}
61-
updateSql := fmt.Sprintf(`update %s set %s = %s where %s = %s`, s.Tables, s.Sequence, s.BuildParam(1), s.Table, s.BuildParam(2))
62-
_, err = tx.ExecContext(ctx, updateSql, seq+1, id)
73+
updateSql := fmt.Sprintf(`update %s set %s = %s + 1 where %s = %s and %s = %d`, s.Tables, s.Sequence, s.Sequence, s.Table, s.BuildParam(1), s.Sequence, seq)
74+
res, err := s.DB.ExecContext(ctx, updateSql, seqName)
6375
if err != nil {
64-
er := tx.Rollback()
65-
if er != nil {
66-
return -1, er
67-
}
6876
return -1, err
6977
}
70-
err = tx.Commit()
78+
c, err := res.RowsAffected()
7179
if err != nil {
7280
return -1, err
7381
}
82+
if c == 0 {
83+
return -2, nil
84+
}
7485
return seq, nil
7586
} else {
7687
insertSql := fmt.Sprintf(`insert into %s (%s, %s) values (%s, 2)`, s.Tables, s.Table, s.Sequence, s.BuildParam(1))
77-
_, err = tx.ExecContext(ctx, insertSql, id)
88+
_, err = s.DB.ExecContext(ctx, insertSql, seqName)
7889
if err != nil {
79-
er := tx.Rollback()
80-
if er != nil {
81-
return -1, er
90+
x := strings.ToLower(err.Error())
91+
if strings.Index(x, "unique constraint") >= 0 || strings.Index(x, "Violation of PRIMARY KEY constraint") >= 0 {
92+
return -2, nil
8293
}
8394
return -1, err
8495
}
85-
err = tx.Commit()
86-
if err != nil {
87-
return -1, err
88-
}
8996
return 1, nil
9097
}
9198
}

transform/transform.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package transform
2+
3+
import (
4+
"encoding/json"
5+
"reflect"
6+
"strings"
7+
)
8+
9+
func ToMap(model interface{}, checkOmit bool, ignoreFields ...string) map[string]interface{} {
10+
modelType := reflect.TypeOf(model)
11+
modelValue := reflect.ValueOf(model)
12+
if modelType.Kind() == reflect.Ptr {
13+
modelType = modelType.Elem()
14+
modelValue = modelValue.Elem()
15+
}
16+
numFields := modelType.NumField()
17+
fields := make(map[string]interface{})
18+
for i := 0; i < numFields; i++ {
19+
tag, ok := modelType.Field(i).Tag.Lookup("json")
20+
if ok {
21+
name := strings.Split(tag, ",")
22+
if checkOmit {
23+
if !modelValue.Field(i).IsZero() {
24+
fields[name[0]] = modelValue.Field(i).Interface()
25+
}
26+
} else {
27+
fields[name[0]] = modelValue.Field(i).Interface()
28+
}
29+
30+
}
31+
}
32+
for _, v := range ignoreFields {
33+
if _, ok := fields[v]; ok {
34+
delete(fields, v)
35+
}
36+
}
37+
return fields
38+
}
39+
40+
func ToObject(ms map[string]interface{}, result interface{}) error {
41+
bytes, err := json.Marshal(ms)
42+
if err != nil {
43+
return err
44+
}
45+
return json.Unmarshal(bytes, result)
46+
}

0 commit comments

Comments
 (0)