Changeset: 8a65996a8dc0 for monetdb-java URL: http://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=8a65996a8dc0 Added Files: src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedBlob.java Modified Files: src/main/java/nl/cwi/monetdb/embedded/AbstractStatementResult.java src/main/java/nl/cwi/monetdb/embedded/EmbeddedPreparedStatement.java src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedConnection.java src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedDatabase.java src/main/java/nl/cwi/monetdb/embedded/MonetDBToJavaMapping.java src/main/java/nl/cwi/monetdb/embedded/QueryResultSet.java src/main/java/nl/cwi/monetdb/embedded/UpdateResultSet.java Branch: embedded Log Message:
FIxed conversions and closing statements diffs (214 lines): diff --git a/src/main/java/nl/cwi/monetdb/embedded/AbstractStatementResult.java b/src/main/java/nl/cwi/monetdb/embedded/AbstractStatementResult.java --- a/src/main/java/nl/cwi/monetdb/embedded/AbstractStatementResult.java +++ b/src/main/java/nl/cwi/monetdb/embedded/AbstractStatementResult.java @@ -33,8 +33,14 @@ public abstract class AbstractStatementR */ public MonetDBEmbeddedConnection getConnection() { return connection; } + /** + * To be called by the connection when is closing, to avoid concurrency problems on the iteration. + */ + protected abstract void closeImplementation(); + @Override public void close() { + this.closeImplementation(); this.connection.removeQueryResult(this); } } diff --git a/src/main/java/nl/cwi/monetdb/embedded/EmbeddedPreparedStatement.java b/src/main/java/nl/cwi/monetdb/embedded/EmbeddedPreparedStatement.java --- a/src/main/java/nl/cwi/monetdb/embedded/EmbeddedPreparedStatement.java +++ b/src/main/java/nl/cwi/monetdb/embedded/EmbeddedPreparedStatement.java @@ -20,7 +20,7 @@ import java.text.SimpleDateFormat; import java.util.*; /** - * The embedded version of the {@link PreparedStatement} interface from JDBC (not inheriting for simpler implementation). + * The embedded version of the {@link PreparedStatement} interface from JDBC (not inheriting for easier implementation). * * @author <a href="mailto:pedro.ferre...@monetdbsolutions.com">Pedro Ferreira</a>, Fabian Groffen, Martin van Dinther */ @@ -49,14 +49,14 @@ public class EmbeddedPreparedStatement { /** * A list of Java classes that don't need special parsing of values (jsut call toString() method). */ - private static final List<Class<?>> DirectMappingClasses; + private static final Set<Class<?>> DirectMappingClasses; static { TimeFormatter = new SimpleDateFormat("HH:mm:ss.SSS"); TimeTzFormatter = new SimpleDateFormat("HH:mm:ss.SSSZ"); TimestampFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); TimestampTzFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ"); - DirectMappingClasses = new ArrayList<>(); + DirectMappingClasses = new HashSet<>(); DirectMappingClasses.add(Boolean.class); DirectMappingClasses.add(Byte.class); DirectMappingClasses.add(Short.class); @@ -65,7 +65,7 @@ public class EmbeddedPreparedStatement { DirectMappingClasses.add(BigInteger.class); DirectMappingClasses.add(Float.class); DirectMappingClasses.add(Double.class); - DirectMappingClasses.add(Byte[].class); + DirectMappingClasses.add(MonetDBEmbeddedBlob.class); DirectMappingClasses.add(URI.class); DirectMappingClasses.add(InetAddress.class); DirectMappingClasses.add(UUID.class); diff --git a/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedBlob.java b/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedBlob.java new file mode 100644 --- /dev/null +++ b/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedBlob.java @@ -0,0 +1,24 @@ +package nl.cwi.monetdb.embedded; + +/** + * A Java representation for Blob data type. Added for more efficient data mapping when fetching from the database. + * + * @author <a href="mailto:pedro.ferre...@monetdbsolutions.com">Pedro Ferreira</a> + */ +public class MonetDBEmbeddedBlob { + + private final byte[] blob; + + public MonetDBEmbeddedBlob(byte[] blob) { + this.blob = blob; + } + + public byte[] getBlob() { + return blob; + } + + @Override + public String toString() { + return new String(this.blob); + } +} diff --git a/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedConnection.java b/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedConnection.java --- a/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedConnection.java +++ b/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedConnection.java @@ -8,8 +8,8 @@ package nl.cwi.monetdb.embedded; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; /** * A single connection to a MonetDB database instance @@ -25,7 +25,7 @@ public class MonetDBEmbeddedConnection { private final long connectionPointer; - private final List<AbstractStatementResult> results = new ArrayList<>(); + private final Set<AbstractStatementResult> results = new HashSet<>(); protected MonetDBEmbeddedConnection(MonetDBEmbeddedDatabase database, long connectionPointer) { this.database = database; @@ -213,7 +213,7 @@ public class MonetDBEmbeddedConnection { * * @param schemaName The schema of the table * @param tableName The name of the table - * @throws MonetDBEmbeddedException + * @throws MonetDBEmbeddedException If an error in the database occurred */ public void removeTable(String schemaName, String tableName) throws MonetDBEmbeddedException { String query = "drop table " + schemaName + "." + tableName + ";"; @@ -221,13 +221,20 @@ public class MonetDBEmbeddedConnection { } /** + * When the database is shuts down, this method is called instead + */ + protected void closeConnectionImplementation() { + for(AbstractStatementResult res : this.results) { + res.closeImplementation(); + } + this.closeConnectionInternal(this.connectionPointer); + } + + /** * Shuts down this connection. Any pending queries connections will be immediately closed as well. */ public void closeConnection() { - for(AbstractStatementResult res : this.results) { - res.close(); - } - this.closeConnectionInternal(this.connectionPointer); + this.closeConnectionImplementation(); this.database.removeConnection(this); } diff --git a/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedDatabase.java b/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedDatabase.java --- a/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedDatabase.java +++ b/src/main/java/nl/cwi/monetdb/embedded/MonetDBEmbeddedDatabase.java @@ -8,8 +8,8 @@ package nl.cwi.monetdb.embedded; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; /** * An embedded version of a MonetDB database. @@ -62,7 +62,7 @@ public class MonetDBEmbeddedDatabase { private boolean isRunning = true; - private final List<MonetDBEmbeddedConnection> connections = new ArrayList<>(); + private final Set<MonetDBEmbeddedConnection> connections = new HashSet<>(); private MonetDBEmbeddedDatabase(String dbDirectory, boolean silentFlag, boolean sequentialFlag) { this.databaseDirectory = dbDirectory; @@ -112,7 +112,7 @@ public class MonetDBEmbeddedDatabase { public void stopDatabase() throws MonetDBEmbeddedException { if(this.isRunning) { for(MonetDBEmbeddedConnection mdbec : connections) { - mdbec.closeConnection(); + mdbec.closeConnectionImplementation(); } this.connections.clear(); this.stopDatabaseInternal(); diff --git a/src/main/java/nl/cwi/monetdb/embedded/MonetDBToJavaMapping.java b/src/main/java/nl/cwi/monetdb/embedded/MonetDBToJavaMapping.java --- a/src/main/java/nl/cwi/monetdb/embedded/MonetDBToJavaMapping.java +++ b/src/main/java/nl/cwi/monetdb/embedded/MonetDBToJavaMapping.java @@ -29,8 +29,9 @@ public enum MonetDBToJavaMapping { Tinyint(Byte.class), Smallint(Short.class), Int(Integer.class), Wrd(Long.class), Bigint(Long.class), Hugeint(BigInteger.class), Decimal(BigDecimal.class), Real(Float.class), Double(Double.class), MonthInterval(Integer.class), SecondInterval(Long.class), Time(Time.class), TimeTz(Time.class), Date(Date.class), - Timestamp(Timestamp.class), TimestampTz(Timestamp.class), Blob(Byte[].class), Geometry(Byte[].class), - GeometryA(Byte[].class), URL(URI.class), Inet(InetAddress.class), JSON(Byte[].class), UUID(UUID.class); + Timestamp(Timestamp.class), TimestampTz(Timestamp.class), Blob(MonetDBEmbeddedBlob.class), + Geometry(MonetDBEmbeddedBlob.class), GeometryA(MonetDBEmbeddedBlob.class), URL(URI.class), Inet(InetAddress.class), + JSON(MonetDBEmbeddedBlob.class), UUID(UUID.class); /** * The mapping between MonetDB data types and enum values. diff --git a/src/main/java/nl/cwi/monetdb/embedded/QueryResultSet.java b/src/main/java/nl/cwi/monetdb/embedded/QueryResultSet.java --- a/src/main/java/nl/cwi/monetdb/embedded/QueryResultSet.java +++ b/src/main/java/nl/cwi/monetdb/embedded/QueryResultSet.java @@ -275,10 +275,9 @@ public class QueryResultSet extends Abst * Close the query data so no more new results can be retrieved. */ @Override - public void close() { + public void closeImplementation() { this.cleanupResultInternal(this.resultPointer); this.resultPointer = 0; - super.close(); } private native void cleanupResultInternal(long resultPointer); diff --git a/src/main/java/nl/cwi/monetdb/embedded/UpdateResultSet.java b/src/main/java/nl/cwi/monetdb/embedded/UpdateResultSet.java --- a/src/main/java/nl/cwi/monetdb/embedded/UpdateResultSet.java +++ b/src/main/java/nl/cwi/monetdb/embedded/UpdateResultSet.java @@ -18,4 +18,6 @@ public class UpdateResultSet extends Abs protected UpdateResultSet(MonetDBEmbeddedConnection connection) { super(connection); } + + public void closeImplementation() {} } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list