diff bindings/java/ext/libAudioDB_JNI.c @ 725:7e1fa27b67ee

* Full status support * Insert support (not fully tested) * Unit tests for create + initial insert
author mas01mj
date Wed, 21 Jul 2010 14:27:07 +0000
parents 11fd16e1d8b3
children fe2282b9bfb0
line wrap: on
line diff
--- a/bindings/java/ext/libAudioDB_JNI.c	Wed Jul 14 17:21:24 2010 +0000
+++ b/bindings/java/ext/libAudioDB_JNI.c	Wed Jul 21 14:27:07 2010 +0000
@@ -1,8 +1,34 @@
+#include <sys/stat.h>
 #include "org_omras2_AudioDB.h"
 #include "org_omras2_AudioDB_Mode.h"
 #include <jni.h>
 #include "audioDB_API.h"
 #include <stdlib.h>
+#include <fcntl.h>
+
+// Following Ben's lead here!
+#define ADB_HEADER_FLAG_L2NORM 0x1
+#define ADB_HEADER_FLAG_POWER 0x4
+#define ADB_HEADER_FLAG_TIMES 0x20
+#define ADB_HEADER_FLAG_REFERENCES 0x40
+
+
+adb_t* get_handle(JNIEnv *env, jobject obj)
+{
+	// Fetch the adb pointer
+
+	adb_t *handle;
+	
+	jclass adbClass = (*env)->GetObjectClass(env, obj);
+	jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
+	if(fid == NULL) {
+		return;
+	}
+	
+	handle = (adb_t*)((*env)->GetLongField(env, obj, fid)); 
+	(*env)->DeleteLocalRef(env, adbClass);
+	return handle;	
+}
 
 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim)
 {
@@ -17,6 +43,37 @@
 	if(!handle)
 		return JNI_FALSE;
 	
+	(*env)->ReleaseStringUTFChars(env, path, str);
+	return JNI_TRUE;
+}
+
+JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode)
+{
+	// TODO: If we have a handle, close the old one.
+	if(get_handle(env, obj))
+	{
+		return;
+	}
+
+	jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode");
+	jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;");
+	jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod);
+	const char* openMode = (*env)->GetStringUTFChars(env, value, 0);
+	const char* pathVal = (*env)->GetStringUTFChars(env, path, 0);
+	int modeVal = 0;
+	if(strcmp(openMode, "O_RDWR") == 0)
+	{
+		modeVal = O_RDWR;
+	}
+	else if(strcmp(openMode, "O_RDONLY") == 0)
+	{
+		modeVal = O_RDONLY;
+	}
+	else
+		return;
+
+	adb_t *handle;
+	handle = audiodb_open(pathVal, modeVal);
 	jclass adbClass = (*env)->GetObjectClass(env, obj);
 	jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
 	if(fid == NULL) {
@@ -24,22 +81,56 @@
 	}
 	(*env)->SetLongField(env, obj, fid, (long)handle);
 	(*env)->DeleteLocalRef(env, adbClass);
-	(*env)->ReleaseStringUTFChars(env, path, str);
-	return JNI_TRUE;
-}
-
-JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode)
-{
-	jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode");
-	jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;");
-	jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod);
-	const char* openMode = (*env)->GetStringUTFChars(env, value, 0);
 
 	return JNI_TRUE;
 }
 
