view status.cpp @ 399:a65b31660804 api-inversion

Invert audioDB::dump / audiodb_dump(). No real API/ABI breakages, modulo the disappearance of audiodb_dump_withdir() (which really should have been audiodb_dump() itself from the start). There were of course ABI breakages in the previous commits. The dodgy thing in this patch is the horribleness of audiodb_dump() itself; there must be a better way of writing it, or at least abstracting some of the body into individual functional pieces. The declaration block at the top tells its own story. We also need to alter the way that audioDB::status handles the adb; rather than having a local variable, use the C++ audioDB object instance field and only open the database if necessary -- then everything has a consistent view.
author mas01cr
date Thu, 27 Nov 2008 15:19:49 +0000
parents bc7a821004bb
children 58b88ab69424
line wrap: on
line source
#include "audioDB.h"
extern "C" {
#include "audioDB_API.h"
}

int audiodb_status(adb_t *adb, adb_status_t *status) {
  /* FIXME: it would be nice to be able to test for "is this database
     pointer valid", but at the moment we punt that to memory
     discipline.  */

  unsigned dudCount = 0;
  unsigned nullCount = 0;

  size_t trackTableLength = ALIGN_PAGE_UP(adb->header->numFiles * O2_TRACKTABLE_ENTRY_SIZE);
  unsigned *trackTable = 0;
  void *tmp = 0;
  if (adb->header->length > 0)  {
    tmp = mmap(0, trackTableLength, PROT_READ, MAP_SHARED, adb->fd, adb->header->trackTableOffset);
    if (tmp == (void *) -1) {
      return 1;
    }
    trackTable = (unsigned *) tmp;
  }

  for(unsigned k = 0; k < adb->header->numFiles; k++) {
    /* FIXME: this bare "16" here reveals a problem (or maybe two).
     * 16 here means the default value of the sequenceLength parameter
     * initializer (both in C++ and corresponding to the "-l" or
     * "--sequencelength" command-line argument).
     *
     * The problem is that the API as currently designed provides no
     * way to pass that information in to this routine; there's no
     * input parameter; nor is there in the SOAP version of this
     * query.  However, there /is/ a way to pass that information on
     * the command-line -- though that codepath is completely
     * untested.  I can see that it might be useful to provide this
     * information, but at present it's probably completely unused, so
     * the compromise for now is to hardwire the 16.
     */ 
    if(trackTable[k] < 16) {
      dudCount++; 
      if(!trackTable[k]) {
	nullCount++; 
      } 
    }
  }

  if(adb->header->length > 0) {
    if(munmap(trackTable, trackTableLength)) {
      return 1;
    }
  }

  status->numFiles = adb->header->numFiles;
  status->dim = adb->header->dim;
  status->length = adb->header->length;
  status->dudCount = dudCount;
  status->nullCount = nullCount;
  status->flags = adb->header->flags;
  status->data_region_size = adb->header->timesTableOffset - adb->header->dataOffset;

  return 0;
}