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