1
0
Fork 0

Simplify JSON encoding

master
Philip O'Toole 1 year ago
parent 05b8d675e0
commit 9341980c47

@ -15,27 +15,6 @@ var (
ErrTypesColumnsLengthViolation = errors.New("types and columns are different lengths")
)
// ResultRows represents the outcome of an operation that might change rows or
// return query data.
type ResultRows struct {
LastInsertID int64 `json:"last_insert_id,omitempty"`
RowsAffected int64 `json:"rows_affected,omitempty"`
Columns []string `json:"columns,omitempty"`
Types []string `json:"types,omitempty"`
Values [][]interface{} `json:"values,omitempty"`
Error string `json:"error,omitempty"`
Time float64 `json:"time,omitempty"`
}
type AssociativeResultRows struct {
LastInsertID int64 `json:"last_insert_id,omitempty"`
RowsAffected int64 `json:"rows_affected,omitempty"`
Types map[string]string `json:"types,omitempty"`
Rows []map[string]interface{} `json:"rows,omitempty"`
Error string `json:"error,omitempty"`
Time float64 `json:"time,omitempty"`
}
// Result represents the outcome of an operation that changes rows.
type Result struct {
LastInsertID int64 `json:"last_insert_id,omitempty"`
@ -63,78 +42,21 @@ type AssociativeRows struct {
// NewResultRowsFromExecuteQueryResponse returns an API ResultRows object from an
// ExecuteQueryResponse.
func NewResultRowsFromExecuteQueryResponse(e *command.ExecuteQueryResponse) (*ResultRows, error) {
er := e.GetE()
qr := e.GetQ()
if er != nil {
return &ResultRows{
LastInsertID: er.LastInsertId,
RowsAffected: er.RowsAffected,
Error: er.Error,
Time: er.Time,
}, nil
} else if qr != nil {
if len(qr.Columns) != len(qr.Types) {
return nil, ErrTypesColumnsLengthViolation
}
values := make([][]interface{}, len(qr.Values))
if err := NewValuesFromQueryValues(values, qr.Values); err != nil {
return nil, err
}
return &ResultRows{
Columns: qr.Columns,
Types: qr.Types,
Values: values,
Error: qr.Error,
Time: qr.Time,
}, nil
func NewResultRowsFromExecuteQueryResponse(e *command.ExecuteQueryResponse) (interface{}, error) {
if er := e.GetE(); er != nil {
return NewResultFromExecuteResult(er)
} else if qr := e.GetQ(); qr != nil {
return NewRowsFromQueryRows(qr)
}
return nil, errors.New("no ExecuteResult or QueryRows")
}
func NewAssociativeResultRowsFromExecuteQueryResponse(e *command.ExecuteQueryResponse) (*AssociativeResultRows, error) {
er := e.GetE()
qr := e.GetQ()
if er != nil {
return &AssociativeResultRows{
LastInsertID: er.LastInsertId,
RowsAffected: er.RowsAffected,
Error: er.Error,
Time: er.Time,
}, nil
} else if qr != nil {
if len(qr.Columns) != len(qr.Types) {
return nil, ErrTypesColumnsLengthViolation
}
values := make([][]interface{}, len(qr.Values))
if err := NewValuesFromQueryValues(values, qr.Values); err != nil {
return nil, err
}
rows := make([]map[string]interface{}, len(values))
for i := range rows {
m := make(map[string]interface{})
for ii, c := range qr.Columns {
m[c] = values[i][ii]
}
rows[i] = m
}
types := make(map[string]string)
for i := range qr.Types {
types[qr.Columns[i]] = qr.Types[i]
}
return &AssociativeResultRows{
Types: types,
Rows: rows,
Error: qr.Error,
Time: qr.Time,
}, nil
func NewAssociativeResultRowsFromExecuteQueryResponse(e *command.ExecuteQueryResponse) (interface{}, error) {
if er := e.GetE(); er != nil {
return NewResultFromExecuteResult(er)
} else if qr := e.GetQ(); qr != nil {
return NewAssociativeRowsFromQueryRows(qr)
}
return nil, errors.New("no ExecuteResult or QueryRows")
}
@ -339,7 +261,7 @@ func jsonMarshal(i interface{}, f marshalFunc, assoc bool) ([]byte, error) {
}
case []*command.ExecuteQueryResponse:
if assoc {
res := make([]*AssociativeResultRows, len(v))
res := make([]interface{}, len(v))
for j := range v {
r, err := NewAssociativeResultRowsFromExecuteQueryResponse(v[j])
if err != nil {
@ -349,7 +271,7 @@ func jsonMarshal(i interface{}, f marshalFunc, assoc bool) ([]byte, error) {
}
return f(res)
} else {
res := make([]*ResultRows, len(v))
res := make([]interface{}, len(v))
for j := range v {
r, err := NewResultRowsFromExecuteQueryResponse(v[j])
if err != nil {

Loading…
Cancel
Save