mas01cr@204: #include "audioDB.h" mas01cr@204: mas01cr@204: /* Make a new database. mas01cr@204: mas01cr@204: The database consists of: mas01cr@204: mas01cr@204: * a header (see dbTableHeader struct definition); mas01cr@204: * keyTable: list of keys of tracks; mas01cr@204: * trackTable: Maps implicit feature index to a feature vector mas01cr@204: matrix (sizes of tracks) mas01cr@204: * featureTable: Lots of doubles; mas01cr@204: * timesTable: (start,end) time points for each feature vector; mas01cr@204: * powerTable: associated power for each feature vector; mas01cr@204: * l2normTable: squared l2norms for each feature vector. mas01cr@204: */ mas01cr@204: mas01cr@204: void audioDB::create(const char* dbName){ mas01cr@204: if ((dbfid = open (dbName, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) mas01cr@204: error("Can't create database file", dbName, "open"); mas01cr@204: get_lock(dbfid, 1); mas01cr@204: mas01cr@204: if(verbosity) { mas01cr@204: std::cerr << "header size:" << O2_HEADERSIZE << std::endl; mas01cr@204: } mas01cr@204: mas01cr@204: dbH = new dbTableHeaderT(); mas01cr@204: assert(dbH); mas01cr@204: mas01cr@204: unsigned int maxfiles = (unsigned int) rint((double) O2_MAXFILES * (double) size / (double) O2_DEFAULTDBSIZE); mas01cr@204: mas01cr@204: // Initialize header mas01cr@204: dbH->magic = O2_MAGIC; mas01cr@204: dbH->version = O2_FORMAT_VERSION; mas01cr@204: dbH->numFiles = 0; mas01cr@204: dbH->dim = 0; mas01cr@204: dbH->flags = 0; mas01cr@204: dbH->length = 0; mas01cr@204: dbH->fileTableOffset = ALIGN_PAGE_UP(O2_HEADERSIZE); mas01cr@204: dbH->trackTableOffset = ALIGN_PAGE_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles); mas01cr@204: dbH->dataOffset = ALIGN_PAGE_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles); mas01cr@204: dbH->l2normTableOffset = ALIGN_PAGE_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double)); mas01cr@204: dbH->powerTableOffset = ALIGN_PAGE_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double)); mas01cr@204: dbH->timesTableOffset = ALIGN_PAGE_DOWN(dbH->powerTableOffset - 2*maxfiles*O2_MEANNUMVECTORS*sizeof(double)); mas01cr@204: dbH->dbSize = size; mas01cr@204: mas01cr@204: write(dbfid, dbH, O2_HEADERSIZE); mas01cr@204: mas01cr@204: // go to the location corresponding to the last byte mas01cr@204: if (lseek (dbfid, size - 1, SEEK_SET) == -1) mas01cr@204: error("lseek error in db file", "", "lseek"); mas01cr@204: mas01cr@204: // write a dummy byte at the last location mas01cr@204: if (write (dbfid, "", 1) != 1) mas01cr@204: error("write error", "", "write"); mas01cr@204: mas01cr@204: if(verbosity) { mas01cr@204: std::cerr << COM_CREATE << " " << dbName << std::endl; mas01cr@204: } mas01cr@204: } mas01cr@204: mas01cr@204: void audioDB::drop(){ mas01cr@204: // FIXME: drop something? Should we even allow this? mas01cr@204: } mas01cr@204: