This is an automated email from the git hooks/post-receive script. ebourg-guest pushed a commit to tag REL8_2_505 in repository libpostgresql-jdbc-java.
commit 4cea0388d5346da526bb3eb7b22d0ff44ca5719f Author: Kris Jurka <[email protected]> Date: Mon Apr 16 18:31:44 2007 +0000 Parse timezones that have offsets in seconds. 8.2 servers now return this information so we must be able to handle it. --- org/postgresql/jdbc2/AbstractJdbc2Connection.java | 4 +- org/postgresql/jdbc2/TimestampUtils.java | 52 ++++++++++++++++------- org/postgresql/test/jdbc2/TimezoneTest.java | 23 ++++++++-- 3 files changed, 58 insertions(+), 21 deletions(-) diff --git a/org/postgresql/jdbc2/AbstractJdbc2Connection.java b/org/postgresql/jdbc2/AbstractJdbc2Connection.java index 561b3ee..58e158f 100644 --- a/org/postgresql/jdbc2/AbstractJdbc2Connection.java +++ b/org/postgresql/jdbc2/AbstractJdbc2Connection.java @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v 1.39 2006/11/05 06:14:18 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v 1.40 2006/12/01 08:53:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -151,7 +151,7 @@ public abstract class AbstractJdbc2Connection implements BaseConnection } // Initialize timestamp stuff - timestampUtils = new TimestampUtils(haveMinimumServerVersion("7.4")); + timestampUtils = new TimestampUtils(haveMinimumServerVersion("7.4"), haveMinimumServerVersion("8.2")); // Initialize common queries. commitQuery = getQueryExecutor().createSimpleQuery("COMMIT"); diff --git a/org/postgresql/jdbc2/TimestampUtils.java b/org/postgresql/jdbc2/TimestampUtils.java index 62848cf..a89e64d 100644 --- a/org/postgresql/jdbc2/TimestampUtils.java +++ b/org/postgresql/jdbc2/TimestampUtils.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/TimestampUtils.java,v 1.19.2.1 2007/01/05 00:34:13 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/jdbc2/TimestampUtils.java,v 1.19.2.2 2007/04/16 17:05:55 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -33,15 +33,17 @@ public class TimestampUtils { private Calendar calCache; private int calCacheZone; - private boolean min74; + private final boolean min74; + private final boolean min82; - TimestampUtils(boolean min74) { + TimestampUtils(boolean min74, boolean min82) { this.min74 = min74; + this.min82 = min82; } - private Calendar getCalendar(int sign, int hr, int min) { - int unified = sign * (hr * 100 + min); - if (calCache != null && calCacheZone == unified) + private Calendar getCalendar(int sign, int hr, int min, int sec) { + int rawOffset = sign * (((hr * 60 + min) * 60 + sec) * 1000); + if (calCache != null && calCacheZone == rawOffset) return calCache; StringBuffer zoneID = new StringBuffer("GMT"); @@ -50,10 +52,12 @@ public class TimestampUtils { zoneID.append(hr); if (min < 10) zoneID.append('0'); zoneID.append(min); + if (sec < 10) zoneID.append('0'); + zoneID.append(sec); - TimeZone syntheticTZ = TimeZone.getTimeZone(zoneID.toString()); + TimeZone syntheticTZ = new SimpleTimeZone(rawOffset, zoneID.toString()); calCache = new GregorianCalendar(syntheticTZ); - calCacheZone = unified; + calCacheZone = rawOffset; return calCache; } @@ -188,7 +192,7 @@ public class TimestampUtils { sep = charAt(s, start); if (sep == '-' || sep == '+') { int tzsign = (sep == '-') ? -1 : 1; - int tzhr, tzmin; + int tzhr, tzmin, tzsec; end = firstNonDigit(s, start+1); // Skip +/- tzhr = number(s, start+1, end); @@ -202,11 +206,21 @@ public class TimestampUtils { } else { tzmin = 0; } - + + tzsec = 0; + if (min82) { + sep = charAt(s, start); + if (sep == ':') { + end = firstNonDigit(s, start+1); // Skip ':' + tzsec = number(s, start+1, end); + start = end; + } + } + // Setting offset does not seem to work correctly in all // cases.. So get a fresh calendar for a synthetic timezone // instead - result.tz = getCalendar(tzsign, tzhr, tzmin); + result.tz = getCalendar(tzsign, tzhr, tzmin, tzsec); start = skipWhitespace(s, start); // Skip trailing whitespace } @@ -532,13 +546,14 @@ public class TimestampUtils { sb.append(decimalStr, 0, 6); } - private static void appendTimeZone(StringBuffer sb, java.util.Calendar cal) + private void appendTimeZone(StringBuffer sb, java.util.Calendar cal) { - int offset = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / 1000 / 60; + int offset = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / 1000; int absoff = Math.abs(offset); - int hours = absoff / 60; - int mins = absoff - hours * 60; + int hours = absoff / 60 / 60; + int mins = (absoff - hours * 60 * 60) / 60; + int secs = absoff - hours * 60 * 60 - mins * 60; sb.append((offset >= 0) ? " +" : " -"); @@ -551,6 +566,13 @@ public class TimestampUtils { if (mins < 10) sb.append('0'); sb.append(mins); + + if (min82) { + sb.append(':'); + if (secs < 10) + sb.append('0'); + sb.append(secs); + } } private static void appendEra(StringBuffer sb, Calendar cal) diff --git a/org/postgresql/test/jdbc2/TimezoneTest.java b/org/postgresql/test/jdbc2/TimezoneTest.java index b1e1aa2..a368a1d 100644 --- a/org/postgresql/test/jdbc2/TimezoneTest.java +++ b/org/postgresql/test/jdbc2/TimezoneTest.java @@ -3,7 +3,7 @@ * Copyright (c) 2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/TimezoneTest.java,v 1.2 2005/08/01 23:30:01 oliver Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/test/jdbc2/TimezoneTest.java,v 1.3 2005/09/14 00:06:19 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -646,10 +646,25 @@ public class TimezoneTest extends TestCase public void testHalfHourTimezone() throws Exception { - // Check our parser handles a timezone like e.g. 03:30 correctly - ResultSet rs = con.createStatement().executeQuery("SELECT '1969-12-31 20:30:00-03:30'::text"); - + Statement stmt = con.createStatement(); + stmt.execute("SET TimeZone = 'GMT+3:30'"); + ResultSet rs = stmt.executeQuery("SELECT '1969-12-31 20:30:00'::timestamptz"); assertTrue(rs.next()); assertEquals(0L, rs.getTimestamp(1).getTime()); } + + public void testTimezoneWithSeconds() throws SQLException + { + if (!TestUtil.haveMinimumServerVersion(con, "8.2")) + return; + + Statement stmt = con.createStatement(); + stmt.execute("SET TimeZone = 'Europe/Helsinki'"); + ResultSet rs = stmt.executeQuery("SELECT '1920-01-01'::timestamptz"); + rs.next(); + // select extract(epoch from '1920-01-01'::timestamptz - 'epoch'::timestamptz) * 1000; + + assertEquals(-1577929192000L, rs.getTimestamp(1).getTime()); + } + } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

