Mercurial > hg > audiodb
view audioDBws.h @ 395:bc7a821004bb api-inversion
Invert audioDB::status / audiodb_status().
To do that without breaking abstractions, we actually need a new field
in the status structure, storing the size of the data region.
Previously, this was computed in the audioDB::status request from the
database header, but I'm assuming that "user" code doesn't have access
to such internals. While we're at it, name some intermediate values in
audioDB::status() so that I don't get confused.
Here's the thing, though: we need to make sure that the adb_t * that we
have from audiodb_open() or audiodb_create() is propagated all the way
through into the C++ routines that implement library functions -- in
particular those which actually write to the database; otherwise we
won't have a consistent view in memory of the header on-disk (as the adb
header that will have been written to disk won't be the same as the one
in memory).
We can do that, by altering the "API" audioDB constructors to take the
adb_t * argument, and setting the adb field in the audioDB object that
we've already introduced to that. But now we need to be careful a
couple of times: if we have one, then audioDB::initTables() mustn't
stomp on it; also, if we're only constructing an audioDB instance to
fulfil an API request, we mustn't audiodb_close() the one we have when
we destroy the audioDB object, because the adb_t * is the one we have
passed in and are going to reuse in later calls to the API.
The good news is that we can be careful in just these ways with minimal
code. The really good news is that once the inversion is complete, all
of this horribleness will automatically go away (as there will be no
code which constructs audioDB objects to fulfil API functions). Hooray!
It's almost like it was all planned this way.
author | mas01cr |
---|---|
date | Tue, 25 Nov 2008 16:41:01 +0000 |
parents | 4871a3ed9e36 |
children | add65705e655 |
line wrap: on
line source
// audioDBws.h -- web services interface to audioDB // //FIXME: this hard-coding of the service location might be right for //its internal use at Goldsmiths (for now) but really isn't in //general. Find a way to bind this later (at install time? Or maybe //just require that the installer edit the resulting wsdl file?) // //gsoap adb service location: http://gibbons.doc.gold.ac.uk:20703/ typedef int xsd__int; typedef double xsd__double; typedef char* xsd__string; // Supports result lists of arbitrary length struct adb__queryResult{ int __sizeRlist; char **Rlist; // Maximum size of result list int __sizeDist; double *Dist; int __sizeQpos; unsigned int *Qpos; int __sizeSpos; unsigned int *Spos; }; struct adb__statusResult { unsigned numFiles; unsigned dim; unsigned length; unsigned dudCount; unsigned nullCount; unsigned flags; }; struct adb__statusResponse { struct adb__statusResult result; }; struct adb__queryResponse { struct adb__queryResult result; }; struct adb__lisztResult { int __sizeRkey; char **Rkey; int __sizeRlen; unsigned int *Rlen; }; struct adb__queryVector { int dim; // dimensionality of the feature (d) int __sizev; // l x d : double *v; // pointer to query data int __sizep; double *p; }; struct adb__lisztResponse { struct adb__lisztResult result; }; // Print the status of an existing adb database int adb__status(xsd__string dbName, struct adb__statusResponse &adbStatusResponse); // Print the status of an existing adb database int adb__liszt(xsd__string dbName, xsd__int lisztOffset, xsd__int lisztLength, struct adb__lisztResponse &adbLisztResponse); // Query an existing adb database int adb__query(xsd__string dbName, xsd__string qKey, xsd__string keyList, xsd__string timesFileName, xsd__string powerFileName, xsd__int qType, xsd__int qPos, xsd__int pointNN, xsd__int segNN, xsd__int segLen, xsd__double radius, xsd__double absolute_threshold, xsd__double relative_threshold, xsd__int exhaustive, xsd__int lsh_exact, struct adb__queryResponse &adbQueryResponse); int adb__sequenceQueryByKey(xsd__string dbName,xsd__string trackKey, xsd__string featureFileName, xsd__int queryType,xsd__string trackFileName,xsd__string timesFileName,xsd__int queryPoint,xsd__int pointNN,xsd__int trackNN,xsd__int sequenceLength,xsd__double radius,xsd__double absolute_threshold,xsd__int usingQueryPoint,xsd__int lsh_exact,struct adb__queryResponse &adbQueryResponse); // Query an audioDB database by vector (serialized), queryKey/featureFileName is here replaced with qVector int adb__shingleQuery(xsd__string dbName, struct adb__queryVector qVector, xsd__string keyList, xsd__string timesFileName, xsd__int queryType, xsd__int queryPos, xsd__int pointNN, xsd__int trackNN, xsd__int sequenceLength, xsd__double radius, xsd__double absolute_threshold, xsd__double relative_threshold, xsd__int exhaustive, xsd__int lsh_exact, struct adb__queryResponse &adbQueryResponse);