Example #1
0
  private static OneParamInfo readOneParameter(ByteBuffer in) throws IOException {
    Object value;
    int len;
    byte[] encodedString = null;
    byte[][] encodedStringArray = null;

    byte nextTypeByte = in.get();
    if (nextTypeByte == ARRAY) {
      VoltType nextType = null;
      byte etype = in.get();
      try {
        nextType = VoltType.get(etype);
      } catch (AssertionError ae) {
        throw new RuntimeException("ParameterSet doesn't support type " + etype);
      }
      if (nextType == null) {
        value = null;
      } else if (nextType == VoltType.STRING) {
        encodedStringArray = (byte[][]) SerializationHelper.readArray(byte[].class, in);
        String[] sval = new String[encodedStringArray.length];
        for (int i = 0; i < encodedStringArray.length; ++i) {
          if (encodedStringArray[i] == null) {
            sval[i] = null;
          } else {
            sval[i] = new String(encodedStringArray[i], Constants.UTF8ENCODING);
          }
        }
        value = sval;
      } else {
        value = SerializationHelper.readArray(nextType.classFromType(), in);
      }
    } else {
      VoltType nextType;
      try {
        nextType = VoltType.get(nextTypeByte);
      } catch (AssertionError ae) {
        throw new RuntimeException("ParameterSet doesn't support type " + nextTypeByte);
      }
      switch (nextType) {
        case NULL:
          value = null;
          break;
        case TINYINT:
          value = in.get();
          break;
        case SMALLINT:
          value = in.getShort();
          break;
        case INTEGER:
          value = in.getInt();
          break;
        case BIGINT:
          value = in.getLong();
          break;
        case FLOAT:
          value = in.getDouble();
          break;
        case STRING:
          len = in.getInt();
          if (len == VoltType.NULL_STRING_LENGTH) {
            value = VoltType.NULL_STRING_OR_VARBINARY;
          } else {
            encodedString = new byte[len];
            in.get(encodedString);
            value = new String(encodedString, Constants.UTF8ENCODING);
          }
          break;
        case VARBINARY:
          len = in.getInt();
          if (len == VoltType.NULL_STRING_LENGTH) {
            value = VoltType.NULL_STRING_OR_VARBINARY;
          } else {
            encodedString = new byte[len];
            in.get(encodedString);
            value = encodedString;
          }
          break;
        case TIMESTAMP:
          final long micros = in.getLong();
          value = new TimestampType(micros);
          break;
        case VOLTTABLE:
          final int tableSize = in.getInt();
          byte[] tableBytes = new byte[tableSize];
          in.get(tableBytes);
          value =
              PrivateVoltTableFactory.createVoltTableFromBuffer(ByteBuffer.wrap(tableBytes), false);
          break;
        case DECIMAL:
          {
            BigDecimal decimal_val = SerializationHelper.getBigDecimal(in);
            if (decimal_val == null) {
              value = VoltType.NULL_DECIMAL;
            } else {
              value = decimal_val;
            }
            break;
          }
        case GEOGRAPHY_POINT:
          value = GeographyPointValue.unflattenFromBuffer(in);
          if (value == null) {
            value = VoltType.NULL_POINT;
          }
          break;
        case GEOGRAPHY:
          len = in.getInt();
          if (len == VoltType.NULL_STRING_LENGTH) {
            value = VoltType.NULL_GEOGRAPHY;
          } else {
            value = GeographyValue.unflattenFromBuffer(in);
          }
          break;
        case BOOLEAN:
          value = in.get();
          break;
        default:
          throw new RuntimeException("ParameterSet doesn't support type " + nextType);
      }
    }

    OneParamInfo retval = new OneParamInfo();
    retval.value = value;
    retval.encodedString = encodedString;
    retval.encodedStringArray = encodedStringArray;
    return retval;
  }