annotate dump.cpp @ 249:1da9a9ed55a3

Slightly refactored the new trackSequenceQueryNNReporter so that it is a derived class of trackAveragingReporter. This reduces code duplication significantly. The reporter is still accessed via the nsequence QUERY directive from the command line.
author mas01mc
date Sun, 17 Feb 2008 16:39:57 +0000
parents 2cc06e5b05a5
children 4dcb09f5fe85
rev   line source
mas01cr@239 1 #include "audioDB.h"
mas01cr@239 2
mas01cr@239 3 void audioDB::dump(const char* dbName){
mas01cr@239 4 if(!dbH) {
mas01cr@239 5 initTables(dbName, 0);
mas01cr@239 6 }
mas01cr@239 7
mas01cr@239 8 if((mkdir(output, S_IRWXU|S_IRWXG|S_IRWXO)) < 0) {
mas01cr@239 9 error("error making output directory", output, "mkdir");
mas01cr@239 10 }
mas01cr@239 11
mas01cr@239 12 char *cwd = new char[PATH_MAX];
mas01cr@239 13
mas01cr@239 14 if ((getcwd(cwd, PATH_MAX)) == 0) {
mas01cr@239 15 error("error getting working directory", "", "getcwd");
mas01cr@239 16 }
mas01cr@239 17
mas01cr@239 18 if((chdir(output)) < 0) {
mas01cr@239 19 error("error changing working directory", output, "chdir");
mas01cr@239 20 }
mas01cr@239 21
mas01cr@239 22 int fLfd, tLfd = 0, pLfd = 0, kLfd;
mas01cr@239 23 FILE *fLFile, *tLFile = 0, *pLFile = 0, *kLFile;
mas01cr@239 24
mas01cr@239 25 if ((fLfd = open("featureList.txt", O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@239 26 error("error creating featureList file", "featureList.txt", "open");
mas01cr@239 27 }
mas01cr@239 28
mas01cr@239 29 int times = dbH->flags & O2_FLAG_TIMES;
mas01cr@239 30 if (times) {
mas01cr@239 31 if ((tLfd = open("timesList.txt", O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@239 32 error("error creating timesList file", "timesList.txt", "open");
mas01cr@239 33 }
mas01cr@239 34 }
mas01cr@239 35
mas01cr@239 36 int power = dbH->flags & O2_FLAG_POWER;
mas01cr@239 37 if (power) {
mas01cr@239 38 if ((pLfd = open("powerList.txt", O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@239 39 error("error creating powerList file", "powerList.txt", "open");
mas01cr@239 40 }
mas01cr@239 41 }
mas01cr@239 42
mas01cr@239 43 if ((kLfd = open("keyList.txt", O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@239 44 error("error creating keyList file", "keyList.txt", "open");
mas01cr@239 45 }
mas01cr@239 46
mas01cr@239 47 /* can these fail? I sincerely hope not. */
mas01cr@239 48 fLFile = fdopen(fLfd, "w");
mas01cr@239 49 if (times) {
mas01cr@239 50 tLFile = fdopen(tLfd, "w");
mas01cr@239 51 }
mas01cr@239 52 if (power) {
mas01cr@239 53 pLFile = fdopen(pLfd, "w");
mas01cr@239 54 }
mas01cr@239 55 kLFile = fdopen(kLfd, "w");
mas01cr@239 56
mas01cr@239 57 char *fName = new char[256];
mas01cr@239 58 int ffd, pfd;
mas01cr@239 59 FILE *tFile;
mas01cr@239 60 unsigned pos = 0;
mas01cr@239 61 lseek(dbfid, dbH->dataOffset, SEEK_SET);
mas01cr@239 62 double *data_buffer;
mas01cr@239 63 size_t data_buffer_size;
mas01cr@239 64 for(unsigned k = 0; k < dbH->numFiles; k++) {
mas01cr@239 65 fprintf(kLFile, "%s\n", fileTable + k*O2_FILETABLESIZE);
mas01cr@239 66 snprintf(fName, 256, "%05d.features", k);
mas01cr@239 67 if ((ffd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@239 68 error("error creating feature file", fName, "open");
mas01cr@239 69 }
mas01cr@239 70 if ((write(ffd, &dbH->dim, sizeof(uint32_t))) < 0) {
mas01cr@239 71 error("error writing dimensions", fName, "write");
mas01cr@239 72 }
mas01cr@239 73
mas01cr@239 74 /* FIXME: this repeated malloc()/free() of data buffers is
mas01cr@239 75 inefficient. */
mas01cr@239 76 data_buffer_size = trackTable[k] * dbH->dim * sizeof(double);
mas01cr@239 77
mas01cr@239 78 {
mas01cr@239 79 void *tmp = malloc(data_buffer_size);
mas01cr@239 80 if (tmp == NULL) {
mas01cr@239 81 error("error allocating data buffer");
mas01cr@239 82 }
mas01cr@239 83 data_buffer = (double *) tmp;
mas01cr@239 84 }
mas01cr@239 85
mas01cr@239 86 if ((read(dbfid, data_buffer, data_buffer_size)) != (ssize_t) data_buffer_size) {
mas01cr@239 87 error("error reading data", fName, "read");
mas01cr@239 88 }
mas01cr@239 89
mas01cr@239 90 if ((write(ffd, data_buffer, data_buffer_size)) < 0) {
mas01cr@239 91 error("error writing data", fName, "write");
mas01cr@239 92 }
mas01cr@239 93
mas01cr@239 94 free(data_buffer);
mas01cr@239 95
mas01cr@239 96 fprintf(fLFile, "%s\n", fName);
mas01cr@239 97 close(ffd);
mas01cr@239 98
mas01cr@239 99 if (times) {
mas01cr@239 100 snprintf(fName, 256, "%05d.times", k);
mas01cr@239 101 tFile = fopen(fName, "w");
mas01cr@239 102 for(unsigned i = 0; i < trackTable[k]; i++) {
mas01cr@239 103 // KLUDGE: specifying 16 digits of precision after the decimal
mas01cr@239 104 // point is (but check this!) sufficient to uniquely identify
mas01cr@239 105 // doubles; however, that will cause ugliness, as that's
mas01cr@239 106 // vastly too many for most values of interest. Moving to %a
mas01cr@239 107 // here and scanf() in the timesFile reading might fix this.
mas01cr@239 108 // -- CSR, 2007-10-19
mas01cr@239 109 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*i));
mas01cr@239 110 }
mas01cr@239 111 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*trackTable[k]-1));
mas01cr@239 112
mas01cr@239 113 fprintf(tLFile, "%s\n", fName);
mas01cr@239 114 }
mas01cr@239 115
mas01cr@239 116 if (power) {
mas01cr@239 117 uint32_t one = 1;
mas01cr@239 118 snprintf(fName, 256, "%05d.power", k);
mas01cr@239 119 if ((pfd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@239 120 error("error creating power file", fName, "open");
mas01cr@239 121 }
mas01cr@239 122 if ((write(pfd, &one, sizeof(uint32_t))) < 0) {
mas01cr@239 123 error("error writing one", fName, "write");
mas01cr@239 124 }
mas01cr@239 125 if ((write(pfd, powerTable + pos, trackTable[k] * sizeof(double))) < 0) {
mas01cr@239 126 error("error writing data", fName, "write");
mas01cr@239 127 }
mas01cr@239 128 fprintf(pLFile, "%s\n", fName);
mas01cr@239 129 close(pfd);
mas01cr@239 130 }
mas01cr@239 131
mas01cr@239 132 pos += trackTable[k];
mas01cr@239 133 std::cout << fileTable+k*O2_FILETABLESIZE << " " << trackTable[k] << std::endl;
mas01cr@239 134 }
mas01cr@239 135
mas01cr@239 136 FILE *scriptFile;
mas01cr@239 137 scriptFile = fopen("restore.sh", "w");
mas01cr@239 138 fprintf(scriptFile, "\
mas01cr@239 139 #! /bin/sh\n\
mas01cr@239 140 #\n\
mas01cr@239 141 # usage: AUDIODB=/path/to/audioDB sh ./restore.sh <newdb>\n\
mas01cr@239 142 \n\
mas01cr@239 143 if [ -z \"${AUDIODB}\" ]; then echo set AUDIODB variable; exit 1; fi\n\
mas01cr@239 144 if [ -z \"$1\" ]; then echo usage: $0 newdb; exit 1; fi\n\n\
mas01cr@239 145 \"${AUDIODB}\" -d \"$1\" -N --size=%d\n", (int) (dbH->dbSize / 1000000));
mas01cr@239 146 if(dbH->flags & O2_FLAG_L2NORM) {
mas01cr@239 147 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n");
mas01cr@239 148 }
mas01cr@239 149 if(power) {
mas01cr@239 150 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n");
mas01cr@239 151 }
mas01cr@239 152 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt");
mas01cr@239 153 if(times) {
mas01cr@239 154 fprintf(scriptFile, " -T timesList.txt");
mas01cr@239 155 }
mas01cr@239 156 if(power) {
mas01cr@239 157 fprintf(scriptFile, " -W powerList.txt");
mas01cr@239 158 }
mas01cr@239 159 fprintf(scriptFile, "\n");
mas01cr@239 160 fclose(scriptFile);
mas01cr@239 161
mas01cr@239 162 if((chdir(cwd)) < 0) {
mas01cr@239 163 error("error changing working directory", cwd, "chdir");
mas01cr@239 164 }
mas01cr@239 165
mas01cr@239 166 fclose(fLFile);
mas01cr@239 167 if(times) {
mas01cr@239 168 fclose(tLFile);
mas01cr@239 169 }
mas01cr@239 170 if(power) {
mas01cr@239 171 fclose(pLFile);
mas01cr@239 172 }
mas01cr@239 173 fclose(kLFile);
mas01cr@239 174 delete[] fName;
mas01cr@239 175
mas01cr@239 176 status(dbName);
mas01cr@239 177 }