blob: 8e626264ae31037c32940ab03af5aed9179f0beb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.client.proto.query.event;
import java.math.BigDecimal;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Date;
import java.util.Objects;
import org.apache.ignite.internal.client.proto.ClientMessagePacker;
import org.apache.ignite.internal.client.proto.ClientMessageUnpacker;
import org.apache.ignite.internal.tostring.S;
import static java.sql.Types.BIGINT;
import static java.sql.Types.BINARY;
import static java.sql.Types.BOOLEAN;
import static java.sql.Types.DATE;
import static java.sql.Types.DECIMAL;
import static java.sql.Types.DOUBLE;
import static java.sql.Types.FLOAT;
import static java.sql.Types.INTEGER;
import static java.sql.Types.OTHER;
import static java.sql.Types.SMALLINT;
import static java.sql.Types.TIME;
import static java.sql.Types.TIMESTAMP;
import static java.sql.Types.TINYINT;
import static java.sql.Types.VARCHAR;
/**
* JDBC column metadata.
*/
public class JdbcColumnMeta extends Response {
/** Nullable. */
private boolean nullable;
/** Schema name. */
private String schemaName;
/** Table name. */
private String tblName;
/** Column name. */
private String colName;
/** Data type. */
private int dataType;
/** Data type name. */
private String dataTypeName;
/** Precision. */
private int precision;
/** Scale. */
private int scale;
/** Data type class. */
private String dataTypeCls;
/**
* Default constructor is used for serialization.
*/
public JdbcColumnMeta() {
}
/**
* Constructor.
*
* @param schemaName Schema.
* @param tblName Table.
* @param colName Column.
* @param cls Type.
*/
public JdbcColumnMeta(String schemaName, String tblName, String colName, Class<?> cls) {
this(schemaName, tblName, colName, cls, -1, -1, true);
}
/**
* Constructor with nullable flag.
*
* @param schemaName Schema.
* @param tblName Table.
* @param colName Column.
* @param cls Type.
* @param nullable Nullable flag.
* @param precision Column precision.
* @param scale Column scale.
*/
public JdbcColumnMeta(String schemaName, String tblName, String colName, Class<?> cls, int precision, int scale,
boolean nullable) {
this(schemaName, tblName, colName, cls.getName(), precision, scale, nullable);
}
/**
* Constructor with nullable flag.
*
* @param schemaName Schema.
* @param tblName Table.
* @param colName Column.
* @param javaTypeName Java type name.
* @param nullable Nullable flag.
* @param precision Column precision.
* @param scale Column scale.
*/
public JdbcColumnMeta(String schemaName, String tblName, String colName, String javaTypeName, int precision, int scale,
boolean nullable) {
this.schemaName = schemaName;
this.tblName = tblName;
this.colName = colName;
this.nullable = nullable;
this.dataType = type(javaTypeName);
this.dataTypeName = typeName(javaTypeName);
this.dataTypeCls = javaTypeName;
this.precision = precision;
this.scale = scale;
hasResults = true;
}
/**
* Gets schema name.
*
* @return Schema name.
*/
public String schemaName() {
return schemaName;
}
/**
* Gets table name.
*
* @return Table name.
*/
public String tableName() {
return tblName;
}
/**
* Gets column name.
*
* @return Column name.
*/
public String columnName() {
return colName;
}
/**
* Gets data type id.
*
* @return Column's data type.
*/
public int dataType() {
return dataType;
}
/**
* Gets data type name.
*
* @return Column's data type name.
*/
public String dataTypeName() {
return dataTypeName;
}
/**
* Gets default value.
*
* @return Column's default value.
*/
public String defaultValue() {
return null;
}
/**
* Gets column precision.
*
* @return Column's precision.
*/
public int precision() {
return precision;
}
/**
* Gets column scale.
*
* @return Column's scale.
*/
public int scale() {
return scale;
}
/**
* Gets nullable flag.
*
* @return {@code true} in case the column allows null values. Otherwise returns {@code false}
*/
public boolean isNullable() {
return nullable;
}
/**
* Gets data type class.
*
* @return Data type class.
*/
public String dataTypeClass() {
return dataTypeCls;
}
/** {@inheritDoc} */
@Override public void writeBinary(ClientMessagePacker packer) {
super.writeBinary(packer);
if (!hasResults)
return;
ClientMessageUtils.writeStringNullable(packer, schemaName);
ClientMessageUtils.writeStringNullable(packer, tblName);
packer.packString(colName);
packer.packInt(dataType);
packer.packString(dataTypeName);
packer.packString(dataTypeCls);
packer.packBoolean(nullable);
packer.packInt(precision);
packer.packInt(scale);
}
/** {@inheritDoc} */
@Override public void readBinary(ClientMessageUnpacker unpacker) {
super.readBinary(unpacker);
if (!hasResults)
return;
schemaName = ClientMessageUtils.readStringNullable(unpacker);
tblName = ClientMessageUtils.readStringNullable(unpacker);
colName = unpacker.unpackString();
dataType = unpacker.unpackInt();
dataTypeName = unpacker.unpackString();
dataTypeCls = unpacker.unpackString();
nullable = unpacker.unpackBoolean();
precision = unpacker.unpackInt();
scale = unpacker.unpackInt();
}
/** {@inheritDoc} */
@Override public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
JdbcColumnMeta meta = (JdbcColumnMeta)o;
return nullable == meta.nullable
&& dataType == meta.dataType
&& precision == meta.precision
&& scale == meta.scale
&& Objects.equals(schemaName, meta.schemaName)
&& Objects.equals(tblName, meta.tblName)
&& Objects.equals(colName, meta.colName)
&& Objects.equals(dataTypeCls, meta.dataTypeCls)
&& Objects.equals(dataTypeName, meta.dataTypeName);
}
/** {@inheritDoc} */
@Override public int hashCode() {
int result = (nullable ? 1 : 0);
result = 31 * result + (schemaName != null ? schemaName.hashCode() : 0);
result = 31 * result + (tblName != null ? tblName.hashCode() : 0);
result = 31 * result + (colName != null ? colName.hashCode() : 0);
result = 31 * result + (dataTypeCls != null ? dataTypeCls.hashCode() : 0);
result = 31 * result + dataType;
result = 31 * result + (dataTypeName != null ? dataTypeName.hashCode() : 0);
result = 31 * result + precision;
result = 31 * result + scale;
return result;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(JdbcColumnMeta.class, this);
}
/**
* Converts Java class name to type from {@link Types}.
*
* @param cls Java class name.
* @return Type from {@link Types}.
*/
private static int type(String cls) {
if (Boolean.class.getName().equals(cls) || boolean.class.getName().equals(cls))
return BOOLEAN;
else if (Byte.class.getName().equals(cls) || byte.class.getName().equals(cls))
return TINYINT;
else if (Short.class.getName().equals(cls) || short.class.getName().equals(cls))
return SMALLINT;
else if (Integer.class.getName().equals(cls) || int.class.getName().equals(cls))
return INTEGER;
else if (Long.class.getName().equals(cls) || long.class.getName().equals(cls))
return BIGINT;
else if (Float.class.getName().equals(cls) || float.class.getName().equals(cls))
return FLOAT;
else if (Double.class.getName().equals(cls) || double.class.getName().equals(cls))
return DOUBLE;
else if (String.class.getName().equals(cls))
return VARCHAR;
else if (byte[].class.getName().equals(cls))
return BINARY;
else if (Time.class.getName().equals(cls))
return TIME;
else if (Timestamp.class.getName().equals(cls))
return TIMESTAMP;
else if (Date.class.getName().equals(cls) || java.sql.Date.class.getName().equals(cls))
return DATE;
else if (BigDecimal.class.getName().equals(cls))
return DECIMAL;
else
return OTHER;
}
/**
* Converts Java class name to SQL type name.
*
* @param cls Java class name.
* @return SQL type name.
*/
private static String typeName(String cls) {
if (Boolean.class.getName().equals(cls) || boolean.class.getName().equals(cls))
return "BOOLEAN";
else if (Byte.class.getName().equals(cls) || byte.class.getName().equals(cls))
return "TINYINT";
else if (Short.class.getName().equals(cls) || short.class.getName().equals(cls))
return "SMALLINT";
else if (Integer.class.getName().equals(cls) || int.class.getName().equals(cls))
return "INTEGER";
else if (Long.class.getName().equals(cls) || long.class.getName().equals(cls))
return "BIGINT";
else if (Float.class.getName().equals(cls) || float.class.getName().equals(cls))
return "FLOAT";
else if (Double.class.getName().equals(cls) || double.class.getName().equals(cls))
return "DOUBLE";
else if (String.class.getName().equals(cls))
return "VARCHAR";
else if (byte[].class.getName().equals(cls))
return "BINARY";
else if (Time.class.getName().equals(cls))
return "TIME";
else if (Timestamp.class.getName().equals(cls))
return "TIMESTAMP";
else if (Date.class.getName().equals(cls) || java.sql.Date.class.getName().equals(cls))
return "DATE";
else if (BigDecimal.class.getName().equals(cls))
return "DECIMAL";
else
return "OTHER";
}
}