Skip to content

Commit df3aa19

Browse files
committed
Fix bug Generic Repository and Action Log
1 parent ce2378e commit df3aa19

File tree

7 files changed

+67
-43
lines changed

7 files changed

+67
-43
lines changed

action/action_log.go

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,45 @@ import (
44
"context"
55
"database/sql"
66
"fmt"
7+
"reflect"
8+
"strconv"
79
"strings"
810
"time"
9-
10-
q "github.com/core-go/sql"
1111
)
1212

13+
func BuildParam(i int) string {
14+
return "?"
15+
}
16+
func BuildOracleParam(i int) string {
17+
return ":" + strconv.Itoa(i)
18+
}
19+
func BuildMsSqlParam(i int) string {
20+
return "@p" + strconv.Itoa(i)
21+
}
22+
func BuildDollarParam(i int) string {
23+
return "$" + strconv.Itoa(i)
24+
}
25+
func GetBuild(db *sql.DB) func(i int) string {
26+
driver := reflect.TypeOf(db.Driver()).String()
27+
switch driver {
28+
case "*pq.Driver":
29+
return BuildDollarParam
30+
case "*godror.drv":
31+
return BuildOracleParam
32+
case "*mssql.Driver":
33+
return BuildMsSqlParam
34+
default:
35+
return BuildParam
36+
}
37+
}
38+
39+
type DBConfig struct {
40+
DataSourceName string `yaml:"data_source_name" mapstructure:"data_source_name" json:"dataSourceName,omitempty" gorm:"column:datasourcename" bson:"dataSourceName,omitempty" dynamodbav:"dataSourceName,omitempty" firestore:"dataSourceName,omitempty"`
41+
Driver string `yaml:"driver" mapstructure:"driver" json:"driver,omitempty" gorm:"column:driver" bson:"driver,omitempty" dynamodbav:"driver,omitempty" firestore:"driver,omitempty"`
42+
}
1343
type ActionLogConf struct {
1444
Log bool `yaml:"log" mapstructure:"log" json:"log,omitempty" gorm:"column:log" bson:"log,omitempty" dynamodbav:"log,omitempty" firestore:"log,omitempty"`
15-
DB q.Config `yaml:"db" mapstructure:"db" json:"db,omitempty" gorm:"column:db" bson:"db,omitempty" dynamodbav:"db,omitempty" firestore:"db,omitempty"`
45+
DB DBConfig `yaml:"db" mapstructure:"db" json:"db,omitempty" gorm:"column:db" bson:"db,omitempty" dynamodbav:"db,omitempty" firestore:"db,omitempty"`
1646
Schema ActionLogSchema `yaml:"schema" mapstructure:"schema" json:"schema,omitempty" gorm:"column:schema" bson:"schema,omitempty" dynamodbav:"schema,omitempty" firestore:"schema,omitempty"`
1747
Config ActionLogConfig `yaml:"config" mapstructure:"config" json:"config,omitempty" gorm:"column:config" bson:"config,omitempty" dynamodbav:"config,omitempty" firestore:"config,omitempty"`
1848
}
@@ -42,7 +72,6 @@ type ActionLogWriter struct {
4272
Schema ActionLogSchema
4373
Generate func(ctx context.Context) (string, error)
4474
BuildParam func(i int) string
45-
Driver string
4675
}
4776

