SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING: Invoke nextval() using...
[cfb.git] / prod / net / jaekl / cfb / db / driver / PostgresqlDriver.java
index 0fe1f0809b129f812ea3e46819be0e834e1c2715..ce4a802fe39c7cb12dde8db661d8adb8e26796ee 100644 (file)
@@ -4,12 +4,13 @@ package net.jaekl.cfb.db.driver;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Properties;
 
-import net.jaekl.cfb.db.Column;
-import net.jaekl.cfb.db.Table;
+import net.jaekl.cfb.db.Sequence;
+import net.jaekl.cfb.db.Column.Type;
 
 public class PostgresqlDriver extends DbDriver {
 
@@ -30,11 +31,36 @@ public class PostgresqlDriver extends DbDriver {
                //props.setProperty("ssl", "true");
                return DriverManager.getConnection(url, props);
        }
-
-       @Override
-       public ResultSet selectColumnsFromWhere(Column[] columns, Table[] tables, String where) {
-               // TODO Auto-generated method stub
-               return null;
+       
+       @Override 
+       public long nextVal(Connection con, Sequence seq) throws SQLException
+       {
+               String sql = " SELECT NEXTVAL(?) ";
+               
+               try (PreparedStatement ps = con.prepareStatement(sql)) 
+               {
+                       ps.setString(1, seq.getName());
+                       
+                       try (ResultSet rs = ps.executeQuery()) {
+                               if (rs.next()) {
+                                       return rs.getLong(1);
+                               }
+                       }
+               }
+               
+               throw new SQLException("No value returned for sequence:  " + sql);
        }
-
-}
+       
+       
+       @Override
+       protected String typeName(Type type) {
+               // Special case:  TIMESTAMPTZ stored as INTEGER (milliseconds since the epoch)
+               // Reading a TIMESTAMPTZ back from the DB, and converting it to a java.util.Date,
+               // is fraught with peril.  The best way around this is to store the dates in 
+               // milliseconds-since-the-epoch (01.01.1970 00:00:00.000 UTC).
+               if (Type.TIMESTAMPTZ.equals(type)) {
+                       return "BIGINT";
+               }
+               
+               return type.toString();
+       }}