annotate dump.cpp @ 512:6439cfba2524 memory-leaks

Implemented correct LSH table via compile-time switch -DLSH_DUMP_CORE_TABLES. Dumps on LSH load.
author mas01mc
date Fri, 23 Jan 2009 18:45:44 +0000
parents 7d6dd067d12e
children 4ded52b104e6 342822c2d49a
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@256 65 fprintf(kLFile, "%s\n", fileTable + k*O2_FILETABLE_ENTRY_SIZE);
mas01cr@380 66 if(dbH->flags & O2_FLAG_LARGE_ADB) {
mas01cr@380 67 char *featureFileName = featureFileNameTable+k*O2_FILETABLE_ENTRY_SIZE;
mas01cr@380 68 fprintf(fLFile, "%s\n", featureFileName);
mas01cr@380 69 if(*featureFileName != '/') {
mas01cr@380 70 error("relative path in LARGE_ADB", featureFileName);
mas01cr@239 71 }
mas01cr@380 72 if(times) {
mas01cr@380 73 char *timesFileName = timesFileNameTable + k*O2_FILETABLE_ENTRY_SIZE;
mas01cr@380 74 fprintf(tLFile, "%s\n", timesFileName);
mas01cr@380 75 if(*timesFileName != '/') {
mas01cr@380 76 error("relative path in LARGE_ADB", timesFileName);
mas01cr@380 77 }
mas01cr@239 78 }
mas01cr@380 79 if(power) {
mas01cr@380 80 char *powerFileName = powerFileNameTable + k*O2_FILETABLE_ENTRY_SIZE;
mas01cr@380 81 fprintf(pLFile, "%s\n", powerFileName);
mas01cr@380 82 if(*powerFileName != '/') {
mas01cr@380 83 error("relative path in LARGE_ADB", powerFileName);
mas01cr@380 84 }
mas01cr@239 85 }
mas01cr@380 86 } else {
mas01cr@380 87 snprintf(fName, 256, "%05d.features", k);
mas01cr@380 88 if ((ffd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@380 89 error("error creating feature file", fName, "open");
mas01cr@239 90 }
mas01cr@380 91 if ((write(ffd, &dbH->dim, sizeof(uint32_t))) < 0) {
mas01cr@380 92 error("error writing dimensions", fName, "write");
mas01cr@380 93 }
mas01cr@380 94
mas01cr@380 95 /* FIXME: this repeated malloc()/free() of data buffers is
mas01cr@380 96 inefficient. */
mas01cr@380 97 data_buffer_size = trackTable[k] * dbH->dim * sizeof(double);
mas01cr@380 98
mas01cr@380 99 {
mas01cr@380 100 void *tmp = malloc(data_buffer_size);
mas01cr@380 101 if (tmp == NULL) {
mas01cr@380 102 error("error allocating data buffer");
mas01cr@380 103 }
mas01cr@380 104 data_buffer = (double *) tmp;
mas01cr@380 105 }
mas01cr@380 106
mas01cr@380 107 if ((read(dbfid, data_buffer, data_buffer_size)) != (ssize_t) data_buffer_size) {
mas01cr@380 108 error("error reading data", fName, "read");
mas01cr@380 109 }
mas01cr@380 110
mas01cr@380 111 if ((write(ffd, data_buffer, data_buffer_size)) < 0) {
mas01cr@239 112 error("error writing data", fName, "write");
mas01cr@239 113 }
mas01cr@380 114
mas01cr@380 115 free(data_buffer);
mas01cr@380 116
mas01cr@380 117 fprintf(fLFile, "%s\n", fName);
mas01cr@380 118 close(ffd);
mas01cr@380 119
mas01cr@380 120 if (times) {
mas01cr@380 121 snprintf(fName, 256, "%05d.times", k);
mas01cr@380 122 tFile = fopen(fName, "w");
mas01cr@380 123 for(unsigned i = 0; i < trackTable[k]; i++) {
mas01cr@380 124 // KLUDGE: specifying 16 digits of precision after the decimal
mas01cr@380 125 // point is (but check this!) sufficient to uniquely identify
mas01cr@380 126 // doubles; however, that will cause ugliness, as that's
mas01cr@380 127 // vastly too many for most values of interest. Moving to %a
mas01cr@380 128 // here and scanf() in the timesFile reading might fix this.
mas01cr@380 129 // -- CSR, 2007-10-19
mas01cr@380 130 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*i));
mas01cr@380 131 }
mas01cr@380 132 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*trackTable[k]-1));
mas01cr@380 133
mas01cr@380 134 fprintf(tLFile, "%s\n", fName);
mas01cr@380 135 }
mas01cr@380 136
mas01cr@380 137 if (power) {
mas01cr@380 138 uint32_t one = 1;
mas01cr@380 139 snprintf(fName, 256, "%05d.power", k);
mas01cr@380 140 if ((pfd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@380 141 error("error creating power file", fName, "open");
mas01cr@380 142 }
mas01cr@380 143 if ((write(pfd, &one, sizeof(uint32_t))) < 0) {
mas01cr@380 144 error("error writing one", fName, "write");
mas01cr@380 145 }
mas01cr@380 146 if ((write(pfd, powerTable + pos, trackTable[k] * sizeof(double))) < 0) {
mas01cr@380 147 error("error writing data", fName, "write");
mas01cr@380 148 }
mas01cr@380 149 fprintf(pLFile, "%s\n", fName);
mas01cr@380 150 close(pfd);
mas01cr@380 151 }
mas01cr@380 152
mas01cr@380 153 pos += trackTable[k];
mas01cr@380 154 std::cout << fileTable+k*O2_FILETABLE_ENTRY_SIZE << " " << trackTable[k] << std::endl;
mas01cr@380 155 }
mas01cr@239 156 }
mas01cr@239 157
mas01cr@239 158 FILE *scriptFile;
mas01cr@239 159 scriptFile = fopen("restore.sh", "w");
mas01cr@239 160 fprintf(scriptFile, "\
mas01cr@239 161 #! /bin/sh\n\
mas01cr@239 162 #\n\
mas01cr@239 163 # usage: AUDIODB=/path/to/audioDB sh ./restore.sh <newdb>\n\
mas01cr@239 164 \n\
mas01cr@239 165 if [ -z \"${AUDIODB}\" ]; then echo set AUDIODB variable; exit 1; fi\n\
mas01cr@239 166 if [ -z \"$1\" ]; then echo usage: $0 newdb; exit 1; fi\n\n\
mas01cr@256 167 \"${AUDIODB}\" -d \"$1\" -N --datasize=%d --ntracks=%d --datadim=%d\n",
mas01cr@256 168 (int) ((dbH->timesTableOffset - dbH->dataOffset) / (1024*1024)),
mas01cr@256 169 // fileTable entries (char[256]) are bigger than trackTable
mas01cr@256 170 // (int), so the granularity of page aligning is finer.
mas01cr@256 171 (int) ((dbH->trackTableOffset - dbH->fileTableOffset) / O2_FILETABLE_ENTRY_SIZE),
mas01cr@256 172 (int) ceil(((double) (dbH->timesTableOffset - dbH->dataOffset)) / ((double) (dbH->dbSize - dbH->l2normTableOffset))));
mas01cr@239 173 if(dbH->flags & O2_FLAG_L2NORM) {
mas01cr@239 174 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n");
mas01cr@239 175 }
mas01cr@239 176 if(power) {
mas01cr@239 177 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n");
mas01cr@239 178 }
mas01cr@239 179 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt");
mas01cr@239 180 if(times) {
mas01cr@239 181 fprintf(scriptFile, " -T timesList.txt");
mas01cr@239 182 }
mas01cr@239 183 if(power) {
mas01cr@239 184 fprintf(scriptFile, " -W powerList.txt");
mas01cr@239 185 }
mas01cr@239 186 fprintf(scriptFile, "\n");
mas01cr@239 187 fclose(scriptFile);
mas01cr@239 188
mas01cr@239 189 if((chdir(cwd)) < 0) {
mas01cr@239 190 error("error changing working directory", cwd, "chdir");
mas01cr@239 191 }
mas01cr@239 192
mas01cr@239 193 fclose(fLFile);
mas01cr@239 194 if(times) {
mas01cr@239 195 fclose(tLFile);
mas01cr@239 196 }
mas01cr@239 197 if(power) {
mas01cr@239 198 fclose(pLFile);
mas01cr@239 199 }
mas01cr@239 200 fclose(kLFile);
mas01cr@239 201 delete[] fName;
mas01cr@239 202
mas01cr@239 203 status(dbName);
mas01cr@239 204 }
mas01mc@334 205
mas01mc@334 206 void audioDB::liszt(const char* dbName, unsigned offset, unsigned numLines, adb__lisztResponse* adbLisztResponse){
mas01mc@334 207 if(!dbH) {
mas01mc@334 208 initTables(dbName, 0);
mas01mc@334 209 }
mas01mc@334 210
mas01mc@334 211 assert(trackTable && fileTable);
mas01mc@334 212
mas01mc@334 213 if(offset>dbH->numFiles){
mas01mc@334 214 char tmpStr[MAXSTR];
mas01mc@334 215 sprintf(tmpStr, "numFiles=%u, lisztOffset=%u", dbH->numFiles, offset);
mas01mc@334 216 error("listKeys offset out of range", tmpStr);
mas01mc@334 217 }
mas01mc@334 218
mas01mc@334 219 if(!adbLisztResponse){
mas01mc@334 220 for(Uns32T k=0; k<numLines && offset+k<dbH->numFiles; k++){
mas01mc@334 221 fprintf(stdout, "[%d] %s (%d)\n", offset+k, fileTable+(offset+k)*O2_FILETABLE_ENTRY_SIZE, trackTable[offset+k]);
mas01mc@334 222 }
mas01mc@334 223 }
mas01mc@334 224 else{
mas01mc@334 225 adbLisztResponse->result.Rkey = new char*[numLines];
mas01mc@334 226 adbLisztResponse->result.Rlen = new unsigned int[numLines];
mas01mc@334 227 Uns32T k = 0;
mas01mc@334 228 for( ; k<numLines && offset+k<dbH->numFiles; k++){
mas01mc@334 229 adbLisztResponse->result.Rkey[k] = new char[MAXSTR];
mas01mc@334 230 snprintf(adbLisztResponse->result.Rkey[k], O2_MAXFILESTR, "%s", fileTable+(offset+k)*O2_FILETABLE_ENTRY_SIZE);
mas01mc@334 231 adbLisztResponse->result.Rlen[k] = trackTable[offset+k];
mas01mc@334 232 }
mas01mc@334 233 adbLisztResponse->result.__sizeRkey = k;
mas01mc@334 234 adbLisztResponse->result.__sizeRlen = k;
mas01mc@334 235 }
mas01mc@334 236
mas01mc@334 237 }