Susumu Yata
null+****@clear*****
Thu Feb 18 18:00:45 JST 2016
Susumu Yata 2016-02-18 18:00:45 +0900 (Thu, 18 Feb 2016) New Revision: bdb7dc6e152fde4c50a66280da43ad2b77486152 https://github.com/groonga/grnci/commit/bdb7dc6e152fde4c50a66280da43ad2b77486152 Message: Update DB.query to send a command with data The purpose is to simplify execution of `load`. Modified files: db.go grnci.go Modified: db.go (+22 -14) =================================================================== --- db.go 2016-02-18 17:44:42 +0900 (0b23ccb) +++ db.go 2016-02-18 18:00:45 +0900 (41e59b3) @@ -301,8 +301,8 @@ type cmdArg struct { Value string } -// composeCommand composes a command from its name and arguments. -func (db *DB) composeCommand(name string, args []cmdArg) (string, error) { +// composeCmd composes a command from its name and arguments. +func (db *DB) composeCmd(name string, args []cmdArg) (string, error) { if err := checkCmdName(name); err != nil { return "", err } @@ -366,20 +366,28 @@ func (db *DB) recv() ([]byte, error) { return buf.Bytes(), nil } -// query sends data and receives the response. -func (db *DB) query(cmd string) ([]byte, error) { - if err := db.send([]byte(cmd)); err != nil { - res, _ := db.recv() - return res, err - } - return db.recv() -} - // query sends a command and receives the response. -func (db *DB) queryEx(name string, args []cmdArg) ([]byte, error) { - cmd, err := db.composeCommand(name, args) +func (db *DB) query(name string, args []cmdArg, data []byte) ([]byte, error) { + cmd, err := db.composeCmd(name, args) if err != nil { return nil, err } - return db.query(cmd) + // Send a command. + if err := db.send([]byte(cmd)); err != nil { + resp, _ := db.recv() + return resp, err + } + resp, err := db.recv() + if (data == nil) || (err != nil) { + return resp, err + } + // Send data if available. + if len(resp) != 0 { + return resp, db.errorf("unexpected response") + } + if err := db.send(data); err != nil { + resp, _ := db.recv() + return resp, err + } + return db.recv() } Modified: grnci.go (+24 -33) =================================================================== --- grnci.go 2016-02-18 17:44:42 +0900 (58770c6) +++ grnci.go 2016-02-18 18:00:45 +0900 (b0956b1) @@ -412,7 +412,7 @@ func (db *DB) TableCreate(name string, options *TableCreateOptions) error { if len(options.TokenFilters) != 0 { args = append(args, cmdArg{"token_filters", options.TokenFilters}) } - res, err := db.queryEx("table_create", args) + res, err := db.query("table_create", args, nil) if err != nil { return err } @@ -503,7 +503,7 @@ func (db *DB) ColumnCreate(tbl, name, typ string, options *ColumnCreateOptions) if len(src) != 0 { args = append(args, cmdArg{"source", src}) } - res, err := db.queryEx("column_create", args) + res, err := db.query("column_create", args, nil) if err != nil { return err } @@ -785,42 +785,42 @@ func (db *DB) loadWriteValue(buf *bytes.Buffer, val *reflect.Value, fields []*Fi } // loadGenBody generates the `load` body. -func (db *DB) loadGenBody(tbl string, vals interface{}, fields []*FieldInfo) (string, error) { +func (db *DB) loadGenBody(tbl string, vals interface{}, fields []*FieldInfo) ([]byte, error) { buf := new(bytes.Buffer) if err := buf.WriteByte('['); err != nil { - return "", err + return nil, err } val := reflect.ValueOf(vals) switch val.Kind() { case reflect.Struct: if err := db.loadWriteValue(buf, &val, fields); err != nil { - return "", err + return nil, err } case reflect.Ptr: if val.IsNil() { - return "", fmt.Errorf("vals is nil") + return nil, fmt.Errorf("vals is nil") } elem := val.Elem() if err := db.loadWriteValue(buf, &elem, fields); err != nil { - return "", err + return nil, err } case reflect.Slice: for i := 0; i < val.Len(); i++ { if i != 0 { if err := buf.WriteByte(','); err != nil { - return "", err + return nil, err } } idxVal := val.Index(i) if err := db.loadWriteValue(buf, &idxVal, fields); err != nil { - return "", err + return nil, err } } } if err := buf.WriteByte(']'); err != nil { - return "", err + return nil, err } - return buf.String(), nil + return buf.Bytes(), nil } // Load executes `load`. @@ -887,20 +887,11 @@ func (db *DB) Load(tbl string, vals interface{}, options *LoadOptions) (int, err args = append(args, cmdArg{"ifexists", options.IfExists}) } args = append(args, cmdArg{"columns", strings.Join(cols, ",")}) - headCmd, err := db.composeCommand("load", args) + body, err := db.loadGenBody(tbl, vals, fields) if err != nil { return 0, err } - bodyCmd, err := db.loadGenBody(tbl, vals, fields) - if err != nil { - return 0, err - } - if res, err := db.query(headCmd); err != nil { - return 0, err - } else if len(res) != 0 { - return 0, db.errorf("load failed") - } - res, err := db.query(bodyCmd) + res, err := db.query("load", args, body) if err != nil { return 0, err } @@ -1271,7 +1262,7 @@ func (db *DB) Select(tbl string, vals interface{}, options *SelectOptions) (int, args = append(args, cmdArg{"adjuster", options.Adjuster}) } args = append(args, cmdArg{"command_version", "2"}) - str, err := db.queryEx("select", args) + str, err := db.query("select", args, nil) if err != nil { return 0, err } @@ -1318,7 +1309,7 @@ func (db *DB) ColumnRemove(tbl, name string, options *ColumnRemoveOptions) error var args []cmdArg args = append(args, cmdArg{"table", tbl}) args = append(args, cmdArg{"name", name}) - res, err := db.queryEx("column_remove", args) + res, err := db.query("column_remove", args, nil) if err != nil { return err } @@ -1368,7 +1359,7 @@ func (db *DB) ColumnRename(tbl, name, newName string, options *ColumnRenameOptio args = append(args, cmdArg{"table", tbl}) args = append(args, cmdArg{"name", name}) args = append(args, cmdArg{"new_name", newName}) - res, err := db.queryEx("column_rename", args) + res, err := db.query("column_rename", args, nil) if err != nil { return err } @@ -1410,7 +1401,7 @@ func (db *DB) TableRemove(name string, options *TableRemoveOptions) error { } var args []cmdArg args = append(args, cmdArg{"name", name}) - res, err := db.queryEx("table_remove", args) + res, err := db.query("table_remove", args, nil) if err != nil { return err } @@ -1456,7 +1447,7 @@ func (db *DB) TableRename(name, newName string, options *TableRenameOptions) err var args []cmdArg args = append(args, cmdArg{"name", name}) args = append(args, cmdArg{"new_name", newName}) - res, err := db.queryEx("table_rename", args) + res, err := db.query("table_rename", args, nil) if err != nil { return err } @@ -1495,7 +1486,7 @@ func (db *DB) ObjectExist(name string, options *ObjectExistOptions) error { } var args []cmdArg args = append(args, cmdArg{"name", name}) - res, err := db.queryEx("object_exist", args) + res, err := db.query("object_exist", args, nil) if err != nil { return err } @@ -1534,7 +1525,7 @@ func (db *DB) Truncate(name string, options *TruncateOptions) error { } var args []cmdArg args = append(args, cmdArg{"target_name", name}) - res, err := db.queryEx("truncate", args) + res, err := db.query("truncate", args, nil) if err != nil { return err } @@ -1579,7 +1570,7 @@ func (db *DB) ThreadLimit(options *ThreadLimitOptions) (int, error) { if options.Max > 0 { args = append(args, cmdArg{"max", strconv.Itoa(options.Max)}) } - res, err := db.queryEx("thread_limit", args) + res, err := db.query("thread_limit", args, nil) if err != nil { return 0, err } @@ -1621,7 +1612,7 @@ func (db *DB) DatabaseUnmap(options *DatabaseUnmapOptions) error { options = NewDatabaseUnmapOptions() } var args []cmdArg - res, err := db.queryEx("database_unmap", args) + res, err := db.query("database_unmap", args, nil) if err != nil { return err } @@ -1660,7 +1651,7 @@ func (db *DB) PluginRegister(name string, options *PluginRegisterOptions) error } var args []cmdArg args = append(args, cmdArg{"name", name}) - res, err := db.queryEx("plugin_register", args) + res, err := db.query("plugin_register", args, nil) if err != nil { return err } @@ -1699,7 +1690,7 @@ func (db *DB) PluginUnregister(name string, options *PluginUnregisterOptions) er } var args []cmdArg args = append(args, cmdArg{"name", name}) - res, err := db.queryEx("plugin_unregister", args) + res, err := db.query("plugin_unregister", args, nil) if err != nil { return err } -------------- next part -------------- HTML����������������������������...Download