view status.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 62a0515f59be
line wrap: on
line source
#include "audioDB.h"
extern "C" {
#include "audioDB_API.h"
#include "audioDB-internals.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;
}