118 lines
4.0 KiB
C
118 lines
4.0 KiB
C
/*
|
|
** 2010 August 30
|
|
**
|
|
** The author disclaims copyright to this source code. In place of
|
|
** a legal notice, here is a blessing:
|
|
**
|
|
** May you do good and not evil.
|
|
** May you find forgiveness for yourself and forgive others.
|
|
** May you share freely, never taking more than you give.
|
|
**
|
|
*************************************************************************
|
|
*/
|
|
|
|
#ifndef _SQLITE3RTREE_H_
|
|
#define _SQLITE3RTREE_H_
|
|
|
|
#include <sqlite3.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry;
|
|
typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info;
|
|
|
|
/* The double-precision datatype used by RTree depends on the
|
|
** SQLITE_RTREE_INT_ONLY compile-time option.
|
|
*/
|
|
#ifdef SQLITE_RTREE_INT_ONLY
|
|
typedef sqlite3_int64 sqlite3_rtree_dbl;
|
|
#else
|
|
typedef double sqlite3_rtree_dbl;
|
|
#endif
|
|
|
|
/*
|
|
** Register a geometry callback named zGeom that can be used as part of an
|
|
** R-Tree geometry query as follows:
|
|
**
|
|
** SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zGeom(... params ...)
|
|
*/
|
|
int sqlite3_rtree_geometry_callback(
|
|
sqlite3 *db,
|
|
const char *zGeom,
|
|
int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*),
|
|
void *pContext
|
|
);
|
|
|
|
|
|
/*
|
|
** A pointer to a structure of the following type is passed as the first
|
|
** argument to callbacks registered using rtree_geometry_callback().
|
|
*/
|
|
struct sqlite3_rtree_geometry {
|
|
void *pContext; /* Copy of pContext passed to s_r_g_c() */
|
|
int nParam; /* Size of array aParam[] */
|
|
sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */
|
|
void *pUser; /* Callback implementation user data */
|
|
void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */
|
|
};
|
|
|
|
/*
|
|
** Register a 2nd-generation geometry callback named zScore that can be
|
|
** used as part of an R-Tree geometry query as follows:
|
|
**
|
|
** SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zQueryFunc(... params ...)
|
|
*/
|
|
int sqlite3_rtree_query_callback(
|
|
sqlite3 *db,
|
|
const char *zQueryFunc,
|
|
int (*xQueryFunc)(sqlite3_rtree_query_info*),
|
|
void *pContext,
|
|
void (*xDestructor)(void*)
|
|
);
|
|
|
|
|
|
/*
|
|
** A pointer to a structure of the following type is passed as the
|
|
** argument to scored geometry callback registered using
|
|
** sqlite3_rtree_query_callback().
|
|
**
|
|
** Note that the first 5 fields of this structure are identical to
|
|
** sqlite3_rtree_geometry. This structure is a subclass of
|
|
** sqlite3_rtree_geometry.
|
|
*/
|
|
struct sqlite3_rtree_query_info {
|
|
void *pContext; /* pContext from when function registered */
|
|
int nParam; /* Number of function parameters */
|
|
sqlite3_rtree_dbl *aParam; /* value of function parameters */
|
|
void *pUser; /* callback can use this, if desired */
|
|
void (*xDelUser)(void*); /* function to free pUser */
|
|
sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */
|
|
unsigned int *anQueue; /* Number of pending entries in the queue */
|
|
int nCoord; /* Number of coordinates */
|
|
int iLevel; /* Level of current node or entry */
|
|
int mxLevel; /* The largest iLevel value in the tree */
|
|
sqlite3_int64 iRowid; /* Rowid for current entry */
|
|
sqlite3_rtree_dbl rParentScore; /* Score of parent node */
|
|
int eParentWithin; /* Visibility of parent node */
|
|
int eWithin; /* OUT: Visibility */
|
|
sqlite3_rtree_dbl rScore; /* OUT: Write the score here */
|
|
/* The following fields are only available in 3.8.11 and later */
|
|
sqlite3_value **apSqlParam; /* Original SQL values of parameters */
|
|
};
|
|
|
|
/*
|
|
** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin.
|
|
*/
|
|
#define NOT_WITHIN 0 /* Object completely outside of query region */
|
|
#define PARTLY_WITHIN 1 /* Object partially overlaps query region */
|
|
#define FULLY_WITHIN 2 /* Object fully contained within query region */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} /* end of the 'extern "C"' block */
|
|
#endif
|
|
|
|
#endif /* ifndef _SQLITE3RTREE_H_ */
|