/*
* Copyright 2004-2009 the original author or authors.
*
* Licensed 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.compass.gps.device.jdbc.dialect;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Date;
import org.compass.gps.device.jdbc.mapping.ColumnMapping;
import org.compass.gps.device.jdbc.mapping.VersionColumnMapping;
/**
* @author kimchy
*/
public class DefaultJdbcDialect implements JdbcDialect {
protected Long getIntegerAsLong(ResultSet rs, ColumnMapping columnMapping) throws SQLException {
int integer;
if (columnMapping.isUsingColumnIndex()) {
integer = rs.getInt(columnMapping.getColumnIndex());
} else {
integer = rs.getInt(columnMapping.getColumnName());
}
return (long) integer;
}
protected Long getNumericAsLong(ResultSet rs, ColumnMapping columnMapping) throws SQLException {
if (columnMapping.isUsingColumnIndex()) {
return rs.getLong(columnMapping.getColumnIndex());
}
return rs.getLong(columnMapping.getColumnName());
}
protected Long getLong(ResultSet rs, ColumnMapping columnMapping) throws SQLException {
if (columnMapping.isUsingColumnIndex()) {
return (Long) rs.getObject(columnMapping.getColumnIndex());
}
return (Long) rs.getObject(columnMapping.getColumnName());
}
protected Long getDateAsLong(ResultSet rs, ColumnMapping columnMapping) throws SQLException {
Date date;
if (columnMapping.isUsingColumnIndex()) {
date = rs.getDate(columnMapping.getColumnIndex());
} else {
date = rs.getDate(columnMapping.getColumnName());
}
return date.getTime();
}
protected Long getTimeAsLong(ResultSet rs, ColumnMapping columnMapping) throws SQLException {
Date date;
if (columnMapping.isUsingColumnIndex()) {
date = rs.getTime(columnMapping.getColumnIndex());
} else {
date = rs.getTime(columnMapping.getColumnName());
}
return date.getTime();
}
protected Long getTimestampAsLong(ResultSet rs, ColumnMapping columnMapping) throws SQLException {
Timestamp timestamp;
if (columnMapping.isUsingColumnIndex()) {
timestamp = rs.getTimestamp(columnMapping.getColumnIndex());
} else {
timestamp = rs.getTimestamp(columnMapping.getColumnName());
}
return timestamp.getTime();
}
protected Long getBigIntAsLong(final ResultSet rs, final ColumnMapping columnMapping) throws SQLException {
if (columnMapping.isUsingColumnIndex()) {
return rs.getBigDecimal(columnMapping.getColumnIndex()).longValue();
}
return rs.getBigDecimal(columnMapping.getColumnName()).longValue();
}
public Long getVersion(ResultSet rs, VersionColumnMapping versionMapping) throws SQLException {
Long result;
int sqlType = versionMapping.getSqlType();
if (sqlType == Types.INTEGER) {
result = getIntegerAsLong(rs, versionMapping);
} else if (sqlType == Types.DATE) {
result = getDateAsLong(rs, versionMapping);
} else if (sqlType == Types.TIMESTAMP) {
result = getTimestampAsLong(rs, versionMapping);
} else if (sqlType == Types.TIME) {
result = getTimeAsLong(rs, versionMapping);
} else if (sqlType == Types.NUMERIC) {
result = getNumericAsLong(rs, versionMapping);
} else if (sqlType == Types.BIGINT) {
result = getBigIntAsLong(rs, versionMapping);
} else {
result = getLong(rs, versionMapping);
}
return result;
}
public void setParameter(PreparedStatement ps, int paramIndex, String value) throws SQLException {
ParameterMetaData metaData = ps.getParameterMetaData();
int type = metaData.getParameterType(paramIndex);
if (type == Types.BIGINT) {
long lValue = Long.parseLong(value);
ps.setLong(paramIndex, lValue);
} else if (type == Types.INTEGER) {
int iValue = Integer.parseInt(value);
ps.setInt(paramIndex, iValue);
} else if (type == Types.SMALLINT) {
short iValue = Short.parseShort(value);
ps.setShort(paramIndex, iValue);
} else if (type == Types.VARCHAR || type == Types.LONGVARCHAR || type == Types.CHAR) {
ps.setString(paramIndex, value);
} else {
throw new IllegalArgumentException("Failed to set parameter for type ["
+ metaData.getParameterTypeName(paramIndex) + "], not supported");
}
}
public String getStringValue(ResultSet rs, ColumnMapping mapping) throws SQLException {
String value;
if (mapping.isUsingColumnIndex()) {
value = rs.getString(mapping.getColumnIndex());
} else {
value = rs.getString(mapping.getColumnName());
}
if (rs.wasNull()) {
return null;
}
return value;
}
public String getStringValue(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
if (rs.wasNull()) {
return null;
}
return value;
}
}