| /* |
| ** 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_ */ |