Changeset: 14e6f812b43c for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=14e6f812b43c
Modified Files:
        src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in
        src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
        src/main/java/nl/cwi/monetdb/mcl/protocol/AbstractProtocol.java
        
src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiDataBlockResponse.java
        src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java
        
src/main/java/nl/cwi/monetdb/mcl/responses/AbstractDataBlockResponse.java
        src/main/java/nl/cwi/monetdb/mcl/responses/ResultSetResponse.java
Branch: embedded
Log Message:

Added oid support.


diffs (181 lines):

diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in 
b/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetDriver.java.in
@@ -265,7 +265,7 @@ public final class MonetDriver implement
                typeMap.put("json", Types.OTHER);
                // typeMap.put("mbr", Types.???);
                typeMap.put("month_interval", Types.INTEGER);
-               // typeMap.put("oid", Types.BIGINT);
+               typeMap.put("oid", Types.OTHER);
                // typeMap.put("ptr", Types.???);
                typeMap.put("real", Types.REAL);
                typeMap.put("sec_interval", Types.BIGINT);
diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java 
b/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
--- a/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
+++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java
@@ -1222,6 +1222,21 @@ public class MonetResultSet extends Mone
                                case Types.DECIMAL:
                                        BigDecimal bigdec = (BigDecimal) 
currentBlock.getValueAsObject(columnIndex - 1);
                                        return bigdec == null ? 0 : 
