Mercurial > hg > audiodb
diff audioDB.cpp @ 169:cdd441dcc9a8
Better error detection (and messages) on invalid feature files
Factor out commonality of dealing with the input file (in
audioDB::initTables and audioDB::batchinsert) into initInputFile(); call
it appropriately.
author | mas01cr |
---|---|
date | Thu, 08 Nov 2007 14:18:47 +0000 |
parents | ea6936b82915 |
children | 42585bd03636 f9d16137e704 |
line wrap: on
line diff
--- a/audioDB.cpp Wed Nov 07 12:03:28 2007 +0000 +++ b/audioDB.cpp Thu Nov 08 14:18:47 2007 +0000 @@ -472,35 +472,48 @@ timesTable = (double *) (db + dbH->timesTableOffset); } +void audioDB::initInputFile (const char *inFile) { + if (inFile) { + if ((infid = open(inFile, O_RDONLY)) < 0) { + error("can't open input file for reading", inFile, "open"); + } + + if (fstat(infid, &statbuf) < 0) { + error("fstat error finding size of input", inFile, "fstat"); + } + + if(dbH->dim == 0 && dbH->length == 0) { // empty database + // initialize with input dimensionality + if(read(infid, &dbH->dim, sizeof(unsigned)) != sizeof(unsigned)) { + error("short read of input file", inFile); + } + if(dbH->dim == 0) { + error("dimensionality of zero in input file", inFile); + } + } else { + unsigned test; + if(read(infid, &test, sizeof(unsigned)) != sizeof(unsigned)) { + error("short read of input file", inFile); + } + if(dbH->dim == 0) { + error("dimensionality of zero in input file", inFile); + } + if(dbH->dim != test) { + cerr << "error: expected dimension: " << dbH->dim << ", got : " << test <<endl; + error("feature dimensions do not match database table dimensions", inFile); + } + } + + if ((indata = (char *) mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, infid, 0)) == (caddr_t) -1) { + error("mmap error for input", inFile, "mmap"); + } + } +} + void audioDB::initTables(const char* dbName, bool forWrite, const char* inFile = 0) { initDBHeader(dbName, forWrite); - - // open the input file - if (inFile && (infid = open(inFile, O_RDONLY)) < 0) { - error("can't open input file for reading", inFile, "open"); - } - // find size of input file - if (inFile && fstat(infid, &statbuf) < 0) { - error("fstat error finding size of input", inFile, "fstat"); - } - if(inFile) - if(dbH->dim == 0 && dbH->length == 0) // empty database - // initialize with input dimensionality - read(infid, &dbH->dim, sizeof(unsigned)); - else { - unsigned test; - read(infid, &test, sizeof(unsigned)); - if(dbH->dim != test) { - cerr << "error: expected dimension: " << dbH->dim << ", got : " << test <<endl; - error("feature dimensions do not match database table dimensions"); - } - } - - // mmap the input file - if (inFile && (indata = (char*)mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, infid, 0)) - == (caddr_t) -1) - error("mmap error for input", inFile, "mmap"); + initInputFile(inFile); } void audioDB::insert(const char* dbName, const char* inFile){ @@ -512,7 +525,7 @@ // Check that there is room for at least 1 more file if((char*)timesTable<((char*)dataBuf+dbH->length+statbuf.st_size-sizeof(int))) - error("No more room in database","insert failed: reason database is full."); + error("Insert failed: no more room in database", inFile); if(!key) key=inFile; @@ -675,36 +688,12 @@ if(filesIn->eof()) break; - // open the input file - if (thisFile && (infid = open (thisFile, O_RDONLY)) < 0) - error("can't open feature file for reading", thisFile, "open"); - - // find size of input file - if (thisFile && fstat (infid,&statbuf) < 0) - error("fstat error finding size of input", "", "fstat"); + initInputFile(thisFile); // Check that there is room for at least 1 more file if((char*)timesTable<((char*)dataBuf+(dbH->length+statbuf.st_size-sizeof(int)))) - error("No more room in database","insert failed: reason database is full."); + error("batchinsert failed: no more room in database", thisFile); - if(thisFile) - if(dbH->dim==0 && dbH->length==0) // empty database - read(infid,&dbH->dim,sizeof(unsigned)); // initialize with input dimensionality - else { - unsigned test; - read(infid,&test,sizeof(unsigned)); - if(dbH->dim!=test){ - cerr << "error: expected dimension: " << dbH->dim << ", got :" << test <<endl; - error("feature dimensions do not match database table dimensions"); - } - } - - // mmap the input file - if (thisFile && (indata = (char*)mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, infid, 0)) - == (caddr_t) -1) - error("mmap error for input", "", "mmap"); - - // Linear scan of filenames check for pre-existing feature unsigned alreadyInserted=0;