diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp index e4c6dd957994757b8639ce5f3f040e49655413ce..7cdeb65bcaa1f77ea78f70291ff58674305be05f 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp +++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp @@ -311,6 +311,66 @@ JNIEXPORT jint JNICALL return hashDbs.size(); } +/** + * Begins a hash database transaction. + * @param env Pointer to Java environment from which this method was called. + * @param obj The Java object from which this method was called. + * @param dbHandle A handle for the hash database. + * @return 1 on error and 0 on success. + */ +JNIEXPORT jint JNICALL +Java_org_sleuthkit_datamodel_SleuthkitJNI_hashDbBeginTransactionNat( + JNIEnv * env, jclass obj, jint dbHandle) +{ + if((size_t) dbHandle > hashDbs.size()) { + setThrowTskCoreError(env, "Invalid database handle"); + return 1; + } + + TSK_HDB_INFO * db = hashDbs.at(dbHandle-1); + if(!db) { + setThrowTskCoreError(env, "Invalid database handle"); + return 1; + } + + if(!db->accepts_updates()) { + setThrowTskCoreError(env, "Database does not accept updates"); + return 1; + } + + return 0; +} + +/** + * Ends a hash database transaction. + * @param env Pointer to Java environment from which this method was called. + * @param obj The Java object from which this method was called. + * @param dbHandle A handle for the hash database. + * @return 1 on error and 0 on success. + */ +JNIEXPORT jint JNICALL +Java_org_sleuthkit_datamodel_SleuthkitJNI_hashDbEndTransactionNat( + JNIEnv * env, jclass obj, jint dbHandle) +{ + if((size_t) dbHandle > hashDbs.size()) { + setThrowTskCoreError(env, "Invalid database handle"); + return 1; + } + + TSK_HDB_INFO * db = hashDbs.at(dbHandle-1); + if(!db) { + setThrowTskCoreError(env, "Invalid database handle"); + return 1; + } + + if(!db->accepts_updates()) { + setThrowTskCoreError(env, "Database does not accept updates"); + return 1; + } + + return 0; +} + /** * Adds data to a hash database. * @param env Pointer to Java environment from which this method was called. diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h index c2eed0af193ad45a11a8cfc5936688c75c86b2e4..dc36be5b0eaa7162399e58337827e6920703cb3f 100644 --- a/bindings/java/jni/dataModel_SleuthkitJNI.h +++ b/bindings/java/jni/dataModel_SleuthkitJNI.h @@ -65,6 +65,14 @@ JNIEXPORT jint JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_hashDbNewNat(JNIEnv * env, jclass obj, jstring pathJ); +JNIEXPORT jint JNICALL +Java_org_sleuthkit_datamodel_SleuthkitJNI_hashDbBeginTransactionNat( + JNIEnv * env, jclass obj, jint dbHandle); + +JNIEXPORT jint JNICALL +Java_org_sleuthkit_datamodel_SleuthkitJNI_hashDbEndTransactionNat( + JNIEnv * env, jclass obj, jint dbHandle); + /* * Class: org_sleuthkit_datamodel_SleuthkitJNI * Method: hashDbAddRecordNat diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index 20b675b5f3d2ff46efca23d91aaf2360af47b387..f0104ce4f4aac0f88edbcd9ed4cb9222a121b473 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -54,7 +54,11 @@ public class SleuthkitJNI { private static native int hashDbOpenNat(String hashDbPath) throws TskCoreException; private static native int hashDbNewNat(String hashDbPath) throws TskCoreException; - + + private static native int hashDbBeginTransactionNat(int dbHandle) throws TskCoreException; + + private static native int hashDbEndTransactionNat(int dbHandle) throws TskCoreException; + private static native int hashDbAddEntryNat(String filename, String hashMd5, String hashSha1, String hashSha256, String comment, int dbHandle) throws TskCoreException; private static native boolean hashDbIsUpdateableNat(int dbHandle); @@ -688,11 +692,15 @@ public static void addToHashDatabase(String filename, String md5, String sha1, S } public static void addToHashDatabase(List<HashEntry> hashes, int dbHandle) throws TskCoreException { - // RJCTODO: Begin transaction - for (HashEntry entry : hashes) { - hashDbAddEntryNat(entry.getFileName(), entry.getMd5Hash(), entry.getSha1Hash(), entry.getSha256Hash(), entry.getComment(), dbHandle); + hashDbBeginTransactionNat(dbHandle); + try { + for (HashEntry entry : hashes) { + hashDbAddEntryNat(entry.getFileName(), entry.getMd5Hash(), entry.getSha1Hash(), entry.getSha256Hash(), entry.getComment(), dbHandle); + } + } + finally { + hashDbEndTransactionNat(dbHandle); } - // RJCTODO: end transaction } public static boolean isUpdateableHashDatabase(int dbHandle) throws TskCoreException {