Mercurial > hg > audiodb
comparison audioDB.cpp @ 128:f789aa32382f
Variable-size databases, step 1: introduce dbSize field into the
database header.
(Preserve backward-compatibility by assuming that dbSize == 0 implies
dbSize = O2_DEFAULTDBSIZE)
author | mas01cr |
---|---|
date | Fri, 19 Oct 2007 13:51:53 +0000 |
parents | 26ec0906adb9 |
children | f7eba8eb272c |
comparison
equal
deleted
inserted
replaced
127:6fafccfe7c05 | 128:f789aa32382f |
---|---|
108 void audioDB::cleanup() { | 108 void audioDB::cleanup() { |
109 cmdline_parser_free(&args_info); | 109 cmdline_parser_free(&args_info); |
110 if(indata) | 110 if(indata) |
111 munmap(indata,statbuf.st_size); | 111 munmap(indata,statbuf.st_size); |
112 if(db) | 112 if(db) |
113 munmap(db,O2_DEFAULTDBSIZE); | 113 munmap(db,dbH->dbSize); |
114 if(dbfid>0) | 114 if(dbfid>0) |
115 close(dbfid); | 115 close(dbfid); |
116 if(infid>0) | 116 if(infid>0) |
117 close(infid); | 117 close(infid); |
118 if(dbH) | 118 if(dbH) |
400 dbH->fileTableOffset = ALIGN_UP(O2_HEADERSIZE, 8); | 400 dbH->fileTableOffset = ALIGN_UP(O2_HEADERSIZE, 8); |
401 dbH->trackTableOffset = ALIGN_UP(dbH->fileTableOffset + O2_FILETABLESIZE*O2_MAXFILES, 8); | 401 dbH->trackTableOffset = ALIGN_UP(dbH->fileTableOffset + O2_FILETABLESIZE*O2_MAXFILES, 8); |
402 dbH->dataOffset = ALIGN_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*O2_MAXFILES, 8); | 402 dbH->dataOffset = ALIGN_UP(dbH->trackTableOffset + O2_TRACKTABLESIZE*O2_MAXFILES, 8); |
403 dbH->l2normTableOffset = ALIGN_DOWN(O2_DEFAULTDBSIZE - O2_MAXFILES*O2_MEANNUMVECTORS*sizeof(double), 8); | 403 dbH->l2normTableOffset = ALIGN_DOWN(O2_DEFAULTDBSIZE - O2_MAXFILES*O2_MEANNUMVECTORS*sizeof(double), 8); |
404 dbH->timesTableOffset = ALIGN_DOWN(dbH->l2normTableOffset - O2_MAXFILES*O2_MEANNUMVECTORS*sizeof(double), 8); | 404 dbH->timesTableOffset = ALIGN_DOWN(dbH->l2normTableOffset - O2_MAXFILES*O2_MEANNUMVECTORS*sizeof(double), 8); |
405 dbH->dbSize = O2_DEFAULTDBSIZE; | |
405 | 406 |
406 memcpy (db, dbH, O2_HEADERSIZE); | 407 memcpy (db, dbH, O2_HEADERSIZE); |
407 if(verbosity) { | 408 if(verbosity) { |
408 cerr << COM_CREATE << " " << dbName << endl; | 409 cerr << COM_CREATE << " " << dbName << endl; |
409 } | 410 } |
441 | 442 |
442 if(dbH->version != O2_FORMAT_VERSION) { | 443 if(dbH->version != O2_FORMAT_VERSION) { |
443 error("database file has incorect version", dbName); | 444 error("database file has incorect version", dbName); |
444 } | 445 } |
445 | 446 |
447 // FIXME: when changing file format version, remove this workaround. | |
448 if(dbH->dbSize == 0) { | |
449 dbH->dbSize = O2_DEFAULTDBSIZE; | |
450 } | |
451 | |
446 // mmap the database file | 452 // mmap the database file |
447 if ((db = (char*) mmap(0, O2_DEFAULTDBSIZE, PROT_READ | (forWrite ? PROT_WRITE : 0), | 453 if ((db = (char*) mmap(0, dbH->dbSize, PROT_READ | (forWrite ? PROT_WRITE : 0), |
448 MAP_SHARED, dbfid, 0)) == (caddr_t) -1) | 454 MAP_SHARED, dbfid, 0)) == (caddr_t) -1) |
449 error("mmap error for initting tables of database", "", "mmap"); | 455 error("mmap error for initting tables of database", "", "mmap"); |
450 | 456 |
451 // Make some handy tables with correct types | 457 // Make some handy tables with correct types |
452 fileTable = (char *) (db + dbH->fileTableOffset); | 458 fileTable = (char *) (db + dbH->fileTableOffset); |
521 if(verbosity) { | 527 if(verbosity) { |
522 cerr << "Warning: ignoring zero-length feature vector file:" << key << endl; | 528 cerr << "Warning: ignoring zero-length feature vector file:" << key << endl; |
523 } | 529 } |
524 // CLEAN UP | 530 // CLEAN UP |
525 munmap(indata,statbuf.st_size); | 531 munmap(indata,statbuf.st_size); |
526 munmap(db,O2_DEFAULTDBSIZE); | 532 munmap(db,dbH->dbSize); |
527 close(infid); | 533 close(infid); |
528 return; | 534 return; |
529 } | 535 } |
530 | 536 |
531 strncpy(fileTable + dbH->numFiles*O2_FILETABLESIZE, key, strlen(key)); | 537 strncpy(fileTable + dbH->numFiles*O2_FILETABLESIZE, key, strlen(key)); |
581 } | 587 } |
582 | 588 |
583 if(!timesFile->is_open()){ | 589 if(!timesFile->is_open()){ |
584 if(dbH->flags & O2_FLAG_TIMES){ | 590 if(dbH->flags & O2_FLAG_TIMES){ |
585 munmap(indata,statbuf.st_size); | 591 munmap(indata,statbuf.st_size); |
586 munmap(db,O2_DEFAULTDBSIZE); | 592 munmap(db,dbH->dbSize); |
587 error("problem opening times file on timestamped database",timesFileName); | 593 error("problem opening times file on timestamped database",timesFileName); |
588 } | 594 } |
589 else{ | 595 else{ |
590 cerr << "Warning: problem opening times file. But non-timestamped database, so ignoring times file." << endl; | 596 cerr << "Warning: problem opening times file. But non-timestamped database, so ignoring times file." << endl; |
591 usingTimes=0; | 597 usingTimes=0; |
609 numtimes++; | 615 numtimes++; |
610 }while(!timesFile->eof()); | 616 }while(!timesFile->eof()); |
611 } | 617 } |
612 if(numtimes<numVectors || numtimes>numVectors+2){ | 618 if(numtimes<numVectors || numtimes>numVectors+2){ |
613 munmap(indata,statbuf.st_size); | 619 munmap(indata,statbuf.st_size); |
614 munmap(db,O2_DEFAULTDBSIZE); | 620 munmap(db,dbH->dbSize); |
615 close(infid); | 621 close(infid); |
616 cerr << "expected " << numVectors << " found " << numtimes << endl; | 622 cerr << "expected " << numVectors << " found " << numtimes << endl; |
617 error("Times file is incorrect length for features file",inFile); | 623 error("Times file is incorrect length for features file",inFile); |
618 } | 624 } |
619 if(verbosity>2) { | 625 if(verbosity>2) { |