save inputdefinition as protobuf to file

This commit is contained in:
Linh Vo 2017-06-12 00:11:20 -05:00
parent 7c28e2c3f3
commit fdacca3147
6 changed files with 223 additions and 96 deletions

View file

@ -131,7 +131,7 @@ func NewRouter(handler *Handler) *mux.Router {
router.HandleFunc("/index/{index}/input-definition/{input-definition}", handler.handleGetDefinition).Methods("GET")
router.HandleFunc("/index/{index}/input-definition/{input-definition}", handler.handlePostDefinition).Methods("POST")
router.HandleFunc("/index/{index}input-definition/{input-definition}", handler.handleDeleteDefinition).Methods("DELETE")
router.HandleFunc("/index/{index}/input-definition/{input-definition}", handler.handleDeleteDefinition).Methods("DELETE")
return router
}
@ -1515,6 +1515,9 @@ func (h *Handler) handlePostDefinition(w http.ResponseWriter, r *http.Request) {
return
}
fmt.Println(req.Frames)
fmt.Println(req.Fields)
// Find index.
index := h.Holder.Index(indexName)
if index == nil {
@ -1544,19 +1547,53 @@ func (h *Handler) handlePostDefinition(w http.ResponseWriter, r *http.Request) {
}
func (h *Handler) handleGetDefinition(w http.ResponseWriter, r *http.Request) {
indexName := mux.Vars(r)["index"]
inputDefName := mux.Vars(r)["input-definition"]
//Find index.
index := h.Holder.Index(indexName)
if index == nil {
if err := json.NewEncoder(w).Encode(deleteIndexResponse{}); err != nil {
h.logger().Printf("response encoding error: %s", err)
}
return
}
inputDef := index.inputDefinition(inputDefName)
res, err := json.Marshal(inputDef)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Println("RESPONSE", string(res))
}
func (h *Handler) handleDeleteDefinition(w http.ResponseWriter, r *http.Request) {
indexName := mux.Vars(r)["index"]
inputDefName := mux.Vars(r)["input-definition"]
// Find index.
index := h.Holder.Index(indexName)
if index == nil {
if err := json.NewEncoder(w).Encode(deleteIndexResponse{}); err != nil {
h.logger().Printf("response encoding error: %s", err)
}
return
}
// Delete frame from the index.
if err := index.DeleteInputDefinition(inputDefName); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
type postInputDefinition struct {
Frames []InputFrame `json:"frames,omitempty"`
Fields []Field `json:"fields,omitempty"`
Fields []Field `json:"fields,omitempty"`
}
type InputFrame struct {
Name string
Name string
Options FrameOptions
}
}

View file

@ -96,6 +96,7 @@ func (h *Holder) Open() error {
index, err := h.newIndex(h.IndexPath(filepath.Base(fi.Name())), filepath.Base(fi.Name()))
if err == ErrName {
h.logger().Printf("ERROR opening index: %s, err=%s", fi.Name(), err)
continue
} else if err != nil {

View file

@ -171,12 +171,13 @@ func (i *Index) openFrames() error {
}
for _, fi := range fis {
if !fi.IsDir() {
if !fi.IsDir() || fi.Name() == ".input-definitions" {
continue
}
fr, err := i.newFrame(i.FramePath(filepath.Base(fi.Name())), filepath.Base(fi.Name()))
if err != nil {
fmt.Println(err)
return ErrName
}
if err := fr.Open(); err != nil {
@ -345,6 +346,8 @@ func (i *Index) Frame(name string) *Frame {
func (i *Index) frame(name string) *Frame { return i.frames[name] }
func (i *Index) inputDefinition(name string) *InputDefinition { return i.inputDefinitions[name] }
// Frames returns a list of all frames in the index.
func (i *Index) Frames() []*Frame {
i.mu.Lock()
@ -383,9 +386,11 @@ func (i *Index) CreateInputDefinition(name string, frames []InputFrame, field []
return i.createInputDefinition(name, frames, field)
}
func (i *Index) createInputDefinition(name string, frames []InputFrame, field []Field) (*InputDefinition, error) {
func (i *Index) createInputDefinition(name string, frames []InputFrame, fields []Field) (*InputDefinition, error) {
if name == "" {
return nil, errors.New("input-definition name required")
} else if len(frames) == 0 || len(fields) == 0 {
return nil, errors.New("frames and fields are required")
}
// Initialize input definition.
@ -399,6 +404,8 @@ func (i *Index) createInputDefinition(name string, frames []InputFrame, field []
return nil, err
}
inputDef.frames = frames
inputDef.fields = fields
if err = inputDef.saveMeta(); err != nil {
return nil, err
}
@ -495,7 +502,7 @@ func (i *Index) newInputDefinition(path, name string) (*InputDefinition, error)
return nil, err
}
f.LogOutput = i.LogOutput
f.Stats = i.Stats.WithTags(fmt.Sprintf("frame:%s", name))
f.Stats = i.Stats.WithTags(fmt.Sprintf("input-definition:%s", name))
f.broadcaster = i.broadcaster
return f, nil
}
@ -527,6 +534,32 @@ func (i *Index) DeleteFrame(name string) error {
return nil
}
// DeleteFrame removes a frame from the index.
func (i *Index) DeleteInputDefinition(name string) error {
i.mu.Lock()
defer i.mu.Unlock()
// Ignore if input definition doesn't exist.
f := i.inputDefinition(name)
if f == nil {
return nil
}
//if err := f.Close(); err != nil {
// return err
//}
// Delete input definition file.
if err := os.Remove(filepath.Join(i.InputDefPath(), name)); err != nil {
return err
}
// Remove reference.
delete(i.inputDefinitions, name)
return nil
}
type indexSlice []*Index
func (p indexSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }

View file

@ -1,6 +1,8 @@
package pilosa
import (
"github.com/gogo/protobuf/proto"
"github.com/pilosa/pilosa/internal"
"io"
"io/ioutil"
"os"
@ -14,8 +16,8 @@ type InputDefinition struct {
broadcaster Broadcaster
Stats StatsClient
LogOutput io.Writer
frames []Frame
fields []Field
frames []InputFrame
fields []Field
}
func NewInputDefinition(path, index, name string) (*InputDefinition, error) {
@ -46,9 +48,9 @@ func (i *InputDefinition) Open() error {
return err
}
//if err := i.loadMeta(); err != nil {
// return err
//}
if err := i.loadMeta(); err != nil {
return err
}
return nil
}(); err != nil {
@ -57,18 +59,70 @@ func (i *InputDefinition) Open() error {
return nil
}
func (i *InputDefinition) loadMeta() error {
var pb internal.InputDefinition
buf, err := ioutil.ReadFile(filepath.Join(i.path, i.name))
if err != nil {
return err
} else {
if err := proto.Unmarshal(buf, &pb); err != nil {
return err
}
}
// Copy metadata fields.
i.name = pb.Name
i.frames = pb.Frames
i.fields = pb.InputDefinitionFields
return nil
}
//saveMeta writes meta data for the frame.
func (f *InputDefinition) saveMeta() error {
func (i *InputDefinition) saveMeta() error {
// Marshal metadata.
//buf, err := proto.Marshal(&internal.InputDefinitionMeta{
// Frames: f.
//})
//if err != nil {
// return err
//}
var frames []*internal.Frame
for _, fr := range i.frames {
frameMeta := &internal.FrameMeta{
RowLabel: fr.Options.RowLabel,
InverseEnabled: fr.Options.InverseEnabled,
CacheType: fr.Options.CacheType,
CacheSize: fr.Options.CacheSize,
TimeQuantum: string(fr.Options.TimeQuantum),
}
frame := &internal.Frame{Name: fr.Name, Meta: frameMeta}
frames = append(frames, frame)
}
var fields []*internal.InputDefinitionField
for _, field := range i.fields {
var actions []*internal.Action
for _, action := range field.Actions {
actionMeta := &internal.Action{
Frame: action.Frame,
ValueDestination: action.ValueDestination,
ValueMap: action.ValueMap,
RowID: action.RowID,
}
actions = append(actions, actionMeta)
}
fieldMeta := &internal.InputDefinitionField{
Name: field.Name,
PrimaryKey: field.PrimaryKey,
Actions: actions,
}
fields = append(fields, fieldMeta)
}
buf, err := proto.Marshal(&internal.InputDefinition{
Name: i.name,
Frames: frames,
InputDefinitionFields: fields,
})
if err != nil {
return err
}
// Write to meta file.
if err := ioutil.WriteFile(filepath.Join(f.path, f.name), []byte(""), 0666); err != nil {
if err := ioutil.WriteFile(filepath.Join(i.path, i.name), buf, 0666); err != nil {
return err
}
@ -84,7 +138,7 @@ type InputDefinitionMeta struct {
type Field struct {
Name string `json:"name,omitempty"`
PrimaryKey bool `json:"primaryKey,omitempty"`
Actions []Action `json:"action,omitempty"`
Actions []Action `json:"actions,omitempty"`
}
type Action struct {

View file

@ -272,9 +272,9 @@ func (m *InputDefinition) GetInputDefinitionFields() []*InputDefinitionField {
}
type InputDefinitionField struct {
Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
PrimaryKey bool `protobuf:"varint,2,opt,name=PrimaryKey,proto3" json:"PrimaryKey,omitempty"`
Meta *Action `protobuf:"bytes,3,opt,name=Meta" json:"Meta,omitempty"`
Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"`
PrimaryKey bool `protobuf:"varint,2,opt,name=PrimaryKey,proto3" json:"PrimaryKey,omitempty"`
Actions []*Action `protobuf:"bytes,3,rep,name=Actions" json:"Actions,omitempty"`
}
func (m *InputDefinitionField) Reset() { *m = InputDefinitionField{} }
@ -282,9 +282,9 @@ func (m *InputDefinitionField) String() string { return proto.Compact
func (*InputDefinitionField) ProtoMessage() {}
func (*InputDefinitionField) Descriptor() ([]byte, []int) { return fileDescriptorPrivate, []int{15} }
func (m *InputDefinitionField) GetMeta() *Action {
func (m *InputDefinitionField) GetActions() []*Action {
if m != nil {
return m.Meta
return m.Actions
}
return nil
}
@ -1008,15 +1008,17 @@ func (m *InputDefinitionField) MarshalTo(dAtA []byte) (int, error) {
}
i++
}
if m.Meta != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintPrivate(dAtA, i, uint64(m.Meta.Size()))
n13, err := m.Meta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
if len(m.Actions) > 0 {
for _, msg := range m.Actions {
dAtA[i] = 0x1a
i++
i = encodeVarintPrivate(dAtA, i, uint64(msg.Size()))
n, err := msg.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
i += n
}
i += n13
}
return i, nil
}
@ -1474,9 +1476,11 @@ func (m *InputDefinitionField) Size() (n int) {
if m.PrimaryKey {
n += 2
}
if m.Meta != nil {
l = m.Meta.Size()
n += 1 + l + sovPrivate(uint64(l))
if len(m.Actions) > 0 {
for _, e := range m.Actions {
l = e.Size()
n += 1 + l + sovPrivate(uint64(l))
}
}
return n
}
@ -3691,7 +3695,7 @@ func (m *InputDefinitionField) Unmarshal(dAtA []byte) error {
m.PrimaryKey = bool(v != 0)
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Meta", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@ -3715,10 +3719,8 @@ func (m *InputDefinitionField) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Meta == nil {
m.Meta = &Action{}
}
if err := m.Meta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
m.Actions = append(m.Actions, &Action{})
if err := m.Actions[len(m.Actions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
@ -4412,57 +4414,57 @@ var (
func init() { proto.RegisterFile("private.proto", fileDescriptorPrivate) }
var fileDescriptorPrivate = []byte{
// 820 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcd, 0x6e, 0x23, 0x45,
0x10, 0x66, 0xec, 0xb1, 0xb1, 0x2b, 0x4a, 0xe2, 0x6d, 0x02, 0x9a, 0x8d, 0x22, 0x2b, 0x6a, 0x21,
0x36, 0xe4, 0x90, 0xc3, 0x72, 0x41, 0xbb, 0x1c, 0x60, 0xe3, 0xac, 0xd6, 0x82, 0x2c, 0xd0, 0x8e,
0xf6, 0x88, 0xd4, 0xb1, 0x0b, 0x18, 0x65, 0x3c, 0x33, 0x4c, 0xf7, 0x24, 0x6b, 0x0e, 0x3c, 0x07,
0x12, 0x57, 0xae, 0xbc, 0x07, 0x47, 0xae, 0xdc, 0x50, 0xb8, 0xf0, 0x18, 0xa8, 0xab, 0x7b, 0x7e,
0x3c, 0xb6, 0xb3, 0xca, 0xde, 0xa6, 0xbe, 0xfa, 0xfb, 0xaa, 0xba, 0xaa, 0x6c, 0xd8, 0x4e, 0xb3,
0xf0, 0x5a, 0x6a, 0x3c, 0x49, 0xb3, 0x44, 0x27, 0xac, 0x17, 0xc6, 0x1a, 0xb3, 0x58, 0x46, 0xfc,
0x6b, 0xe8, 0x8f, 0xe3, 0x19, 0xbe, 0x3e, 0x47, 0x2d, 0xd9, 0x21, 0x6c, 0x9d, 0x26, 0x51, 0x3e,
0x8f, 0xbf, 0x92, 0x97, 0x18, 0x05, 0xde, 0xa1, 0x77, 0xd4, 0x17, 0x75, 0xc8, 0x58, 0x5c, 0x84,
0x73, 0xfc, 0x36, 0x97, 0xb1, 0xce, 0xe7, 0x41, 0xcb, 0x5a, 0xd4, 0x20, 0xfe, 0x87, 0x07, 0xfd,
0xe7, 0x99, 0x9c, 0x23, 0x45, 0xdc, 0x87, 0x9e, 0x48, 0x6e, 0xea, 0xe1, 0x4a, 0x99, 0x7d, 0x04,
0x3b, 0xe3, 0xf8, 0x1a, 0x33, 0x85, 0x67, 0xb1, 0xbc, 0x8c, 0x70, 0x46, 0xe1, 0x7a, 0xa2, 0x81,
0xb2, 0x03, 0xe8, 0x9f, 0xca, 0xe9, 0x8f, 0x78, 0xb1, 0x48, 0x31, 0x68, 0x53, 0x90, 0x0a, 0x28,
0xb5, 0x93, 0xf0, 0x67, 0x0c, 0xfc, 0x43, 0xef, 0x68, 0x5b, 0x54, 0x40, 0x93, 0x6f, 0x67, 0x95,
0x2f, 0x87, 0x9d, 0xf1, 0x3c, 0x4d, 0x32, 0x2d, 0x50, 0xa5, 0x49, 0xac, 0x90, 0x0d, 0xa0, 0x7d,
0x96, 0x65, 0x8e, 0xae, 0xf9, 0xe4, 0xbf, 0xc0, 0xe0, 0x59, 0x94, 0x4c, 0xaf, 0x46, 0x52, 0x4b,
0x81, 0x3f, 0xe5, 0xa8, 0x34, 0xdb, 0x83, 0x0e, 0x35, 0xce, 0xd9, 0x59, 0xc1, 0xa0, 0x54, 0xbc,
0xeb, 0x8c, 0x15, 0x0c, 0x4a, 0xfe, 0xc4, 0xde, 0x17, 0x56, 0x30, 0xe8, 0x24, 0x0a, 0xa7, 0x96,
0xb5, 0x2f, 0xac, 0xc0, 0x18, 0xf8, 0xaf, 0x42, 0xbc, 0x71, 0x54, 0xe9, 0x9b, 0x8f, 0xe1, 0x41,
0x2d, 0xbf, 0xa3, 0xf9, 0x01, 0x74, 0x45, 0x72, 0x33, 0x1e, 0xa9, 0xc0, 0x3b, 0x6c, 0x1f, 0xf9,
0xc2, 0x49, 0xd4, 0x10, 0x7a, 0x31, 0xa3, 0x6a, 0x91, 0xaa, 0x02, 0xf8, 0x43, 0xe8, 0x50, 0x77,
0x4c, 0x95, 0x95, 0xaf, 0xf9, 0xe4, 0xbf, 0x79, 0xf0, 0xe0, 0x5c, 0xbe, 0x26, 0x1a, 0xaa, 0x4c,
0xf3, 0x02, 0xfa, 0x25, 0x48, 0xd6, 0x5b, 0x8f, 0x8f, 0x4f, 0x8a, 0xf1, 0x39, 0x59, 0xb1, 0xaf,
0x90, 0xb3, 0x58, 0x67, 0x0b, 0x51, 0x39, 0xef, 0x7f, 0x06, 0x3b, 0xcb, 0x4a, 0xc3, 0xe1, 0x0a,
0x17, 0x45, 0xa7, 0xaf, 0x70, 0x61, 0x7a, 0x72, 0x2d, 0xa3, 0xdc, 0xf6, 0xcf, 0x17, 0x56, 0x78,
0xd2, 0xfa, 0xd4, 0xe3, 0xdf, 0x01, 0x3b, 0xcd, 0x50, 0x6a, 0xa4, 0x00, 0xe7, 0xa8, 0x94, 0xfc,
0x01, 0x37, 0xbf, 0x82, 0xed, 0x6c, 0xab, 0xde, 0xd9, 0x03, 0xe8, 0x8f, 0x95, 0x9b, 0x2d, 0x7a,
0x89, 0x9e, 0xa8, 0x00, 0x7e, 0x0c, 0x6c, 0x84, 0x11, 0x6a, 0x74, 0xeb, 0x70, 0x47, 0x7c, 0x3e,
0x29, 0xb8, 0xbc, 0xd9, 0x96, 0x3d, 0x02, 0xdf, 0x6c, 0x02, 0x51, 0xd9, 0x7a, 0xfc, 0x5e, 0xd5,
0xba, 0x72, 0xed, 0x04, 0x19, 0xf0, 0xb0, 0x08, 0xea, 0xb6, 0xe7, 0x0d, 0x05, 0xae, 0x19, 0xb3,
0x22, 0x55, 0xbb, 0x99, 0xaa, 0xdc, 0x47, 0x97, 0xea, 0xf3, 0xa2, 0xd6, 0xb7, 0x4d, 0xc5, 0x47,
0x0e, 0x35, 0xe3, 0xfa, 0xd2, 0x68, 0xad, 0x0f, 0x7d, 0x6f, 0x2e, 0xb9, 0xc9, 0xe3, 0x3f, 0xcf,
0xa5, 0xbc, 0x5f, 0x98, 0x46, 0xe7, 0xcc, 0x91, 0x29, 0x06, 0xcb, 0x6d, 0x58, 0x29, 0xb3, 0x47,
0xd0, 0xa5, 0xac, 0x2a, 0xf0, 0x69, 0x76, 0x77, 0x1b, 0x6c, 0x84, 0x53, 0x9b, 0x75, 0x72, 0x43,
0xde, 0xb1, 0xeb, 0x64, 0x25, 0x76, 0x06, 0x83, 0x71, 0x9c, 0xe6, 0x7a, 0x84, 0xdf, 0x87, 0x71,
0xa8, 0xc3, 0x24, 0x56, 0x41, 0x97, 0x42, 0x3d, 0xac, 0x33, 0x5a, 0xb2, 0x10, 0x2b, 0x2e, 0xfc,
0x77, 0x0f, 0x76, 0x1b, 0xe0, 0x86, 0xa2, 0x0b, 0xbe, 0xad, 0xbb, 0xf9, 0x5e, 0xc0, 0xfb, 0x8d,
0x78, 0xcf, 0x43, 0x8c, 0x66, 0x2a, 0x68, 0x93, 0xdf, 0x70, 0x23, 0x39, 0x32, 0x13, 0xeb, 0x9d,
0x79, 0x0a, 0x7b, 0xeb, 0x14, 0x6b, 0xa9, 0x0e, 0x01, 0xbe, 0xc9, 0xc2, 0xb9, 0xcc, 0x16, 0x5f,
0xe2, 0xc2, 0xdd, 0xee, 0x1a, 0xc2, 0x3e, 0x5c, 0x1a, 0xc7, 0x41, 0x45, 0xe8, 0x8b, 0x29, 0x35,
0xc9, 0xce, 0xc0, 0xdf, 0x1e, 0x74, 0x2d, 0x50, 0x8d, 0x9a, 0x57, 0x9f, 0xea, 0x63, 0x18, 0xbc,
0x32, 0x57, 0x60, 0x84, 0x4a, 0x87, 0xb1, 0x34, 0x96, 0x6e, 0x16, 0x57, 0x70, 0xf6, 0x04, 0x7a,
0x84, 0x9d, 0xcb, 0x74, 0xb5, 0x0f, 0x36, 0xcb, 0x49, 0x61, 0x60, 0xef, 0x53, 0x69, 0x6f, 0xb2,
0xd3, 0x05, 0x2d, 0xce, 0x31, 0x09, 0xfb, 0x4f, 0x61, 0x7b, 0xc9, 0xe1, 0x9e, 0x37, 0xeb, 0xa0,
0xb8, 0x13, 0x4b, 0x3d, 0xbd, 0x7b, 0xe3, 0x8e, 0x56, 0x26, 0xc5, 0xd5, 0xdb, 0x84, 0xb9, 0x04,
0x78, 0x99, 0xcc, 0x70, 0xa2, 0xa5, 0xce, 0x95, 0x79, 0xa3, 0x17, 0x89, 0xd2, 0xc5, 0x1b, 0x99,
0x6f, 0xba, 0x84, 0x5a, 0xea, 0x72, 0x7b, 0x49, 0x60, 0x1f, 0xc3, 0xbb, 0x94, 0x0a, 0x8b, 0x69,
0xd9, 0x6d, 0x2c, 0x97, 0x28, 0xf4, 0xfc, 0x29, 0x6c, 0x9f, 0x46, 0xb9, 0xd2, 0x98, 0xb9, 0x2c,
0xc7, 0xd0, 0x31, 0x39, 0x8b, 0xdf, 0x82, 0xbd, 0xca, 0xb3, 0xa2, 0x22, 0xac, 0xc9, 0xb3, 0xc1,
0x9f, 0xb7, 0x43, 0xef, 0xaf, 0xdb, 0xa1, 0xf7, 0xcf, 0xed, 0xd0, 0xfb, 0xf5, 0xdf, 0xe1, 0x3b,
0x97, 0x5d, 0xfa, 0xff, 0xf1, 0xc9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x74, 0xd0, 0x83,
0x90, 0x08, 0x00, 0x00,
// 823 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4f, 0x6f, 0x1b, 0x45,
0x14, 0x67, 0xed, 0xb5, 0x6b, 0xbf, 0x28, 0x89, 0x3b, 0x04, 0xb4, 0x8d, 0x22, 0x2b, 0x9a, 0x03,
0x0d, 0x3e, 0xf8, 0x50, 0x2e, 0xa8, 0xe5, 0x00, 0xb5, 0x5d, 0xd5, 0x02, 0x17, 0x18, 0x47, 0x3d,
0x22, 0x4d, 0xec, 0x07, 0xac, 0xb2, 0xde, 0x35, 0x3b, 0xb3, 0x4e, 0xcd, 0x81, 0xcf, 0x81, 0xc4,
0x95, 0x2b, 0xdf, 0x83, 0x23, 0x57, 0x6e, 0x28, 0x5c, 0xf8, 0x18, 0x68, 0xfe, 0xed, 0xae, 0xd7,
0x76, 0xaa, 0xf4, 0x36, 0xef, 0xf7, 0xfe, 0xfd, 0xe6, 0xcd, 0x7b, 0x6f, 0x17, 0x0e, 0x97, 0x69,
0xb8, 0xe2, 0x12, 0xfb, 0xcb, 0x34, 0x91, 0x09, 0x69, 0x85, 0xb1, 0xc4, 0x34, 0xe6, 0x11, 0xfd,
0x1a, 0xda, 0xe3, 0x78, 0x8e, 0x6f, 0x26, 0x28, 0x39, 0x39, 0x87, 0x83, 0x41, 0x12, 0x65, 0x8b,
0xf8, 0x2b, 0x7e, 0x85, 0x51, 0xe0, 0x9d, 0x7b, 0x17, 0x6d, 0x56, 0x86, 0x94, 0xc5, 0x65, 0xb8,
0xc0, 0x6f, 0x33, 0x1e, 0xcb, 0x6c, 0x11, 0xd4, 0x8c, 0x45, 0x09, 0xa2, 0x7f, 0x78, 0xd0, 0x7e,
0x91, 0xf2, 0x05, 0xea, 0x88, 0xa7, 0xd0, 0x62, 0xc9, 0x4d, 0x39, 0x5c, 0x2e, 0x93, 0x8f, 0xe0,
0x68, 0x1c, 0xaf, 0x30, 0x15, 0x38, 0x8a, 0xf9, 0x55, 0x84, 0x73, 0x1d, 0xae, 0xc5, 0x2a, 0x28,
0x39, 0x83, 0xf6, 0x80, 0xcf, 0x7e, 0xc4, 0xcb, 0xf5, 0x12, 0x83, 0xba, 0x0e, 0x52, 0x00, 0xb9,
0x76, 0x1a, 0xfe, 0x8c, 0x81, 0x7f, 0xee, 0x5d, 0x1c, 0xb2, 0x02, 0xa8, 0xf2, 0x6d, 0x6c, 0xf3,
0xa5, 0x70, 0x34, 0x5e, 0x2c, 0x93, 0x54, 0x32, 0x14, 0xcb, 0x24, 0x16, 0x48, 0x3a, 0x50, 0x1f,
0xa5, 0xa9, 0xa5, 0xab, 0x8e, 0xf4, 0x17, 0xe8, 0x3c, 0x8f, 0x92, 0xd9, 0xf5, 0x90, 0x4b, 0xce,
0xf0, 0xa7, 0x0c, 0x85, 0x24, 0x27, 0xd0, 0xd0, 0x85, 0xb3, 0x76, 0x46, 0x50, 0xa8, 0xbe, 0xbc,
0xad, 0x8c, 0x11, 0x14, 0xaa, 0xfd, 0x35, 0x7b, 0x9f, 0x19, 0x41, 0xa1, 0xd3, 0x28, 0x9c, 0x19,
0xd6, 0x3e, 0x33, 0x02, 0x21, 0xe0, 0xbf, 0x0e, 0xf1, 0xc6, 0x52, 0xd5, 0x67, 0x3a, 0x86, 0x87,
0xa5, 0xfc, 0x96, 0xe6, 0x87, 0xd0, 0x64, 0xc9, 0xcd, 0x78, 0x28, 0x02, 0xef, 0xbc, 0x7e, 0xe1,
0x33, 0x2b, 0xe9, 0x82, 0xe8, 0x17, 0x53, 0xaa, 0x9a, 0x56, 0x15, 0x00, 0x7d, 0x04, 0x0d, 0x5d,
0x1d, 0x75, 0xcb, 0xc2, 0x57, 0x1d, 0xe9, 0x6f, 0x1e, 0x3c, 0x9c, 0xf0, 0x37, 0x9a, 0x86, 0xc8,
0xd3, 0xbc, 0x84, 0x76, 0x0e, 0x6a, 0xeb, 0x83, 0x27, 0xbd, 0xbe, 0x6b, 0x9f, 0xfe, 0x96, 0x7d,
0x81, 0x8c, 0x62, 0x99, 0xae, 0x59, 0xe1, 0x7c, 0xfa, 0x19, 0x1c, 0x6d, 0x2a, 0x15, 0x87, 0x6b,
0x5c, 0xbb, 0x4a, 0x5f, 0xe3, 0x5a, 0xd5, 0x64, 0xc5, 0xa3, 0xcc, 0xd4, 0xcf, 0x67, 0x46, 0x78,
0x5a, 0xfb, 0xd4, 0xa3, 0xdf, 0x01, 0x19, 0xa4, 0xc8, 0x25, 0xea, 0x00, 0x13, 0x14, 0x82, 0xff,
0x80, 0xfb, 0x5f, 0xc1, 0x54, 0xb6, 0x56, 0xae, 0xec, 0x19, 0xb4, 0xc7, 0xc2, 0xf6, 0x96, 0x7e,
0x89, 0x16, 0x2b, 0x00, 0xda, 0x03, 0x32, 0xc4, 0x08, 0x25, 0xda, 0x71, 0xb8, 0x23, 0x3e, 0x9d,
0x3a, 0x2e, 0x6f, 0xb7, 0x25, 0x8f, 0xc1, 0x57, 0x93, 0xa0, 0xa9, 0x1c, 0x3c, 0x79, 0xbf, 0x28,
0x5d, 0x3e, 0x76, 0x4c, 0x1b, 0xd0, 0xd0, 0x05, 0xb5, 0xd3, 0xf3, 0x96, 0x0b, 0xee, 0x68, 0x33,
0x97, 0xaa, 0x5e, 0x4d, 0x95, 0xcf, 0xa3, 0x4d, 0xf5, 0xb9, 0xbb, 0xeb, 0xbb, 0xa6, 0xa2, 0x43,
0x8b, 0xaa, 0x76, 0x7d, 0xa5, 0xb4, 0xc6, 0x47, 0x9f, 0xf7, 0x5f, 0xb9, 0xca, 0xe3, 0x3f, 0xcf,
0xa6, 0xbc, 0x5f, 0x98, 0x4a, 0xe5, 0xd4, 0x92, 0x71, 0x8d, 0x65, 0x27, 0x2c, 0x97, 0xc9, 0x63,
0x68, 0xea, 0xac, 0x22, 0xf0, 0x75, 0xef, 0x1e, 0x57, 0xd8, 0x30, 0xab, 0x56, 0xe3, 0x64, 0x9b,
0xbc, 0x61, 0xc6, 0xc9, 0x48, 0x64, 0x04, 0x9d, 0x71, 0xbc, 0xcc, 0xe4, 0x10, 0xbf, 0x0f, 0xe3,
0x50, 0x86, 0x49, 0x2c, 0x82, 0xa6, 0x0e, 0xf5, 0xa8, 0xcc, 0x68, 0xc3, 0x82, 0x6d, 0xb9, 0xd0,
0xdf, 0x3d, 0x38, 0xae, 0x80, 0x7b, 0x2e, 0xed, 0xf8, 0xd6, 0xee, 0xe6, 0x7b, 0x09, 0x1f, 0x54,
0xe2, 0xbd, 0x08, 0x31, 0x9a, 0x8b, 0xa0, 0xae, 0xfd, 0xba, 0x7b, 0xc9, 0x69, 0x33, 0xb6, 0xdb,
0x99, 0xae, 0xe0, 0x64, 0x97, 0x62, 0x27, 0xd5, 0x2e, 0xc0, 0x37, 0x69, 0xb8, 0xe0, 0xe9, 0xfa,
0x4b, 0x5c, 0xdb, 0xdd, 0x5d, 0x42, 0x48, 0x0f, 0x1e, 0x7c, 0x31, 0x33, 0x05, 0x33, 0x9c, 0x3a,
0x05, 0x27, 0xa3, 0x60, 0xce, 0x80, 0xfe, 0xed, 0x41, 0xd3, 0x9c, 0x8b, 0x86, 0xf3, 0xca, 0xbd,
0xdd, 0x83, 0xce, 0x6b, 0xb5, 0x0b, 0x86, 0x28, 0x64, 0x18, 0x73, 0x65, 0x69, 0x3b, 0x72, 0x0b,
0x27, 0x4f, 0xa1, 0xa5, 0xb1, 0x09, 0x5f, 0x6e, 0x57, 0xc3, 0x64, 0xe9, 0x3b, 0x03, 0xb3, 0xa5,
0x72, 0x7b, 0x95, 0x5d, 0xef, 0x51, 0xb7, 0x94, 0xb5, 0x70, 0xfa, 0x0c, 0x0e, 0x37, 0x1c, 0xee,
0xb9, 0xb9, 0xce, 0xdc, 0xb6, 0xd8, 0xa8, 0xec, 0xdd, 0x73, 0x77, 0xb1, 0xd5, 0x2f, 0xf6, 0xbe,
0x55, 0x98, 0x72, 0x80, 0x57, 0xc9, 0x1c, 0xa7, 0x92, 0xcb, 0x4c, 0xa8, 0x97, 0x7a, 0x99, 0x08,
0xe9, 0x5e, 0x4a, 0x9d, 0xf5, 0x3e, 0x94, 0x5c, 0xe6, 0x33, 0xac, 0x05, 0xf2, 0x31, 0x3c, 0xd0,
0xa9, 0xd0, 0xbd, 0xcf, 0x71, 0x65, 0xc4, 0x98, 0xd3, 0xd3, 0x67, 0x70, 0x38, 0x88, 0x32, 0x21,
0x31, 0xb5, 0x59, 0x7a, 0xd0, 0x50, 0x39, 0xdd, 0x17, 0xe1, 0xa4, 0xf0, 0x2c, 0xa8, 0x30, 0x63,
0xf2, 0xbc, 0xf3, 0xe7, 0x6d, 0xd7, 0xfb, 0xeb, 0xb6, 0xeb, 0xfd, 0x73, 0xdb, 0xf5, 0x7e, 0xfd,
0xb7, 0xfb, 0xde, 0x55, 0x53, 0xff, 0x85, 0x7c, 0xf2, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe2,
0x37, 0x53, 0x60, 0x96, 0x08, 0x00, 0x00,
}

View file

@ -89,7 +89,7 @@ message InputDefinition {
message InputDefinitionField {
string Name = 1;
bool PrimaryKey = 2;
Action Meta = 3;
repeated Action Actions = 3;
}
message Action {