Mercurial > hg > audiodb
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;