pqarrays
2015-04-19
Child:ce9c92fc81ab
pqarrays/array.go
First pass implementation. Use a lexer to generate tokens out of the Array type responses that PostgreSQL will send. Write a parser for string[] array types. Create a StringArray type that fulfills the driver.Valuer and sql.Scanner interfaces using the parser and lexer.
1 package pqarrays
3 import (
4 "database/sql/driver"
5 "errors"
6 "strconv"
7 "strings"
8 )
10 var (
11 ErrUnexpectedValueType = errors.New("expected value to be a string or []byte")
12 )
14 type StringArray []string
16 func (s StringArray) Value() (driver.Value, error) {
17 output := make([]string, 0, len(s))
18 for _, item := range s {
19 item = strconv.Quote(item)
20 item = strings.Replace(item, "'", "\\'", -1)
21 output = append(output, item)
22 }
23 return []byte(`{` + strings.Join(output, ",") + `}`), nil
24 }
26 func (s *StringArray) Scan(value interface{}) error {
27 *s = (*s)[:0]
28 var input string
29 if _, ok := value.(string); ok {
30 input = value.(string)
31 } else if _, ok := value.([]byte); ok {
32 input = string(value.([]byte))
33 } else {
34 return ErrUnexpectedValueType
35 }
36 l := lex(input)
37 parsed, err := parse(l)
38 if err != nil {
39 return err
40 }
41 for _, item := range parsed {
42 if item == nil {
43 continue
44 }
45 *s = append(*s, *item)
46 }
47 return nil
48 }