annotate dump.cpp @ 279:dee55886eca0 sampling

make the RNG a part of the audioDB object. Easier to deal with memory discipline and initialization (though note the FIXME comment in audioDB::initTables()). Also initialize the RNG from the current time. A mature implementation would use a proper source of entropy...
author mas01cr
date Wed, 02 Jul 2008 13:53:23 +0000
parents 4dcb09f5fe85
children b9eff6896943
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@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@256 133 std::cout << fileTable+k*O2_FILETABLE_ENTRY_SIZE << " " << 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@256 145 \"${AUDIODB}\" -d \"$1\" -N --datasize=%d --ntracks=%d --datadim=%d\n",
mas01cr@256 146 (int) ((dbH->timesTableOffset - dbH->dataOffset) / (1024*1024)),
mas01cr@256 147 // fileTable entries (char[256]) are bigger than trackTable
mas01cr@256 148 // (int), so the granularity of page aligning is finer.
mas01cr@256 149 (int) ((dbH->trackTableOffset - dbH->fileTableOffset) / O2_FILETABLE_ENTRY_SIZE),
mas01cr@256 150 (int) ceil(((double) (dbH->timesTableOffset - dbH->dataOffset)) / ((double) (dbH->dbSize - dbH->l2normTableOffset))));
mas01cr@239 151 if(dbH->flags & O2_FLAG_L2NORM) {
mas01cr@239 152 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n");
mas01cr@239 153 }
mas01cr@239 154 if(power) {
mas01cr@239 155 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n");
mas01cr@239 156 }
mas01cr@239 157 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt");
mas01cr@239 158 if(times) {
mas01cr@239 159 fprintf(scriptFile, " -T timesList.txt");
mas01cr@239 160 }
mas01cr@239 161 if(power) {
mas01cr@239 162 fprintf(scriptFile, " -W powerList.txt");
mas01cr@239 163 }
mas01cr@239 164 fprintf(scriptFile, "\n");
mas01cr@239 165 fclose(scriptFile);
mas01cr@239 166
mas01cr@239 167 if((chdir(cwd)) < 0) {
mas01cr@239 168 error("error changing working directory", cwd, "chdir");
mas01cr@239 169 }
mas01cr@239 170
mas01cr@239 171 fclose(fLFile);
mas01cr@239 172 if(times) {
mas01cr@239 173 fclose(tLFile);
mas01cr@239 174 }
mas01cr@239 175 if(power) {
mas01cr@239 176 fclose(pLFile);
mas01cr@239 177 }
mas01cr@239 178 fclose(kLFile);
mas01cr@239 179 delete[] fName;
mas01cr@239 180
mas01cr@239 181 status(dbName);
mas01cr@239 182 }