Mercurial > hg > audiodb
comparison audioDB.cpp @ 355:94c18f128ce8
First version of the API, committed to the main trunk. Thanks Christophe, for all the help!
author | mas01ik |
---|---|
date | Wed, 12 Nov 2008 10:21:06 +0000 |
parents | 30384a82983a |
children | 893bb90f6936 2d5c3f8e8c22 |
comparison
equal
deleted
inserted
replaced
354:4871a3ed9e36 | 355:94c18f128ce8 |
---|---|
39 // Perform database prefix substitution | 39 // Perform database prefix substitution |
40 if(dbName && adb_root) | 40 if(dbName && adb_root) |
41 prefix_name((char** const)&dbName, adb_root); | 41 prefix_name((char** const)&dbName, adb_root); |
42 | 42 |
43 if(O2_ACTION(COM_SERVER)) | 43 if(O2_ACTION(COM_SERVER)) |
44 #ifdef BINARY | |
44 startServer(); | 45 startServer(); |
46 #else | |
47 ; | |
48 #endif | |
45 | 49 |
46 else if(O2_ACTION(COM_CREATE)) | 50 else if(O2_ACTION(COM_CREATE)) |
47 create(dbName); | 51 create(dbName); |
48 | 52 |
49 else if(O2_ACTION(COM_INSERT)) | 53 else if(O2_ACTION(COM_INSERT)) |
52 else if(O2_ACTION(COM_BATCHINSERT)) | 56 else if(O2_ACTION(COM_BATCHINSERT)) |
53 batchinsert(dbName, inFile); | 57 batchinsert(dbName, inFile); |
54 | 58 |
55 else if(O2_ACTION(COM_QUERY)) | 59 else if(O2_ACTION(COM_QUERY)) |
56 if(isClient){ | 60 if(isClient){ |
61 #ifdef BINARY | |
57 if(query_from_key){ | 62 if(query_from_key){ |
58 VERB_LOG(1, "Calling web services query %s on database %s, query=%s\n", radius>0?"(Radius)":"(NN)", dbName, (key&&strlen(key))?key:inFile); | 63 VERB_LOG(1, "Calling web services query %s on database %s, query=%s\n", radius>0?"(Radius)":"(NN)", dbName, (key&&strlen(key))?key:inFile); |
59 ws_query_by_key(dbName, key, inFile, (char*)hostport); | 64 ws_query_by_key(dbName, key, inFile, (char*)hostport); |
60 } | 65 } |
61 else{ | 66 else{ |
62 VERB_LOG(1, "Calling web services query on database %s, query=%s\n", dbName, (key&&strlen(key))?key:inFile); | 67 VERB_LOG(1, "Calling web services query on database %s, query=%s\n", dbName, (key&&strlen(key))?key:inFile); |
63 ws_query(dbName, inFile, (char*)hostport); | 68 ws_query(dbName, inFile, (char*)hostport); |
64 } | 69 } |
70 #else | |
71 ; | |
72 #endif | |
65 } | 73 } |
66 else | 74 else |
67 query(dbName, inFile); | 75 query(dbName, inFile); |
68 | 76 |
69 else if(O2_ACTION(COM_STATUS)) | 77 else if(O2_ACTION(COM_STATUS)) |
70 if(isClient) | 78 if(isClient) |
79 #ifdef BINARY | |
71 ws_status(dbName,(char*)hostport); | 80 ws_status(dbName,(char*)hostport); |
81 #else | |
82 ; | |
83 #endif | |
72 else | 84 else |
73 status(dbName); | 85 status(dbName); |
74 | 86 |
75 else if(O2_ACTION(COM_SAMPLE)) | 87 else if(O2_ACTION(COM_SAMPLE)) |
76 sample(dbName); | 88 sample(dbName); |
84 else if(O2_ACTION(COM_DUMP)) | 96 else if(O2_ACTION(COM_DUMP)) |
85 dump(dbName); | 97 dump(dbName); |
86 | 98 |
87 else if(O2_ACTION(COM_LISZT)) | 99 else if(O2_ACTION(COM_LISZT)) |
88 if(isClient) | 100 if(isClient) |
101 #ifdef BINARY | |
89 ws_liszt(dbName, (char*) hostport); | 102 ws_liszt(dbName, (char*) hostport); |
103 #else | |
104 ; | |
105 #endif | |
90 else | 106 else |
91 liszt(dbName, lisztOffset, lisztLength); | 107 liszt(dbName, lisztOffset, lisztLength); |
92 | 108 |
93 else if(O2_ACTION(COM_INDEX)) | 109 else if(O2_ACTION(COM_INDEX)) |
94 index_index_db(dbName); | 110 index_index_db(dbName); |
142 } catch(char *err) { | 158 } catch(char *err) { |
143 cleanup(); | 159 cleanup(); |
144 throw(err); | 160 throw(err); |
145 } | 161 } |
146 } | 162 } |
163 | |
164 | |
165 //for the lib / API | |
166 audioDB::audioDB(const unsigned argc, char* const argv[], int * apierror): O2_AUDIODB_INITIALIZERS | |
167 { | |
168 | |
169 try { | |
170 UseApiError=1; | |
171 | |
172 if(processArgs(argc, argv)<0){ | |
173 printf("No command found.\n"); | |
174 cmdline_parser_print_version (); | |
175 if (strlen(gengetopt_args_info_purpose) > 0) | |
176 printf("%s\n", gengetopt_args_info_purpose); | |
177 printf("%s\n", gengetopt_args_info_usage); | |
178 printf("%s\n", gengetopt_args_info_help[1]); | |
179 printf("%s\n", gengetopt_args_info_help[2]); | |
180 printf("%s\n", gengetopt_args_info_help[0]); | |
181 error("No command found"); | |
182 } | |
183 | |
184 adb__queryResponse adbq; | |
185 | |
186 if(O2_ACTION(COM_CREATE)) | |
187 create(dbName); | |
188 | |
189 else if(O2_ACTION(COM_INSERT)) | |
190 insert(dbName, inFile); | |
191 | |
192 else if(O2_ACTION(COM_BATCHINSERT)) | |
193 batchinsert(dbName, inFile); | |
194 | |
195 else if(O2_ACTION(COM_QUERY)) | |
196 if(isClient) | |
197 ;//ws_query(dbName, inFile, (char*)hostport); | |
198 else | |
199 query(dbName, inFile, &adbq); | |
200 //query(dbName, inFile); | |
201 | |
202 else if(O2_ACTION(COM_STATUS)) | |
203 if(isClient) | |
204 ;//ws_status(dbName,(char*)hostport); | |
205 else | |
206 status(dbName); | |
207 | |
208 else if(O2_ACTION(COM_L2NORM)) | |
209 l2norm(dbName); | |
210 | |
211 else if(O2_ACTION(COM_POWER)) | |
212 power_flag(dbName); | |
213 | |
214 else if(O2_ACTION(COM_DUMP)) | |
215 dump(dbName); | |
216 | |
217 else | |
218 error("Unrecognized command",command); | |
219 | |
220 } catch(int a) { | |
221 *apierror=a; | |
222 return; | |
223 | |
224 } | |
225 *apierror=apierrortemp; | |
226 return; | |
227 | |
228 } | |
229 | |
230 //for API status | |
231 audioDB::audioDB(const unsigned argc, char* const argv[], cppstatusptr stat, int * apierror): O2_AUDIODB_INITIALIZERS | |
232 { | |
233 | |
234 try { | |
235 UseApiError=1; | |
236 | |
237 | |
238 if(processArgs(argc, argv)<0){ | |
239 printf("No command found.\n"); | |
240 cmdline_parser_print_version (); | |
241 if (strlen(gengetopt_args_info_purpose) > 0) | |
242 printf("%s\n", gengetopt_args_info_purpose); | |
243 printf("%s\n", gengetopt_args_info_usage); | |
244 printf("%s\n", gengetopt_args_info_help[1]); | |
245 printf("%s\n", gengetopt_args_info_help[2]); | |
246 printf("%s\n", gengetopt_args_info_help[0]); | |
247 error("No command found"); | |
248 } | |
249 | |
250 status(dbName, stat); | |
251 | |
252 | |
253 } catch(int a) { | |
254 *apierror=a; | |
255 return; | |
256 | |
257 } | |
258 *apierror=apierrortemp; | |
259 return; | |
260 | |
261 } | |
262 | |
263 | |
264 //for API query | |
265 audioDB::audioDB(const unsigned argc, char* const argv[],adb__queryResponse *adbQueryResponse, int * apierror): O2_AUDIODB_INITIALIZERS | |
266 { | |
267 | |
268 try { | |
269 UseApiError=1; | |
270 | |
271 if(processArgs(argc, argv)<0){ | |
272 printf("No command found.\n"); | |
273 cmdline_parser_print_version (); | |
274 if (strlen(gengetopt_args_info_purpose) > 0) | |
275 printf("%s\n", gengetopt_args_info_purpose); | |
276 printf("%s\n", gengetopt_args_info_usage); | |
277 printf("%s\n", gengetopt_args_info_help[1]); | |
278 printf("%s\n", gengetopt_args_info_help[2]); | |
279 printf("%s\n", gengetopt_args_info_help[0]); | |
280 error("No command found"); | |
281 } | |
282 | |
283 query(dbName, inFile, adbQueryResponse); | |
284 | |
285 } catch(int a) { | |
286 *apierror=a; | |
287 return; | |
288 | |
289 } | |
290 *apierror=apierrortemp; | |
291 return; | |
292 | |
293 } | |
294 | |
295 | |
296 | |
297 | |
147 | 298 |
148 void audioDB::cleanup() { | 299 void audioDB::cleanup() { |
149 cmdline_parser_free(&args_info); | 300 cmdline_parser_free(&args_info); |
150 if(indata) | 301 if(indata) |
151 munmap(indata,statbuf.st_size); | 302 munmap(indata,statbuf.st_size); |
168 if(timesFileNameTable) | 319 if(timesFileNameTable) |
169 munmap(timesFileNameTable, fileTableLength); | 320 munmap(timesFileNameTable, fileTableLength); |
170 if(powerFileNameTable) | 321 if(powerFileNameTable) |
171 munmap(powerFileNameTable, fileTableLength); | 322 munmap(powerFileNameTable, fileTableLength); |
172 if(trackOffsetTable) | 323 if(trackOffsetTable) |
173 delete trackOffsetTable; | 324 delete [] trackOffsetTable; |
174 if(reporter) | 325 if(reporter) |
175 delete reporter; | 326 delete reporter; |
176 if(exact_evaluation_queue) | 327 if(exact_evaluation_queue) |
177 delete exact_evaluation_queue; | 328 delete exact_evaluation_queue; |
178 if(rng) | 329 if(rng) |
630 adbStatusResponse->result.nullCount = nullCount; | 781 adbStatusResponse->result.nullCount = nullCount; |
631 adbStatusResponse->result.flags = dbH->flags; | 782 adbStatusResponse->result.flags = dbH->flags; |
632 } | 783 } |
633 } | 784 } |
634 | 785 |
786 ///used by lib/API | |
787 void audioDB::status(const char* dbName, cppstatusptr status){ | |
788 if(!dbH) { | |
789 initTables(dbName, 0); | |
790 } | |
791 | |
792 unsigned dudCount=0; | |
793 unsigned nullCount=0; | |
794 for(unsigned k=0; k<dbH->numFiles; k++){ | |
795 if(trackTable[k]<sequenceLength){ | |
796 dudCount++; | |
797 if(!trackTable[k]) | |
798 nullCount++; | |
799 } | |
800 } | |
801 | |
802 status->numFiles = dbH->numFiles; | |
803 status->dim = dbH->dim; | |
804 status->length = dbH->length; | |
805 status->dudCount = dudCount; | |
806 status->nullCount = nullCount; | |
807 status->flags = dbH->flags; | |
808 | |
809 return; | |
810 } | |
811 | |
812 | |
813 | |
814 | |
635 void audioDB::l2norm(const char* dbName) { | 815 void audioDB::l2norm(const char* dbName) { |
636 forWrite = true; | 816 forWrite = true; |
637 initTables(dbName, 0); | 817 initTables(dbName, 0); |
638 if( !(dbH->flags & O2_FLAG_LARGE_ADB ) && (dbH->length>0) ){ | 818 if( !(dbH->flags & O2_FLAG_LARGE_ADB ) && (dbH->length>0) ){ |
639 /* FIXME: should probably be uint64_t */ | 819 /* FIXME: should probably be uint64_t */ |
711 SERVER_LSH_INDEX_SINGLETON = 0; // Initialize global variables | 891 SERVER_LSH_INDEX_SINGLETON = 0; // Initialize global variables |
712 SERVER_ADB_ROOT = 0; // Server-side database root prefix | 892 SERVER_ADB_ROOT = 0; // Server-side database root prefix |
713 SERVER_ADB_FEATURE_ROOT = 0; // Server-side features root prefix | 893 SERVER_ADB_FEATURE_ROOT = 0; // Server-side features root prefix |
714 audioDB(argc, argv); | 894 audioDB(argc, argv); |
715 } | 895 } |
896 | |
897 | |
898 extern "C" { | |
899 | |
900 /* for API questions contact | |
901 * Christophe Rhodes c.rhodes@gold.ac.uk | |
902 * Ian Knopke mas01ik@gold.ac.uk, ian.knopke@gmail.com */ | |
903 | |
904 #include "audioDB_API.h" | |
905 | |
906 | |
907 //adb_ptr audiodb_create(char * path,long ntracks, long datadim) { | |
908 adb_ptr audiodb_create(char * path,long datasize,long ntracks, long datadim) { | |
909 char *argv[12]; | |
910 int argvctr=0; | |
911 char tempstr1[200]; | |
912 char tempstr2[200]; | |
913 char tempstr3[200]; | |
914 int apierror=0; | |
915 | |
916 | |
917 argv[argvctr++] = "audioDB"; | |
918 argv[argvctr++] = "--NEW"; | |
919 argv[argvctr++] = "-d"; | |
920 argv[argvctr++] = path; | |
921 | |
922 if (datasize >0){ | |
923 argv[argvctr++]="--datasize"; | |
924 snprintf(tempstr1,sizeof(tempstr1),"%ld",datasize); | |
925 argv[argvctr++]=tempstr1; | |
926 } | |
927 | |
928 if (ntracks >0){ | |
929 argv[argvctr++]="--ntracks"; | |
930 snprintf(tempstr2,sizeof(tempstr2),"%ld",ntracks); | |
931 argv[argvctr++]=tempstr2; | |
932 } | |
933 | |
934 if (datadim > 0){ | |
935 argv[argvctr++]="--datadim"; | |
936 snprintf(tempstr3,sizeof(tempstr3),"%ld",datadim); | |
937 argv[argvctr++]=tempstr3; | |
938 } | |
939 | |
940 argv[argvctr+1]='\0'; | |
941 | |
942 audioDB::audioDB(argvctr, argv, &apierror); | |
943 | |
944 if (!apierror){ | |
945 return audiodb_open(path); | |
946 } | |
947 | |
948 /* database exists, so fail and pass NULL */ | |
949 return NULL; | |
950 } | |
951 | |
952 | |
953 | |
954 int audiodb_insert(adb_ptr mydb, adb_insert_ptr ins) { | |
955 char *argv[15]; | |
956 int argvctr=0; | |
957 int apierror=0; | |
958 | |
959 argv[argvctr++]="audioDB"; | |
960 argv[argvctr++]="-I"; | |
961 argv[argvctr++]="-d"; | |
962 argv[argvctr++]=mydb->dbname; | |
963 argv[argvctr++]="-f"; | |
964 argv[argvctr++]=ins->features; | |
965 | |
966 if (ins->times){ | |
967 argv[argvctr++]="--times"; | |
968 argv[argvctr++]=ins->times; | |
969 } | |
970 | |
971 if (ins->power){ | |
972 argv[argvctr++]="-w"; | |
973 argv[argvctr++]=ins->power; | |
974 } | |
975 | |
976 if (ins->key){ | |
977 argv[argvctr++]="--key"; | |
978 argv[argvctr++]=ins->key; | |
979 } | |
980 argv[argvctr+1]='\0'; | |
981 | |
982 audioDB::audioDB(argvctr,argv,&apierror); | |
983 return apierror; | |
984 } | |
985 | |
986 | |
987 int audiodb_batchinsert(adb_ptr mydb, adb_insert_ptr ins, unsigned int size) { | |
988 | |
989 char *argv[22]; | |
990 int argvctr=0; | |
991 unsigned int i=0; | |
992 int retval=0; | |
993 char tempfeaturename[]="tempfeatureXXXXXX"; | |
994 char temppowername[]="temppowerXXXXXX"; | |
995 char tempkeyname[]="tempkeyXXXXXX"; | |
996 char temptimesname[]="temptimesXXXXXX"; | |
997 int tempfeaturefd=0; | |
998 int temppowerfd=0; | |
999 int tempkeyfd=0; | |
1000 int temptimesfd=0; | |
1001 | |
1002 int flags[4]={0}; | |
1003 int apierror=0; | |
1004 | |
1005 /* So the final API should take an array of structs. However, the current | |
1006 * version requires four separate text files. So temporarily, we need to | |
1007 * unpack the struct array, make four separate text files, and then reinsert | |
1008 * them into the command-line call. This should change as soon as possible */ | |
1009 | |
1010 | |
1011 argv[argvctr++]="audioDB"; | |
1012 argv[argvctr++]="-B"; | |
1013 argv[argvctr++]="-d"; | |
1014 argv[argvctr++]=mydb->dbname; | |
1015 | |
1016 | |
1017 /* assume struct is well formed for all entries */ | |
1018 if (ins[0].features){ flags[0]++;} else { | |
1019 /* short circuit the case where there are no features in the structs */ | |
1020 return -1; | |
1021 } ; | |
1022 if (ins[0].power){ flags[1]++;}; | |
1023 if (ins[0].key){ flags[2]++;}; | |
1024 if (ins[0].times){ flags[3]++;}; | |
1025 | |
1026 | |
1027 /* make four temp files */ | |
1028 tempfeaturefd=mkstemp(tempfeaturename); | |
1029 if (tempfeaturefd !=-1){ | |
1030 | |
1031 temppowerfd=mkstemp(temppowername); | |
1032 if (temppowerfd !=-1){ | |
1033 | |
1034 tempkeyfd=mkstemp(tempkeyname); | |
1035 if (tempkeyfd !=-1){ | |
1036 | |
1037 temptimesfd=mkstemp(temptimesname); | |
1038 if (temptimesfd !=-1){ | |
1039 | |
1040 } else { | |
1041 retval=-1; | |
1042 close(tempkeyfd); | |
1043 remove(tempkeyname); | |
1044 close(temppowerfd); | |
1045 remove(temppowername); | |
1046 close(tempfeaturefd); | |
1047 remove(tempfeaturename); | |
1048 } | |
1049 | |
1050 } else { | |
1051 retval=-1; | |
1052 close(temppowerfd); | |
1053 remove(temppowername); | |
1054 close(tempfeaturefd); | |
1055 remove(tempfeaturename); | |
1056 } | |
1057 | |
1058 } else { | |
1059 retval=-1; | |
1060 close(tempfeaturefd); | |
1061 remove(tempfeaturename); | |
1062 } | |
1063 | |
1064 } else { | |
1065 retval=-1; | |
1066 } | |
1067 | |
1068 | |
1069 | |
1070 | |
1071 | |
1072 if (retval == -1){ | |
1073 return -1; | |
1074 } | |
1075 | |
1076 /* Ok, so we should have a working set of files to write to */ | |
1077 /* I'm going to assume that the same format is kept for all structs in the array */ | |
1078 /* That is, each struct should be correctly formed, and contain at least a features file, because I'm just going to pass the terms along to the text files */ | |
1079 for (i=0; i<size; i++){ | |
1080 | |
1081 write(tempfeaturefd,ins[i].features,strlen(ins[i].features)); | |
1082 write(tempfeaturefd,"\n",1); | |
1083 | |
1084 if (flags[1]){ | |
1085 write(temppowerfd,ins[i].power,strlen(ins[i].power)); | |
1086 write(temppowerfd,"\n",1); | |
1087 } | |
1088 | |
1089 if (flags[2]){ | |
1090 write(tempkeyfd,ins[i].key,strlen(ins[i].key)); | |
1091 write(tempkeyfd,"\n",1); | |
1092 } | |
1093 | |
1094 if (flags[3]){ | |
1095 write(temptimesfd,ins[i].times,strlen(ins[i].times)); | |
1096 write(temptimesfd,"\n",1); | |
1097 } | |
1098 } | |
1099 | |
1100 argv[argvctr++]="-F"; | |
1101 argv[argvctr++]=tempfeaturename; | |
1102 close(tempfeaturefd); | |
1103 close(temppowerfd); | |
1104 close(tempkeyfd); | |
1105 close(temptimesfd); | |
1106 | |
1107 if (flags[1]){ | |
1108 argv[argvctr++]="--powerList"; | |
1109 argv[argvctr++]=temppowername; | |
1110 } | |
1111 | |
1112 if (flags[2]){ | |
1113 argv[argvctr++]="--keyList"; | |
1114 argv[argvctr++]=tempkeyname; | |
1115 } | |
1116 | |
1117 if (flags[3]){ | |
1118 argv[argvctr++]="--timesList"; | |
1119 argv[argvctr++]=temptimesname; | |
1120 } | |
1121 | |
1122 argv[argvctr+1]='\0'; | |
1123 | |
1124 audioDB::audioDB(argvctr,argv,&apierror); | |
1125 | |
1126 remove(tempfeaturename); | |
1127 remove(temppowername); | |
1128 remove(tempkeyname); | |
1129 remove(temptimesname); | |
1130 | |
1131 | |
1132 return apierror; | |
1133 } | |
1134 | |
1135 | |
1136 int audiodb_query(adb_ptr mydb, adb_query_ptr adbq, adb_queryresult_ptr adbqr){ | |
1137 | |
1138 char *argv[32]; | |
1139 int argvctr=0; | |
1140 char tempstr1[200]; | |
1141 char tempstr2[200]; | |
1142 char tempstr3[200]; | |
1143 int apierror=0; | |
1144 | |
1145 adb__queryResponse adbQueryResponse; | |
1146 | |
1147 /* TODO: may need error checking here */ | |
1148 /* currently counting on audioDB binary to fail for me */ | |
1149 argv[argvctr++]="audioDB"; | |
1150 | |
1151 if(adbq->querytype){ | |
1152 argv[argvctr++]="-Q"; | |
1153 argv[argvctr++]=adbq->querytype; | |
1154 } | |
1155 | |
1156 if(mydb->dbname){ | |
1157 argv[argvctr++]="-d"; | |
1158 argv[argvctr++]=mydb->dbname; | |
1159 } | |
1160 | |
1161 if (adbq->feature){ | |
1162 argv[argvctr++]="-f"; | |
1163 argv[argvctr++]=adbq->feature; | |
1164 } | |
1165 | |
1166 if (adbq->power){ | |
1167 argv[argvctr++]="-w"; | |
1168 argv[argvctr++]=adbq->power; | |
1169 } | |
1170 | |
1171 if (adbq->qpoint){ | |
1172 argv[argvctr++]="-p"; | |
1173 argv[argvctr++]=adbq->qpoint; | |
1174 } | |
1175 if (adbq->numpoints){ | |
1176 argv[argvctr++]="-n"; | |
1177 argv[argvctr++]=adbq->numpoints; | |
1178 } | |
1179 if (adbq->radius){ | |
1180 argv[argvctr++]="-R"; | |
1181 argv[argvctr++]=adbq->radius; | |
1182 } | |
1183 if(adbq->resultlength){ | |
1184 argv[argvctr++]="-r"; | |
1185 argv[argvctr++]=adbq->resultlength; | |
1186 } | |
1187 if(adbq->sequencelength){ | |
1188 argv[argvctr++]="-l"; | |
1189 argv[argvctr++]=adbq->sequencelength; | |
1190 } | |
1191 if(adbq->sequencehop){ | |
1192 argv[argvctr++]="-h"; | |
1193 argv[argvctr++]=adbq->sequencehop; | |
1194 } | |
1195 | |
1196 if (adbq->absolute_threshold){ | |
1197 argv[argvctr++]="--absolute-threshold"; | |
1198 snprintf(tempstr1,sizeof(tempstr1),"%f",adbq->absolute_threshold); | |
1199 argv[argvctr++]=tempstr1; | |
1200 } | |
1201 | |
1202 if (adbq->relative_threshold){ | |
1203 argv[argvctr++]="--relative-threshold"; | |
1204 snprintf(tempstr2,sizeof(tempstr2),"%f",adbq->relative_threshold); | |
1205 argv[argvctr++]=tempstr2; | |
1206 } | |
1207 | |
1208 if (adbq->exhaustive){ | |
1209 argv[argvctr++]="--exhaustive"; | |
1210 } | |
1211 | |
1212 if (adbq->expandfactor){ | |
1213 argv[argvctr++]="--expandfactor"; | |
1214 snprintf(tempstr3,sizeof(tempstr3),"%f",adbq->expandfactor); | |
1215 argv[argvctr++]=tempstr3; | |
1216 } | |
1217 | |
1218 if (adbq->rotate){ | |
1219 argv[argvctr++]="--rotate"; | |
1220 } | |
1221 | |
1222 if (adbq->keylist){ | |
1223 argv[argvctr++]="-K"; | |
1224 argv[argvctr++]=adbq->keylist; | |
1225 } | |
1226 argv[argvctr+1]='\0'; | |
1227 | |
1228 /* debugging */ | |
1229 | |
1230 audioDB::audioDB(argvctr,argv, &adbQueryResponse, &apierror); | |
1231 | |
1232 //copy data over here from adbQueryResponse to adbqr | |
1233 adbqr->sizeRlist=adbQueryResponse.result.__sizeRlist; | |
1234 adbqr->sizeDist=adbQueryResponse.result.__sizeDist; | |
1235 adbqr->sizeQpos=adbQueryResponse.result.__sizeQpos; | |
1236 adbqr->sizeSpos=adbQueryResponse.result.__sizeSpos; | |
1237 adbqr->Rlist=adbQueryResponse.result.Rlist; | |
1238 adbqr->Dist=adbQueryResponse.result.Dist; | |
1239 adbqr->Qpos=adbQueryResponse.result.Qpos; | |
1240 adbqr->Spos=adbQueryResponse.result.Spos; | |
1241 | |
1242 return apierror; | |
1243 } | |
1244 | |
1245 ///* status command */ | |
1246 int audiodb_status(adb_ptr mydb, adb_status_ptr status){ | |
1247 | |
1248 cppstatus sss; | |
1249 int apierror=0; | |
1250 | |
1251 char * argv[5]; | |
1252 | |
1253 apierror=0; | |
1254 argv[0]="audioDB"; | |
1255 argv[1]="--STATUS"; | |
1256 argv[2]="-d"; | |
1257 argv[3]=mydb->dbname; | |
1258 argv[4]='\0'; | |
1259 | |
1260 audioDB::audioDB(4,argv,&sss ,&apierror); | |
1261 | |
1262 status->numFiles=sss.numFiles; | |
1263 status->dim=sss.dim; | |
1264 status->length=sss.length; | |
1265 status->dudCount=sss.dudCount; | |
1266 status->nullCount=sss.nullCount; | |
1267 status->flags=sss.flags; | |
1268 | |
1269 return apierror; | |
1270 } | |
1271 | |
1272 int audiodb_dump(adb_ptr mydb){ | |
1273 return audiodb_dump_withdir(mydb,"audioDB.dump"); | |
1274 } | |
1275 | |
1276 int audiodb_dump_withdir(adb_ptr mydb, char * outputdir){ | |
1277 | |
1278 char * argv[7]; | |
1279 int argvctr=0; | |
1280 int apierror=0; | |
1281 | |
1282 argv[argvctr++]="audioDB"; | |
1283 argv[argvctr++]="--DUMP"; | |
1284 argv[argvctr++]="-d"; | |
1285 argv[argvctr++]=mydb->dbname; | |
1286 argv[argvctr++]="--output"; | |
1287 argv[argvctr++]=(char *)outputdir; | |
1288 argv[argvctr+1]='\0'; | |
1289 | |
1290 audioDB::audioDB(6,argv,&apierror); | |
1291 | |
1292 return apierror; | |
1293 } | |
1294 | |
1295 int audiodb_l2norm(adb_ptr mydb){ | |
1296 | |
1297 char * argv[5]; | |
1298 int apierror=0; | |
1299 | |
1300 argv[0]="audioDB"; | |
1301 argv[1]="--L2NORM"; | |
1302 argv[2]="-d"; | |
1303 argv[3]=mydb->dbname; | |
1304 argv[4]='\0'; | |
1305 | |
1306 audioDB::audioDB(4,argv,&apierror); | |
1307 return apierror; | |
1308 } | |
1309 | |
1310 int audiodb_power(adb_ptr mydb){ | |
1311 | |
1312 char * argv[5]; | |
1313 int apierror=0; | |
1314 | |
1315 argv[0]="audioDB"; | |
1316 argv[1]="--POWER"; | |
1317 argv[2]="-d"; | |
1318 argv[3]=mydb->dbname; | |
1319 argv[4]='\0'; | |
1320 | |
1321 audioDB::audioDB(4,argv,&apierror); | |
1322 return apierror; | |
1323 } | |
1324 | |
1325 adb_ptr audiodb_open(char * path){ | |
1326 | |
1327 adb_ptr mydbp; | |
1328 adbstatus mystatus; | |
1329 | |
1330 /* if db exists */ | |
1331 | |
1332 if (open(path, O_EXCL) != -1){ | |
1333 | |
1334 mydbp=(adb_ptr)malloc(sizeof(adb)); | |
1335 mydbp->dbname=(char *)malloc(sizeof(path)); | |
1336 | |
1337 strcpy(mydbp->dbname,path); | |
1338 | |
1339 audiodb_status(mydbp, &mystatus); | |
1340 mydbp->ntracks=mystatus.numFiles; | |
1341 mydbp->datadim=mystatus.dim; | |
1342 | |
1343 return mydbp; | |
1344 } | |
1345 | |
1346 return NULL; | |
1347 }; | |
1348 | |
1349 | |
1350 | |
1351 void audiodb_close(adb_ptr db){ | |
1352 | |
1353 free(db->dbname); | |
1354 free(db); | |
1355 | |
1356 } | |
1357 | |
1358 | |
1359 } | |
1360 |