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 }