Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
ericlagergren committed Oct 9, 2019
1 parent 8837942 commit 92294e9
Showing 1 changed file with 32 additions and 1 deletion.
33 changes: 32 additions & 1 deletion encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ func encode(parameterStatus *parameterStatus, x interface{}, pgtypOid oid.Oid) [
return strconv.AppendBool(nil, v)
case time.Time:
return formatTs(v)

case decomposer:
// TODO: https://github.com/sfackler/rust-postgres/issues/119#issuecomment-166669557
default:
errorf("encode: unknown type for %T", v)
}
Expand Down Expand Up @@ -593,3 +594,33 @@ func (nt NullTime) Value() (driver.Value, error) {
}
return nt.Time, nil
}

// decomposer composes or decomposes a decimal value to and from individual parts.
// There are four separate parts: a boolean negative flag, a form byte with three possible states
// (finite=0, infinite=1, NaN=2), a base-2 big-endian integer
// coefficient (also known as a significand) as a []byte, and an int32 exponent.
// These are composed into a final value as "decimal = (neg) (form=finite) coefficient * 10 ^ exponent".
// A zero length coefficient is a zero value.
// If the form is not finite the coefficient and scale should be ignored.
// The negative parameter may be set to true for any form, although implementations are not required
// to respect the negative parameter in the non-finite form.
//
// Implementations may choose to signal a negative zero or negative NaN, but implementations
// that do not support these may also ignore the negative zero or negative NaN without error.
// If an implementation does not support Infinity it may be converted into a NaN without error.
// If a value is set that is larger then what is supported by an implementation is attempted to
// be set, an error must be returned.
// Implementations must return an error if a NaN or Infinity is attempted to be set while neither
// are supported.
type decomposer interface {
// Decompose returns the internal decimal state into parts.
// If the provided buf has sufficient capacity, buf may be returned as the coefficient with
// the value set and length set as appropriate.
Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32)

// Compose sets the internal decimal value from parts. If the value cannot be
// represented then an error should be returned.
// The coefficent should not be modified. Successive calls to compose with
// the same arguments should result in the same decimal value.
Compose(form byte, negative bool, coefficient []byte, exponent int32) error
}

0 comments on commit 92294e9

Please sign in to comment.