annotate dump.cpp @ 277:abfb26e08d9c audiodb-debian

Merge trunk changes -r326:386 into audiodb-debian branch. Plus new debian/changelog version. (Should have used an epoch really, but couldn't be bothered; TODO: work out a sane version numbering policy).
author mas01cr
date Tue, 01 Jul 2008 09:12:40 +0000
parents 15b8ff55ea5b
children b9eff6896943
rev   line source
mas01cr@243 1 #include "audioDB.h"
mas01cr@243 2
mas01cr@243 3 void audioDB::dump(const char* dbName){
mas01cr@243 4 if(!dbH) {
mas01cr@243 5 initTables(dbName, 0);
mas01cr@243 6 }
mas01cr@243 7
mas01cr@243 8 if((mkdir(output, S_IRWXU|S_IRWXG|S_IRWXO)) < 0) {
mas01cr@243 9 error("error making output directory", output, "mkdir");
mas01cr@243 10 }
mas01cr@243 11
mas01cr@243 12 char *cwd = new char[PATH_MAX];
mas01cr@243 13
mas01cr@243 14 if ((getcwd(cwd, PATH_MAX)) == 0) {
mas01cr@243 15 error("error getting working directory", "", "getcwd");
mas01cr@243 16 }
mas01cr@243 17
mas01cr@243 18 if((chdir(output)) < 0) {
mas01cr@243 19 error("error changing working directory", output, "chdir");
mas01cr@243 20 }
mas01cr@243 21
mas01cr@243 22 int fLfd, tLfd = 0, pLfd = 0, kLfd;
mas01cr@243 23 FILE *fLFile, *tLFile = 0, *pLFile = 0, *kLFile;
mas01cr@243 24
mas01cr@243 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@243 26 error("error creating featureList file", "featureList.txt", "open");
mas01cr@243 27 }
mas01cr@243 28
mas01cr@243 29 int times = dbH->flags & O2_FLAG_TIMES;
mas01cr@243 30 if (times) {
mas01cr@243 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@243 32 error("error creating timesList file", "timesList.txt", "open");
mas01cr@243 33 }
mas01cr@243 34 }
mas01cr@243 35
mas01cr@243 36 int power = dbH->flags & O2_FLAG_POWER;
mas01cr@243 37 if (power) {
mas01cr@243 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@243 39 error("error creating powerList file", "powerList.txt", "open");
mas01cr@243 40 }
mas01cr@243 41 }
mas01cr@243 42
mas01cr@243 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@243 44 error("error creating keyList file", "keyList.txt", "open");
mas01cr@243 45 }
mas01cr@243 46
mas01cr@243 47 /* can these fail? I sincerely hope not. */
mas01cr@243 48 fLFile = fdopen(fLfd, "w");
mas01cr@243 49 if (times) {
mas01cr@243 50 tLFile = fdopen(tLfd, "w");
mas01cr@243 51 }
mas01cr@243 52 if (power) {
mas01cr@243 53 pLFile = fdopen(pLfd, "w");
mas01cr@243 54 }
mas01cr@243 55 kLFile = fdopen(kLfd, "w");
mas01cr@243 56
mas01cr@243 57 char *fName = new char[256];
mas01cr@243 58 int ffd, pfd;
mas01cr@243 59 FILE *tFile;
mas01cr@243 60 unsigned pos = 0;
mas01cr@243 61 lseek(dbfid, dbH->dataOffset, SEEK_SET);
mas01cr@243 62 double *data_buffer;
mas01cr@243 63 size_t data_buffer_size;
mas01cr@243 64 for(unsigned k = 0; k < dbH->numFiles; k++) {
mas01cr@277 65 fprintf(kLFile, "%s\n", fileTable + k*O2_FILETABLE_ENTRY_SIZE);
mas01cr@243 66 snprintf(fName, 256, "%05d.features", k);
mas01cr@243 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@243 68 error("error creating feature file", fName, "open");
mas01cr@243 69 }
mas01cr@243 70 if ((write(ffd, &dbH->dim, sizeof(uint32_t))) < 0) {
mas01cr@243 71 error("error writing dimensions", fName, "write");
mas01cr@243 72 }
mas01cr@243 73
mas01cr@243 74 /* FIXME: this repeated malloc()/free() of data buffers is
mas01cr@243 75 inefficient. */
mas01cr@243 76 data_buffer_size = trackTable[k] * dbH->dim * sizeof(double);
mas01cr@243 77
mas01cr@243 78 {
mas01cr@243 79 void *tmp = malloc(data_buffer_size);
mas01cr@243 80 if (tmp == NULL) {
mas01cr@243 81 error("error allocating data buffer");
mas01cr@243 82 }
mas01cr@243 83 data_buffer = (double *) tmp;
mas01cr@243 84 }
mas01cr@243 85
mas01cr@243 86 if ((read(dbfid, data_buffer, data_buffer_size)) != (ssize_t) data_buffer_size) {
mas01cr@243 87 error("error reading data", fName, "read");
mas01cr@243 88 }
mas01cr@243 89
mas01cr@243 90 if ((write(ffd, data_buffer, data_buffer_size)) < 0) {
mas01cr@243 91 error("error writing data", fName, "write");
mas01cr@243 92 }
mas01cr@243 93
mas01cr@243 94 free(data_buffer);
mas01cr@243 95
mas01cr@243 96 fprintf(fLFile, "%s\n", fName);
mas01cr@243 97 close(ffd);
mas01cr@243 98
mas01cr@243 99 if (times) {
mas01cr@243 100 snprintf(fName, 256, "%05d.times", k);
mas01cr@243 101 tFile = fopen(fName, "w");
mas01cr@243 102 for(unsigned i = 0; i < trackTable[k]; i++) {
mas01cr@243 103 // KLUDGE: specifying 16 digits of precision after the decimal
mas01cr@243 104 // point is (but check this!) sufficient to uniquely identify
mas01cr@243 105 // doubles; however, that will cause ugliness, as that's
mas01cr@243 106 // vastly too many for most values of interest. Moving to %a
mas01cr@243 107 // here and scanf() in the timesFile reading might fix this.
mas01cr@243 108 // -- CSR, 2007-10-19
mas01cr@243 109 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*i));
mas01cr@243 110 }
mas01cr@243 111 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*trackTable[k]-1));
mas01cr@243 112
mas01cr@243 113 fprintf(tLFile, "%s\n", fName);
mas01cr@243 114 }
mas01cr@243 115
mas01cr@243 116 if (power) {
mas01cr@243 117 uint32_t one = 1;
mas01cr@243 118 snprintf(fName, 256, "%05d.power", k);
mas01cr@243 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@243 120 error("error creating power file", fName, "open");
mas01cr@243 121 }
mas01cr@243 122 if ((write(pfd, &one, sizeof(uint32_t))) < 0) {
mas01cr@243 123 error("error writing one", fName, "write");
mas01cr@243 124 }
mas01cr@243 125 if ((write(pfd, powerTable + pos, trackTable[k] * sizeof(double))) < 0) {
mas01cr@243 126 error("error writing data", fName, "write");
mas01cr@243 127 }
mas01cr@243 128 fprintf(pLFile, "%s\n", fName);
mas01cr@243 129 close(pfd);
mas01cr@243 130 }
mas01cr@243 131
mas01cr@243 132 pos += trackTable[k];
mas01cr@277 133 std::cout << fileTable+k*O2_FILETABLE_ENTRY_SIZE << " " << trackTable[k] << std::endl;
mas01cr@243 134 }
mas01cr@243 135
mas01cr@243 136 FILE *scriptFile;
mas01cr@243 137 scriptFile = fopen("restore.sh", "w");
mas01cr@243 138 fprintf(scriptFile, "\
mas01cr@243 139 #! /bin/sh\n\
mas01cr@243 140 #\n\
mas01cr@243 141 # usage: AUDIODB=/path/to/audioDB sh ./restore.sh <newdb>\n\
mas01cr@243 142 \n\
mas01cr@243 143 if [ -z \"${AUDIODB}\" ]; then echo set AUDIODB variable; exit 1; fi\n\
mas01cr@243 144 if [ -z \"$1\" ]; then echo usage: $0 newdb; exit 1; fi\n\n\
mas01cr@277 145 \"${AUDIODB}\" -d \"$1\" -N --datasize=%d --ntracks=%d --datadim=%d\n",
mas01cr@277 146 (int) ((dbH->timesTableOffset - dbH->dataOffset) / (1024*1024)),
mas01cr@277 147 // fileTable entries (char[256]) are bigger than trackTable
mas01cr@277 148 // (int), so the granularity of page aligning is finer.
mas01cr@277 149 (int) ((dbH->trackTableOffset - dbH->fileTableOffset) / O2_FILETABLE_ENTRY_SIZE),
mas01cr@277 150 (int) ceil(((double) (dbH->timesTableOffset - dbH->dataOffset)) / ((double) (dbH->dbSize - dbH->l2normTableOffset))));
mas01cr@243 151 if(dbH->flags & O2_FLAG_L2NORM) {
mas01cr@243 152 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n");
mas01cr@243 153 }
mas01cr@243 154 if(power) {
mas01cr@243 155 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n");
mas01cr@243 156 }
mas01cr@243 157 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt");
mas01cr@243 158 if(times) {
mas01cr@243 159 fprintf(scriptFile, " -T timesList.txt");
mas01cr@243 160 }
mas01cr@243 161 if(power) {
mas01cr@243 162 fprintf(scriptFile, " -W powerList.txt");
mas01cr@243 163 }
mas01cr@243 164 fprintf(scriptFile, "\n");
mas01cr@243 165 fclose(scriptFile);
mas01cr@243 166
mas01cr@243 167 if((chdir(cwd)) < 0) {
mas01cr@243 168 error("error changing working directory", cwd, "chdir");
mas01cr@243 169 }
mas01cr@243 170
mas01cr@243 171 fclose(fLFile);
mas01cr@243 172 if(times) {
mas01cr@243 173 fclose(tLFile);
mas01cr@243 174 }
mas01cr@243 175 if(power) {
mas01cr@243 176 fclose(pLFile);
mas01cr@243 177 }
mas01cr@243 178 fclose(kLFile);
mas01cr@243 179 delete[] fName;
mas01cr@243 180
mas01cr@243 181 status(dbName);
mas01cr@243 182 }