aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java19
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java64
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java19
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java72
4 files changed, 117 insertions, 57 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
index 51cb64d5a21..6db05e698a8 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java
@@ -310,12 +310,11 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
* @param x the parameter value
* @exception SQLException if a database access error occurs
*/
+ private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd");
public void setDate(int parameterIndex, java.sql.Date x) throws SQLException
{
- SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''");
-
- set(parameterIndex, df.format(x));
-
+ set(parameterIndex, DF1.format(x));
+
// The above is how the date should be handled.
//
// However, in JDK's prior to 1.1.6 (confirmed with the
@@ -349,9 +348,17 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
* @param x the parameter value
* @exception SQLException if a database access error occurs
*/
+ private static SimpleDateFormat DF2 = getDF2();
+ private static SimpleDateFormat getDF2() {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+ return sdf;
+ }
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException
- {
- set(parameterIndex, "'" + x.toString() + "'");
+ {
+ StringBuffer strBuf = new StringBuffer("'");
+ strBuf.append(DF2.format(x)).append('.').append(x.getNanos()/10000000).append("+00'");
+ set(parameterIndex, strBuf.toString());
}
/**
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
index 3010ed59a3f..a91ba440f39 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java
@@ -412,9 +412,8 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
String s = getString(columnIndex);
if(s==null)
return null;
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
- return new java.sql.Date(df.parse(s).getTime());
+ return new java.sql.Date(DF5.parse(s).getTime());
} catch (ParseException e) {
throw new PSQLException("postgresql.res.baddate",new Integer(e.getErrorOffset()),s);
}
@@ -457,30 +456,59 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
* @return the column value; null if SQL NULL
* @exception SQLException if a database access error occurs
*/
+ private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSzzzzzzzzz");
+ private static final SimpleDateFormat DF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz");
+ private static final SimpleDateFormat DF3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+ private static final SimpleDateFormat DF4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ private static final SimpleDateFormat DF5 = new SimpleDateFormat("yyyy-MM-dd");
public Timestamp getTimestamp(int columnIndex) throws SQLException
{
String s = getString(columnIndex);
if(s==null)
return null;
-
- // This works, but it's commented out because Michael Stephenson's
- // solution is better still:
- //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- // Michael Stephenson's solution:
+
+ boolean subsecond;
+ //if string contains a '.' we have fractional seconds
+ if (s.indexOf('.') == -1) {
+ subsecond = false;
+ } else {
+ subsecond = true;
+ }
+
+ //here we are modifying the string from ISO format to a format java can understand
+ //java expects timezone info as 'GMT-08:00' instead of '-08' in postgres ISO format
+ //and java expects three digits if fractional seconds are present instead of two for postgres
+ //so this code strips off timezone info and adds on the GMT+/-...
+ //as well as adds a third digit for partial seconds if necessary
+ StringBuffer strBuf = new StringBuffer(s);
+ char sub = strBuf.charAt(strBuf.length()-3);
+ if (sub == '+' || sub == '-') {
+ strBuf.setLength(strBuf.length()-3);
+ if (subsecond) {
+ strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
+ } else {
+ strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
+ }
+ } else if (subsecond) {
+ strBuf = strBuf.append('0');
+ }
+
+ s = strBuf.toString();
+
SimpleDateFormat df = null;
- if (s.length()>21 && s.indexOf('.') != -1) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSzzz");
- } else if (s.length()>19 && s.indexOf('.') == -1) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:MM:sszzz");
- } else if (s.length()>19 && s.indexOf('.') != -1) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss.SS");
- } else if (s.length()>10 && s.length()<=18) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
+
+ if (s.length()>23 && subsecond) {
+ df = DF1;
+ } else if (s.length()>23 && !subsecond) {
+ df = DF2;
+ } else if (s.length()>10 && subsecond) {
+ df = DF3;
+ } else if (s.length()>10 && !subsecond) {
+ df = DF4;
} else {
- df = new SimpleDateFormat("yyyy-MM-dd");
+ df = DF5;
}
-
+
try {
return new Timestamp(df.parse(s).getTime());
} catch(ParseException e) {
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
index 1e8ec1138ea..24e21c32b84 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java
@@ -310,12 +310,11 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
* @param x the parameter value
* @exception SQLException if a database access error occurs
*/
+ private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd");
public void setDate(int parameterIndex, java.sql.Date x) throws SQLException
{
- SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''");
-
- set(parameterIndex, df.format(x));
-
+ set(parameterIndex, DF1.format(x));
+
// The above is how the date should be handled.
//
// However, in JDK's prior to 1.1.6 (confirmed with the
@@ -349,9 +348,17 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta
* @param x the parameter value
* @exception SQLException if a database access error occurs
*/
+ private static SimpleDateFormat DF2 = getDF2();
+ private static SimpleDateFormat getDF2() {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+ return sdf;
+ }
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException
- {
- set(parameterIndex, "'" + x.toString() + "'");
+ {
+ StringBuffer strBuf = new StringBuffer("'");
+ strBuf.append(DF2.format(x)).append('.').append(x.getNanos()/10000000).append("+00'");
+ set(parameterIndex, strBuf.toString());
}
/**
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
index f1f333d6d2f..d0a578d761b 100644
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
+++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java
@@ -415,9 +415,8 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
String s = getString(columnIndex);
if(s==null)
return null;
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
- return new java.sql.Date(df.parse(s).getTime());
+ return new java.sql.Date(DF5.parse(s).getTime());
} catch (ParseException e) {
throw new PSQLException("postgresql.res.baddate",new Integer(e.getErrorOffset()),s);
}
@@ -460,47 +459,66 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu
* @return the column value; null if SQL NULL
* @exception SQLException if a database access error occurs
*/
+ private static final SimpleDateFormat DF1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSzzzzzzzzz");
+ private static final SimpleDateFormat DF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz");
+ private static final SimpleDateFormat DF3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
+ private static final SimpleDateFormat DF4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ private static final SimpleDateFormat DF5 = new SimpleDateFormat("yyyy-MM-dd");
public Timestamp getTimestamp(int columnIndex) throws SQLException
{
String s = getString(columnIndex);
if(s==null)
return null;
-
- // This works, but it's commented out because Michael Stephenson's
- // solution is better still:
- //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-// Modification by Jan Thomae
- String sub = s.substring(s.length() - 3, s.length()-2);
- if (sub.equals("+") || sub.equals("-")) {
- s = s.substring(0, s.length()-3) + "GMT"+ s.substring(s.length()-3, s.length())+":00";
+
+ boolean subsecond;
+ //if string contains a '.' we have fractional seconds
+ if (s.indexOf('.') == -1) {
+ subsecond = false;
+ } else {
+ subsecond = true;
+ }
+
+ //here we are modifying the string from ISO format to a format java can understand
+ //java expects timezone info as 'GMT-08:00' instead of '-08' in postgres ISO format
+ //and java expects three digits if fractional seconds are present instead of two for postgres
+ //so this code strips off timezone info and adds on the GMT+/-...
+ //as well as adds a third digit for partial seconds if necessary
+ StringBuffer strBuf = new StringBuffer(s);
+ char sub = strBuf.charAt(strBuf.length()-3);
+ if (sub == '+' || sub == '-') {
+ strBuf.setLength(strBuf.length()-3);
+ if (subsecond) {
+ strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
+ } else {
+ strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00");
+ }
+ } else if (subsecond) {
+ strBuf = strBuf.append('0');
}
-// -------
- // Michael Stephenson's solution:
+
+ s = strBuf.toString();
+
SimpleDateFormat df = null;
-// Modification by Jan Thomae
- if (s.length()>27) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz");
- } else
-// -------
- if (s.length()>21 && s.indexOf('.') != -1) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSzzz");
- } else if (s.length()>19 && s.indexOf('.') == -1) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:MM:sszzz");
- } else if (s.length()>19 && s.indexOf('.') != -1) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss.SS");
- } else if (s.length()>10 && s.length()<=18) {
- df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
+ if (s.length()>23 && subsecond) {
+ df = DF1;
+ } else if (s.length()>23 && !subsecond) {
+ df = DF2;
+ } else if (s.length()>10 && subsecond) {
+ df = DF3;
+ } else if (s.length()>10 && !subsecond) {
+ df = DF4;
} else {
- df = new SimpleDateFormat("yyyy-MM-dd");
+ df = DF5;
}
-
+
try {
return new Timestamp(df.parse(s).getTime());
} catch(ParseException e) {
throw new PSQLException("postgresql.res.badtimestamp",new Integer(e.getErrorOffset()),s);
}
}
+
/**
* A column value can be retrieved as a stream of ASCII characters