-JNIEXPORT void JNICALL Java_org_omras2_AudioDB_insert(JNIEnv *env, jobject obj)
+JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1close (JNIEnv *env, jobject obj)
 {
+	adb_t *handle = get_handle(env, obj);
+	if(!handle)
+		return;
+
+	audiodb_close(handle);
+	
+	jclass adbClass = (*env)->GetObjectClass(env, obj);
+	jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
+	
+	if(fid == NULL) {
+		return;
+	}
+
+	(*env)->SetLongField(env, obj, fid, 0);
+	(*env)->DeleteLocalRef(env, adbClass);
+}
+
+JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1insert_1path(JNIEnv *env, jobject obj, jstring key, jstring features, jstring power, jstring times)
+{
+	adb_t *handle = get_handle(env, obj);
+	if(!handle)
+		return JNI_FALSE;
+	
+	adb_insert_t* ins = (adb_insert_t *)malloc(sizeof(adb_insert_t));
+	ins->key = NULL;
+	ins->features = NULL;
+	ins->power = NULL;
+	ins->times = NULL;
+
+	if(key)
+		ins->key = (*env)->GetStringUTFChars(env, key, 0);
+	if(features)
+		ins->features = (*env)->GetStringUTFChars(env, features, 0);
+	if(power)
+		ins->power = (*env)->GetStringUTFChars(env, power, 0);
+	if(times)
+		ins->times = (*env)->GetStringUTFChars(env, times, 0);
+
+	int result = audiodb_insert(handle, ins);
+
+	if(result)
+		return JNI_FALSE;
+	
+	return JNI_TRUE;
 }
 
 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_query(JNIEnv *env, jobject obj)
@@ -48,20 +139,9 @@
 
 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj)
 {
-
-	// Fetch the adb pointer
-
-	adb_t *handle;
-	
-	jclass adbClass = (*env)->GetObjectClass(env, obj);
-	jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
-	if(fid == NULL) {
-		return;
-	}
-	
-	handle = (adb_t*)((*env)->GetLongField(env, obj, fid)); 
-	(*env)->DeleteLocalRef(env, adbClass);
-	
+	adb_t *handle = get_handle(env, obj);
+	if(!handle)
+		return NULL;
 	adb_status_t *status;
 	status = (adb_status_t *)malloc(sizeof(adb_status_t));
 	int flags = audiodb_status(handle, status);	
@@ -77,11 +157,48 @@
 
 	jobject result = (*env)->NewObject(env, statusClass, cid);
 
-	fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I");
-	if(fid == NULL) {
-		return;
-	}
+	// This needs a macro!
+	jfieldID fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I");
+	if(fid == NULL) return;
 	(*env)->SetIntField(env, result, fid, status->numFiles);
+	
+	fid = (*env)->GetFieldID(env, statusClass, "dim", "I");
+	if(fid == NULL) return;
+	(*env)->SetIntField(env, result, fid, status->dim);
+	
+	fid = (*env)->GetFieldID(env, statusClass, "dudCount", "I");
+	if(fid == NULL) return;
+	(*env)->SetIntField(env, result, fid, status->dudCount);
+	
+	fid = (*env)->GetFieldID(env, statusClass, "nullCount", "I");
+	if(fid == NULL) return;
+	(*env)->SetIntField(env, result, fid, status->nullCount);
+	
+	fid = (*env)->GetFieldID(env, statusClass, "length", "I");
+	if(fid == NULL) return;
+	(*env)->SetIntField(env, result, fid, status->length);
+	
+	fid = (*env)->GetFieldID(env, statusClass, "dataRegionSize", "I");
+	if(fid == NULL) return;
+	(*env)->SetIntField(env, result, fid, status->data_region_size);
+
+	// Flags
+	
+	fid = (*env)->GetFieldID(env, statusClass, "isL2Normed", "Z");
+	if(fid == NULL) return;
+	(*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_L2NORM));
+	
+	fid = (*env)->GetFieldID(env, statusClass, "hasPower", "Z");
+	if(fid == NULL) return;
+	(*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_POWER));
+	
+	fid = (*env)->GetFieldID(env, statusClass, "hasTimes", "Z");
+	if(fid == NULL) return;
+	(*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_TIMES));
+	
+	fid = (*env)->GetFieldID(env, statusClass, "hasReferences", "Z");
+	if(fid == NULL) return;
+	(*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_REFERENCES));
 
 	(*env)->DeleteLocalRef(env, statusClass);