Changeset: 7c3a84de7605 for monetdb-java URL: http://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=7c3a84de7605 Modified Files: src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedConnection.java src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedDatabase.java src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBEmbeddedBlob.java src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetBooleanColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetByteColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetDoubleColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetFloatColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetIntColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetLongColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetObjectColumn.java src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetShortColumn.java src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTable.java Branch: embedded Log Message:
More cleanup, finished null values mappings. diffs (truncated from 779 to 300 lines): diff --git a/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedConnection.java b/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedConnection.java --- a/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedConnection.java +++ b/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedConnection.java @@ -12,8 +12,7 @@ import nl.cwi.monetdb.embedded.resultset import nl.cwi.monetdb.embedded.tables.MonetDBTable; import nl.cwi.monetdb.embedded.utils.StringEscaper; -import java.util.HashSet; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * A single connection to a MonetDB database instance @@ -27,10 +26,12 @@ public class MonetDBEmbeddedConnection { protected final long connectionPointer; - private final Set<AbstractConnectionResult> results = new HashSet<>(); + private final ConcurrentHashMap<Long, AbstractConnectionResult> results = new ConcurrentHashMap<>(); protected MonetDBEmbeddedConnection(long connectionPointer) { this.connectionPointer = connectionPointer; } + protected long getConnectionPointer() { return connectionPointer; } + /** * Gets the current schema set on the connection. * @@ -95,7 +96,7 @@ public class MonetDBEmbeddedConnection { query += ";"; } UpdateResultSet res = this.sendUpdateInternal(this.connectionPointer, query, true); - results.add(res); + results.put(res.getConnectionPointer(), res); return res; } @@ -122,7 +123,7 @@ public class MonetDBEmbeddedConnection { query += ";"; } QueryResultSet res = this.sendQueryInternal(this.connectionPointer, query, true); - results.add(res); + results.put(res.getConnectionPointer(), res); return res; } @@ -147,7 +148,7 @@ public class MonetDBEmbeddedConnection { */ public MonetDBTable getMonetDBTable(String schemaName, String tableName) throws MonetDBEmbeddedException { MonetDBTable res = this.getMonetDBTableInternal(this.connectionPointer, schemaName, tableName); - results.add(res); + results.put(res.getConnectionPointer(), res); return res; } @@ -215,7 +216,7 @@ public class MonetDBEmbeddedConnection { * When the database is shuts down, this method is called instead */ protected void closeConnectionImplementation() { - for(AbstractConnectionResult res : this.results) { + for(AbstractConnectionResult res : this.results.values()) { res.closeImplementation(); } this.closeConnectionInternal(this.connectionPointer); @@ -239,7 +240,7 @@ public class MonetDBEmbeddedConnection { /** * Removes a query result from this connection. */ - protected void removeQueryResult(AbstractConnectionResult res) { this.results.remove(res); } + protected void removeQueryResult(AbstractConnectionResult res) { this.results.remove(res.getConnectionPointer()); } /** * Internal implementation of sendUpdate. diff --git a/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedDatabase.java b/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedDatabase.java --- a/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedDatabase.java +++ b/src/main/java/nl/cwi/monetdb/embedded/env/MonetDBEmbeddedDatabase.java @@ -8,8 +8,7 @@ package nl.cwi.monetdb.embedded.env; -import java.util.HashSet; -import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * An embedded version of a MonetDB database. @@ -68,23 +67,41 @@ public class MonetDBEmbeddedDatabase { /** * Get the database farm directory. * + * @throws MonetDBEmbeddedException If the database is not running * @return A String representing the farm directory */ - public static String GetDatabaseDirectory() { return MonetDBEmbeddedDatabase.databaseDirectory; } + public static String GetDatabaseDirectory() throws MonetDBEmbeddedException { + if(MonetDBEmbeddedDatabase == null) { + throw new MonetDBEmbeddedException("The database is not running!"); + } + return MonetDBEmbeddedDatabase.databaseDirectory; + } /** * Check if the Silent Flag was set while creating the database. * + * @throws MonetDBEmbeddedException If the database is not running * @return The Silent Flag */ - public static boolean IsSilentFlagSet() { return MonetDBEmbeddedDatabase.silentFlag; } + public static boolean IsSilentFlagSet() throws MonetDBEmbeddedException { + if(MonetDBEmbeddedDatabase == null) { + throw new MonetDBEmbeddedException("The database is not running!"); + } + return MonetDBEmbeddedDatabase.silentFlag; + } /** * Check if the Sequential Flag was set while creating the database. * + * @throws MonetDBEmbeddedException If the database is not running * @return The Sequential Flag */ - public static boolean IsSequentialFlagSet() { return MonetDBEmbeddedDatabase.sequentialFlag; } + public static boolean IsSequentialFlagSet() throws MonetDBEmbeddedException { + if(MonetDBEmbeddedDatabase == null) { + throw new MonetDBEmbeddedException("The database is not running!"); + } + return MonetDBEmbeddedDatabase.sequentialFlag; + } /** * Stops the database. All the pending connections will be shut down as well. @@ -95,7 +112,7 @@ public class MonetDBEmbeddedDatabase { if(MonetDBEmbeddedDatabase == null) { throw new MonetDBEmbeddedException("The database is not running!"); } else { - for(MonetDBEmbeddedConnection mdbec : MonetDBEmbeddedDatabase.connections) { + for(MonetDBEmbeddedConnection mdbec : MonetDBEmbeddedDatabase.connections.values()) { mdbec.closeConnectionImplementation(); } MonetDBEmbeddedDatabase.connections.clear(); @@ -119,7 +136,7 @@ public class MonetDBEmbeddedDatabase { private final boolean sequentialFlag; - private final Set<MonetDBEmbeddedConnection> connections = new HashSet<>(); + private final ConcurrentHashMap<Long, MonetDBEmbeddedConnection> connections = new ConcurrentHashMap<>(); private MonetDBEmbeddedDatabase(String dbDirectory, boolean silentFlag, boolean sequentialFlag) { this.databaseDirectory = dbDirectory; @@ -134,7 +151,13 @@ public class MonetDBEmbeddedDatabase { * @throws MonetDBEmbeddedException If the database is not running or an error in the database occurred */ public static MonetDBEmbeddedConnection CreateConnection() throws MonetDBEmbeddedException { - return MonetDBEmbeddedDatabase.createConnectionInternal(); + if(MonetDBEmbeddedDatabase == null) { + throw new MonetDBEmbeddedException("The database is not running!"); + } else { + MonetDBEmbeddedConnection con = MonetDBEmbeddedDatabase.createConnectionInternal(); + MonetDBEmbeddedDatabase.connections.put(con.getConnectionPointer(), con); + return con; + } } /** @@ -151,7 +174,7 @@ public class MonetDBEmbeddedDatabase { * Removes a connection from this database. */ protected static void RemoveConnection(MonetDBEmbeddedConnection con) { - MonetDBEmbeddedDatabase.connections.remove(con); + MonetDBEmbeddedDatabase.connections.remove(con.connectionPointer); } /** diff --git a/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBEmbeddedBlob.java b/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBEmbeddedBlob.java --- a/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBEmbeddedBlob.java +++ b/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBEmbeddedBlob.java @@ -19,7 +19,7 @@ import java.util.Collections; * * @author <a href="mailto:pedro.ferre...@monetdbsolutions.com">Pedro Ferreira</a> */ -public class MonetDBEmbeddedBlob implements Serializable, Blob { +public class MonetDBEmbeddedBlob implements Serializable, Blob, Comparable<MonetDBEmbeddedBlob> { /** * The BLOB's content as a Java byte array. @@ -156,4 +156,14 @@ public class MonetDBEmbeddedBlob impleme this.checkFreed(); return new ByteArrayInputStream(Arrays.copyOfRange(this.blob, (int) pos, (int) length)); } + + @Override + public int compareTo(MonetDBEmbeddedBlob o) { + byte[] first = this.blob, second = o.blob; + int len = Math.min(first.length, second.length), res = 0; + for(int i = 0; i < len ; i++) { + res = res + first[i] - second[i]; + } + return res; + } } diff --git a/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java b/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java --- a/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java +++ b/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java @@ -15,6 +15,7 @@ import java.net.URL; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; +import java.util.EnumMap; import java.util.HashMap; import java.util.UUID; @@ -39,6 +40,11 @@ public enum MonetDBToJavaMapping { */ private static final HashMap<String, MonetDBToJavaMapping> MonetDBMappings; + /** + * The mapping between MonetDB data types and enum values. + */ + private static final EnumMap<MonetDBToJavaMapping, Class<?>> AppendMappings; + static { MonetDBMappings = new HashMap<>(); MonetDBMappings.put("boolean", Boolean); @@ -69,6 +75,36 @@ public enum MonetDBToJavaMapping { MonetDBMappings.put("inet", Inet); MonetDBMappings.put("json", JSON); MonetDBMappings.put("uuid", UUID); + + AppendMappings = new EnumMap<>(MonetDBToJavaMapping.class); + AppendMappings.put(Boolean, boolean[].class); + AppendMappings.put(Char, String[].class); + AppendMappings.put(Varchar, String[].class); + AppendMappings.put(Clob, String[].class); + AppendMappings.put(Oid, long[].class); + AppendMappings.put(Tinyint, byte[].class); + AppendMappings.put(Smallint, short[].class); + AppendMappings.put(Int, int[].class); + AppendMappings.put(Wrd, long[].class); + AppendMappings.put(Bigint, long[].class); + AppendMappings.put(Hugeint, BigInteger[].class); + AppendMappings.put(Decimal, BigDecimal[].class); + AppendMappings.put(Real, float[].class); + AppendMappings.put(Double, double[].class); + AppendMappings.put(MonthInterval, int[].class); + AppendMappings.put(SecondInterval, long[].class); + AppendMappings.put(Time, Time[].class); + AppendMappings.put(TimeTz, Time[].class); + AppendMappings.put(Date, Date[].class); + AppendMappings.put(Timestamp, Timestamp[].class); + AppendMappings.put(TimestampTz, Timestamp[].class); + AppendMappings.put(Blob, MonetDBEmbeddedBlob[].class); + AppendMappings.put(Geometry, MonetDBEmbeddedBlob[].class); + AppendMappings.put(GeometryA, MonetDBEmbeddedBlob[].class); + AppendMappings.put(URL, URL[].class); + AppendMappings.put(Inet, Inet4Address[].class); + AppendMappings.put(JSON, MonetDBEmbeddedBlob[].class); + AppendMappings.put(UUID, UUID[].class); } /** @@ -82,11 +118,21 @@ public enum MonetDBToJavaMapping { } /** + * Get the corresponding MonetDBToJavaMapping from MonetDB internal data type. + * + * @param value A MonetDBToJavaMapping entry + * @return The corresponding Java array class or null if no mapping + */ + public static Class<?> GetArrayMappingFromEnumValue(MonetDBToJavaMapping value) { + return AppendMappings.get(value); + } + + /** * The corresponding Java class for the enum value. */ private final Class<?> javaClass; - MonetDBToJavaMapping(Class<?> javaClass) { this.javaClass = javaClass;} + MonetDBToJavaMapping(Class<?> javaClass) { this.javaClass = javaClass; } /** * Gets the corresponding Java class for the enum value. diff --git a/src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetBooleanColumn.java b/src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetBooleanColumn.java --- a/src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetBooleanColumn.java +++ b/src/main/java/nl/cwi/monetdb/embedded/resultset/QueryResultSetBooleanColumn.java @@ -18,16 +18,20 @@ import nl.cwi.monetdb.embedded.env.Monet public class QueryResultSetBooleanColumn extends AbstractQueryResultSetColumn<boolean[]> { /** - * MonetDB's boolean null constant. - */ - private static boolean BooleanNullConstant; - - /** * Gets MonetDB's boolean null constant * * @return MonetDB's boolean null constant */ - public static boolean GetBooleanNullConstant() { return BooleanNullConstant; } + public static native boolean GetBooleanNullConstant(); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list