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) {