1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.5 KiB
Go

package http
import (
"encoding/json"
"errors"
"github.com/rqlite/rqlite/store"
)
var (
// ErrNoStatements is returned when a request is empty
ErrNoStatements = errors.New("no statements")
// ErrInvalidRequest is returned when a request cannot be parsed.
ErrInvalidRequest = errors.New("invalid request")
)
// ParseRequest generates a set of Statements for a given byte slice.
func ParseRequest(b []byte) ([]store.Statement, error) {
if b == nil {
return nil, ErrNoStatements
}
simple := []string{} // Represents a set of unparameterized queries
parameterized := [][]interface{}{} // Represents a set of parameterized queries
// Try simple form first.
err := json.Unmarshal(b, &simple)
if err == nil {
if len(simple) == 0 {
return nil, ErrNoStatements
}
stmts := make([]store.Statement, len(simple))
for i := range simple {
stmts[i].Query = simple[i]
}
return stmts, nil
}
// Next try parameterized form.
if err := json.Unmarshal(b, &parameterized); err != nil {
return nil, ErrInvalidRequest
}
stmts := make([]store.Statement, len(parameterized))
for i := range parameterized {
if len(parameterized[i]) == 0 {
return nil, ErrNoStatements
}
stmts[i].Query = parameterized[i][0].(string)
if len(parameterized[i]) == 1 {
continue
}
stmts[i].Parameters = make([]store.Value, len(parameterized[i])-1)
for j := range parameterized[i][1:] {
stmts[i].Parameters[j] = parameterized[i][j+1]
}
}
return stmts, nil
}