annotate create.cpp @ 204:2ea1908707c7 refactoring

Filewise refactor. Break apart huge monolithic audioDB.cpp file into seven broadly independent portions: * SOAP * DB creation * insertion * query * dump * common functionality * constructor functions Remove the "using namespace std" from the header file, though that wasn't actually a problem: the problem in question is solved by including adb.nsmap in only soap.cpp. Makefile improvements.
author mas01cr
date Wed, 28 Nov 2007 15:10:28 +0000
parents
children acafe033b962
rev   line source
mas01cr@204 1 #include "audioDB.h"
mas01cr@204 2
mas01cr@204 3 /* Make a new database.
mas01cr@204 4
mas01cr@204 5 The database consists of:
mas01cr@204 6
mas01cr@204 7 * a header (see dbTableHeader struct definition);
mas01cr@204 8 * keyTable: list of keys of tracks;
mas01cr@204 9 * trackTable: Maps implicit feature index to a feature vector
mas01cr@204 10 matrix (sizes of tracks)
mas01cr@204 11 * featureTable: Lots of doubles;
mas01cr@204 12 * timesTable: (start,end) time points for each feature vector;
mas01cr@204 13 * powerTable: associated power for each feature vector;
mas01cr@204 14 * l2normTable: squared l2norms for each feature vector.
mas01cr@204 15 */
mas01cr@204 16
mas01cr@204 17 void audioDB::create(const char* dbName){
mas01cr@204 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@204 19 error("Can't create database file", dbName, "open");
mas01cr@204 20 get_lock(dbfid, 1);
mas01cr@204 21
mas01cr@204 22 if(verbosity) {
mas01cr@204 23 std::cerr << "header size:" << O2_HEADERSIZE << std::endl;
mas01cr@204 24 }
mas01cr@204 25
mas01cr@204 26 dbH = new dbTableHeaderT();
mas01cr@204 27 assert(dbH);
mas01cr@204 28
mas01cr@204 29 unsigned int maxfiles = (unsigned int) rint((double) O2_MAXFILES * (double) size / (double) O2_DEFAULTDBSIZE);
mas01cr@204 30
mas01cr@204 31 // Initialize header
mas01cr@204 32 dbH->magic = O2_MAGIC;
mas01cr@204 33 dbH->version = O2_FORMAT_VERSION;
mas01cr@204 34 dbH->numFiles = 0;
mas01cr@204 35 dbH->dim = 0;
mas01cr@204 36 dbH->flags = 0;
mas01cr@204 37 dbH->length = 0;
mas01cr@204 38 dbH->fileTableOffset = ALIGN_PAGE_UP(O2_HEADERSIZE);
mas01cr@204 39 dbH->trackTableOffset = ALIGN_PAGE_UP(dbH->fileTableOffset + O2_FILETABLESIZE*maxfiles);
mas01cr@204 40 dbH->dataOffset = ALIGN_PAGE_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*maxfiles);
mas01cr@204 41 dbH->l2normTableOffset = ALIGN_PAGE_DOWN(size - maxfiles*O2_MEANNUMVECTORS*sizeof(double));
mas01cr@204 42 dbH->powerTableOffset = ALIGN_PAGE_DOWN(dbH->l2normTableOffset - maxfiles*O2_MEANNUMVECTORS*sizeof(double));
mas01cr@204 43 dbH->timesTableOffset = ALIGN_PAGE_DOWN(dbH->powerTableOffset - 2*maxfiles*O2_MEANNUMVECTORS*sizeof(double));
mas01cr@204 44 dbH->dbSize = size;
mas01cr@204 45
mas01cr@204 46 write(dbfid, dbH, O2_HEADERSIZE);
mas01cr@204 47
mas01cr@204 48 // go to the location corresponding to the last byte
mas01cr@204 49 if (lseek (dbfid, size - 1, SEEK_SET) == -1)
mas01cr@204 50 error("lseek error in db file", "", "lseek");
mas01cr@204 51
mas01cr@204 52 // write a dummy byte at the last location
mas01cr@204 53 if (write (dbfid, "", 1) != 1)
mas01cr@204 54 error("write error", "", "write");
mas01cr@204 55
mas01cr@204 56 if(verbosity) {
mas01cr@204 57 std::cerr << COM_CREATE << " " << dbName << std::endl;
mas01cr@204 58 }
mas01cr@204 59 }
mas01cr@204 60
mas01cr@204 61 void audioDB::drop(){
mas01cr@204 62 // FIXME: drop something? Should we even allow this?
mas01cr@204 63 }
mas01cr@204 64