mas01cr@239: #include "audioDB.h" mas01cr@239: mas01cr@239: void audioDB::dump(const char* dbName){ mas01cr@239: if(!dbH) { mas01cr@239: initTables(dbName, 0); mas01cr@239: } mas01cr@239: mas01mc@319: if(dbH->flags & O2_FLAG_LARGE_ADB){ mas01mc@319: error("error: dump not supported for LARGE_ADB"); mas01mc@319: } mas01mc@319: mas01cr@239: if((mkdir(output, S_IRWXU|S_IRWXG|S_IRWXO)) < 0) { mas01cr@239: error("error making output directory", output, "mkdir"); mas01cr@239: } mas01cr@239: mas01cr@239: char *cwd = new char[PATH_MAX]; mas01cr@239: mas01cr@239: if ((getcwd(cwd, PATH_MAX)) == 0) { mas01cr@239: error("error getting working directory", "", "getcwd"); mas01cr@239: } mas01cr@239: mas01cr@239: if((chdir(output)) < 0) { mas01cr@239: error("error changing working directory", output, "chdir"); mas01cr@239: } mas01cr@239: mas01cr@239: int fLfd, tLfd = 0, pLfd = 0, kLfd; mas01cr@239: FILE *fLFile, *tLFile = 0, *pLFile = 0, *kLFile; mas01cr@239: mas01cr@239: 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: error("error creating featureList file", "featureList.txt", "open"); mas01cr@239: } mas01cr@239: mas01cr@239: int times = dbH->flags & O2_FLAG_TIMES; mas01cr@239: if (times) { mas01cr@239: 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: error("error creating timesList file", "timesList.txt", "open"); mas01cr@239: } mas01cr@239: } mas01cr@239: mas01cr@239: int power = dbH->flags & O2_FLAG_POWER; mas01cr@239: if (power) { mas01cr@239: 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: error("error creating powerList file", "powerList.txt", "open"); mas01cr@239: } mas01cr@239: } mas01cr@239: mas01cr@239: 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: error("error creating keyList file", "keyList.txt", "open"); mas01cr@239: } mas01cr@239: mas01cr@239: /* can these fail? I sincerely hope not. */ mas01cr@239: fLFile = fdopen(fLfd, "w"); mas01cr@239: if (times) { mas01cr@239: tLFile = fdopen(tLfd, "w"); mas01cr@239: } mas01cr@239: if (power) { mas01cr@239: pLFile = fdopen(pLfd, "w"); mas01cr@239: } mas01cr@239: kLFile = fdopen(kLfd, "w"); mas01cr@239: mas01cr@239: char *fName = new char[256]; mas01cr@239: int ffd, pfd; mas01cr@239: FILE *tFile; mas01cr@239: unsigned pos = 0; mas01cr@239: lseek(dbfid, dbH->dataOffset, SEEK_SET); mas01cr@239: double *data_buffer; mas01cr@239: size_t data_buffer_size; mas01cr@239: for(unsigned k = 0; k < dbH->numFiles; k++) { mas01cr@256: fprintf(kLFile, "%s\n", fileTable + k*O2_FILETABLE_ENTRY_SIZE); mas01cr@239: snprintf(fName, 256, "%05d.features", k); mas01cr@239: 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: error("error creating feature file", fName, "open"); mas01cr@239: } mas01cr@239: if ((write(ffd, &dbH->dim, sizeof(uint32_t))) < 0) { mas01cr@239: error("error writing dimensions", fName, "write"); mas01cr@239: } mas01cr@239: mas01cr@239: /* FIXME: this repeated malloc()/free() of data buffers is mas01cr@239: inefficient. */ mas01cr@239: data_buffer_size = trackTable[k] * dbH->dim * sizeof(double); mas01cr@239: mas01cr@239: { mas01cr@239: void *tmp = malloc(data_buffer_size); mas01cr@239: if (tmp == NULL) { mas01cr@239: error("error allocating data buffer"); mas01cr@239: } mas01cr@239: data_buffer = (double *) tmp; mas01cr@239: } mas01cr@239: mas01cr@239: if ((read(dbfid, data_buffer, data_buffer_size)) != (ssize_t) data_buffer_size) { mas01cr@239: error("error reading data", fName, "read"); mas01cr@239: } mas01cr@239: mas01cr@239: if ((write(ffd, data_buffer, data_buffer_size)) < 0) { mas01cr@239: error("error writing data", fName, "write"); mas01cr@239: } mas01cr@239: mas01cr@239: free(data_buffer); mas01cr@239: mas01cr@239: fprintf(fLFile, "%s\n", fName); mas01cr@239: close(ffd); mas01cr@239: mas01cr@239: if (times) { mas01cr@239: snprintf(fName, 256, "%05d.times", k); mas01cr@239: tFile = fopen(fName, "w"); mas01cr@239: for(unsigned i = 0; i < trackTable[k]; i++) { mas01cr@239: // KLUDGE: specifying 16 digits of precision after the decimal mas01cr@239: // point is (but check this!) sufficient to uniquely identify mas01cr@239: // doubles; however, that will cause ugliness, as that's mas01cr@239: // vastly too many for most values of interest. Moving to %a mas01cr@239: // here and scanf() in the timesFile reading might fix this. mas01cr@239: // -- CSR, 2007-10-19 mas01cr@239: fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*i)); mas01cr@239: } mas01cr@239: fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*trackTable[k]-1)); mas01cr@239: mas01cr@239: fprintf(tLFile, "%s\n", fName); mas01cr@239: } mas01cr@239: mas01cr@239: if (power) { mas01cr@239: uint32_t one = 1; mas01cr@239: snprintf(fName, 256, "%05d.power", k); mas01cr@239: 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: error("error creating power file", fName, "open"); mas01cr@239: } mas01cr@239: if ((write(pfd, &one, sizeof(uint32_t))) < 0) { mas01cr@239: error("error writing one", fName, "write"); mas01cr@239: } mas01cr@239: if ((write(pfd, powerTable + pos, trackTable[k] * sizeof(double))) < 0) { mas01cr@239: error("error writing data", fName, "write"); mas01cr@239: } mas01cr@239: fprintf(pLFile, "%s\n", fName); mas01cr@239: close(pfd); mas01cr@239: } mas01cr@239: mas01cr@239: pos += trackTable[k]; mas01cr@256: std::cout << fileTable+k*O2_FILETABLE_ENTRY_SIZE << " " << trackTable[k] << std::endl; mas01cr@239: } mas01cr@239: mas01cr@239: FILE *scriptFile; mas01cr@239: scriptFile = fopen("restore.sh", "w"); mas01cr@239: fprintf(scriptFile, "\ mas01cr@239: #! /bin/sh\n\ mas01cr@239: #\n\ mas01cr@239: # usage: AUDIODB=/path/to/audioDB sh ./restore.sh \n\ mas01cr@239: \n\ mas01cr@239: if [ -z \"${AUDIODB}\" ]; then echo set AUDIODB variable; exit 1; fi\n\ mas01cr@239: if [ -z \"$1\" ]; then echo usage: $0 newdb; exit 1; fi\n\n\ mas01cr@256: \"${AUDIODB}\" -d \"$1\" -N --datasize=%d --ntracks=%d --datadim=%d\n", mas01cr@256: (int) ((dbH->timesTableOffset - dbH->dataOffset) / (1024*1024)), mas01cr@256: // fileTable entries (char[256]) are bigger than trackTable mas01cr@256: // (int), so the granularity of page aligning is finer. mas01cr@256: (int) ((dbH->trackTableOffset - dbH->fileTableOffset) / O2_FILETABLE_ENTRY_SIZE), mas01cr@256: (int) ceil(((double) (dbH->timesTableOffset - dbH->dataOffset)) / ((double) (dbH->dbSize - dbH->l2normTableOffset)))); mas01cr@239: if(dbH->flags & O2_FLAG_L2NORM) { mas01cr@239: fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n"); mas01cr@239: } mas01cr@239: if(power) { mas01cr@239: fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n"); mas01cr@239: } mas01cr@239: fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt"); mas01cr@239: if(times) { mas01cr@239: fprintf(scriptFile, " -T timesList.txt"); mas01cr@239: } mas01cr@239: if(power) { mas01cr@239: fprintf(scriptFile, " -W powerList.txt"); mas01cr@239: } mas01cr@239: fprintf(scriptFile, "\n"); mas01cr@239: fclose(scriptFile); mas01cr@239: mas01cr@239: if((chdir(cwd)) < 0) { mas01cr@239: error("error changing working directory", cwd, "chdir"); mas01cr@239: } mas01cr@239: mas01cr@239: fclose(fLFile); mas01cr@239: if(times) { mas01cr@239: fclose(tLFile); mas01cr@239: } mas01cr@239: if(power) { mas01cr@239: fclose(pLFile); mas01cr@239: } mas01cr@239: fclose(kLFile); mas01cr@239: delete[] fName; mas01cr@239: mas01cr@239: status(dbName); mas01cr@239: }