1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package types
- import (
- "bytes"
- "compress/gzip"
- "database/sql/driver"
- "errors"
- "io"
- )
- // 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.(type) {
- case string:
- source = []byte(src.(string))
- case []byte:
- source = src.([]byte)
- 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 := io.ReadAll(reader)
- if err != nil {
- return err
- }
- *g = GzippedText(b)
- return nil
- }
|