Navigation Menu

Skip to content

Commit

Permalink
Gnx: add DB.GroongaQueryEX().
Browse files Browse the repository at this point in the history
  • Loading branch information
s-yata committed Apr 6, 2015
1 parent 722d0f7 commit fb8d38f
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions go2/gnx/gnx.go
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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')) {
Expand Down

0 comments on commit fb8d38f

Please sign in to comment.