bigdec.intValue();
+                               case Types.OTHER:
+                                       if ("oid".equals(types[columnIndex - 
1])) {
+                                               String val = 
currentBlock.getValueAsString(columnIndex - 1);
+                                               
if(currentBlock.isLastReadWasNull()) {
+                                                       return 0;
+                                               }
+                                               int len = val.length();
+                                               if (len > 2 && 
val.endsWith("@0")) {
+                                                       try {
+                                                               return 
Integer.parseInt(val.substring(0, len - 2));
+                                                       } catch 
(NumberFormatException nfe) {
+                                                               throw 
newSQLNumberFormatException(nfe);
+                                                       }
+                                               }
+                                       }
                                default: //OTHERS, BLOB, LONGVARBINARY, TIME...
                                        throw new SQLException("Conversion from 
" + types[columnIndex - 1] +
                                                        " to integer type not 
supported", "M1M05");
@@ -1294,6 +1309,21 @@ public class MonetResultSet extends Mone
                                case Types.DECIMAL:
                                        BigDecimal bigdec = (BigDecimal) 
currentBlock.getValueAsObject(columnIndex - 1);
                                        return bigdec == null ? 0 : 
bigdec.longValue();
+                               case Types.OTHER:
+                                       if ("oid".equals(types[columnIndex - 
1])) {
+                                               String val = 
currentBlock.getValueAsString(columnIndex - 1);
+                                               
if(currentBlock.isLastReadWasNull()) {
+                                                       return 0;
+                                               }
+                                               int len = val.length();
+                                               if (len > 2 && 
val.endsWith("@0")) {
+                                                       try {
+                                                               return 
Long.parseLong(val.substring(0, len - 2));
+                                                       } catch 
(NumberFormatException nfe) {
+                                                               throw 
newSQLNumberFormatException(nfe);
+                                                       }
+                                               }
+                                       }
                                default: //OTHERS, BLOB, LONGVARBINARY, TIME...
                                        throw new SQLException("Conversion from 
" + types[columnIndex - 1] +
                                                        " to long type not 
supported", "M1M05");
@@ -3737,4 +3767,16 @@ public class MonetResultSet extends Mone
        private static final SQLFeatureNotSupportedException 
newSQLFeatureNotSupportedException(String name) {
                return new SQLFeatureNotSupportedException("Method " + name + " 
not implemented", "0A000");
        }
+
+       /**
+        * Small helper method that formats the "Could not convert value to a 
number" message
+        * and creates a new SQLDataException object whose SQLState is set
+        * to "22003": Numeric value out of range.
+        *
+        * @param error the NumberFormatException
+        * @return a new created SQLDataException object with SQLState 22003
+        */
+       private static final SQLDataException 
newSQLNumberFormatException(NumberFormatException error) {
+               return new SQLDataException("Could not convert value to a 
number. " + error.getMessage(), "22003");
+       }
 }
diff --git a/src/main/java/nl/cwi/monetdb/mcl/protocol/AbstractProtocol.java 
b/src/main/java/nl/cwi/monetdb/mcl/protocol/AbstractProtocol.java
--- a/src/main/java/nl/cwi/monetdb/mcl/protocol/AbstractProtocol.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/protocol/AbstractProtocol.java
@@ -212,11 +212,12 @@ public abstract class AbstractProtocol {
         * @param columncount - Number of tuples
         * @param protocol - This protocol
         * @param JdbcSQLTypes - the types array
+        * @param types - the description of the types array
         * @return An AbstractDataBlockResponse instance
         */
        public abstract AbstractDataBlockResponse 
getAnEmptyDataBlockResponse(int rowcount, int columncount,
                                                                                
                                                                  
AbstractProtocol protocol,
-                                                                               
                                                                  int[] 
JdbcSQLTypes);
+                                                                               
                                                                  int[] 
JdbcSQLTypes, String[] types);
 
        /**
         * Gets the next DataBlockResponse response from the server, belonging 
to a ResultSetResponse
diff --git 
a/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiDataBlockResponse.java
 
b/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiDataBlockResponse.java
--- 
a/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiDataBlockResponse.java
+++ 
b/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiDataBlockResponse.java
@@ -38,8 +38,9 @@ public class OldMapiDataBlockResponse ex
        /** The last parsed nanos values for timestamps */
        private int lastNanos;
 
-       OldMapiDataBlockResponse(int rowcount, int columncount, 
AbstractProtocol protocol, int[] JdbcSQLTypes) {
-               super(rowcount, protocol, JdbcSQLTypes);
+       OldMapiDataBlockResponse(int rowcount, int columncount, 
AbstractProtocol protocol, int[] JdbcSQLTypes,
+                                                        String[] types) {
+               super(rowcount, protocol, JdbcSQLTypes, types);
                this.pos = -1;
                this.data = new Object[columncount];
        }
diff --git 
a/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java 
b/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java
--- a/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/protocol/oldmapi/OldMapiProtocol.java
@@ -191,10 +191,21 @@ public class OldMapiProtocol extends Abs
                return new AutoCommitResponse(ac);
        }
 
+       /**
+        * Get an empty OldMapiDataBlockResponse from the server.
+        *
+        * @param rowcount - Number of tuples
+        * @param columncount - Number of tuples
+        * @param protocol - This protocol
+        * @param JdbcSQLTypes - the types array
+        * @param types - the description of the types array
+        * @return An OldMapiDataBlockResponse instance
+        */
        @Override
        public AbstractDataBlockResponse getAnEmptyDataBlockResponse(int 
rowcount, int columncount,
-                                                                               
                                                 AbstractProtocol protocol, 
int[] JdbcSQLTypes) {
-               return new OldMapiDataBlockResponse(rowcount, columncount, 
protocol, JdbcSQLTypes);
+                                                                               
                                                 AbstractProtocol protocol, 
int[] JdbcSQLTypes,
+                                                                               
                                                 String[] types) {
+               return new OldMapiDataBlockResponse(rowcount, columncount, 
protocol, JdbcSQLTypes, types);
        }
 
        /**
diff --git 
a/src/main/java/nl/cwi/monetdb/mcl/responses/AbstractDataBlockResponse.java 
b/src/main/java/nl/cwi/monetdb/mcl/responses/AbstractDataBlockResponse.java
--- a/src/main/java/nl/cwi/monetdb/mcl/responses/AbstractDataBlockResponse.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/responses/AbstractDataBlockResponse.java
@@ -44,6 +44,8 @@ public abstract class AbstractDataBlockR
        public final int rowcount;
        /** The JdbcSQLTypes mapping */
        public final int[] jdbcSQLTypes;
+       /** The types mapping */
+       public final String[] types;
        /** whether the last read field (via some getXyz() method) was NULL */
        public boolean lastReadWasNull = true;
 
@@ -54,10 +56,11 @@ public abstract class AbstractDataBlockR
         * @param protocol the underlying protocol
         * @param JdbcSQLTypes an array of the JDBC mappings of the columns
         */
-       public AbstractDataBlockResponse(int rowcount, AbstractProtocol 
protocol, int[] JdbcSQLTypes) {
+       public AbstractDataBlockResponse(int rowcount, AbstractProtocol 
protocol, int[] JdbcSQLTypes, String[] types) {
                this.rowcount = rowcount;
                this.protocol = protocol;
                this.jdbcSQLTypes = JdbcSQLTypes;
+               this.types = types;
        }
 
        /**
diff --git a/src/main/java/nl/cwi/monetdb/mcl/responses/ResultSetResponse.java 
b/src/main/java/nl/cwi/monetdb/mcl/responses/ResultSetResponse.java
--- a/src/main/java/nl/cwi/monetdb/mcl/responses/ResultSetResponse.java
+++ b/src/main/java/nl/cwi/monetdb/mcl/responses/ResultSetResponse.java
@@ -123,7 +123,7 @@ public class ResultSetResponse implement
 
                this.resultBlocks = new AbstractDataBlockResponse[(tuplecount / 
cacheSize) + 1];
                this.resultBlocks[0] = 
con.getProtocol().getAnEmptyDataBlockResponse(rowcount, columncount,
-                               con.getProtocol(), this.JdbcSQLTypes);
+                               con.getProtocol(), this.JdbcSQLTypes, 
this.type);
        }
 
        /**
@@ -162,7 +162,7 @@ public class ResultSetResponse implement
        public AbstractDataBlockResponse addDataBlockResponse(int offset, int 
rowcount) {
                int block = (offset - blockOffset) / cacheSize;
                AbstractDataBlockResponse res = 
con.getProtocol().getAnEmptyDataBlockResponse(rowcount,
-                               this.getColumncount(), this.con.getProtocol(), 
JdbcSQLTypes);
+                               this.getColumncount(), this.con.getProtocol(), 
JdbcSQLTypes, type);
                resultBlocks[block] = res;
                return res;
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to