v0.0.407 sq.Iterate
Some checks failed
Build Docker and Deploy / Run goext test-suite (push) Has been cancelled
Some checks failed
Build Docker and Deploy / Run goext test-suite (push) Has been cancelled
This commit is contained in:
@@ -333,3 +333,79 @@ func ScanAll[TData any](ctx context.Context, q Queryable, rows *sqlx.Rows, mode
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func IterateAll[TData any](ctx context.Context, q Queryable, rows *sqlx.Rows, mode StructScanMode, sec StructScanSafety, close bool, consumer func(v TData) error) (int, error) {
|
||||
var strscan *StructScanner
|
||||
|
||||
if sec == Safe {
|
||||
strscan = NewStructScanner(rows, false)
|
||||
var data TData
|
||||
err := strscan.Start(&data)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
} else if sec == Unsafe {
|
||||
strscan = NewStructScanner(rows, true)
|
||||
var data TData
|
||||
err := strscan.Start(&data)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
} else {
|
||||
return 0, errors.New("unknown value for <sec>")
|
||||
}
|
||||
|
||||
rcount := 0
|
||||
|
||||
for rows.Next() {
|
||||
|
||||
if err := ctx.Err(); err != nil {
|
||||
return rcount, err
|
||||
}
|
||||
|
||||
if mode == SModeFast {
|
||||
var data TData
|
||||
err := strscan.StructScanBase(&data)
|
||||
if err != nil {
|
||||
return rcount, err
|
||||
}
|
||||
|
||||
err = consumer(data)
|
||||
if err != nil {
|
||||
return rcount, exerr.Wrap(err, "").Build()
|
||||
}
|
||||
|
||||
rcount++
|
||||
|
||||
} else if mode == SModeExtended {
|
||||
var data TData
|
||||
err := strscan.StructScanExt(q, &data)
|
||||
if err != nil {
|
||||
return rcount, err
|
||||
}
|
||||
|
||||
err = consumer(data)
|
||||
if err != nil {
|
||||
return rcount, exerr.Wrap(err, "").Build()
|
||||
}
|
||||
|
||||
rcount++
|
||||
|
||||
} else {
|
||||
return rcount, errors.New("unknown value for <mode>")
|
||||
}
|
||||
}
|
||||
|
||||
if close {
|
||||
err := strscan.rows.Close()
|
||||
if err != nil {
|
||||
return rcount, err
|
||||
}
|
||||
}
|
||||
|
||||
if err := rows.Err(); err != nil {
|
||||
return rcount, err
|
||||
}
|
||||
|
||||
return rcount, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user