annotate create.cpp @ 249:1da9a9ed55a3

Slightly refactored the new trackSequenceQueryNNReporter so that it is a derived class of trackAveragingReporter. This reduces code duplication significantly. The reporter is still accessed via the nsequence QUERY directive from the command line.
author mas01mc
date Sun, 17 Feb 2008 16:39:57 +0000
parents 2cc06e5b05a5
children 4dcb09f5fe85
rev   line source
mas01cr@239 1 #include "audioDB.h"
mas01cr@239 2
mas01cr@239 3 /* Make a new database.
mas01cr@239 4
mas01cr@239 5 The database consists of:
mas01cr@239 6
mas01cr@239 7 * a header (see dbTableHeader struct definition);
mas01cr@239 8 * keyTable: list of keys of tracks;
mas01cr@239 9 * trackTable: Maps implicit feature index to a feature vector
mas01cr@239 10 matrix (sizes of tracks)
mas01cr@239 11 * featureTable: Lots of doubles;
mas01cr@239 12 * timesTable: (start,end) time points for each feature vector;
mas01cr@239 13 * powerTable: associated power for each feature vector;
mas01cr@239 14 * l2normTable: squared l2norms for each feature vector.
mas01cr@239 15 */
mas01cr@239 16
mas01cr@239 17 void audioDB::create(const char* dbName){
mas01cr@239 18 if ((dbfid = open (dbName, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
mas01cr@239 19 error("Can't create database file", dbName, "open");
mas01cr@239 20 get_lock(dbfid, 1);
mas01cr@239 21
mas01cr@239 22 VERB_LOG(0, "header size: %ju\n", (intmax_t) O2_HEADERSIZE);
mas01cr@239 23
mas01cr@239 24 dbH = new dbTableHeaderT();
mas01cr@239 25 assert(dbH);
mas01cr@239 26
mas01cr@239 27 unsigned int maxfiles = (unsigned int) rint((double) O2_MAXFILES * (double) size / (double) O2_DEFAULTDBSIZE);
mas01cr@239 28
mas01cr@239 29 // Initialize header
mas01cr@239 30 dbH->magic = O2_MAGIC;
mas01cr@239 31 dbH->version = O2_FORMAT_VERSION;
mas01cr@239 32 dbH->numFiles = 0;
mas01cr@239 33 dbH->dim = 0;
mas01cr@239 34 dbH->flags = 0;
mas01cr@239 35 dbH->headerSize = O2_HEADERSIZE;
mas01cr@239 36 dbH->length = 0;
mas01cr@239 37 dbH->fileTableOffset = ALIGN_PAGE_UP(O2_HEADERSIZE);
mas01cr@239 38 dbH->trackTableOffset = ALIGN_PAGE_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles);
mas01cr@239 39 dbH->dataOffset = ALIGN_PAGE_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles);
mas01cr@239 40 dbH->l2normTableOffset = ALIGN_PAGE_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double));
mas01cr@239 41 dbH->powerTableOffset = ALIGN_PAGE_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double));
mas01cr@239 42 dbH->timesTableOffset = ALIGN_PAGE_DOWN(dbH->powerTableOffset - 2*maxfiles*O2_MEANNUMVECTORS*sizeof(double));
mas01cr@239 43 dbH->dbSize = size;
mas01cr@239 44
mas01cr@239 45 write(dbfid, dbH, O2_HEADERSIZE);
mas01cr@239 46
mas01cr@239 47 // go to the location corresponding to the last byte
mas01cr@239 48 if (lseek (dbfid, size - 1, SEEK_SET) == -1)
mas01cr@239 49 error("lseek error in db file", "", "lseek");
mas01cr@239 50
mas01cr@239 51 // write a dummy byte at the last location
mas01cr@239 52 if (write (dbfid, "", 1) != 1)
mas01cr@239 53 error("write error", "", "write");
mas01cr@239 54
mas01cr@239 55 VERB_LOG(0, "%s %s\n", COM_CREATE, dbName);
mas01cr@239 56 }
mas01cr@239 57
mas01cr@239 58 void audioDB::drop(){
mas01cr@239 59 // FIXME: drop something? Should we even allow this?
mas01cr@239 60 }
mas01cr@239 61