use reflect to construct structs from rows
diff --git a/data.go b/data.go
index 24acb8d..9c801ca 100644
--- a/data.go
+++ b/data.go
@@ -18,6 +18,7 @@
"sync"
"github.com/30x/apid-core"
+ "reflect"
)
var (
@@ -230,70 +231,34 @@
return
}
-func dataDeploymentsFromRow(rows *sql.Rows) (deployments []DataDeployment, err error) {
+func dataDeploymentsFromRow(rows *sql.Rows) ([]DataDeployment, error) {
+ tmp, err := structFromRows(reflect.TypeOf((*DataDeployment)(nil)).Elem(), rows)
+ if err != nil {
+ return nil, err
+ }
+ return tmp.([]DataDeployment), nil
+}
+
+func structFromRows(t reflect.Type, rows *sql.Rows) (interface{}, error) {
+ num := t.NumField()
+ cols := make([]interface{}, num)
+ slice := reflect.New(reflect.SliceOf(t)).Elem()
+ for i := range cols {
+ cols[i] = new(sql.NullString)
+ }
for rows.Next() {
- dep := DataDeployment{}
- var id, orgId, envId, blobId, blobResourceID, colType, name, revision, path, created, createdBy, updated, updatedBy sql.NullString
- err = rows.Scan(
- &id,
- &orgId,
- &envId,
- &blobId,
- &blobResourceID,
- &colType,
- &name,
- &revision,
- &path,
- &created,
- &createdBy,
- &updated,
- &updatedBy,
- )
+ v := reflect.New(t).Elem()
+ err := rows.Scan(cols...)
if err != nil {
return nil, err
}
-
- if id.Valid {
- dep.ID = id.String
+ for i := range cols {
+ p := cols[i].(*sql.NullString)
+ if p.Valid {
+ v.Field(i).SetString(p.String)
+ }
}
- if orgId.Valid {
- dep.OrgID = orgId.String
- }
- if envId.Valid {
- dep.EnvID = envId.String
- }
- if blobId.Valid {
- dep.BlobID = blobId.String
- }
- if blobResourceID.Valid {
- dep.BlobResourceID = blobResourceID.String
- }
- if colType.Valid {
- dep.Type = colType.String
- }
- if name.Valid {
- dep.Name = name.String
- }
- if revision.Valid {
- dep.Revision = revision.String
- }
- if path.Valid {
- dep.Path = path.String
- }
- if created.Valid {
- dep.Created = created.String
- }
- if createdBy.Valid {
- dep.CreatedBy = createdBy.String
- }
- if updated.Valid {
- dep.Updated = updated.String
- }
- if updatedBy.Valid {
- dep.UpdatedBy = updatedBy.String
- }
-
- deployments = append(deployments, dep)
+ slice = reflect.Append(slice, v)
}
- return
+ return slice.Interface(), nil
}