changeset 441:1a1ea05a94ce api-inversion

clarify audiodb_insert() write audiodb_insert() (essentially to support the command-line client audioDB::insert operation) in terms of audiodb_insert_datum() and a new audiodb_insert_reference() function. These two functions each do exactly one thing and return failure if they're working on the wrong kind of database.
author mas01cr
date Wed, 24 Dec 2008 10:56:25 +0000
parents 91addb6ce4c4
children 16c5c51a4c32
files audioDB_API.h insert.cpp
diffstat 2 files changed, 47 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/audioDB_API.h	Wed Dec 24 10:56:22 2008 +0000
+++ b/audioDB_API.h	Wed Dec 24 10:56:25 2008 +0000
@@ -42,7 +42,7 @@
   const char *key;
   const char *times;
 };
-typedef struct adbinsert adb_insert_t, *adb_insert_ptr;
+typedef struct adbinsert adb_insert_t, adb_reference_t, *adb_insert_ptr;
 
 /* struct for returning status results */
 struct adbstatus {
@@ -175,6 +175,7 @@
 
 /* insert functions */
 int audiodb_insert_datum(adb_t *, adb_datum_t *);
+int audiodb_insert_reference(adb_t *, adb_reference_t *);
 int audiodb_insert(adb_ptr mydb, adb_insert_ptr ins);
 int audiodb_batchinsert(adb_ptr mydb, adb_insert_ptr ins, unsigned int size);
 
--- a/insert.cpp	Wed Dec 24 10:56:22 2008 +0000
+++ b/insert.cpp	Wed Dec 24 10:56:25 2008 +0000
@@ -225,6 +225,49 @@
   }
 }
 
+int audiodb_insert_reference(adb_t *adb, adb_reference_t *reference) {
+  if(!(adb->header->flags & O2_FLAG_LARGE_ADB)) {
+    return 1;
+  } else {
+    adb_datum_internal_t d;
+    struct stat st;
+    int fd;
+    off_t size;
+    
+    if((fd = open(reference->features, O_RDONLY)) == -1) {
+      return 1;
+    }
+    if(fstat(fd, &st)) {
+      goto error;
+    }
+    read_or_goto_error(fd, &(d.dim), sizeof(uint32_t));
+    close(fd);
+    fd = 0;
+    size = st.st_size - sizeof(uint32_t);
+    d.nvectors = size / (sizeof(double) * d.dim);
+    d.data = (void *) reference->features;
+    if(reference->power) {
+      if(stat(reference->power, &st)) {
+        return 1;
+      }
+    }
+    d.power = (void *) reference->power;
+    if(reference->times) {
+      if(stat(reference->times, &st)) {
+        return 1;
+      }
+    }
+    d.times = (void *) reference->times;
+    d.key = reference->key ? reference->key : reference->features;
+    return audiodb_insert_datum_internal(adb, &d);
+  error:
+    if(fd) {
+      close(fd);
+    }
+    return 1;
+  }
+}
+
 static int audiodb_free_datum(adb_datum_t *datum) {
   if(datum->data) {
     free(datum->data);
@@ -354,49 +397,15 @@
 
 int audiodb_insert(adb_t *adb, adb_insert_t *insert) {
   if(adb->header->flags & O2_FLAG_LARGE_ADB) {
-    adb_datum_internal_t d;
-    struct stat st;
-    int fd;
+    adb_reference_t *reference = insert;
     int err;
-    off_t size;
-    
-    if((fd = open(insert->features, O_RDONLY)) == -1) {
-      return 1;
-    }
-    if(fstat(fd, &st)) {
-      goto error;
-    }
-    read_or_goto_error(fd, &(d.dim), sizeof(uint32_t));
-    close(fd);
-    fd = 0;
-    size = st.st_size - sizeof(uint32_t);
-    d.nvectors = size / (sizeof(double) * d.dim);
-    d.data = (void *) insert->features;
-    if(insert->power) {
-      if(stat(insert->power, &st)) {
-        return 1;
-      }
-    }
-    d.power = (void *) insert->power;
-    if(insert->times) {
-      if(stat(insert->times, &st)) {
-        return 1;
-      }
-    }
-    d.times = (void *) insert->times;
-    d.key = insert->key ? insert->key : insert->features;
-    err = audiodb_insert_datum_internal(adb, &d);
+    err = audiodb_insert_reference(adb, reference);
 
     if(err == 2) {
       return 0;
     } else {
       return err;
     }
-  error:
-    if(fd) {
-      close(fd);
-    }
-    return 1;
   } else {
     adb_datum_t datum;
     int err;