[Groonga-commit] groonga/grnci at b5d58f5 [master] Add DB.ExecFile (experimental).

Back to archive index

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����������������������������...
Télécharger 



More information about the Groonga-commit mailing list
Back to archive index