annotate dump.cpp @ 204:2ea1908707c7 refactoring

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