88 lines
2.6 KiB
Go
88 lines
2.6 KiB
Go
package influxql
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/influxdata/influxdb/v2"
|
|
"github.com/influxdata/influxdb/v2/kit/platform"
|
|
"github.com/influxdata/influxdb/v2/kit/platform/errors"
|
|
)
|
|
|
|
type EncodingFormat int
|
|
|
|
func (f *EncodingFormat) UnmarshalJSON(bytes []byte) error {
|
|
var s string
|
|
|
|
if err := json.Unmarshal(bytes, &s); err != nil {
|
|
return err
|
|
}
|
|
|
|
*f = EncodingFormatFromMimeType(s)
|
|
return nil
|
|
}
|
|
|
|
func (f EncodingFormat) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(f.ContentType())
|
|
}
|
|
|
|
const (
|
|
EncodingFormatJSON EncodingFormat = iota
|
|
EncodingFormatTextCSV
|
|
EncodingFormatAppCSV
|
|
EncodingFormatMessagePack
|
|
)
|
|
|
|
// Returns closed encoding format from the specified mime type.
|
|
// The default is JSON if no exact match is found.
|
|
func EncodingFormatFromMimeType(s string) EncodingFormat {
|
|
switch s {
|
|
case "application/csv":
|
|
return EncodingFormatAppCSV
|
|
case "text/csv":
|
|
return EncodingFormatTextCSV
|
|
case "application/x-msgpack":
|
|
return EncodingFormatMessagePack
|
|
default:
|
|
return EncodingFormatJSON
|
|
}
|
|
}
|
|
|
|
func (f EncodingFormat) ContentType() string {
|
|
switch f {
|
|
case EncodingFormatAppCSV:
|
|
return "application/csv"
|
|
case EncodingFormatTextCSV:
|
|
return "text/csv"
|
|
case EncodingFormatMessagePack:
|
|
return "application/x-msgpack"
|
|
default:
|
|
return "application/json"
|
|
}
|
|
}
|
|
|
|
type QueryRequest struct {
|
|
Authorization *influxdb.Authorization `json:"authorization,omitempty"`
|
|
OrganizationID platform.ID `json:"organization_id"`
|
|
DB string `json:"db"`
|
|
RP string `json:"rp"`
|
|
Epoch string `json:"epoch"`
|
|
EncodingFormat EncodingFormat `json:"encoding_format"`
|
|
ContentType string `json:"content_type"` // Content type is the desired response format.
|
|
Chunked bool `json:"chunked"` // Chunked indicates responses should be chunked using ChunkSize
|
|
ChunkSize int `json:"chunk_size"` // ChunkSize is the number of points to be encoded per batch. 0 indicates no chunking.
|
|
Query string `json:"query"` // Query contains the InfluxQL.
|
|
Params map[string]interface{} `json:"params,omitempty"`
|
|
Source string `json:"source"` // Source represents the ultimate source of the request.
|
|
}
|
|
|
|
// The HTTP query requests represented the body expected by the QueryHandler
|
|
func (r *QueryRequest) Valid() error {
|
|
if !r.OrganizationID.Valid() {
|
|
return &errors.Error{
|
|
Msg: "organization_id is not valid",
|
|
Code: errors.EInvalid,
|
|
}
|
|
}
|
|
return r.Authorization.Valid()
|
|
}
|