annotate dump.cpp @ 410:d7e590d58c85 api-inversion

Pavlovian response to compiler warnings... ... attempt to squash them. For now we can get most of the way by writing a simple write_or_goto_error() macro for write(), and the equivalent for read(). One of the warnings, for the return value of chdir(), is silly, because we're already in an error case, and we really can't do anything sensible if the chdir fails. Try to deal with it anyway.
author mas01cr
date Thu, 11 Dec 2008 08:54:01 +0000
parents a8a5f2ca5380
children 62a0515f59be
rev   line source
mas01cr@239 1 #include "audioDB.h"
mas01cr@399 2 extern "C" {
mas01cr@399 3 #include "audioDB_API.h"
mas01cr@401 4 #include "audioDB-internals.h"
mas01cr@399 5 }
mas01cr@239 6
mas01cr@399 7 int audiodb_dump(adb_t *adb, const char *output) {
mas01cr@399 8 char *fileTable = 0; /* key_table */
mas01cr@399 9 unsigned *trackTable = 0; /* track_size_table */
mas01cr@399 10 double *timesTable = 0; /* timestamps_table */
mas01cr@399 11 double *powerTable = 0; /* power_table */
mas01cr@399 12
mas01cr@399 13 size_t fileTableLength = 0;
mas01cr@399 14 size_t trackTableLength = 0;
mas01cr@399 15 size_t timesTableLength = 0;
mas01cr@399 16 size_t powerTableLength = 0;
mas01cr@399 17
mas01cr@399 18 char *featureFileNameTable = 0;
mas01cr@399 19 char *powerFileNameTable = 0;
mas01cr@399 20 char *timesFileNameTable = 0;
mas01cr@399 21
mas01cr@399 22 char cwd[PATH_MAX];
mas01cr@399 23 int directory_changed = 0;
mas01cr@399 24
mas01cr@399 25 int fLfd = 0, tLfd = 0, pLfd = 0, kLfd = 0;
mas01cr@399 26 FILE *fLFile = 0, *tLFile = 0, *pLFile = 0, *kLFile = 0;
mas01cr@399 27
mas01cr@399 28 int times, power;
mas01cr@399 29
mas01cr@399 30 char fName[256];
mas01cr@399 31 int ffd, pfd;
mas01cr@399 32 FILE *tFile;
mas01cr@399 33 unsigned pos = 0;
mas01cr@399 34 double *data_buffer;
mas01cr@399 35 size_t data_buffer_size;
mas01cr@399 36 FILE *scriptFile = 0;
mas01cr@399 37
mas01cr@399 38 unsigned nfiles = adb->header->numFiles;
mas01cr@399 39
mas01cr@399 40 if(adb->header->length > 0) {
mas01cr@399 41 fileTableLength = ALIGN_PAGE_UP(nfiles * O2_FILETABLE_ENTRY_SIZE);
mas01cr@399 42 trackTableLength = ALIGN_PAGE_UP(nfiles * O2_TRACKTABLE_ENTRY_SIZE);
mas01cr@399 43 if(!(adb->header->flags & O2_FLAG_LARGE_ADB)) {
mas01cr@399 44 off_t length = adb->header->length;
mas01cr@399 45 unsigned dim = adb->header->dim;
mas01cr@399 46 timesTableLength = ALIGN_PAGE_UP(2*length/dim);
mas01cr@399 47 powerTableLength = ALIGN_PAGE_UP(length/dim);
mas01cr@399 48 }
mas01cr@399 49
mas01cr@399 50 mmap_or_goto_error(char *, fileTable, adb->header->fileTableOffset, fileTableLength);
mas01cr@399 51 mmap_or_goto_error(unsigned *, trackTable, adb->header->trackTableOffset, trackTableLength);
mas01cr@399 52 if (adb->header->flags & O2_FLAG_LARGE_ADB) {
mas01cr@399 53 mmap_or_goto_error(char *, featureFileNameTable, adb->header->dataOffset, fileTableLength);
mas01cr@399 54 mmap_or_goto_error(char *, powerFileNameTable, adb->header->powerTableOffset, fileTableLength);
mas01cr@399 55 mmap_or_goto_error(char *, timesFileNameTable, adb->header->timesTableOffset, fileTableLength);
mas01cr@399 56 } else {
mas01cr@399 57 mmap_or_goto_error(double *, powerTable, adb->header->powerTableOffset, powerTableLength);
mas01cr@399 58 mmap_or_goto_error(double *, timesTable, adb->header->timesTableOffset, timesTableLength);
mas01cr@399 59 }
mas01cr@239 60 }
mas01cr@239 61
mas01cr@239 62 if((mkdir(output, S_IRWXU|S_IRWXG|S_IRWXO)) < 0) {
mas01cr@399 63 goto error;
mas01cr@239 64 }
mas01cr@239 65
mas01cr@239 66 if ((getcwd(cwd, PATH_MAX)) == 0) {
mas01cr@399 67 goto error;
mas01cr@239 68 }
mas01cr@239 69
mas01cr@399 70 /* FIXME: Hrm. How does chdir(2) interact with threads? Does each
mas01cr@399 71 * thread have its own working directory? */
mas01cr@239 72 if((chdir(output)) < 0) {
mas01cr@399 73 goto error;
mas01cr@399 74 }
mas01cr@399 75 directory_changed = 1;
mas01cr@399 76
mas01cr@399 77 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@399 78 goto error;
mas01cr@239 79 }
mas01cr@239 80
mas01cr@399 81 times = adb->header->flags & O2_FLAG_TIMES;
mas01cr@239 82 if (times) {
mas01cr@239 83 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@399 84 goto error;
mas01cr@239 85 }
mas01cr@239 86 }
mas01cr@239 87
mas01cr@399 88 power = adb->header->flags & O2_FLAG_POWER;
mas01cr@239 89 if (power) {
mas01cr@239 90 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@399 91 goto error;
mas01cr@239 92 }
mas01cr@239 93 }
mas01cr@239 94
mas01cr@239 95 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@399 96 goto error;
mas01cr@239 97 }
mas01cr@239 98
mas01cr@239 99 /* can these fail? I sincerely hope not. */
mas01cr@239 100 fLFile = fdopen(fLfd, "w");
mas01cr@239 101 if (times) {
mas01cr@239 102 tLFile = fdopen(tLfd, "w");
mas01cr@239 103 }
mas01cr@239 104 if (power) {
mas01cr@239 105 pLFile = fdopen(pLfd, "w");
mas01cr@239 106 }
mas01cr@239 107 kLFile = fdopen(kLfd, "w");
mas01cr@239 108
mas01cr@399 109 lseek(adb->fd, adb->header->dataOffset, SEEK_SET);
mas01cr@399 110
mas01cr@399 111 for(unsigned k = 0; k < nfiles; k++) {
mas01cr@256 112 fprintf(kLFile, "%s\n", fileTable + k*O2_FILETABLE_ENTRY_SIZE);
mas01cr@399 113 if(adb->header->flags & O2_FLAG_LARGE_ADB) {
mas01cr@380 114 char *featureFileName = featureFileNameTable+k*O2_FILETABLE_ENTRY_SIZE;
mas01cr@399 115 if(*featureFileName != '/') {
mas01cr@399 116 goto error;
mas01cr@399 117 }
mas01cr@380 118 fprintf(fLFile, "%s\n", featureFileName);
mas01cr@380 119 if(times) {
mas01cr@380 120 char *timesFileName = timesFileNameTable + k*O2_FILETABLE_ENTRY_SIZE;
mas01cr@399 121 if(*timesFileName != '/') {
mas01cr@399 122 goto error;
mas01cr@399 123 }
mas01cr@380 124 fprintf(tLFile, "%s\n", timesFileName);
mas01cr@239 125 }
mas01cr@380 126 if(power) {
mas01cr@380 127 char *powerFileName = powerFileNameTable + k*O2_FILETABLE_ENTRY_SIZE;
mas01cr@399 128 if(*powerFileName != '/') {
mas01cr@399 129 goto error;
mas01cr@399 130 }
mas01cr@380 131 fprintf(pLFile, "%s\n", powerFileName);
mas01cr@239 132 }
mas01cr@380 133 } else {
mas01cr@380 134 snprintf(fName, 256, "%05d.features", k);
mas01cr@380 135 if ((ffd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@399 136 goto error;
mas01cr@239 137 }
mas01cr@410 138 write_or_goto_error(ffd, &(adb->header->dim), sizeof(uint32_t));
mas01cr@380 139
mas01cr@380 140 /* FIXME: this repeated malloc()/free() of data buffers is
mas01cr@380 141 inefficient. */
mas01cr@399 142 data_buffer_size = trackTable[k] * adb->header->dim * sizeof(double);
mas01cr@380 143
mas01cr@380 144 {
mas01cr@380 145 void *tmp = malloc(data_buffer_size);
mas01cr@380 146 if (tmp == NULL) {
mas01cr@399 147 goto error;
mas01cr@380 148 }
mas01cr@380 149 data_buffer = (double *) tmp;
mas01cr@380 150 }
mas01cr@380 151
mas01cr@399 152 if ((read(adb->fd, data_buffer, data_buffer_size)) != (ssize_t) data_buffer_size) {
mas01cr@399 153 goto error;
mas01cr@380 154 }
mas01cr@380 155
mas01cr@410 156 write_or_goto_error(ffd, data_buffer, data_buffer_size);
mas01cr@380 157
mas01cr@380 158 free(data_buffer);
mas01cr@380 159
mas01cr@380 160 fprintf(fLFile, "%s\n", fName);
mas01cr@380 161 close(ffd);
mas01cr@399 162 ffd = 0;
mas01cr@399 163
mas01cr@380 164 if (times) {
mas01cr@380 165 snprintf(fName, 256, "%05d.times", k);
mas01cr@380 166 tFile = fopen(fName, "w");
mas01cr@380 167 for(unsigned i = 0; i < trackTable[k]; i++) {
mas01cr@380 168 // KLUDGE: specifying 16 digits of precision after the decimal
mas01cr@380 169 // point is (but check this!) sufficient to uniquely identify
mas01cr@380 170 // doubles; however, that will cause ugliness, as that's
mas01cr@380 171 // vastly too many for most values of interest. Moving to %a
mas01cr@380 172 // here and scanf() in the timesFile reading might fix this.
mas01cr@380 173 // -- CSR, 2007-10-19
mas01cr@380 174 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*i));
mas01cr@380 175 }
mas01cr@380 176 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*trackTable[k]-1));
mas01cr@399 177 fclose(tFile);
mas01cr@380 178
mas01cr@380 179 fprintf(tLFile, "%s\n", fName);
mas01cr@380 180 }
mas01cr@380 181
mas01cr@380 182 if (power) {
mas01cr@380 183 uint32_t one = 1;
mas01cr@380 184 snprintf(fName, 256, "%05d.power", k);
mas01cr@380 185 if ((pfd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
mas01cr@399 186 goto error;
mas01cr@380 187 }
mas01cr@410 188 write_or_goto_error(pfd, &one, sizeof(uint32_t));
mas01cr@410 189 write_or_goto_error(pfd, powerTable + pos, trackTable[k] * sizeof(double));
mas01cr@380 190 fprintf(pLFile, "%s\n", fName);
mas01cr@380 191 close(pfd);
mas01cr@399 192 pfd = 0;
mas01cr@380 193 }
mas01cr@380 194
mas01cr@380 195 pos += trackTable[k];
mas01cr@380 196 std::cout << fileTable+k*O2_FILETABLE_ENTRY_SIZE << " " << trackTable[k] << std::endl;
mas01cr@380 197 }
mas01cr@239 198 }
mas01cr@239 199
mas01cr@239 200 scriptFile = fopen("restore.sh", "w");
mas01cr@239 201 fprintf(scriptFile, "\
mas01cr@239 202 #! /bin/sh\n\
mas01cr@239 203 #\n\
mas01cr@239 204 # usage: AUDIODB=/path/to/audioDB sh ./restore.sh <newdb>\n\
mas01cr@239 205 \n\
mas01cr@239 206 if [ -z \"${AUDIODB}\" ]; then echo set AUDIODB variable; exit 1; fi\n\
mas01cr@239 207 if [ -z \"$1\" ]; then echo usage: $0 newdb; exit 1; fi\n\n\
mas01cr@256 208 \"${AUDIODB}\" -d \"$1\" -N --datasize=%d --ntracks=%d --datadim=%d\n",
mas01cr@399 209 (int) ((adb->header->timesTableOffset - adb->header->dataOffset) / (1024*1024)),
mas01cr@256 210 // fileTable entries (char[256]) are bigger than trackTable
mas01cr@256 211 // (int), so the granularity of page aligning is finer.
mas01cr@399 212 (int) ((adb->header->trackTableOffset - adb->header->fileTableOffset) / O2_FILETABLE_ENTRY_SIZE),
mas01cr@399 213 (int) ceil(((double) (adb->header->timesTableOffset - adb->header->dataOffset)) / ((double) (adb->header->dbSize - adb->header->l2normTableOffset))));
mas01cr@399 214 if(adb->header->flags & O2_FLAG_L2NORM) {
mas01cr@239 215 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n");
mas01cr@239 216 }
mas01cr@239 217 if(power) {
mas01cr@239 218 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n");
mas01cr@239 219 }
mas01cr@239 220 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt");
mas01cr@239 221 if(times) {
mas01cr@239 222 fprintf(scriptFile, " -T timesList.txt");
mas01cr@239 223 }
mas01cr@239 224 if(power) {
mas01cr@239 225 fprintf(scriptFile, " -W powerList.txt");
mas01cr@239 226 }
mas01cr@239 227 fprintf(scriptFile, "\n");
mas01cr@239 228 fclose(scriptFile);
mas01cr@239 229
mas01cr@239 230 fclose(fLFile);
mas01cr@239 231 if(times) {
mas01cr@239 232 fclose(tLFile);
mas01cr@239 233 }
mas01cr@239 234 if(power) {
mas01cr@239 235 fclose(pLFile);
mas01cr@239 236 }
mas01cr@239 237 fclose(kLFile);
mas01cr@239 238
mas01cr@399 239 maybe_munmap(fileTable, fileTableLength);
mas01cr@399 240 maybe_munmap(trackTable, trackTableLength);
mas01cr@399 241 maybe_munmap(timesTable, timesTableLength);
mas01cr@399 242 maybe_munmap(powerTable, powerTableLength);
mas01cr@399 243 maybe_munmap(featureFileNameTable, fileTableLength);
mas01cr@399 244 maybe_munmap(timesFileNameTable, fileTableLength);
mas01cr@399 245 maybe_munmap(powerFileNameTable, fileTableLength);
mas01cr@399 246
mas01cr@399 247 if((chdir(cwd)) < 0) {
mas01cr@399 248 /* don't goto error because the error handling will try to
mas01cr@399 249 * chdir() */
mas01cr@399 250 return 1;
mas01cr@399 251 }
mas01cr@399 252
mas01cr@399 253 return 0;
mas01cr@399 254
mas01cr@399 255 error:
mas01cr@399 256 if(fLFile) {
mas01cr@399 257 fclose(fLFile);
mas01cr@399 258 } else if(fLfd) {
mas01cr@399 259 close(fLfd);
mas01cr@399 260 }
mas01cr@399 261 if(tLFile) {
mas01cr@399 262 fclose(tLFile);
mas01cr@399 263 } else if(tLfd) {
mas01cr@399 264 close(fLfd);
mas01cr@399 265 }
mas01cr@399 266 if(pLFile) {
mas01cr@399 267 fclose(pLFile);
mas01cr@399 268 } else if(pLfd) {
mas01cr@399 269 close(pLfd);
mas01cr@399 270 }
mas01cr@399 271 if(kLFile) {
mas01cr@399 272 fclose(kLFile);
mas01cr@399 273 } else if(kLfd) {
mas01cr@399 274 close(kLfd);
mas01cr@399 275 }
mas01cr@399 276 if(scriptFile) {
mas01cr@399 277 fclose(scriptFile);
mas01cr@399 278 }
mas01cr@399 279
mas01cr@399 280 maybe_munmap(fileTable, fileTableLength);
mas01cr@399 281 maybe_munmap(trackTable, trackTableLength);
mas01cr@399 282 maybe_munmap(timesTable, timesTableLength);
mas01cr@399 283 maybe_munmap(powerTable, powerTableLength);
mas01cr@399 284 maybe_munmap(featureFileNameTable, fileTableLength);
mas01cr@399 285 maybe_munmap(timesFileNameTable, fileTableLength);
mas01cr@399 286 maybe_munmap(powerFileNameTable, fileTableLength);
mas01cr@399 287
mas01cr@399 288 if(directory_changed) {
mas01cr@410 289 int gcc_warning_workaround = chdir(cwd);
mas01cr@410 290 directory_changed = gcc_warning_workaround;
mas01cr@399 291 }
mas01cr@399 292 return 1;
mas01cr@239 293 }