You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-library/vendor/github.com/upper/db/v4/adapter/postgresql/custom_types_pgx.go

307 lines
7.7 KiB

// +build !pq
// Copyright (c) 2012-present The upper.io/db authors. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package postgresql
import (
"database/sql/driver"
"github.com/jackc/pgtype"
)
// JSONB represents a PostgreSQL's JSONB value:
// https://www.postgresql.org/docs/9.6/static/datatype-json.html. JSONB
// satisfies sqlbuilder.ScannerValuer.
type JSONB struct {
Data interface{}
}
// MarshalJSON encodes the wrapper value as JSON.
func (j JSONB) MarshalJSON() ([]byte, error) {
t := &pgtype.JSONB{}
if err := t.Set(j.Data); err != nil {
return nil, err
}
return t.MarshalJSON()
}
// UnmarshalJSON decodes the given JSON into the wrapped value.
func (j *JSONB) UnmarshalJSON(b []byte) error {
t := &pgtype.JSONB{}
if err := t.UnmarshalJSON(b); err != nil {
return err
}
if j.Data == nil {
j.Data = t.Get()
return nil
}
if err := t.AssignTo(&j.Data); err != nil {
return err
}
return nil
}
// Scan satisfies the sql.Scanner interface.
func (j *JSONB) Scan(src interface{}) error {
t := &pgtype.JSONB{}
if err := t.Scan(src); err != nil {
return err
}
if j.Data == nil {
j.Data = t.Get()
return nil
}
if err := t.AssignTo(j.Data); err != nil {
return err
}
return nil
}
// Value satisfies the driver.Valuer interface.
func (j JSONB) Value() (driver.Value, error) {
t := &pgtype.JSONB{}
if err := t.Set(j.Data); err != nil {
return nil, err
}
return t.Value()
}
// StringArray represents a one-dimensional array of strings (`[]string{}`)
// that is compatible with PostgreSQL's text array (`text[]`). StringArray
// satisfies sqlbuilder.ScannerValuer.
type StringArray []string
// Value satisfies the driver.Valuer interface.
func (a StringArray) Value() (driver.Value, error) {
t := pgtype.TextArray{}
if err := t.Set(a); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (sa *StringArray) Scan(src interface{}) error {
d := []string{}
t := pgtype.TextArray{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*sa = StringArray(d)
return nil
}
type Bytea []byte
func (b Bytea) Value() (driver.Value, error) {
t := pgtype.Bytea{Bytes: b}
if err := t.Set(b); err != nil {
return nil, err
}
return t.Value()
}
func (b *Bytea) Scan(src interface{}) error {
d := []byte{}
t := pgtype.Bytea{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*b = Bytea(d)
return nil
}
// ByteaArray represents a one-dimensional array of strings (`[]string{}`)
// that is compatible with PostgreSQL's text array (`text[]`). ByteaArray
// satisfies sqlbuilder.ScannerValuer.
type ByteaArray [][]byte
// Value satisfies the driver.Valuer interface.
func (a ByteaArray) Value() (driver.Value, error) {
t := pgtype.ByteaArray{}
if err := t.Set(a); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (ba *ByteaArray) Scan(src interface{}) error {
d := [][]byte{}
t := pgtype.ByteaArray{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*ba = ByteaArray(d)
return nil
}
// Int64Array represents a one-dimensional array of int64s (`[]int64{}`) that
// is compatible with PostgreSQL's integer array (`integer[]`). Int64Array
// satisfies sqlbuilder.ScannerValuer.
type Int64Array []int64
// Value satisfies the driver.Valuer interface.
func (i64a Int64Array) Value() (driver.Value, error) {
t := pgtype.Int8Array{}
if err := t.Set(i64a); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (i64a *Int64Array) Scan(src interface{}) error {
d := []int64{}
t := pgtype.Int8Array{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*i64a = Int64Array(d)
return nil
}
// Int32Array represents a one-dimensional array of int32s (`[]int32{}`) that
// is compatible with PostgreSQL's integer array (`integer[]`). Int32Array
// satisfies sqlbuilder.ScannerValuer.
type Int32Array []int32
// Value satisfies the driver.Valuer interface.
func (i32a Int32Array) Value() (driver.Value, error) {
t := pgtype.Int4Array{}
if err := t.Set(i32a); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (i32a *Int32Array) Scan(src interface{}) error {
d := []int32{}
t := pgtype.Int4Array{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*i32a = Int32Array(d)
return nil
}
// Float64Array represents a one-dimensional array of float64s (`[]float64{}`)
// that is compatible with PostgreSQL's double precision array (`double
// precision[]`). Float64Array satisfies sqlbuilder.ScannerValuer.
type Float64Array []float64
// Value satisfies the driver.Valuer interface.
func (f64a Float64Array) Value() (driver.Value, error) {
t := pgtype.Float8Array{}
if err := t.Set(f64a); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (f64a *Float64Array) Scan(src interface{}) error {
d := []float64{}
t := pgtype.Float8Array{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*f64a = Float64Array(d)
return nil
}
// Float32Array represents a one-dimensional array of float32s (`[]float32{}`)
// that is compatible with PostgreSQL's double precision array (`double
// precision[]`). Float32Array satisfies sqlbuilder.ScannerValuer.
type Float32Array []float32
// Value satisfies the driver.Valuer interface.
func (f32a Float32Array) Value() (driver.Value, error) {
t := pgtype.Float8Array{}
if err := t.Set(f32a); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (f32a *Float32Array) Scan(src interface{}) error {
d := []float32{}
t := pgtype.Float8Array{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*f32a = Float32Array(d)
return nil
}
// BoolArray represents a one-dimensional array of int64s (`[]bool{}`) that
// is compatible with PostgreSQL's boolean type (`boolean[]`). BoolArray
// satisfies sqlbuilder.ScannerValuer.
type BoolArray []bool
// Value satisfies the driver.Valuer interface.
func (ba BoolArray) Value() (driver.Value, error) {
t := pgtype.BoolArray{}
if err := t.Set(ba); err != nil {
return nil, err
}
return t.Value()
}
// Scan satisfies the sql.Scanner interface.
func (ba *BoolArray) Scan(src interface{}) error {
d := []bool{}
t := pgtype.BoolArray{}
if err := t.Scan(src); err != nil {
return err
}
if err := t.AssignTo(&d); err != nil {
return err
}
*ba = BoolArray(d)
return nil
}