annotate create.cpp @ 239:2cc06e5b05a5

Merge refactoring branch. Bug fixes: * 64-bit powertable bug; * -inf - -inf bug; * use new times information; * plus short track, O2_MAXFILES and structure padding ABI fixes (already backported) Major code changes: * split source into functional units, known as 'files'; * Reporter class for accumulating and reporting on query results; * much OAOOization, mostly from above: net 800 LOC (25%) shorter.
author mas01cr
date Thu, 13 Dec 2007 14:23:32 +0000
parents
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