Mercurial > hg > audiodb
view open.cpp @ 406:c279adeb47f4 api-inversion
Slight rearrangement of insert code.
Move most of audiodb_insert() into a helper function to create an
adb_datum_t from an adb_insert_t. (Most of the rest of it goes into
another helper function for cleaning up).
Now audiodb_insert() is small enough that it's plausible to move the
O2_FLAG_LARGE_ADB into it from audioDB::insert. The plan is to add
support for the LARGE_ADB case in audiodb_insert(), at which point
audiodb_batchinsert() will Just Work, and we'll be able to delete
audioDB::batchinsert_large_adb (which is good, because it's an
almost-but-not-quite-identical copy of audioDB::batchinsert).
author | mas01cr |
---|---|
date | Fri, 05 Dec 2008 22:56:12 +0000 |
parents | 58b88ab69424 |
children | ad2206c24986 |
line wrap: on
line source
#include "audioDB.h" extern "C" { #include "audioDB_API.h" #include "audioDB-internals.h" } static bool audiodb_check_header(adb_header_t *header) { /* FIXME: use syslog() or write to stderr or something to give the poor user some diagnostics. */ if(header->magic == O2_OLD_MAGIC) { return false; } if(header->magic != O2_MAGIC) { return false; } if(header->version != O2_FORMAT_VERSION) { return false; } if(header->headerSize != O2_HEADERSIZE) { return false; } return true; } static int audiodb_collect_keys(adb_t *adb) { char *key_table = 0; size_t key_table_length = 0; if(adb->header->length > 0) { unsigned nfiles = adb->header->numFiles; key_table_length = ALIGN_PAGE_UP(nfiles * O2_FILETABLE_ENTRY_SIZE); mmap_or_goto_error(char *, key_table, adb->header->fileTableOffset, key_table_length); for (unsigned i = 0; i < nfiles; i++) { adb->keys->insert(key_table + i*O2_FILETABLE_ENTRY_SIZE); } munmap(key_table, key_table_length); } return 0; error: maybe_munmap(key_table, key_table_length); return 1; } adb_t *audiodb_open(const char *path, int flags) { adb_t *adb = 0; int fd = -1; flags &= (O_RDONLY|O_RDWR); fd = open(path, flags); if(fd == -1) { goto error; } if(acquire_lock(fd, flags == O_RDWR)) { goto error; } adb = (adb_t *) malloc(sizeof(adb_t)); if(!adb) { goto error; } adb->fd = fd; adb->flags = flags; adb->path = (char *) malloc(1+strlen(path)); if(!(adb->path)) { goto error; } strcpy(adb->path, path); adb->header = (adb_header_t *) malloc(sizeof(adb_header_t)); if(!(adb->header)) { goto error; } if(read(fd, (char *) adb->header, O2_HEADERSIZE) != O2_HEADERSIZE) { goto error; } if(!audiodb_check_header(adb->header)) { goto error; } adb->keys = new std::set<std::string>; if(!adb->keys) { goto error; } if(audiodb_collect_keys(adb)) { goto error; } return adb; error: if(adb) { if(adb->header) { free(adb->header); } if(adb->path) { free(adb->path); } if(adb->keys) { delete adb->keys; } free(adb); } if(fd != -1) { close(fd); } return NULL; }