mirror of https://github.com/jackc/pgx.git
129 lines
2.3 KiB
Go
129 lines
2.3 KiB
Go
package pgx
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
// ValueReader is used by the Scanner interface to decode values.
|
|
type ValueReader struct {
|
|
mr *msgReader
|
|
fd *FieldDescription
|
|
valueBytesRemaining int32
|
|
err error
|
|
}
|
|
|
|
// Err returns any error that the ValueReader has experienced
|
|
func (r *ValueReader) Err() error {
|
|
return r.err
|
|
}
|
|
|
|
// Fatal tells r that a Fatal error has occurred
|
|
func (r *ValueReader) Fatal(err error) {
|
|
r.err = err
|
|
}
|
|
|
|
// Len returns the number of unread bytes
|
|
func (r *ValueReader) Len() int32 {
|
|
return r.valueBytesRemaining
|
|
}
|
|
|
|
// Type returns the *FieldDescription of the value
|
|
func (r *ValueReader) Type() *FieldDescription {
|
|
return r.fd
|
|
}
|
|
|
|
func (r *ValueReader) ReadByte() byte {
|
|
if r.err != nil {
|
|
return 0
|
|
}
|
|
|
|
r.valueBytesRemaining -= 1
|
|
if r.valueBytesRemaining < 0 {
|
|
r.Fatal(errors.New("read past end of value"))
|
|
return 0
|
|
}
|
|
|
|
return r.mr.readByte()
|
|
}
|
|
|
|
func (r *ValueReader) ReadInt16() int16 {
|
|
if r.err != nil {
|
|
return 0
|
|
}
|
|
|
|
r.valueBytesRemaining -= 2
|
|
if r.valueBytesRemaining < 0 {
|
|
r.Fatal(errors.New("read past end of value"))
|
|
return 0
|
|
}
|
|
|
|
return r.mr.readInt16()
|
|
}
|
|
|
|
func (r *ValueReader) ReadInt32() int32 {
|
|
if r.err != nil {
|
|
return 0
|
|
}
|
|
|
|
r.valueBytesRemaining -= 4
|
|
if r.valueBytesRemaining < 0 {
|
|
r.Fatal(errors.New("read past end of value"))
|
|
return 0
|
|
}
|
|
|
|
return r.mr.readInt32()
|
|
}
|
|
|
|
func (r *ValueReader) ReadInt64() int64 {
|
|
if r.err != nil {
|
|
return 0
|
|
}
|
|
|
|
r.valueBytesRemaining -= 8
|
|
if r.valueBytesRemaining < 0 {
|
|
r.Fatal(errors.New("read past end of value"))
|
|
return 0
|
|
}
|
|
|
|
return r.mr.readInt64()
|
|
}
|
|
|
|
func (r *ValueReader) ReadOid() Oid {
|
|
return Oid(r.ReadInt32())
|
|
}
|
|
|
|
// ReadString reads count bytes and returns as string
|
|
func (r *ValueReader) ReadString(count int32) string {
|
|
if r.err != nil {
|
|
return ""
|
|
}
|
|
|
|
r.valueBytesRemaining -= count
|
|
if r.valueBytesRemaining < 0 {
|
|
r.Fatal(errors.New("read past end of value"))
|
|
return ""
|
|
}
|
|
|
|
return r.mr.readString(count)
|
|
}
|
|
|
|
// ReadBytes reads count bytes and returns as []byte
|
|
func (r *ValueReader) ReadBytes(count int32) []byte {
|
|
if r.err != nil {
|
|
return nil
|
|
}
|
|
|
|
if count < 0 {
|
|
r.Fatal(errors.New("count must not be negative"))
|
|
return nil
|
|
}
|
|
|
|
r.valueBytesRemaining -= count
|
|
if r.valueBytesRemaining < 0 {
|
|
r.Fatal(errors.New("read past end of value"))
|
|
return nil
|
|
}
|
|
|
|
return r.mr.readBytes(count)
|
|
}
|