4877
func NewSqlActionLogWriter(database *sql.DB, tableName string, config ActionLogConfig, s ActionLogSchema, options ...func(context.Context) (string, error)) *ActionLogWriter {
@@ -60,7 +89,6 @@ func NewActionLogWriter(database *sql.DB, tableName string, config ActionLogConf
6089
s.Timestamp = strings.ToLower(s.Timestamp)
6190
s.Status = strings.ToLower(s.Status)
6291
s.Desc = strings.ToLower(s.Desc)
63-
driver := q.GetDriver(database)
6492
if len(s.Id) == 0 {
6593
s.Id = "id"
6694
}
@@ -86,9 +114,9 @@ func NewActionLogWriter(database *sql.DB, tableName string, config ActionLogConf
86114
if len(options) > 0 && options[0] != nil {
87115
buildParam = options[0]
88116
} else {
89-
buildParam = q.GetBuild(database)
117+
buildParam = GetBuild(database)
90118
}
91-
writer := ActionLogWriter{Database: database, Table: tableName, Config: config, Schema: s, Generate: generate, BuildParam: buildParam, Driver: driver}
119+
writer := ActionLogWriter{Database: database, Table: tableName, Config: config, Schema: s, Generate: generate, BuildParam: buildParam}
92120
return &writer
93121
}
94122

@@ -122,7 +150,7 @@ func (s *ActionLogWriter) Write(ctx context.Context, resource string, action str
122150
log[k] = v
123151
}
124152
}
125-
query, vars := BuildInsertSQL(s.Database, s.Table, log, s.BuildParam)
153+
query, vars := BuildInsertSQL(s.Table, log, s.BuildParam)
126154
_, err := s.Database.ExecContext(ctx, query, vars...)
127155
return err
128156
}
@@ -154,18 +182,11 @@ func GetString(ctx context.Context, key string) string {
154182
}
155183
return ""
156184
}
157-
func BuildInsertSQL(db *sql.DB, tableName string, model map[string]interface{}, options ...func(i int) string) (string, []interface{}) {
158-
driver := q.GetDriver(db)
159-
var buildParam func(i int) string
160-
if len(options) > 0 && options[0] != nil {
161-
buildParam = options[0]
162-
} else {
163-
buildParam = q.GetBuild(db)
164-
}
185+
func BuildInsertSQL(tableName string, model map[string]interface{}, buildParam func(i int) string) (string, []interface{}) {
165186
var cols []string
166187
var values []interface{}
167188
for col, v := range model {
168-
cols = append(cols, QuoteString(col, driver))
189+
cols = append(cols, col)
169190
values = append(values, v)
170191
}
171192
column := fmt.Sprintf("(%v)", strings.Join(cols, ","))
@@ -176,13 +197,6 @@ func BuildInsertSQL(db *sql.DB, tableName string, model map[string]interface{},
176197
arrValue = append(arrValue, param)
177198
}
178199
value := fmt.Sprintf("(%v)", strings.Join(arrValue, ","))
179-
strSQL := fmt.Sprintf("insert into %v %v values %v", QuoteString(tableName, driver), column, value)
200+
strSQL := fmt.Sprintf("insert into %v %v values %v", tableName, column, value)
180201
return strSQL, values
181202
}
182-
183-
func QuoteString(name string, driver string) string {
184-
if driver == q.DriverPostgres {
185-
name = `"` + name + `"`
186-
}
187-
return name
188-
}

adapter/adapter.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ type Adapter[T any, K any] struct {
2020
}
2121

2222
func NewAdapter[T any, K any](db *sql.DB, tableName string, opts ...func(int) string) (*Adapter[T, K], error) {
23-
return NewSqlAdapterWithVersionAndArray[T, K](db, tableName, "", nil, opts...)
23+
return NewAdapterWithVersionAndArray[T, K](db, tableName, "", nil, opts...)
2424
}
2525
func NewAdapterWithVersion[T any, K any](db *sql.DB, tableName string, versionField string, opts ...func(int) string) (*Adapter[T, K], error) {
26-
return NewSqlAdapterWithVersionAndArray[T, K](db, tableName, versionField, nil, opts...)
26+
return NewAdapterWithVersionAndArray[T, K](db, tableName, versionField, nil, opts...)
2727
}
28-
func NewSqlAdapterWithVersionAndArray[T any, K any](db *sql.DB, tableName string, versionField string, toArray func(interface{}) interface {
28+
func NewAdapterWithArray[T any, K any](db *sql.DB, tableName string, toArray func(interface{}) interface {
29+
driver.Valuer
30+
sql.Scanner
31+
}, opts ...func(int) string) (*Adapter[T, K], error) {
32+
return NewAdapterWithVersionAndArray[T, K](db, tableName, "", toArray, opts...)
33+
}
34+
func NewAdapterWithVersionAndArray[T any, K any](db *sql.DB, tableName string, versionField string, toArray func(interface{}) interface {
2935
driver.Valuer
3036
sql.Scanner
3137
}, opts ...func(int) string) (*Adapter[T, K], error) {
@@ -58,6 +64,7 @@ func NewSqlAdapterWithVersionAndArray[T any, K any](db *sql.DB, tableName string
5864
fields := q.BuildFieldsBySchema(adapter.Schema)
5965
return &Adapter[T, K]{adapter, fieldsIndex, fields, idMap}, nil
6066
}
67+
6168
func (a *Adapter[T, K]) All(ctx context.Context) ([]T, error) {
6269
var objs []T
6370
query := fmt.Sprintf("select %s from %s", a.Fields, a.Table)
@@ -91,7 +98,7 @@ func (a *Adapter[T, K]) Load(ctx context.Context, id K) (*T, error) {
9198
query := fmt.Sprintf("select %s from %s ", a.Fields, a.Table)
9299
query1, args := q.BuildFindByIdWithDB(a.DB, query, ip, a.JsonColumnMap, a.Keys, a.BuildParam)
93100
tx := q.GetExec(ctx, a.DB, a.TxKey)
94-
err := q.Query(ctx, tx, a.Map, &objs, query1, args...)
101+
err := q.QueryWithArray(ctx, tx, a.Map, &objs, a.ToArray, query1, args...)
95102
if err != nil {
96103
return nil, err
97104
}

adapter/search.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func NewSearchAdapterWithArray[T any, K any, F any](db *sql.DB, table string, bu
3030
driver.Valuer
3131
sql.Scanner
3232
}, versionField string, buildParam func(int) string, opts ...func(*T)) (*SearchAdapter[T, K, F], error) {
33-
adapter, err := NewSqlAdapterWithVersionAndArray[T, K](db, table, versionField, toArray, buildParam)
33+
adapter, err := NewAdapterWithVersionAndArray[T, K](db, table, versionField, toArray, buildParam)
3434
if err != nil {
3535
return nil, err
3636
}

query/loader.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type Loader[T any, K any] struct {
2424
Keys []string
2525
BuildParam func(i int) string
2626
Map func(*T)
27-
toArray func(interface{}) interface {
27+
ToArray func(interface{}) interface {
2828
driver.Valuer
2929
sql.Scanner
3030
}
@@ -88,7 +88,7 @@ func NewLoaderWithMapAndArray[T any, K any](db *sql.DB, tableName string, toArra
8888
func (a *Loader[T, K]) All(ctx context.Context) ([]T, error) {
8989
var objs []T
9090
query := fmt.Sprintf("select %s from %s", a.Fields, a.Table)
91-
err := q.Query(ctx, a.DB, a.FieldMap, &objs, query)
91+
err := q.QueryWithArray(ctx, a.DB, a.FieldMap, &objs, a.ToArray, query)
9292
if a.Map != nil {
9393
l := len(objs)
9494
for i := 0; i < l; i++ {
@@ -122,7 +122,7 @@ func (a *Loader[T, K]) Load(ctx context.Context, id K) (*T, error) {
122122
var objs []T
123123
query := fmt.Sprintf("select %s from %s ", a.Fields, a.Table)
124124
query1, args := q.BuildFindByIdWithDB(a.DB, query, ip, a.JsonColumnMap, a.Keys, a.BuildParam)
125-
err := q.Query(ctx, a.DB, a.FieldMap, &objs, query1, args...)
125+
err := q.QueryWithArray(ctx, a.DB, a.FieldMap, &objs, a.ToArray, query1, args...)
126126
if err != nil {
127127
return nil, err
128128
}

query/query.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ type Query[T any, K any, F any] struct {
1414
BuildQuery func(F) (string, []interface{})
1515
Mp func(*T)
1616
Map map[string]int
17-
ToArray func(interface{}) interface {
18-
driver.Valuer
19-
sql.Scanner
20-
}
2117
}
2218

2319
func NewQuery[T any, K any, F any](db *sql.DB, table string, buildQuery func(F) (string, []interface{}), opts ...func(*T)) (*Query[T, K, F], error) {
@@ -41,7 +37,7 @@ func NewQueryWithArray[T any, K any, F any](db *sql.DB, table string, buildQuery
4137
if err != nil {
4238
return nil, err
4339
}
44-
builder := &Query[T, K, F]{Loader: adapter, Map: fieldsIndex, BuildQuery: buildQuery, Mp: mp, ToArray: toArray}
40+
builder := &Query[T, K, F]{Loader: adapter, Map: fieldsIndex, BuildQuery: buildQuery, Mp: mp}
4541
return builder, nil
4642
}
4743

repository/repository.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ type Repository[T any, K any] struct {
2020
}
2121

2222
func NewRepository[T any, K any](db *sql.DB, tableName string, opts ...func(int) string) (*Repository[T, K], error) {
23-
return NewSqlRepositoryWithVersionAndArray[T, K](db, tableName, "", nil, opts...)
23+
return NewRepositoryWithVersionAndArray[T, K](db, tableName, "", nil, opts...)
2424
}
2525
func NewRepositoryWithVersion[T any, K any](db *sql.DB, tableName string, versionField string, opts ...func(int) string) (*Repository[T, K], error) {
26-
return NewSqlRepositoryWithVersionAndArray[T, K](db, tableName, versionField, nil, opts...)
26+
return NewRepositoryWithVersionAndArray[T, K](db, tableName, versionField, nil, opts...)
2727
}
28-
func NewSqlRepositoryWithVersionAndArray[T any, K any](db *sql.DB, tableName string, versionField string, toArray func(interface{}) interface {
28+
func NewSqlRepositoryWithArray[T any, K any](db *sql.DB, tableName string, toArray func(interface{}) interface {
29+
driver.Valuer
30+
sql.Scanner
31+
}, opts ...func(int) string) (*Repository[T, K], error) {
32+
return NewRepositoryWithVersionAndArray[T, K](db, tableName, "", toArray, opts...)
33+
}
34+
func NewRepositoryWithVersionAndArray[T any, K any](db *sql.DB, tableName string, versionField string, toArray func(interface{}) interface {
2935
driver.Valuer
3036
sql.Scanner
3137
}, opts ...func(int) string) (*Repository[T, K], error) {
@@ -58,6 +64,7 @@ func NewSqlRepositoryWithVersionAndArray[T any, K any](db *sql.DB, tableName str
5864
fields := q.BuildFieldsBySchema(repo.Schema)
5965
return &Repository[T, K]{repo, fieldsIndex, fields, idMap}, nil
6066
}
67+
6168
func (a *Repository[T, K]) All(ctx context.Context) ([]T, error) {
6269
var objs []T
6370
query := fmt.Sprintf("select %s from %s", a.Fields, a.Table)
@@ -91,7 +98,7 @@ func (a *Repository[T, K]) Load(ctx context.Context, id K) (*T, error) {
9198
query := fmt.Sprintf("select %s from %s ", a.Fields, a.Table)
9299
query1, args := q.BuildFindByIdWithDB(a.DB, query, ip, a.JsonColumnMap, a.Keys, a.BuildParam)
93100
tx := q.GetExec(ctx, a.DB, a.TxKey)
94-
err := q.Query(ctx, tx, a.Map, &objs, query1, args...)
101+
err := q.QueryWithArray(ctx, tx, a.Map, &objs, a.ToArray, query1, args...)
95102
if err != nil {
96103
return nil, err
97104
}

repository/search.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func NewSearchRepositoryWithArray[T any, K any, F any](db *sql.DB, table string,
3030
driver.Valuer
3131
sql.Scanner
3232
}, versionField string, buildParam func(int) string, opts ...func(*T)) (*SearchRepository[T, K, F], error) {
33-
repo, err := NewSqlRepositoryWithVersionAndArray[T, K](db, table, versionField, toArray, buildParam)
33+
repo, err := NewRepositoryWithVersionAndArray[T, K](db, table, versionField, toArray, buildParam)
3434
if err != nil {
3535
return nil, err
3636
}

0 commit comments

Comments
 (0)