diff --git a/ant/build.gant b/ant/build.gant
index 37a7c5e..7f6cdc1 100644
--- a/ant/build.gant
+++ b/ant/build.gant
@@ -447,11 +447,12 @@ final def osgi = { curDir, deliverDir, targetDir ->
attribute(name:"Bundle-RequiredExecutionEnvironment", value:"JavaSE-1.6")
attribute(name:"Export-Package", value:"com.almworks.sqlite4java;version=\"1.0.${version}\"")
attribute(name:"Bundle-NativeCode", value:
- "native/sqlite4java-win32-x64.dll; osname=win32; processor=x64," +
+ "native/sqlite4java-win32-x64.dll; osname=win32; processor=x86_64," +
"native/sqlite4java-win32-x86.dll; osname=win32; processor=x86," +
- "native/libsqlite4java-linux-amd64.so; osname=Linux; processor=x64," +
- "native/libsqlite4java-linux-i386.so; osname=Linux; processor=x86," +
- "native/libsqlite4java-osx.dylib; osname=Mac OS X; processor=x86_64")
+ "native/libsqlite4java-linux-amd64.so; osname=linux; processor=x64," +
+ "native/libsqlite4java-linux-i386.so; osname=linux; processor=x86," +
+ "native/libsqlite4java-osx.dylib; osname=macosx; processor=x86_64," +
+ "native/libsqlite4java-osx.dylib; osname=macosx; processor=x86,")
}
}
}
diff --git a/java/com/almworks/sqlite4java/SQLiteConnection.java b/java/com/almworks/sqlite4java/SQLiteConnection.java
index a483c39..a87c543 100644
--- a/java/com/almworks/sqlite4java/SQLiteConnection.java
+++ b/java/com/almworks/sqlite4java/SQLiteConnection.java
@@ -20,14 +20,10 @@
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
import java.util.logging.Level;
import static com.almworks.sqlite4java.SQLiteConstants.*;
-import com.almworks.sqlite4java.SQLiteColumnMetadata;
/**
* SQLiteConnection is a single connection to sqlite database. It wraps the sqlite3*
@@ -436,6 +432,7 @@ public void dispose() {
finalizeStatements();
finalizeBlobs();
finalizeBuffers();
+ finalizeArrays();
finalizeProgressHandler(handle);
int rc = _SQLiteSwigged.sqlite3_close(handle);
// rc may be SQLiteConstants.Result.SQLITE_BUSY if statements are open
@@ -1165,6 +1162,36 @@ private void finalizeStatements() {
}
}
+ private void finalizeArrays() {
+ boolean alienThread = myConfinement != Thread.currentThread();
+ if (!alienThread) {
+ Internal.logFine(this, "finalizing arrays");
+ FastMap fastMap;
+ while (true) {
+ synchronized (myLock) {
+ if (myLongArrays.isEmpty())
+ break;
+ fastMap = new FastMap(myLongArrays);
+ myLongArrays.clear();
+ }
+ for (Map.Entry entry : fastMap.entrySet()) {
+ finalizeArrayHandle(entry.getValue(), entry.getKey());
+ }
+ }
+ }
+ synchronized (myLock) {
+ if (!myLongArrays.isEmpty()) {
+ int count = myLongArrays.size();
+ if (alienThread) {
+ Internal.logWarn(this, "cannot finalize " + count + " arrays from alien thread");
+ } else {
+ Internal.recoverableError(this, count + " arrays are not finalized", false);
+ }
+ myLongArrays.clear();
+ }
+ }
+ }
+
private void finalizeBlobs() {
boolean alienThread = myConfinement != Thread.currentThread();
if (!alienThread) {
@@ -1219,9 +1246,13 @@ private void finalizeArray(SQLiteLongArray array) {
Internal.logFine(array, "finalizing");
SWIGTYPE_p_intarray handle = array.arrayHandle();
String tableName = array.getName();
+ finalizeArrayHandle(handle, tableName);
+ }
+
+ private void finalizeArrayHandle(SWIGTYPE_p_intarray handle, String name) {
int rc = _SQLiteManual.sqlite3_intarray_destroy(handle);
if (rc != SQLITE_OK) {
- Internal.logWarn(this, "error [" + rc + "] finalizing array " + tableName);
+ Internal.logWarn(this, "error [" + rc + "] finalizing array " + name);
}
}