Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add the geopoly_json() interface. Untested. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | geojson |
Files: | files | file ages | folders |
SHA3-256: |
25695c80a01d18bc533d6c741076452d |
User & Date: | drh 2018-05-09 15:00:36.551 |
Context
2018-05-09
| ||
15:19 | Merge from trunk the ability to use sqlite3_sql interfaces in extensions. (check-in: 5bb9e6a9f1 user: drh tags: geojson) | |
15:00 | Add the geopoly_json() interface. Untested. (check-in: 25695c80a0 user: drh tags: geojson) | |
14:33 | Merge trunk changes, and especially the newly published sqlite3_str interface. (check-in: f3609aefe8 user: drh tags: geojson) | |
Changes
Changes to ext/misc/geopoly.c.
︙ | ︙ | |||
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 | int argc, sqlite3_value **argv ){ GeoPoly *p = geopolyFuncParam(context, argv[0]); if( p ){ sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); } } /* ** Implementation of the geopoly_area(X) function. ** ** If the input is a well-formed Geopoly BLOB then return the area ** enclosed by the polygon. Otherwise return NULL. */ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 | int argc, sqlite3_value **argv ){ GeoPoly *p = geopolyFuncParam(context, argv[0]); if( p ){ sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); sqlite3_free(p); } } /* ** SQL function: geopoly_json(X) ** ** Interpret X as a polygon and render it as a JSON array ** of coordinates. Or, if X is not a valid polygon, return NULL. */ static void geopolyJsonFunc( sqlite3_context *context, int argc, sqlite3_value **argv ){ GeoPoly *p = geopolyFuncParam(context, argv[0]); if( p ){ sqlite3 *db = sqlite3_context_db_pointer(context); sqlite3_str *x = sqlite3_str_new(db); int i; sqlite3_str_append(x, "[", 1); for(i=0; i<p->nVertex; i++){ sqlite3_str_appendf(x, "[%g,%g]", p->a[i*2], p->a[i*2+1]); sqlite3_str_append(x, i==p->nVertex-1 ? "]" : ",", 1); } sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); sqlite3_free(p); } } /* ** Implementation of the geopoly_area(X) function. ** ** If the input is a well-formed Geopoly BLOB then return the area ** enclosed by the polygon. Otherwise return NULL. */ |
︙ | ︙ | |||
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 | static const struct { void (*xFunc)(sqlite3_context*,int,sqlite3_value**); int nArg; const char *zName; } aFunc[] = { { geopolyAreaFunc, 1, "geopoly_area" }, { geopolyBlobFunc, 1, "geopoly_blob" }, }; int i; SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg, SQLITE_UTF8, 0, aFunc[i].xFunc, 0, 0); } return rc; } | > | 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 | static const struct { void (*xFunc)(sqlite3_context*,int,sqlite3_value**); int nArg; const char *zName; } aFunc[] = { { geopolyAreaFunc, 1, "geopoly_area" }, { geopolyBlobFunc, 1, "geopoly_blob" }, { geopolyJsonFunc, 1, "geopoly_json" }, }; int i; SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg, SQLITE_UTF8, 0, aFunc[i].xFunc, 0, 0); } return rc; } |