summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/README.md5
-rw-r--r--dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types.go172
-rw-r--r--dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types_test.go127
3 files changed, 304 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/README.md b/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/README.md
new file mode 100644
index 0000000..713abe5
--- /dev/null
+++ b/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/README.md
@@ -0,0 +1,5 @@
+# types
+
+The types package provides some useful types which implement the `sql.Scanner`
+and `driver.Valuer` interfaces, suitable for use as scan and value targets with
+database/sql.
diff --git a/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types.go b/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types.go
new file mode 100644
index 0000000..808f583
--- /dev/null
+++ b/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types.go
@@ -0,0 +1,172 @@
+package types
+
+import (
+ "bytes"
+ "compress/gzip"
+ "database/sql/driver"
+ "encoding/json"
+ "errors"
+
+ "io/ioutil"
+)
+
+// GzippedText is a []byte which transparently gzips data being submitted to
+// a database and ungzips data being Scanned from a database.
+type GzippedText []byte
+
+// Value implements the driver.Valuer interface, gzipping the raw value of
+// this GzippedText.
+func (g GzippedText) Value() (driver.Value, error) {
+ b := make([]byte, 0, len(g))
+ buf := bytes.NewBuffer(b)
+ w := gzip.NewWriter(buf)
+ w.Write(g)
+ w.Close()
+ return buf.Bytes(), nil
+
+}
+
+// Scan implements the sql.Scanner interface, ungzipping the value coming off
+// the wire and storing the raw result in the GzippedText.
+func (g *GzippedText) Scan(src interface{}) error {
+ var source []byte
+ switch src := src.(type) {
+ case string:
+ source = []byte(src)
+ case []byte:
+ source = src
+ default:
+ return errors.New("Incompatible type for GzippedText")
+ }
+ reader, err := gzip.NewReader(bytes.NewReader(source))
+ if err != nil {
+ return err
+ }
+ defer reader.Close()
+ b, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return err
+ }
+ *g = GzippedText(b)
+ return nil
+}
+
+// JSONText is a json.RawMessage, which is a []byte underneath.
+// Value() validates the json format in the source, and returns an error if
+// the json is not valid. Scan does no validation. JSONText additionally
+// implements `Unmarshal`, which unmarshals the json within to an interface{}
+type JSONText json.RawMessage
+
+var emptyJSON = JSONText("{}")
+
+// MarshalJSON returns the *j as the JSON encoding of j.
+func (j JSONText) MarshalJSON() ([]byte, error) {
+ if len(j) == 0 {
+ return emptyJSON, nil
+ }
+ return j, nil
+}
+
+// UnmarshalJSON sets *j to a copy of data
+func (j *JSONText) UnmarshalJSON(data []byte) error {
+ if j == nil {
+ return errors.New("JSONText: UnmarshalJSON on nil pointer")
+ }
+ *j = append((*j)[0:0], data...)
+ return nil
+}
+
+// Value returns j as a value. This does a validating unmarshal into another
+// RawMessage. If j is invalid json, it returns an error.
+func (j JSONText) Value() (driver.Value, error) {
+ var m json.RawMessage
+ var err = j.Unmarshal(&m)
+ if err != nil {
+ return []byte{}, err
+ }
+ return []byte(j), nil
+}
+
+// Scan stores the src in *j. No validation is done.
+func (j *JSONText) Scan(src interface{}) error {
+ var source []byte
+ switch t := src.(type) {
+ case string:
+ source = []byte(t)
+ case []byte:
+ if len(t) == 0 {
+ source = emptyJSON
+ } else {
+ source = t
+ }
+ case nil:
+ *j = emptyJSON
+ default:
+ return errors.New("Incompatible type for JSONText")
+ }
+ *j = append((*j)[0:0], source...)
+ return nil
+}
+
+// Unmarshal unmarshal's the json in j to v, as in json.Unmarshal.
+func (j *JSONText) Unmarshal(v interface{}) error {
+ if len(*j) == 0 {
+ *j = emptyJSON
+ }
+ return json.Unmarshal([]byte(*j), v)
+}
+
+// String supports pretty printing for JSONText types.
+func (j JSONText) String() string {
+ return string(j)
+}
+
+// NullJSONText represents a JSONText that may be null.
+// NullJSONText implements the scanner interface so
+// it can be used as a scan destination, similar to NullString.
+type NullJSONText struct {
+ JSONText
+ Valid bool // Valid is true if JSONText is not NULL
+}
+
+// Scan implements the Scanner interface.
+func (n *NullJSONText) Scan(value interface{}) error {
+ if value == nil {
+ n.JSONText, n.Valid = emptyJSON, false
+ return nil
+ }
+ n.Valid = true
+ return n.JSONText.Scan(value)
+}
+
+// Value implements the driver Valuer interface.
+func (n NullJSONText) Value() (driver.Value, error) {
+ if !n.Valid {
+ return nil, nil
+ }
+ return n.JSONText.Value()
+}
+
+// BitBool is an implementation of a bool for the MySQL type BIT(1).
+// This type allows you to avoid wasting an entire byte for MySQL's boolean type TINYINT.
+type BitBool bool
+
+// Value implements the driver.Valuer interface,
+// and turns the BitBool into a bitfield (BIT(1)) for MySQL storage.
+func (b BitBool) Value() (driver.Value, error) {
+ if b {
+ return []byte{1}, nil
+ }
+ return []byte{0}, nil
+}
+
+// Scan implements the sql.Scanner interface,
+// and turns the bitfield incoming from MySQL into a BitBool
+func (b *BitBool) Scan(src interface{}) error {
+ v, ok := src.([]byte)
+ if !ok {
+ return errors.New("bad []byte type assertion")
+ }
+ *b = v[0] == 1
+ return nil
+}
diff --git a/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types_test.go b/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types_test.go
new file mode 100644
index 0000000..29813d1
--- /dev/null
+++ b/dependencies/pkg/mod/github.com/jmoiron/sqlx@v1.3.5/types/types_test.go
@@ -0,0 +1,127 @@
+package types
+
+import "testing"
+
+func TestGzipText(t *testing.T) {
+ g := GzippedText("Hello, world")
+ v, err := g.Value()
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ err = (&g).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ if string(g) != "Hello, world" {
+ t.Errorf("Was expecting the string we sent in (Hello World), got %s", string(g))
+ }
+}
+
+func TestJSONText(t *testing.T) {
+ j := JSONText(`{"foo": 1, "bar": 2}`)
+ v, err := j.Value()
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ err = (&j).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ m := map[string]interface{}{}
+ j.Unmarshal(&m)
+
+ if m["foo"].(float64) != 1 || m["bar"].(float64) != 2 {
+ t.Errorf("Expected valid json but got some garbage instead? %#v", m)
+ }
+
+ j = JSONText(`{"foo": 1, invalid, false}`)
+ v, err = j.Value()
+ if err == nil {
+ t.Errorf("Was expecting invalid json to fail!")
+ }
+
+ j = JSONText("")
+ v, err = j.Value()
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+
+ err = (&j).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+
+ j = JSONText(nil)
+ v, err = j.Value()
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+
+ err = (&j).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+}
+
+func TestNullJSONText(t *testing.T) {
+ j := NullJSONText{}
+ err := j.Scan(`{"foo": 1, "bar": 2}`)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ v, err := j.Value()
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ err = (&j).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ m := map[string]interface{}{}
+ j.Unmarshal(&m)
+
+ if m["foo"].(float64) != 1 || m["bar"].(float64) != 2 {
+ t.Errorf("Expected valid json but got some garbage instead? %#v", m)
+ }
+
+ j = NullJSONText{}
+ err = j.Scan(nil)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ if j.Valid != false {
+ t.Errorf("Expected valid to be false, but got true")
+ }
+}
+
+func TestBitBool(t *testing.T) {
+ // Test true value
+ var b BitBool = true
+
+ v, err := b.Value()
+ if err != nil {
+ t.Errorf("Cannot return error")
+ }
+ err = (&b).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ if !b {
+ t.Errorf("Was expecting the bool we sent in (true), got %v", b)
+ }
+
+ // Test false value
+ b = false
+
+ v, err = b.Value()
+ if err != nil {
+ t.Errorf("Cannot return error")
+ }
+ err = (&b).Scan(v)
+ if err != nil {
+ t.Errorf("Was not expecting an error")
+ }
+ if b {
+ t.Errorf("Was expecting the bool we sent in (false), got %v", b)
+ }
+}