[Groonga-commit] groonga/grnci at 736af96 [master] Add parseColumnNames() for parsing comma-separated column names

Back to archive index

Susumu Yata null+****@clear*****
Thu Feb 11 13:30:07 JST 2016


Susumu Yata	2016-02-11 13:30:07 +0900 (Thu, 11 Feb 2016)

  New Revision: 736af96337633b4680233f7be54a8416e02f3212
  https://github.com/groonga/grnci/commit/736af96337633b4680233f7be54a8416e02f3212

  Message:
    Add parseColumnNames() for parsing comma-separated column names
    
    GitHub: #23

  Modified files:
    grnci.go

  Modified: grnci.go (+70 -2)
===================================================================
--- grnci.go    2016-02-11 13:01:33 +0900 (c6e040e)
+++ grnci.go    2016-02-11 13:30:07 +0900 (802246c)
@@ -294,6 +294,72 @@ func parseFieldTag(s string) ([]string, error) {
 	return vals, nil
 }
 
+// parseColumnNames() parses comma-separated column names.
+func parseColumnNames(s string) ([]string, error) {
+	s = strings.TrimSpace(s)
+	if len(s) == 0 {
+		return nil, nil
+	}
+	var vals []string
+	for len(s) != 0 {
+		var stack []byte
+		i := 0
+		for i < len(s) {
+			if (len(stack) != 0) && (stack[len(stack)-1] == '"') {
+				// In a string.
+				switch s[i] {
+				case '"':
+					stack = stack[:len(stack)-1]
+				case '\\':
+					if i == (len(stack) - 1) {
+						return nil, fmt.Errorf("invalid '\\' in column names")
+					}
+					i++
+				}
+			} else {
+				// Not in a string.
+				switch s[i] {
+				case '(':
+					stack = append(stack, ')')
+				case '[':
+					stack = append(stack, ']')
+				case '{':
+					stack = append(stack, '}')
+				case ')', ']', '}':
+					if (len(stack) == 0) || (stack[len(stack)-1] != s[i]) {
+						return nil, fmt.Errorf("invalid '%c' in column names", s[i])
+					}
+					stack = stack[:len(stack)-1]
+				case '"':
+					stack = append(stack, '"')
+				case '\\':
+					if i == (len(stack) - 1) {
+						return nil, fmt.Errorf("invalid '\\' in column names")
+					}
+					i++
+				}
+				if s[i] == ',' {
+					break
+				}
+			}
+			i++
+		}
+		if len(stack) != 0 {
+			err := fmt.Errorf("invalid '%c' in column names", stack[len(stack)-1])
+			return nil, err
+		}
+		vals = append(vals, s[:i])
+		if i < len(s) {
+			i++
+		}
+		s = s[i:]
+	}
+	for i, _ := range vals {
+		vals[i] = strings.TrimSpace(vals[i])
+	}
+	return vals, nil
+}
+
 //
 // Library management
 //
@@ -1631,7 +1697,8 @@ func (db *DB) Load(tbl string, vals interface{}, options *LoadOptions) (int, err
 		return 0, err
 	}
 	var fields []*FieldInfo
-	cols := splitValues(options.Columns, ',')
+	// TODO: error handling.
+	cols, _ := parseColumnNames(options.Columns)
 	if len(cols) == 0 {
 		fields = make([]*FieldInfo, info.NumField())
 		for i := 0; i < info.NumField(); i++ {
@@ -1945,7 +2012,8 @@ func (db *DB) Select(tbl string, vals interface{}, options *SelectOptions) (int,
 		return 0, err
 	}
 	var fields []*FieldInfo
-	cols := splitValues(options.OutputColumns, ',')
+	// TODO: error handling.
+	cols, _ := parseColumnNames(options.OutputColumns)
 	if len(cols) == 0 {
 		fields = make([]*FieldInfo, info.NumField())
 		for i := 0; i < info.NumField(); i++ {
-------------- next part --------------
HTML����������������������������...
Download 



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