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@380
|
66 if(dbH->flags & O2_FLAG_LARGE_ADB) {
|
mas01cr@380
|
67 char *featureFileName = featureFileNameTable+k*O2_FILETABLE_ENTRY_SIZE;
|
mas01cr@380
|
68 fprintf(fLFile, "%s\n", featureFileName);
|
mas01cr@380
|
69 if(*featureFileName != '/') {
|
mas01cr@380
|
70 error("relative path in LARGE_ADB", featureFileName);
|
mas01cr@239
|
71 }
|
mas01cr@380
|
72 if(times) {
|
mas01cr@380
|
73 char *timesFileName = timesFileNameTable + k*O2_FILETABLE_ENTRY_SIZE;
|
mas01cr@380
|
74 fprintf(tLFile, "%s\n", timesFileName);
|
mas01cr@380
|
75 if(*timesFileName != '/') {
|
mas01cr@380
|
76 error("relative path in LARGE_ADB", timesFileName);
|
mas01cr@380
|
77 }
|
mas01cr@239
|
78 }
|
mas01cr@380
|
79 if(power) {
|
mas01cr@380
|
80 char *powerFileName = powerFileNameTable + k*O2_FILETABLE_ENTRY_SIZE;
|
mas01cr@380
|
81 fprintf(pLFile, "%s\n", powerFileName);
|
mas01cr@380
|
82 if(*powerFileName != '/') {
|
mas01cr@380
|
83 error("relative path in LARGE_ADB", powerFileName);
|
mas01cr@380
|
84 }
|
mas01cr@239
|
85 }
|
mas01cr@380
|
86 } else {
|
mas01cr@380
|
87 snprintf(fName, 256, "%05d.features", k);
|
mas01cr@380
|
88 if ((ffd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
|
mas01cr@380
|
89 error("error creating feature file", fName, "open");
|
mas01cr@239
|
90 }
|
mas01cr@380
|
91 if ((write(ffd, &dbH->dim, sizeof(uint32_t))) < 0) {
|
mas01cr@380
|
92 error("error writing dimensions", fName, "write");
|
mas01cr@380
|
93 }
|
mas01cr@380
|
94
|
mas01cr@380
|
95 /* FIXME: this repeated malloc()/free() of data buffers is
|
mas01cr@380
|
96 inefficient. */
|
mas01cr@380
|
97 data_buffer_size = trackTable[k] * dbH->dim * sizeof(double);
|
mas01cr@380
|
98
|
mas01cr@380
|
99 {
|
mas01cr@380
|
100 void *tmp = malloc(data_buffer_size);
|
mas01cr@380
|
101 if (tmp == NULL) {
|
mas01cr@380
|
102 error("error allocating data buffer");
|
mas01cr@380
|
103 }
|
mas01cr@380
|
104 data_buffer = (double *) tmp;
|
mas01cr@380
|
105 }
|
mas01cr@380
|
106
|
mas01cr@380
|
107 if ((read(dbfid, data_buffer, data_buffer_size)) != (ssize_t) data_buffer_size) {
|
mas01cr@380
|
108 error("error reading data", fName, "read");
|
mas01cr@380
|
109 }
|
mas01cr@380
|
110
|
mas01cr@380
|
111 if ((write(ffd, data_buffer, data_buffer_size)) < 0) {
|
mas01cr@239
|
112 error("error writing data", fName, "write");
|
mas01cr@239
|
113 }
|
mas01cr@380
|
114
|
mas01cr@380
|
115 free(data_buffer);
|
mas01cr@380
|
116
|
mas01cr@380
|
117 fprintf(fLFile, "%s\n", fName);
|
mas01cr@380
|
118 close(ffd);
|
mas01cr@380
|
119
|
mas01cr@380
|
120 if (times) {
|
mas01cr@380
|
121 snprintf(fName, 256, "%05d.times", k);
|
mas01cr@380
|
122 tFile = fopen(fName, "w");
|
mas01cr@380
|
123 for(unsigned i = 0; i < trackTable[k]; i++) {
|
mas01cr@380
|
124 // KLUDGE: specifying 16 digits of precision after the decimal
|
mas01cr@380
|
125 // point is (but check this!) sufficient to uniquely identify
|
mas01cr@380
|
126 // doubles; however, that will cause ugliness, as that's
|
mas01cr@380
|
127 // vastly too many for most values of interest. Moving to %a
|
mas01cr@380
|
128 // here and scanf() in the timesFile reading might fix this.
|
mas01cr@380
|
129 // -- CSR, 2007-10-19
|
mas01cr@380
|
130 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*i));
|
mas01cr@380
|
131 }
|
mas01cr@380
|
132 fprintf(tFile, "%.16e\n", *(timesTable + 2*pos + 2*trackTable[k]-1));
|
mas01cr@380
|
133
|
mas01cr@380
|
134 fprintf(tLFile, "%s\n", fName);
|
mas01cr@380
|
135 }
|
mas01cr@380
|
136
|
mas01cr@380
|
137 if (power) {
|
mas01cr@380
|
138 uint32_t one = 1;
|
mas01cr@380
|
139 snprintf(fName, 256, "%05d.power", k);
|
mas01cr@380
|
140 if ((pfd = open(fName, O_CREAT|O_RDWR|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) {
|
mas01cr@380
|
141 error("error creating power file", fName, "open");
|
mas01cr@380
|
142 }
|
mas01cr@380
|
143 if ((write(pfd, &one, sizeof(uint32_t))) < 0) {
|
mas01cr@380
|
144 error("error writing one", fName, "write");
|
mas01cr@380
|
145 }
|
mas01cr@380
|
146 if ((write(pfd, powerTable + pos, trackTable[k] * sizeof(double))) < 0) {
|
mas01cr@380
|
147 error("error writing data", fName, "write");
|
mas01cr@380
|
148 }
|
mas01cr@380
|
149 fprintf(pLFile, "%s\n", fName);
|
mas01cr@380
|
150 close(pfd);
|
mas01cr@380
|
151 }
|
mas01cr@380
|
152
|
mas01cr@380
|
153 pos += trackTable[k];
|
mas01cr@380
|
154 std::cout << fileTable+k*O2_FILETABLE_ENTRY_SIZE << " " << trackTable[k] << std::endl;
|
mas01cr@380
|
155 }
|
mas01cr@239
|
156 }
|
mas01cr@239
|
157
|
mas01cr@239
|
158 FILE *scriptFile;
|
mas01cr@239
|
159 scriptFile = fopen("restore.sh", "w");
|
mas01cr@239
|
160 fprintf(scriptFile, "\
|
mas01cr@239
|
161 #! /bin/sh\n\
|
mas01cr@239
|
162 #\n\
|
mas01cr@239
|
163 # usage: AUDIODB=/path/to/audioDB sh ./restore.sh <newdb>\n\
|
mas01cr@239
|
164 \n\
|
mas01cr@239
|
165 if [ -z \"${AUDIODB}\" ]; then echo set AUDIODB variable; exit 1; fi\n\
|
mas01cr@239
|
166 if [ -z \"$1\" ]; then echo usage: $0 newdb; exit 1; fi\n\n\
|
mas01cr@256
|
167 \"${AUDIODB}\" -d \"$1\" -N --datasize=%d --ntracks=%d --datadim=%d\n",
|
mas01cr@256
|
168 (int) ((dbH->timesTableOffset - dbH->dataOffset) / (1024*1024)),
|
mas01cr@256
|
169 // fileTable entries (char[256]) are bigger than trackTable
|
mas01cr@256
|
170 // (int), so the granularity of page aligning is finer.
|
mas01cr@256
|
171 (int) ((dbH->trackTableOffset - dbH->fileTableOffset) / O2_FILETABLE_ENTRY_SIZE),
|
mas01cr@256
|
172 (int) ceil(((double) (dbH->timesTableOffset - dbH->dataOffset)) / ((double) (dbH->dbSize - dbH->l2normTableOffset))));
|
mas01cr@239
|
173 if(dbH->flags & O2_FLAG_L2NORM) {
|
mas01cr@239
|
174 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -L\n");
|
mas01cr@239
|
175 }
|
mas01cr@239
|
176 if(power) {
|
mas01cr@239
|
177 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -P\n");
|
mas01cr@239
|
178 }
|
mas01cr@239
|
179 fprintf(scriptFile, "\"${AUDIODB}\" -d \"$1\" -B -F featureList.txt -K keyList.txt");
|
mas01cr@239
|
180 if(times) {
|
mas01cr@239
|
181 fprintf(scriptFile, " -T timesList.txt");
|
mas01cr@239
|
182 }
|
mas01cr@239
|
183 if(power) {
|
mas01cr@239
|
184 fprintf(scriptFile, " -W powerList.txt");
|
mas01cr@239
|
185 }
|
mas01cr@239
|
186 fprintf(scriptFile, "\n");
|
mas01cr@239
|
187 fclose(scriptFile);
|
mas01cr@239
|
188
|
mas01cr@239
|
189 if((chdir(cwd)) < 0) {
|
mas01cr@239
|
190 error("error changing working directory", cwd, "chdir");
|
mas01cr@239
|
191 }
|
mas01cr@239
|
192
|
mas01cr@239
|
193 fclose(fLFile);
|
mas01cr@239
|
194 if(times) {
|
mas01cr@239
|
195 fclose(tLFile);
|
mas01cr@239
|
196 }
|
mas01cr@239
|
197 if(power) {
|
mas01cr@239
|
198 fclose(pLFile);
|
mas01cr@239
|
199 }
|
mas01cr@239
|
200 fclose(kLFile);
|
mas01cr@239
|
201 delete[] fName;
|
mas01cr@239
|
202
|
mas01cr@239
|
203 status(dbName);
|
mas01cr@239
|
204 }
|
mas01mc@334
|
205
|
mas01mc@334
|
206 void audioDB::liszt(const char* dbName, unsigned offset, unsigned numLines, adb__lisztResponse* adbLisztResponse){
|
mas01mc@334
|
207 if(!dbH) {
|
mas01mc@334
|
208 initTables(dbName, 0);
|
mas01mc@334
|
209 }
|
mas01mc@334
|
210
|
mas01mc@334
|
211 assert(trackTable && fileTable);
|
mas01mc@334
|
212
|
mas01mc@334
|
213 if(offset>dbH->numFiles){
|
mas01mc@334
|
214 char tmpStr[MAXSTR];
|
mas01mc@334
|
215 sprintf(tmpStr, "numFiles=%u, lisztOffset=%u", dbH->numFiles, offset);
|
mas01mc@334
|
216 error("listKeys offset out of range", tmpStr);
|
mas01mc@334
|
217 }
|
mas01mc@334
|
218
|
mas01mc@334
|
219 if(!adbLisztResponse){
|
mas01mc@334
|
220 for(Uns32T k=0; k<numLines && offset+k<dbH->numFiles; k++){
|
mas01mc@334
|
221 fprintf(stdout, "[%d] %s (%d)\n", offset+k, fileTable+(offset+k)*O2_FILETABLE_ENTRY_SIZE, trackTable[offset+k]);
|
mas01mc@334
|
222 }
|
mas01mc@334
|
223 }
|
mas01mc@334
|
224 else{
|
mas01mc@334
|
225 adbLisztResponse->result.Rkey = new char*[numLines];
|
mas01mc@334
|
226 adbLisztResponse->result.Rlen = new unsigned int[numLines];
|
mas01mc@334
|
227 Uns32T k = 0;
|
mas01mc@334
|
228 for( ; k<numLines && offset+k<dbH->numFiles; k++){
|
mas01mc@334
|
229 adbLisztResponse->result.Rkey[k] = new char[MAXSTR];
|
mas01mc@334
|
230 snprintf(adbLisztResponse->result.Rkey[k], O2_MAXFILESTR, "%s", fileTable+(offset+k)*O2_FILETABLE_ENTRY_SIZE);
|
mas01mc@334
|
231 adbLisztResponse->result.Rlen[k] = trackTable[offset+k];
|
mas01mc@334
|
232 }
|
mas01mc@334
|
233 adbLisztResponse->result.__sizeRkey = k;
|
mas01mc@334
|
234 adbLisztResponse->result.__sizeRlen = k;
|
mas01mc@334
|
235 }
|
mas01mc@334
|
236
|
mas01mc@334
|
237 }
|