blob: 1985d857e4fed19f25e1a450c3e8c6ff729378d2 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc.client.column;
import java.sql.*;
import java.util.Calendar;
import org.mariadb.jdbc.Configuration;
import org.mariadb.jdbc.client.DataType;
import org.mariadb.jdbc.client.ReadableByteBuf;
/** Column metadata definition */
public class YearColumn extends UnsignedSmallIntColumn {
/**
* YEAR metadata type decoder
*
* @param buf buffer
* @param charset charset
* @param length maximum data length
* @param dataType data type. see https://mariadb.com/kb/en/result-set-packets/#field-types
* @param decimals decimal length
* @param flags flags. see https://mariadb.com/kb/en/result-set-packets/#field-details-flag
* @param stringPos string offset position in buffer
* @param extTypeName extended type name
* @param extTypeFormat extended type format
*/
public YearColumn(
ReadableByteBuf buf,
int charset,
long length,
DataType dataType,
byte decimals,
int flags,
int[] stringPos,
String extTypeName,
String extTypeFormat) {
super(buf, charset, length, dataType, decimals, flags, stringPos, extTypeName, extTypeFormat);
}
public String defaultClassname(Configuration conf) {
return conf.yearIsDateType() ? Date.class.getName() : Short.class.getName();
}
public int getColumnType(Configuration conf) {
return conf.yearIsDateType() ? Types.DATE : Types.SMALLINT;
}
public String getColumnTypeName(Configuration conf) {
return "YEAR";
}
@Override
public Object getDefaultText(final Configuration conf, ReadableByteBuf buf, int length)
throws SQLDataException {
if (conf.yearIsDateType()) {
short y = (short) buf.atoull(length);
if (columnLength == 2) {
// YEAR(2) - deprecated
if (y <= 69) {
y += 2000;
} else {
y += 1900;
}
}
return Date.valueOf(y + "-01-01");
}
return decodeShortText(buf, length);
}
@Override
public Object getDefaultBinary(final Configuration conf, ReadableByteBuf buf, int length)
throws SQLDataException {
if (conf.yearIsDateType()) {
int v = buf.readShort();
if (columnLength == 2) {
// YEAR(2) - deprecated
if (v <= 69) {
v += 2000;
} else {
v += 1900;
}
}
return Date.valueOf(v + "-01-01");
}
return decodeShortText(buf, length);
}
@Override
public Date decodeDateText(ReadableByteBuf buf, int length, Calendar cal)
throws SQLDataException {
short y = (short) buf.atoll(length);
if (columnLength == 2) {
// YEAR(2) - deprecated
if (y <= 69) {
y += 2000;
} else {
y += 1900;
}
}
return Date.valueOf(y + "-01-01");
}
@Override
public Date decodeDateBinary(ReadableByteBuf buf, int length, Calendar cal)
throws SQLDataException {
int v = buf.readShort();
if (columnLength == 2) {
// YEAR(2) - deprecated
if (v <= 69) {
v += 2000;
} else {
v += 1900;
}
}
return Date.valueOf(v + "-01-01");
}
@Override
public Timestamp decodeTimestampText(ReadableByteBuf buf, int length, Calendar calParam)
throws SQLDataException {
Calendar cal1 = calParam == null ? Calendar.getInstance() : calParam;
int year = Integer.parseInt(buf.readAscii(length));
if (columnLength <= 2) year += year >= 70 ? 1900 : 2000;
synchronized (cal1) {
cal1.clear();
cal1.set(year, Calendar.JANUARY, 1);
return new Timestamp(cal1.getTimeInMillis());
}
}
@Override
public Timestamp decodeTimestampBinary(ReadableByteBuf buf, int length, Calendar calParam)
throws SQLDataException {
Calendar cal = calParam == null ? Calendar.getInstance() : calParam;
int year = buf.readUnsignedShort();
if (columnLength <= 2) year += year >= 70 ? 1900 : 2000;
Timestamp timestamp;
synchronized (cal) {
cal.clear();
cal.set(year, 0, 1, 0, 0, 0);
timestamp = new Timestamp(cal.getTimeInMillis());
}
timestamp.setNanos(0);
return timestamp;
}
}