45 lines
845 B
Go
45 lines
845 B
Go
|
package core
|
||
|
|
||
|
import (
|
||
|
"database/sql"
|
||
|
"reflect"
|
||
|
)
|
||
|
|
||
|
type DB struct {
|
||
|
*sql.DB
|
||
|
}
|
||
|
|
||
|
func Open(driverName, dataSourceName string) (*DB, error) {
|
||
|
db, err := sql.Open(driverName, dataSourceName)
|
||
|
return &DB{db}, err
|
||
|
}
|
||
|
|
||
|
func (db *DB) Query(query string, args ...interface{}) (*Rows, error) {
|
||
|
rows, err := db.DB.Query(query, args...)
|
||
|
return &Rows{rows}, err
|
||
|
}
|
||
|
|
||
|
type Rows struct {
|
||
|
*sql.Rows
|
||
|
}
|
||
|
|
||
|
func (rs *Rows) Scan(dest ...interface{}) error {
|
||
|
newDest := make([]interface{}, 0)
|
||
|
for _, s := range dest {
|
||
|
vv := reflect.ValueOf(s)
|
||
|
switch vv.Kind() {
|
||
|
case reflect.Ptr:
|
||
|
vvv := vv.Elem()
|
||
|
if vvv.Kind() == reflect.Struct {
|
||
|
for j := 0; j < vvv.NumField(); j++ {
|
||
|
newDest = append(newDest, vvv.FieldByIndex([]int{j}).Addr().Interface())
|
||
|
}
|
||
|
} else {
|
||
|
newDest = append(newDest, s)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return rs.Rows.Scan(newDest...)
|
||
|
}
|