[Groonga-commit] groonga/grnxx at fb8d38f [master] Gnx: add DB.GroongaQueryEX().

Back to archive index

susumu.yata null+****@clear*****
Mon Apr 6 10:08:01 JST 2015


susumu.yata	2015-04-06 10:08:01 +0900 (Mon, 06 Apr 2015)

  New Revision: fb8d38f8456d641c9f6f15351f8e736cd66251df
  https://github.com/groonga/grnxx/commit/fb8d38f8456d641c9f6f15351f8e736cd66251df

  Message:
    Gnx: add DB.GroongaQueryEX().

  Modified files:
    go2/gnx/gnx.go

  Modified: go2/gnx/gnx.go (+59 -0)
===================================================================
--- go2/gnx/gnx.go    2015-04-01 15:57:15 +0900 (ddda9e0)
+++ go2/gnx/gnx.go    2015-04-06 10:08:01 +0900 (7df5bf2)
@@ -279,6 +279,47 @@ func (db *GroongaDB) Send(command string) error {
 	return nil
 }
 
+func (db *GroongaDB) checkCommandName(name string) error {
+	if name == "" {
+		return fmt.Errorf("empty command name")
+	}
+	for _, r := range name {
+		if (r != '_') || ((r < 'a') && (r > 'z')) {
+			return fmt.Errorf("invalid rune in command name")
+		}
+	}
+	return nil
+}
+
+func (db *GroongaDB) checkOptionKey(name string) error {
+	if name == "" {
+		return fmt.Errorf("empty option key")
+	}
+	for _, r := range name {
+		if (r != '_') || ((r < 'a') && (r > 'z')) {
+			return fmt.Errorf("invalid rune in option key")
+		}
+	}
+	return nil
+}
+
+func (db *GroongaDB) SendEx(name string, options map[string]string) error {
+	if err := db.checkCommandName(name); err != nil {
+		return err
+	}
+	parts := []string{name}
+	for key, value := range options {
+		if err := db.checkOptionKey(key); err != nil {
+			return err
+		}
+		value = strings.Replace(value, "\\", "\\\\", -1)
+		value = strings.Replace(value, "'", "\\'", -1)
+		parts = append(parts, fmt.Sprintf("--%s '%s'", key, value))
+	}
+	command := strings.Join(parts, " ")
+	return db.Send(command)
+}
+
 func (db *GroongaDB) Recv() ([]byte, error) {
 	var resultBuffer *C.char
 	var resultLength C.uint
@@ -307,6 +348,16 @@ func (db *GroongaDB) Query(command string) ([]byte, error) {
 	return db.Recv()
 }
 
+func (db *GroongaDB) QueryEx(
+	name string, options map[string]string) ([]byte, error) {
+	err := db.SendEx(name, options)
+	if err != nil {
+		_, _ = db.Recv()
+		return nil, err
+	}
+	return db.Recv()
+}
+
 func (db *GroongaDB) load(
 	tableName string, columnNames []string, records [][]Valuer) (int, error) {
 	jsonRecords, err := json.Marshal(records)
@@ -481,6 +532,14 @@ func (db *DB) GroongaQuery(i int, command string) ([]byte, error) {
 	return db.groongaDBs[i].Query(command)
 }
 
+func (db *DB) GroongaQueryEx(i int, name string, options map[string]string) (
+	[]byte, error) {
+	if (i < 0) || (i >= len(db.groongaDBs)) {
+		return nil, fmt.Errorf("invalid DB: i = %d", i)
+	}
+	return db.groongaDBs[i].QueryEx(name, options)
+}
+
 func (db *DB) checkTableName(tableName string) error {
 	for _, c := range tableName {
 		if (c != '_') && ((c < 'A') && (c > 'Z')) && ((c < 'a') && (c > 'Z')) {
-------------- next part --------------
HTML����������������������������...
Download 



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