-
Notifications
You must be signed in to change notification settings - Fork 0
/
resultset.go
54 lines (45 loc) · 1.22 KB
/
resultset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package ceous
import (
"io"
)
// ResultSet represents the abstraction of a sql.ResultSet struct.
type ResultSet interface {
Next() bool
Scan(dest ...interface{}) error
Columns() ([]string, error)
io.Closer
}
// RecordScanner describes a scanner for a record.
type RecordScanner interface {
ScanRecord(rs ResultSet, model Record) error
}
// RecordScannerColumns describes a column selector.
type RecordScannerColumns interface {
SelectColumns() []SchemaField
}
// BaseRecordScanner implements a basic and generic `RecordScanner`.
type BaseRecordScanner struct{}
var DefaultRecordScanner BaseRecordScanner
// ScanRecord uses the ColumnAddress to read records from the given `rs`.
func (recordScanner *BaseRecordScanner) ScanRecord(rs ResultSet, model Record) error {
columns, err := rs.Columns()
if err != nil {
return err
}
scanColumns := make([]interface{}, len(columns))
for i, column := range columns {
sValue, err := model.ColumnAddress(column)
if err != nil {
return err
}
scanColumns[i] = sValue
}
err = rs.Scan(scanColumns...)
if err != nil {
return err
}
// TODO(jota): Check for read only models... /// model.setWritable(!rs.readOnly)
model.setWritable(true)
model.setPersisted()
return nil
}