annotate audioDB_API.h @ 507:e7fd50483311

Free bits of the datum constructed in audioDB::query. We're not quite safe: error calls between allocation of some of these bits and pieces and their use will cause failure... but not freeing things here is definitely wrong.
author mas01cr
date Tue, 13 Jan 2009 21:37:10 +0000
parents 342822c2d49a
children cc2b97d020b1
rev   line source
mas01cr@498 1 #ifndef AUDIODB_API_H
mas01cr@498 2 #define AUDIODB_API_H
mas01cr@498 3
mas01cr@498 4 #include <stdbool.h>
mas01cr@498 5 #include <stdint.h>
mas01cr@498 6
mas01ik@355 7 /* for API questions contact
mas01ik@355 8 * Christophe Rhodes c.rhodes@gold.ac.uk
mas01ik@355 9 * Ian Knopke mas01ik@gold.ac.uk, ian.knopke@gmail.com */
mas01ik@355 10
mas01cr@498 11 /* Temporary workarounds */
mas01cr@498 12 typedef struct dbTableHeader adb_header_t;
mas01cr@498 13 int acquire_lock(int, bool);
mas01cr@498 14 int divest_lock(int);
mas01cr@498 15
mas01ik@355 16
mas01ik@355 17 /*******************************************************************/
mas01ik@355 18 /* Data types for API */
mas01ik@355 19
mas01ik@355 20 /* The main struct that stores the name of the database, and in future will hold all
mas01ik@355 21 * kinds of other interesting information */
mas01ik@355 22 /* This basically gets passed around to all of the other functions */
mas01ik@355 23
mas01cr@498 24 /* FIXME: it might be that "adb_" isn't such a good prefix to use, and
mas01cr@498 25 that we should prefer "audiodb_". Or else maybe we should be
mas01cr@498 26 calling ourselves libadb? */
mas01cr@498 27 typedef struct adb adb_t, *adb_ptr;
mas01ik@355 28
mas01cr@498 29 struct adb_datum {
mas01cr@498 30 uint32_t nvectors;
mas01cr@498 31 uint32_t dim;
mas01cr@498 32 const char *key;
mas01cr@498 33 double *data;
mas01cr@498 34 double *power;
mas01cr@498 35 double *times;
mas01ik@355 36 };
mas01cr@498 37 typedef struct adb_datum adb_datum_t;
mas01ik@355 38
mas01ik@355 39 //used for both insert and batchinsert
mas01ik@355 40 struct adbinsert {
mas01cr@498 41 const char *features;
mas01cr@498 42 const char *power;
mas01cr@498 43 const char *key;
mas01cr@498 44 const char *times;
mas01ik@355 45 };
mas01cr@498 46 typedef struct adbinsert adb_insert_t, adb_reference_t, *adb_insert_ptr;
mas01ik@355 47
mas01ik@355 48 /* struct for returning status results */
mas01ik@355 49 struct adbstatus {
mas01ik@355 50 unsigned int numFiles;
mas01ik@355 51 unsigned int dim;
mas01ik@355 52 unsigned int dudCount;
mas01ik@355 53 unsigned int nullCount;
mas01ik@355 54 unsigned int flags;
mas01cr@498 55 uint64_t length;
mas01cr@498 56 uint64_t data_region_size;
mas01ik@355 57 };
mas01ik@355 58 typedef struct adbstatus adb_status_t, *adb_status_ptr;
mas01ik@355 59
mas01ik@355 60 /* needed for constructing a query */
mas01ik@355 61 struct adbquery {
mas01ik@355 62
mas01ik@355 63 char * querytype;
mas01ik@355 64 char * feature; //usually a file of some kind
mas01ik@396 65 char * key;
mas01ik@355 66 char * power; //also a file
mas01ik@355 67 char * keylist; //also a file
mas01ik@355 68 char * qpoint; //position
mas01ik@355 69 char * numpoints;
mas01ik@355 70 char * radius;
mas01ik@355 71 char * resultlength; //how many results to make
mas01ik@355 72 char * sequencelength;
mas01ik@355 73 char * sequencehop;
mas01ik@355 74 double absolute_threshold;
mas01ik@355 75 double relative_threshold;
mas01ik@355 76 int exhaustive; //hidden option in gengetopt
mas01ik@355 77 double expandfactor; //hidden
mas01ik@355 78 int rotate; //hidden
mas01ik@355 79
mas01ik@355 80 };
mas01ik@355 81 typedef struct adbquery adb_query_t,*adb_query_ptr;
mas01ik@355 82
mas01ik@355 83 /* ... and for getting query results back */
mas01ik@355 84 struct adbqueryresult {
mas01ik@355 85
mas01ik@355 86 int sizeRlist; /* do I really need to return all 4 sizes here */
mas01ik@355 87 int sizeDist;
mas01ik@355 88 int sizeQpos;
mas01ik@355 89 int sizeSpos;
mas01ik@355 90 char **Rlist;
mas01ik@355 91 double *Dist;
mas01ik@355 92 unsigned int *Qpos;
mas01ik@355 93 unsigned int *Spos;
mas01ik@355 94
mas01ik@355 95 };
mas01ik@355 96 typedef struct adbqueryresult adb_queryresult_t, *adb_queryresult_ptr;
mas01ik@355 97
mas01cr@498 98 /* New ("new" == December 2008) query API */
mas01cr@498 99
mas01cr@498 100 typedef struct adbresult {
mas01cr@498 101 const char *key;
mas01cr@498 102 double dist;
mas01cr@498 103 uint32_t qpos;
mas01cr@498 104 uint32_t ipos;
mas01cr@498 105 } adb_result_t;
mas01cr@498 106
mas01cr@498 107 #define ADB_REFINE_INCLUDE_KEYLIST 1
mas01cr@498 108 #define ADB_REFINE_EXCLUDE_KEYLIST 2
mas01cr@498 109 #define ADB_REFINE_RADIUS 4
mas01cr@498 110 #define ADB_REFINE_ABSOLUTE_THRESHOLD 8
mas01cr@498 111 #define ADB_REFINE_RELATIVE_THRESHOLD 16
mas01cr@498 112 #define ADB_REFINE_DURATION_RATIO 32
mas01cr@498 113 #define ADB_REFINE_HOP_SIZE 64
mas01cr@498 114
mas01cr@498 115 typedef struct adbkeylist {
mas01cr@498 116 uint32_t nkeys;
mas01cr@498 117 const char **keys;
mas01cr@498 118 } adb_keylist_t;
mas01cr@498 119
mas01cr@498 120 typedef struct adbqueryrefine {
mas01cr@498 121 uint32_t flags;
mas01cr@498 122 adb_keylist_t include;
mas01cr@498 123 adb_keylist_t exclude;
mas01cr@498 124 double radius;
mas01cr@498 125 double absolute_threshold;
mas01cr@498 126 double relative_threshold;
mas01cr@498 127 double duration_ratio; /* expandfactor */
mas01cr@498 128 uint32_t hopsize;
mas01cr@498 129 } adb_query_refine_t;
mas01cr@498 130
mas01cr@498 131 #define ADB_ACCUMULATION_DB 1
mas01cr@498 132 #define ADB_ACCUMULATION_PER_TRACK 2
mas01cr@498 133 #define ADB_ACCUMULATION_ONE_TO_ONE 3
mas01cr@498 134
mas01cr@498 135 #define ADB_DISTANCE_DOT_PRODUCT 1
mas01cr@498 136 #define ADB_DISTANCE_EUCLIDEAN_NORMED 2
mas01cr@498 137 #define ADB_DISTANCE_EUCLIDEAN 3
mas01cr@498 138
mas01cr@498 139 typedef struct adbqueryparameters {
mas01cr@498 140 uint32_t accumulation;
mas01cr@498 141 uint32_t distance;
mas01cr@498 142 uint32_t npoints;
mas01cr@498 143 uint32_t ntracks;
mas01cr@498 144 } adb_query_parameters_t;
mas01cr@498 145
mas01cr@498 146 typedef struct adbqueryresults {
mas01cr@498 147 uint32_t nresults;
mas01cr@498 148 adb_result_t *results;
mas01cr@498 149 } adb_query_results_t;
mas01cr@498 150
mas01cr@498 151 #define ADB_QID_FLAG_EXHAUSTIVE 1
mas01cr@498 152 #define ADB_QID_FLAG_ALLOW_FALSE_POSITIVES 2
mas01cr@498 153
mas01cr@498 154 typedef struct adbqueryid {
mas01cr@498 155 adb_datum_t *datum;
mas01cr@498 156 uint32_t sequence_length;
mas01cr@498 157 uint32_t flags;
mas01cr@498 158 uint32_t sequence_start;
mas01cr@498 159 } adb_query_id_t;
mas01cr@498 160
mas01cr@498 161 typedef struct adbqueryspec {
mas01cr@498 162 adb_query_id_t qid;
mas01cr@498 163 adb_query_parameters_t params;
mas01cr@498 164 adb_query_refine_t refine;
mas01cr@498 165 } adb_query_spec_t;
mas01ik@355 166
mas01ik@355 167 /*******************************************************************/
mas01ik@355 168 /* Function prototypes for API */
mas01ik@355 169
mas01ik@355 170 /* open an existing database */
mas01ik@355 171 /* returns a struct or NULL on failure */
mas01cr@498 172 adb_ptr audiodb_open(const char *path, int flags);
mas01ik@355 173
mas01ik@355 174 /* create a new database */
mas01ik@355 175 /* returns a struct or NULL on failure */
mas01cr@381 176 adb_ptr audiodb_create(const char *path, unsigned datasize, unsigned ntracks, unsigned datadim);
mas01ik@355 177
mas01ik@355 178 /* close a database */
mas01ik@355 179 void audiodb_close(adb_ptr db);
mas01ik@355 180
mas01ik@355 181 /* You'll need to turn both of these on to do anything useful */
mas01ik@355 182 int audiodb_l2norm(adb_ptr mydb);
mas01ik@355 183 int audiodb_power(adb_ptr mydb);
mas01ik@355 184
mas01ik@355 185 /* insert functions */
mas01cr@498 186 int audiodb_insert_datum(adb_t *, const adb_datum_t *);
mas01cr@498 187 int audiodb_insert_reference(adb_t *, const adb_reference_t *);
mas01ik@355 188 int audiodb_insert(adb_ptr mydb, adb_insert_ptr ins);
mas01ik@355 189 int audiodb_batchinsert(adb_ptr mydb, adb_insert_ptr ins, unsigned int size);
mas01ik@355 190
mas01ik@355 191 /* query function */
mas01ik@355 192 int audiodb_query(adb_ptr mydb, adb_query_ptr adbq, adb_queryresult_ptr adbqres);
mas01cr@498 193 adb_query_results_t *audiodb_query_spec(adb_t *, const adb_query_spec_t *);
mas01cr@498 194 int audiodb_query_free_results(adb_t *, const adb_query_spec_t *, adb_query_results_t *);
mas01cr@498 195
mas01ik@355 196 /* database status */
mas01ik@355 197 int audiodb_status(adb_ptr mydb, adb_status_ptr status);
mas01ik@355 198
mas01ik@355 199 /* varoius dump formats */
mas01cr@498 200 int audiodb_dump(adb_ptr mydb, const char *outputdir);
mas01ik@355 201
mas01cr@498 202 #endif