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 }
|