=== modified file 'src/main/java/org/mariadb/jdbc/MySQLPreparedStatement.java' --- src/main/java/org/mariadb/jdbc/MySQLPreparedStatement.java 2013-09-05 18:42:14 +0000 +++ src/main/java/org/mariadb/jdbc/MySQLPreparedStatement.java 2013-09-18 18:16:24 +0000 @@ -1105,7 +1105,11 @@ setNull(parameterIndex, Types.DATE); return; } - setParameter(parameterIndex, new DateParameter(date)); + Calendar calendar = null; + if (getProtocol().getServerTimezone() != null) { + calendar = Calendar.getInstance(getProtocol().getServerTimezone()); + } + setParameter(parameterIndex, new DateParameter(date, calendar)); } @@ -1114,8 +1118,11 @@ setNull(parameterIndex, Types.TIME); return; } - - setParameter(parameterIndex, new TimeParameter(x, null, useFractionalSeconds)); + Calendar calendar = null; + if (getProtocol().getServerTimezone() != null) { + calendar = Calendar.getInstance(getProtocol().getServerTimezone()); + } + setParameter(parameterIndex, new TimeParameter(x, calendar, useFractionalSeconds)); } /** @@ -1134,7 +1141,11 @@ return; } - TimestampParameter t = new TimestampParameter(timestamp, null, useFractionalSeconds); + Calendar calendar = null; + if (getProtocol().getServerTimezone() != null) { + calendar = Calendar.getInstance(getProtocol().getServerTimezone()); + } + TimestampParameter t = new TimestampParameter(timestamp, calendar, useFractionalSeconds); setParameter(parameterIndex, t); } === modified file 'src/main/java/org/mariadb/jdbc/MySQLResultSet.java' --- src/main/java/org/mariadb/jdbc/MySQLResultSet.java 2013-09-05 19:28:23 +0000 +++ src/main/java/org/mariadb/jdbc/MySQLResultSet.java 2013-09-18 18:26:04 +0000 @@ -431,7 +431,20 @@ */ public Object getObject(int columnIndex) throws SQLException { try { - return getValueObject(columnIndex).getObject(protocol.datatypeMappingFlags); + Object object = getValueObject(columnIndex).getObject(protocol.datatypeMappingFlags); + TimeZone serverTimezone = protocol.getServerTimezone(); + if (serverTimezone != null) { + if (serverTimezone != null) { + if (object instanceof Date) { + return getValueObject(columnIndex).getDate(Calendar.getInstance(serverTimezone)); + } else if (object instanceof Timestamp) { + return getValueObject(columnIndex).getTimestamp(Calendar.getInstance(serverTimezone)); + } else if (object instanceof Time) { + return getValueObject(columnIndex).getTime(Calendar.getInstance(serverTimezone)); + } + } + } + return object; } catch (ParseException e) { throw SQLExceptionMapper.getSQLException("Could not get object: " + e.getMessage(), "S1009", e); } @@ -3462,13 +3475,22 @@ * is called on a closed result set */ public Date getDate(int columnIndex) throws SQLException { - try { - return getValueObject(columnIndex).getDate(); - } catch (ParseException e) { - throw SQLExceptionMapper.getSQLException("Could not parse column as date, was: \"" + - getValueObject(columnIndex).getString() + - "\"", e); - } + ValueObject valueObject = getValueObject(columnIndex); + try { + if (valueObject != null) { + if (protocol.getServerTimezone() != null) { + return valueObject.getDate(Calendar.getInstance(protocol.getServerTimezone())); + } else { + return valueObject.getDate(); + } + } else { + return null; + } + } catch (ParseException e) { + throw SQLExceptionMapper.getSQLException("Could not parse column as date, was: \"" + + valueObject.getString() + + "\"", e); + } } /** @@ -3481,11 +3503,20 @@ * is called on a closed result set */ public Time getTime(int columnIndex) throws SQLException { - try { - return getValueObject(columnIndex).getTime(); + ValueObject valueObject = getValueObject(columnIndex); + try { + if (valueObject != null) { + if (protocol.getServerTimezone() != null) { + return valueObject.getTime(Calendar.getInstance(protocol.getServerTimezone())); + } else { + return valueObject.getTime(); + } + } else { + return null; + } } catch (ParseException e) { throw SQLExceptionMapper.getSQLException("Could not parse column as time, was: \"" + - getValueObject(columnIndex).getString() + + valueObject.getString() + "\"", e); } } @@ -3500,11 +3531,20 @@ * is called on a closed result set */ public Timestamp getTimestamp(int columnIndex) throws SQLException { - try { - return getValueObject(columnIndex).getTimestamp(); + ValueObject valueObject = getValueObject(columnIndex); + try { + if (valueObject != null) { + if (protocol.getServerTimezone() != null) { + return valueObject.getTimestamp(Calendar.getInstance(protocol.getServerTimezone())); + } else { + return valueObject.getTimestamp(); + } + } else { + return null; + } } catch (ParseException e) { throw SQLExceptionMapper.getSQLException("Could not parse column as timestamp, was: \"" + - getValueObject(columnIndex).getString() + + valueObject.getString() + "\"", e); } } === modified file 'src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java' --- src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java 2013-09-17 22:40:00 +0000 +++ src/main/java/org/mariadb/jdbc/internal/mysql/MySQLProtocol.java 2013-09-18 18:14:28 +0000 @@ -175,6 +175,8 @@ long failTimestamp; int reconnectCount; int queriesSinceFailover; + + private TimeZone serverTimezone; /* =========================== HA parameters ========================================= */ /** @@ -252,7 +254,14 @@ this.username = (username == null ? "" : username); this.password = (password == null ? "" : password); - + String serverTimezoneID = info.getProperty("serverTimezone"); + if (serverTimezoneID != null) { + serverTimezone = TimeZone.getTimeZone(serverTimezoneID); + if (!serverTimezoneID.equalsIgnoreCase("GMT") && serverTimezone.getID().equals("GMT")) { + throw new QueryException("Invalid timezone ID '"+ serverTimezoneID + "'"); + } + } + String logLevel = info.getProperty("MySQLProtocolLogLevel"); if (logLevel != null) log.setLevel(Level.parse(logLevel)); @@ -1086,6 +1095,10 @@ return minorVersion; } + public TimeZone getServerTimezone() { + return serverTimezone; + } + public boolean versionGreaterOrEqual(int major, int minor, int patch) { if (this.majorVersion > major) return true;