From de928bb1b174ccf0573a6d69a13a9024d8836056 Mon Sep 17 00:00:00 2001
From: Richard Cordovano <rcordovano@basistech.com>
Date: Fri, 7 Feb 2014 17:50:17 -0500
Subject: [PATCH] Implement more of new addToHashDatabase() API for
 SleuthkitJNI

---
 bindings/java/jni/dataModel_SleuthkitJNI.cpp  | 60 +++++++++++++++++++
 bindings/java/jni/dataModel_SleuthkitJNI.h    |  8 +++
 .../org/sleuthkit/datamodel/SleuthkitJNI.java | 18 ++++--
 3 files changed, 81 insertions(+), 5 deletions(-)

diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
index e4c6dd957..7cdeb65bc 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 c2eed0af1..dc36be5b0 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 20b675b5f..f0104ce4f 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 {
-- 
GitLab