Susumu Yata
null+****@clear*****
Sun Apr 10 13:43:21 JST 2016
Susumu Yata 2016-04-10 13:43:21 +0900 (Sun, 10 Apr 2016) New Revision: b5d58f50a7f3b7d120a0dbfb357678ff20dd6914 https://github.com/groonga/grnci/commit/b5d58f50a7f3b7d120a0dbfb357678ff20dd6914 Message: Add DB.ExecFile (experimental). GitHub: #35 Modified files: db.go grnci.go grnci_test.go Modified: db.go (+21 -1) =================================================================== --- db.go 2016-04-01 13:24:19 +0900 (a826250) +++ db.go 2016-04-10 13:43:21 +0900 (0e57a95) @@ -659,7 +659,27 @@ func (db *DB) errorf(format string, args ...interface{}) error { } } -// query sends a command and receives the response. +// exec sends a command and receives a response. +func (db *DB) exec(data []byte) ([]byte, error) { + switch db.mode { + case LocalDB: + if err := db.localDB.send(data); err != nil { + resp, _ := db.localDB.recv() + return resp, err + } + return db.localDB.recv() + case GQTPClient: + if err := db.gqtpClient.send(data); err != nil { + resp, _ := db.gqtpClient.recv() + return resp, err + } + return db.gqtpClient.recv() + default: + return nil, fmt.Errorf("invalid mode: %d", db.mode) + } +} + +// query sends a command and receives a response. func (db *DB) query(name string, args []cmdArg, data []byte) ([]byte, error) { switch db.mode { case LocalDB: Modified: grnci.go (+31 -0) =================================================================== --- grnci.go 2016-04-01 13:24:19 +0900 (b0956b1) +++ grnci.go 2016-04-10 13:43:21 +0900 (0788a88) @@ -13,9 +13,11 @@ package grnci import "C" import ( + "bufio" "bytes" "encoding/json" "fmt" + "os" "reflect" "strconv" "strings" @@ -1699,3 +1701,32 @@ func (db *DB) PluginUnregister(name string, options *PluginUnregisterOptions) er } return nil } + +// +// Execute commands in a file (experimental). +// + +// ExecFile reads commands from a file and executes it. +func (db *DB) ExecFile(path string) ([][]byte, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + var resps [][]byte + scanner := bufio.NewScanner(file) + for scanner.Scan() { + resp, err := db.exec([]byte(scanner.Text())) + if err != nil { + return resps, err + } + if len(resp) != 0 { + resps = append(resps, resp) + } + } + if err := scanner.Err(); err != nil { + return resps, err + } + return resps, nil +} Modified: grnci_test.go (+36 -0) =================================================================== --- grnci_test.go 2016-04-01 13:24:19 +0900 (d858e7d) +++ grnci_test.go 2016-04-10 13:43:21 +0900 (83db183) @@ -633,3 +633,39 @@ func TestGetStructInfo(t *testing.T) { t.Fatalf("GetStructInfo failed: field = %v", field) } } + +func TestExecFile(t *testing.T) { + dirPath, _, db := createTempDB(t) + defer removeTempDB(t, dirPath, db) + + file, err := ioutil.TempFile("", "grnci_test") + if err != nil { + t.Fatalf("ioutil.TempFile failed: %v", err) + } + defer os.Remove(file.Name()) + + file.WriteString("table_create tbl TABLE_NO_KEY\n") + file.WriteString("column_create tbl col COLUMN_SCALAR Int32\n") + file.WriteString("load --table tbl '[[\"col\"],[123],[456],[789]]'\n") + file.WriteString(`load --table tbl +[ + ["col"], + [100], + [200], + [300], + [400], + [500] +] +`) + resps, err := db.ExecFile(file.Name()) + if err != nil { + t.Fatalf("DB.ExecFile failed: %v", err) + } + if len(resps) != 4 || + string(resps[0]) != "true" || + string(resps[1]) != "true" || + string(resps[2]) != "3" || + string(resps[3]) != "5" { + t.Fatalf("DB.ExecFile failed: resps = %#v", resps) + } +} -------------- next part -------------- HTML����������������������������...다운로드