Class DefaultDatatypeCoder

java.lang.Object
org.firebirdsql.gds.ng.DefaultDatatypeCoder
All Implemented Interfaces:
DatatypeCoder
Direct Known Subclasses:
BigEndianDatatypeCoder, LittleEndianDatatypeCoder

public class DefaultDatatypeCoder extends Object implements DatatypeCoder
The default datatype coder.

Implements the encoding and decoding for the wire protocol.

As a lot of the implementation also applies to the big endian and little endian decoders for the JNA implementation, this class is not placed in package org.firebirdsql.gds.ng.wire

Since:
3.0
Author:
Mark Rotteveel
  • Constructor Details

    • DefaultDatatypeCoder

      public DefaultDatatypeCoder(IEncodingFactory encodingFactory)
      Creates a default datatype coder for the wire protocol.

      In almost all cases, it is better to use forEncodingFactory(IEncodingFactory).

      Parameters:
      encodingFactory - Encoding factory
  • Method Details

    • forEncodingFactory

      public static DefaultDatatypeCoder forEncodingFactory(IEncodingFactory encodingFactory)
      Returns an instance of DefaultDatatypeCoder for an encoding factory.
      Parameters:
      encodingFactory - Encoding factory
      Returns:
      Datatype coder, this might be a cached instance
    • sizeOfShort

      public int sizeOfShort()
      Description copied from interface: DatatypeCoder
      The size of an encoded short in this data type coder.
      Specified by:
      sizeOfShort in interface DatatypeCoder
      Returns:
      The size of an encoded short (either 2 or 4 bytes)
    • encodeShort

      public byte[] encodeShort(short value)
      Description copied from interface: DatatypeCoder
      Encode a short value as a byte array.
      Specified by:
      encodeShort in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
      See Also:
    • encodeShort

      public byte[] encodeShort(int value)
      Description copied from interface: DatatypeCoder
      Encode a short value as a byte array.
      Specified by:
      encodeShort in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
    • encodeShort

      public void encodeShort(int value, byte[] target, int fromIndex)
      Description copied from interface: DatatypeCoder
      Encode a short value into the target byte array starting at index fromIndex.
      Specified by:
      encodeShort in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      target - Target byte array of sufficient size (warning: this may be datatype coder specific)
      fromIndex - Index to start writing
    • decodeShort

      public short decodeShort(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a short value.
      Specified by:
      decodeShort in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The short value of the decoded byte array
    • decodeShort

      public short decodeShort(byte[] bytes, int fromIndex)
      Description copied from interface: DatatypeCoder
      Decode from a byte array to a short value.
      Specified by:
      decodeShort in interface DatatypeCoder
      Parameters:
      bytes - The byte array to be decoded
      fromIndex - The index to start reading
      Returns:
      The short value of the decoded byte array
    • encodeInt

      public byte[] encodeInt(int value)
      Description copied from interface: DatatypeCoder
      Encode an int value as a byte array.
      Specified by:
      encodeInt in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
    • encodeInt

      public void encodeInt(int value, byte[] target, int fromIndex)
      Description copied from interface: DatatypeCoder
      Encode an int value into the target byte array starting at index fromIndex.
      Specified by:
      encodeInt in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      target - Target byte array of sufficient size
      fromIndex - Index to start writing
    • intToBytes

      protected byte[] intToBytes(int value)
      Encode an int value as a byte array in network-order(big-endian) representation.
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
    • decodeInt

      public int decodeInt(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into an int value.
      Specified by:
      decodeInt in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The int value of the decoded byte array
    • decodeInt

      public int decodeInt(byte[] bytes, int fromIndex)
      Description copied from interface: DatatypeCoder
      Decode a byte array to an int value.
      Specified by:
      decodeInt in interface DatatypeCoder
      Parameters:
      bytes - The byte array to be decoded
      fromIndex - The index to start reading
      Returns:
      The int value of the decoded byte array
    • encodeLong

      public byte[] encodeLong(long value)
      Description copied from interface: DatatypeCoder
      Encode a long value as a byte array.
      Specified by:
      encodeLong in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
    • decodeLong

      public long decodeLong(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a long value.
      Specified by:
      decodeLong in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The long value of the decoded byte array
    • encodeFloat

      public byte[] encodeFloat(float value)
      Description copied from interface: DatatypeCoder
      Encode a float value as a byte array.
      Specified by:
      encodeFloat in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
    • decodeFloat

      public float decodeFloat(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a float value.
      Specified by:
      decodeFloat in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The float value of the decoded byte array
    • encodeDouble

      public byte[] encodeDouble(double value)
      Description copied from interface: DatatypeCoder
      Encode a double value as a byte array.
      Specified by:
      encodeDouble in interface DatatypeCoder
      Parameters:
      value - The value to be encoded
      Returns:
      The value of value encoded as a byte array
    • decodeDouble

      public double decodeDouble(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a double value.
      Specified by:
      decodeDouble in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The double value of the decoded byte array
    • encodeString

      public final byte[] encodeString(String value)
      Description copied from interface: DatatypeCoder
      Encode a String value into a byte array using the encoding of this datatype coder.
      Specified by:
      encodeString in interface DatatypeCoder
      Parameters:
      value - The String to be encoded
      Returns:
      The value of value as a byte array
    • createWriter

      public final Writer createWriter(OutputStream outputStream)
      Description copied from interface: DatatypeCoder
      Creates a writer wrapping an input stream.
      Specified by:
      createWriter in interface DatatypeCoder
      Parameters:
      outputStream - Input stream
      Returns:
      Writer applying the encoding of this datatype when writing
    • decodeString

      public final String decodeString(byte[] value)
      Description copied from interface: DatatypeCoder
      Decode an encoded byte array into a String using the encoding of this datatype coder.
      Specified by:
      decodeString in interface DatatypeCoder
      Parameters:
      value - The value to be decoded
      Returns:
      The decoded String
    • createReader

      public final Reader createReader(InputStream inputStream)
      Description copied from interface: DatatypeCoder
      Creates a reader wrapping an input stream.
      Specified by:
      createReader in interface DatatypeCoder
      Parameters:
      inputStream - Input stream
      Returns:
      Reader applying the encoding of this datatype coder when reading
    • encodeTimestamp

      public Timestamp encodeTimestamp(Timestamp value, Calendar cal)
      Description copied from interface: DatatypeCoder
      Encode a Timestamp using a given Calendar.
      Specified by:
      encodeTimestamp in interface DatatypeCoder
      Parameters:
      value - The Timestamp to be encoded
      cal - The Calendar to be used for encoding, may be null
    • encodeTimestamp

      public Timestamp encodeTimestamp(Timestamp value, Calendar cal, boolean invertTimeZone)
      Description copied from interface: DatatypeCoder
      Encode a Timestamp using a given Calendar.
      Specified by:
      encodeTimestamp in interface DatatypeCoder
      Parameters:
      value - The Timestamp to be encoded
      cal - The Calendar to be used for encoding, may be null
      invertTimeZone - If true, the timezone offset value will be subtracted from the encoded value, otherwise it will be added
      Returns:
      The encoded Timestamp
    • encodeTimestamp

      public byte[] encodeTimestamp(Timestamp value)
      Description copied from interface: DatatypeCoder
      Encode a Timestamp as a byte array.
      Specified by:
      encodeTimestamp in interface DatatypeCoder
      Parameters:
      value - The Timestamp to be encoded
      Returns:
      The array of bytes that represents the given Timestamp value
    • encodeTimestampRaw

      public byte[] encodeTimestampRaw(DatatypeCoder.RawDateTimeStruct raw)
      Description copied from interface: DatatypeCoder
      Encode the date and time portions of a raw date time struct into a byte array.
      Specified by:
      encodeTimestampRaw in interface DatatypeCoder
      Parameters:
      raw - The RawDateTimeStruct to be encoded
      Returns:
      The array of bytes representing the date and time of the given RawDateTimeStruct
    • encodeTimestampCalendar

      public byte[] encodeTimestampCalendar(Timestamp value, Calendar c)
      Specified by:
      encodeTimestampCalendar in interface DatatypeCoder
    • decodeTimestamp

      public Timestamp decodeTimestamp(Timestamp value, Calendar cal)
      Description copied from interface: DatatypeCoder
      Decode a Timestamp value using a given Calendar.
      Specified by:
      decodeTimestamp in interface DatatypeCoder
      Parameters:
      value - The Timestamp to be decoded
      cal - The Calendar to be used in decoding, may be null
      Returns:
      The decoded Timestamp
    • decodeTimestamp

      public Timestamp decodeTimestamp(Timestamp value, Calendar cal, boolean invertTimeZone)
      Description copied from interface: DatatypeCoder
      Decode a Timestamp value using a given Calendar.
      Specified by:
      decodeTimestamp in interface DatatypeCoder
      Parameters:
      value - The Timestamp to be decoded
      cal - The Calendar to be used in decoding, may be null
      invertTimeZone - If true, the timezone offset value will be subtracted from the decoded value, otherwise it will be added
      Returns:
      The encoded Timestamp
    • decodeTimestamp

      public Timestamp decodeTimestamp(byte[] byte_long)
      Description copied from interface: DatatypeCoder
      Decode a 8-byte byte array into a Timestamp.
      Specified by:
      decodeTimestamp in interface DatatypeCoder
      Parameters:
      byte_long - The byte array to be decoded
      Returns:
      A Timestamp value from the decoded bytes
    • decodeTimestampRaw

      public DatatypeCoder.RawDateTimeStruct decodeTimestampRaw(byte[] byte_long)
      Description copied from interface: DatatypeCoder
      Decode a 8-byte byte array into a raw date time struct.
      Specified by:
      decodeTimestampRaw in interface DatatypeCoder
      Parameters:
      byte_long - The byte array to be decoded
      Returns:
      A DatatypeCoder.RawDateTimeStruct.
    • decodeTimestampCalendar

      public Timestamp decodeTimestampCalendar(byte[] byte_long, Calendar c)
      Specified by:
      decodeTimestampCalendar in interface DatatypeCoder
    • encodeTime

      public Time encodeTime(Time d, Calendar cal, boolean invertTimeZone)
      Description copied from interface: DatatypeCoder
      Encode a given Time value using a given Calendar.
      Specified by:
      encodeTime in interface DatatypeCoder
      Parameters:
      d - The Time to be encoded
      cal - The Calendar to be used in the encoding, may be null
      Returns:
      The encoded Time
    • encodeTime

      public byte[] encodeTime(Time d)
      Description copied from interface: DatatypeCoder
      Encode a Time value into a byte array.
      Specified by:
      encodeTime in interface DatatypeCoder
      Parameters:
      d - The Time to be encoded
      Returns:
      The array of bytes representing the given Time
    • encodeTimeRaw

      public byte[] encodeTimeRaw(DatatypeCoder.RawDateTimeStruct raw)
      Description copied from interface: DatatypeCoder
      Encode the time portion of a raw date time struct into a byte array.
      Specified by:
      encodeTimeRaw in interface DatatypeCoder
      Parameters:
      raw - The RawDateTimeStruct to be encoded
      Returns:
      The array of bytes representing the time of the given RawDateTimeStruct
    • encodeTimeCalendar

      public byte[] encodeTimeCalendar(Time d, Calendar c)
      Specified by:
      encodeTimeCalendar in interface DatatypeCoder
    • decodeTime

      public Time decodeTime(Time d, Calendar cal, boolean invertTimeZone)
      Description copied from interface: DatatypeCoder
      Decode a Time value using a given Calendar.
      Specified by:
      decodeTime in interface DatatypeCoder
      Parameters:
      d - The Time to be decoded
      cal - The Calendar to be used in the decoding, may be null
      Returns:
      The decooded Time
    • decodeTime

      public Time decodeTime(byte[] int_byte)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a Time value.
      Specified by:
      decodeTime in interface DatatypeCoder
      Parameters:
      int_byte - The byte array to be decoded
      Returns:
      The decoded Time
    • decodeTimeRaw

      public DatatypeCoder.RawDateTimeStruct decodeTimeRaw(byte[] int_byte)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a raw date time struct.
      Specified by:
      decodeTimeRaw in interface DatatypeCoder
      Parameters:
      int_byte - The byte array to be decoded
      Returns:
      The DatatypeCoder.RawDateTimeStruct
    • decodeTimeCalendar

      public Time decodeTimeCalendar(byte[] int_byte, Calendar c)
      Specified by:
      decodeTimeCalendar in interface DatatypeCoder
    • encodeDate

      public Date encodeDate(Date d, Calendar cal)
      Description copied from interface: DatatypeCoder
      Encode a given Date value using a given Calendar.
      Specified by:
      encodeDate in interface DatatypeCoder
      Parameters:
      d - The Date to be encoded
      cal - The Calendar to be used in the encoding, may be null
      Returns:
      The encoded Date
    • encodeDate

      public byte[] encodeDate(Date d)
      Description copied from interface: DatatypeCoder
      Encode a Date value into a byte array.
      Specified by:
      encodeDate in interface DatatypeCoder
      Parameters:
      d - The Date to be encoded
      Returns:
      The array of bytes representing the given Date
    • encodeDateRaw

      public byte[] encodeDateRaw(DatatypeCoder.RawDateTimeStruct raw)
      Description copied from interface: DatatypeCoder
      Encode the date portion of a raw date time struct into a byte array.
      Specified by:
      encodeDateRaw in interface DatatypeCoder
      Parameters:
      raw - The RawDateTimeStruct to be encoded
      Returns:
      The array of bytes representing the date of the given RawDateTimeStruct
    • encodeDateCalendar

      public byte[] encodeDateCalendar(Date d, Calendar c)
      Specified by:
      encodeDateCalendar in interface DatatypeCoder
    • decodeDate

      public Date decodeDate(Date d, Calendar cal)
      Description copied from interface: DatatypeCoder
      Decode a Date value using a given Calendar.
      Specified by:
      decodeDate in interface DatatypeCoder
      Parameters:
      d - The Date to be decoded
      cal - The Calendar to be used in the decoding, may be null
      Returns:
      The decoded Date
    • decodeDate

      public Date decodeDate(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a Date value.
      Specified by:
      decodeDate in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The decoded Date
    • decodeDateRaw

      public DatatypeCoder.RawDateTimeStruct decodeDateRaw(byte[] byte_int)
      Description copied from interface: DatatypeCoder
      Decode a byte array into a raw date time struct.
      Specified by:
      decodeDateRaw in interface DatatypeCoder
      Parameters:
      byte_int - The byte array to be decoded
      Returns:
      The DatatypeCoder.RawDateTimeStruct
    • decodeDateCalendar

      public Date decodeDateCalendar(byte[] byte_int, Calendar c)
      Specified by:
      decodeDateCalendar in interface DatatypeCoder
    • decodeBoolean

      public boolean decodeBoolean(byte[] data)
      Description copied from interface: DatatypeCoder
      Decode boolean from supplied data.
      Specified by:
      decodeBoolean in interface DatatypeCoder
      Parameters:
      data - (expected) 1 bytes
      Returns:
      false when 0, true for all other values
    • encodeBoolean

      public byte[] encodeBoolean(boolean value)
      Description copied from interface: DatatypeCoder
      Encodes boolean to 1 byte data.
      Specified by:
      encodeBoolean in interface DatatypeCoder
      Parameters:
      value - Boolean value to encode
      Returns:
      true as 1, false as 0.
    • encodeLocalTime

      public byte[] encodeLocalTime(int hour, int minute, int second, int nanos)
      Description copied from interface: DatatypeCoder
      Encodes a java.time.LocalTime equivalent to time bytes.
      Specified by:
      encodeLocalTime in interface DatatypeCoder
      Parameters:
      hour - Number of hours (is assumed to be 0..23)
      minute - Number of minutes (is assumed to be 0..59)
      second - Number of seconds (is assumed to be 0..59)
      nanos - Sub-second nanoseconds (actual resolution is 100 microseconds, is assumed to be 0 .. 10^9 - 1 ns)
      Returns:
      Byte array for time
    • encodeLocalDate

      public byte[] encodeLocalDate(int year, int month, int day)
      Description copied from interface: DatatypeCoder
      Encodes a java.time.LocalDate equivalent to date bytes.
      Specified by:
      encodeLocalDate in interface DatatypeCoder
      Parameters:
      year - Year
      month - Month (is assumed to be 1..12)
      day - Day (is assumed to be valid for year and month)
      Returns:
      Byte array for date
    • encodeLocalDateTime

      public byte[] encodeLocalDateTime(int year, int month, int day, int hour, int minute, int second, int nanos)
      Description copied from interface: DatatypeCoder
      Encodes a java.time.LocalDateTime equivalent to timestamp bytes.
      Specified by:
      encodeLocalDateTime in interface DatatypeCoder
      Parameters:
      year - Year
      month - Month (is assumed to be 1..12)
      day - Day (is assumed to be valid for year and month)
      hour - Number of hours (is assumed to be 0..23)
      minute - Number of minutes (is assumed to be 0..59)
      second - Number of seconds (is assumed to be 0..59)
      nanos - Sub-second nanoseconds (actual resolution is 100 microseconds, is assumed to be 0 .. 10^9 - 1 ns)
      Returns:
      Byte array for timestamp
    • decodeDecimal64

      public Decimal64 decodeDecimal64(byte[] data)
      Description copied from interface: DatatypeCoder
      Decodes a decimal64 from byte array.
      Specified by:
      decodeDecimal64 in interface DatatypeCoder
      Parameters:
      data - Data to decode (expected 8 bytes)
      Returns:
      Decimal64 value
    • encodeDecimal64

      public byte[] encodeDecimal64(Decimal64 decimal64)
      Description copied from interface: DatatypeCoder
      Encodes a decimal64 to a byte array.
      Specified by:
      encodeDecimal64 in interface DatatypeCoder
      Parameters:
      decimal64 - The decimal64 value to be encoded
      Returns:
      Byte array for decimal64 value
    • decodeDecimal128

      public Decimal128 decodeDecimal128(byte[] data)
      Description copied from interface: DatatypeCoder
      Decodes a decimal128 from byte array.
      Specified by:
      decodeDecimal128 in interface DatatypeCoder
      Parameters:
      data - Data to decode (expected 16 bytes)
      Returns:
      Decimal128 value
    • encodeDecimal128

      public byte[] encodeDecimal128(Decimal128 decimal128)
      Description copied from interface: DatatypeCoder
      Encodes a decimal128 to a byte array.
      Specified by:
      encodeDecimal128 in interface DatatypeCoder
      Parameters:
      decimal128 - The decimal128 value to be encoded
      Returns:
      Byte array for decimal128 value
    • decodeInt128

      public BigInteger decodeInt128(byte[] data)
      Description copied from interface: DatatypeCoder
      Decodes a BigInteger from byte array.
      Specified by:
      decodeInt128 in interface DatatypeCoder
      Parameters:
      data - Data to decode (expected 16 bytes)
      Returns:
      BigInteger value
    • encodeInt128

      public byte[] encodeInt128(BigInteger bigInteger)
      Description copied from interface: DatatypeCoder
      Encodes a BigInteger to a 16-byte byte array.

      The implementation expects to be passed a value that fits in 16 bytes. If a larger value is passed, and IllegalArgumentException is thrown.

      Specified by:
      encodeInt128 in interface DatatypeCoder
      Parameters:
      bigInteger - The BigInteger value to be encoded
      Returns:
      Byte array for bigInteger value
    • getEncodingFactory

      public final IEncodingFactory getEncodingFactory()
      Specified by:
      getEncodingFactory in interface DatatypeCoder
      Returns:
      The encoding factory.
    • getEncodingDefinition

      public final EncodingDefinition getEncodingDefinition()
      Specified by:
      getEncodingDefinition in interface DatatypeCoder
      Returns:
      The encoding definition used by this datatype coder for string conversions.
    • getEncoding

      public final Encoding getEncoding()
      Specified by:
      getEncoding in interface DatatypeCoder
      Returns:
      The encoding used by this datatype coder for string conversions.
    • forEncodingDefinition

      public final DatatypeCoder forEncodingDefinition(EncodingDefinition encodingDefinition)
      Description copied from interface: DatatypeCoder
      Return a derived datatype coder that applies the supplied encoding definition for string conversions.
      Specified by:
      forEncodingDefinition in interface DatatypeCoder
      Parameters:
      encodingDefinition - Encoding definition
      Returns:
      Derived datatype coder (may be this instance if encoding definition is the same)
    • unwrap

      public DatatypeCoder unwrap()
      Description copied from interface: DatatypeCoder
      Unwrap this datatype coder to its parent (or itself).
      Specified by:
      unwrap in interface DatatypeCoder
      Returns:
      Return the parent of this datatype code, or itself if it has no parent.
    • equals

      public final boolean equals(Object o)
      Description copied from interface: DatatypeCoder

      Equality: same basic type (ie: wire protocol/JNA type + endianness) and same encoding definition.

      This does not need to take into account the encoding factory, as usage should be limited to datatype coders derived from the same connection.

      Specified by:
      equals in interface DatatypeCoder
      Overrides:
      equals in class Object
      Parameters:
      o - Object to compare to
      Returns:
      true if other is an equivalent datatype coder.
    • hashCode

      public final int hashCode()
      Specified by:
      hashCode in interface DatatypeCoder
      Overrides:
      hashCode in class Object