annotate open.cpp @ 430:2d14d21f826b api-inversion

Make the keys std::set in adb_t a std::map instead. The key's index can usefully be the value, and now suddenly we can remove audioDB::getKeyPos and its oh-so-helpful "this should be an STL map" comment.
author mas01cr
date Wed, 24 Dec 2008 10:55:36 +0000
parents ad2206c24986
children 62a0515f59be
rev   line source
mas01cr@392 1 #include "audioDB.h"
mas01cr@392 2 extern "C" {
mas01cr@392 3 #include "audioDB_API.h"
mas01cr@402 4 #include "audioDB-internals.h"
mas01cr@392 5 }
mas01cr@392 6
mas01cr@402 7 static bool audiodb_check_header(adb_header_t *header) {
mas01cr@392 8 /* FIXME: use syslog() or write to stderr or something to give the
mas01cr@392 9 poor user some diagnostics. */
mas01cr@392 10 if(header->magic == O2_OLD_MAGIC) {
mas01cr@392 11 return false;
mas01cr@392 12 }
mas01cr@392 13 if(header->magic != O2_MAGIC) {
mas01cr@392 14 return false;
mas01cr@392 15 }
mas01cr@392 16 if(header->version != O2_FORMAT_VERSION) {
mas01cr@392 17 return false;
mas01cr@392 18 }
mas01cr@392 19 if(header->headerSize != O2_HEADERSIZE) {
mas01cr@392 20 return false;
mas01cr@392 21 }
mas01cr@392 22 return true;
mas01cr@392 23 }
mas01cr@392 24
mas01cr@402 25 static int audiodb_collect_keys(adb_t *adb) {
mas01cr@402 26 char *key_table = 0;
mas01cr@402 27 size_t key_table_length = 0;
mas01cr@402 28
mas01cr@402 29 if(adb->header->length > 0) {
mas01cr@402 30 unsigned nfiles = adb->header->numFiles;
mas01cr@402 31 key_table_length = ALIGN_PAGE_UP(nfiles * O2_FILETABLE_ENTRY_SIZE);
mas01cr@402 32 mmap_or_goto_error(char *, key_table, adb->header->fileTableOffset, key_table_length);
mas01cr@430 33 for (unsigned int k = 0; k < nfiles; k++) {
mas01cr@430 34 (*adb->keys)[(key_table + k*O2_FILETABLE_ENTRY_SIZE)] = k;
mas01cr@402 35 }
mas01cr@402 36 munmap(key_table, key_table_length);
mas01cr@402 37 }
mas01cr@402 38
mas01cr@402 39 return 0;
mas01cr@402 40
mas01cr@402 41 error:
mas01cr@402 42 maybe_munmap(key_table, key_table_length);
mas01cr@402 43 return 1;
mas01cr@402 44 }
mas01cr@402 45
mas01cr@392 46 adb_t *audiodb_open(const char *path, int flags) {
mas01cr@392 47 adb_t *adb = 0;
mas01cr@392 48 int fd = -1;
mas01cr@392 49
mas01cr@392 50 flags &= (O_RDONLY|O_RDWR);
mas01cr@392 51 fd = open(path, flags);
mas01cr@392 52 if(fd == -1) {
mas01cr@392 53 goto error;
mas01cr@392 54 }
mas01cr@392 55 if(acquire_lock(fd, flags == O_RDWR)) {
mas01cr@392 56 goto error;
mas01cr@392 57 }
mas01cr@392 58
mas01cr@411 59 adb = (adb_t *) calloc(1, sizeof(adb_t));
mas01cr@392 60 if(!adb) {
mas01cr@392 61 goto error;
mas01cr@392 62 }
mas01cr@392 63 adb->fd = fd;
mas01cr@392 64 adb->flags = flags;
mas01cr@392 65 adb->path = (char *) malloc(1+strlen(path));
mas01cr@392 66 if(!(adb->path)) {
mas01cr@392 67 goto error;
mas01cr@392 68 }
mas01cr@392 69 strcpy(adb->path, path);
mas01cr@392 70
mas01cr@392 71 adb->header = (adb_header_t *) malloc(sizeof(adb_header_t));
mas01cr@392 72 if(!(adb->header)) {
mas01cr@392 73 goto error;
mas01cr@392 74 }
mas01cr@392 75 if(read(fd, (char *) adb->header, O2_HEADERSIZE) != O2_HEADERSIZE) {
mas01cr@392 76 goto error;
mas01cr@392 77 }
mas01cr@392 78 if(!audiodb_check_header(adb->header)) {
mas01cr@392 79 goto error;
mas01cr@392 80 }
mas01cr@392 81
mas01cr@430 82 adb->keys = new std::map<std::string,uint32_t>;
mas01cr@402 83 if(!adb->keys) {
mas01cr@402 84 goto error;
mas01cr@402 85 }
mas01cr@402 86 if(audiodb_collect_keys(adb)) {
mas01cr@402 87 goto error;
mas01cr@402 88 }
mas01cr@392 89 return adb;
mas01cr@392 90
mas01cr@392 91 error:
mas01cr@392 92 if(adb) {
mas01cr@392 93 if(adb->header) {
mas01cr@392 94 free(adb->header);
mas01cr@392 95 }
mas01cr@392 96 if(adb->path) {
mas01cr@392 97 free(adb->path);
mas01cr@392 98 }
mas01cr@402 99 if(adb->keys) {
mas01cr@402 100 delete adb->keys;
mas01cr@402 101 }
mas01cr@392 102 free(adb);
mas01cr@392 103 }
mas01cr@392 104 if(fd != -1) {
mas01cr@392 105 close(fd);
mas01cr@392 106 }
mas01cr@392 107 return NULL;
mas01cr@392 108 }