Skip to content

Commit a774909

Browse files
committed
Add BatchWriter
1 parent 27864e8 commit a774909

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

batch_inserter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (w *BatchInserter) Write(ctx context.Context, models interface{}) ([]int, [
7070
models2 = models
7171
}
7272
s := reflect.ValueOf(models2)
73-
_, er2 := InsertBatchWithSchema(ctx, w.db, w.tableName, models2, w.ToArray, w.BuildParam)
73+
_, er2 := InsertBatchWithSchema(ctx, w.db, w.tableName, models2, w.ToArray, w.BuildParam, w.Schema)
7474

7575
if er2 == nil {
7676
// Return full success

batch_writer.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package sql
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"database/sql/driver"
7+
"reflect"
8+
)
9+
10+
type BatchWriter struct {
11+
db *sql.DB
12+
tableName string
13+
Map func(ctx context.Context, model interface{}) (interface{}, error)
14+
Schema *Schema
15+
ToArray func(interface{}) interface {
16+
driver.Valuer
17+
sql.Scanner
18+
}
19+
}
20+
func NewBatchWriter(db *sql.DB, tableName string, modelType reflect.Type, options ...func(context.Context, interface{}) (interface{}, error)) *BatchWriter {
21+
var mp func(context.Context, interface{}) (interface{}, error)
22+
if len(options) > 0 && options[0] != nil {
23+
mp = options[0]
24+
}
25+
return NewBatchWriterWithArray(db, tableName, modelType, nil, mp)
26+
}
27+
func NewBatchWriterWithArray(db *sql.DB, tableName string, modelType reflect.Type, toArray func(interface{}) interface {
28+
driver.Valuer
29+
sql.Scanner
30+
}, options ...func(context.Context, interface{}) (interface{}, error)) *BatchWriter {
31+
var mp func(context.Context, interface{}) (interface{}, error)
32+
if len(options) > 0 && options[0] != nil {
33+
mp = options[0]
34+
}
35+
schema := CreateSchema(modelType)
36+
return &BatchWriter{db: db, tableName: tableName, Schema: schema, Map: mp, ToArray: toArray}
37+
}
38+
39+
func (w *BatchWriter) Write(ctx context.Context, models interface{}) ([]int, []int, error) {
40+
successIndices := make([]int, 0)
41+
failIndices := make([]int, 0)
42+
var m interface{}
43+
var er0 error
44+
if w.Map != nil {
45+
m, er0 = MapModels(ctx, models, w.Map)
46+
if er0 != nil {
47+
s0 := reflect.ValueOf(m)
48+
_, er0b := InterfaceSlice(m)
49+
failIndices = ToArrayIndex(s0, failIndices)
50+
return successIndices, failIndices, er0b
51+
}
52+
} else {
53+
m = models
54+
}
55+
s := reflect.ValueOf(m)
56+
_, er2 := SaveBatchWithArray(ctx, w.db, w.tableName, m, w.ToArray, w.Schema)
57+
58+
if er2 == nil {
59+
// Return full success
60+
successIndices = ToArrayIndex(s, successIndices)
61+
return successIndices, failIndices, er2
62+
} else {
63+
// Return full fail
64+
failIndices = ToArrayIndex(s, failIndices)
65+
}
66+
return successIndices, failIndices, er2
67+
}

writer.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ func Commit(tx *sql.Tx, err error, options...bool) error {
3333
}
3434
return tx.Commit()
3535
}
36+
func Rollback(tx *sql.Tx, err error, options...int64) (int64, error) {
37+
tx.Rollback()
38+
if len(options) > 0 {
39+
return options[0], err
40+
}
41+
return -1, err
42+
}
3643
func End(tx *sql.Tx, res int64, err error, options...bool) (int64, error) {
3744
er := Commit(tx, err, options...)
3845
return res, er

0 commit comments

Comments
 (0)