0000: 2f 2a 0a 0a 20 74 6f 70 6f 5f 63 61 6c 6c 62 61 /*.. topo_callba
0010: 63 6b 73 2e 63 20 2d 2d 20 69 6d 70 6c 65 6d 65 cks.c -- impleme
0020: 6e 74 61 74 69 6f 6e 20 6f 66 20 54 6f 70 6f 6c ntation of Topol
0030: 6f 67 79 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e ogy callback fun
0040: 63 74 69 6f 6e 73 20 0a 20 20 20 20 0a 20 76 65 ctions . . ve
0050: 72 73 69 6f 6e 20 34 2e 33 2c 20 32 30 31 35 20 rsion 4.3, 2015
0060: 4a 75 6c 79 20 31 38 0a 0a 20 41 75 74 68 6f 72 July 18.. Author
0070: 3a 20 53 61 6e 64 72 6f 20 46 75 72 69 65 72 69 : Sandro Furieri
0080: 20 61 2e 66 75 72 69 65 72 69 40 6c 71 74 2e 69 a.furieri@lqt.i
0090: 74 0a 0a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d t.. ------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00e0: 2d 0a 20 0a 20 56 65 72 73 69 6f 6e 3a 20 4d 50 -. . Version: MP
00f0: 4c 20 31 2e 31 2f 47 50 4c 20 32 2e 30 2f 4c 47 L 1.1/GPL 2.0/LG
0100: 50 4c 20 32 2e 31 0a 20 0a 20 54 68 65 20 63 6f PL 2.1. . The co
0110: 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 66 ntents of this f
0120: 69 6c 65 20 61 72 65 20 73 75 62 6a 65 63 74 20 ile are subject
0130: 74 6f 20 74 68 65 20 4d 6f 7a 69 6c 6c 61 20 50 to the Mozilla P
0140: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 56 65 ublic License Ve
0150: 72 73 69 6f 6e 0a 20 31 2e 31 20 28 74 68 65 20 rsion. 1.1 (the
0160: 22 4c 69 63 65 6e 73 65 22 29 3b 20 79 6f 75 20 "License"); you
0170: 6d 61 79 20 6e 6f 74 20 75 73 65 20 74 68 69 73 may not use this
0180: 20 66 69 6c 65 20 65 78 63 65 70 74 20 69 6e 20 file except in
0190: 63 6f 6d 70 6c 69 61 6e 63 65 20 77 69 74 68 0a compliance with.
01a0: 20 74 68 65 20 4c 69 63 65 6e 73 65 2e 20 59 6f the License. Yo
01b0: 75 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 63 u may obtain a c
01c0: 6f 70 79 20 6f 66 20 74 68 65 20 4c 69 63 65 6e opy of the Licen
01d0: 73 65 20 61 74 0a 20 68 74 74 70 3a 2f 2f 77 77 se at. http://ww
01e0: 77 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 4d 50 w.mozilla.org/MP
01f0: 4c 2f 0a 20 0a 53 6f 66 74 77 61 72 65 20 64 69 L/. .Software di
0200: 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20 stributed under
0210: 74 68 65 20 4c 69 63 65 6e 73 65 20 69 73 20 64 the License is d
0220: 69 73 74 72 69 62 75 74 65 64 20 6f 6e 20 61 6e istributed on an
0230: 20 22 41 53 20 49 53 22 20 62 61 73 69 73 2c 0a "AS IS" basis,.
0240: 57 49 54 48 4f 55 54 20 57 41 52 52 41 4e 54 59 WITHOUT WARRANTY
0250: 20 4f 46 20 41 4e 59 20 4b 49 4e 44 2c 20 65 69 OF ANY KIND, ei
0260: 74 68 65 72 20 65 78 70 72 65 73 73 20 6f 72 20 ther express or
0270: 69 6d 70 6c 69 65 64 2e 20 53 65 65 20 74 68 65 implied. See the
0280: 20 4c 69 63 65 6e 73 65 0a 66 6f 72 20 74 68 65 License.for the
0290: 20 73 70 65 63 69 66 69 63 20 6c 61 6e 67 75 61 specific langua
02a0: 67 65 20 67 6f 76 65 72 6e 69 6e 67 20 72 69 67 ge governing rig
02b0: 68 74 73 20 61 6e 64 20 6c 69 6d 69 74 61 74 69 hts and limitati
02c0: 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 0a 4c 69 ons under the.Li
02d0: 63 65 6e 73 65 2e 0a 0a 54 68 65 20 4f 72 69 67 cense...The Orig
02e0: 69 6e 61 6c 20 43 6f 64 65 20 69 73 20 74 68 65 inal Code is the
02f0: 20 53 70 61 74 69 61 4c 69 74 65 20 6c 69 62 72 SpatiaLite libr
0300: 61 72 79 0a 0a 54 68 65 20 49 6e 69 74 69 61 6c ary..The Initial
0310: 20 44 65 76 65 6c 6f 70 65 72 20 6f 66 20 74 68 Developer of th
0320: 65 20 4f 72 69 67 69 6e 61 6c 20 43 6f 64 65 20 e Original Code
0330: 69 73 20 41 6c 65 73 73 61 6e 64 72 6f 20 46 75 is Alessandro Fu
0340: 72 69 65 72 69 0a 20 0a 50 6f 72 74 69 6f 6e 73 rieri. .Portions
0350: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 created by the
0360: 49 6e 69 74 69 61 6c 20 44 65 76 65 6c 6f 70 65 Initial Develope
0370: 72 20 61 72 65 20 43 6f 70 79 72 69 67 68 74 20 r are Copyright
0380: 28 43 29 20 32 30 31 35 0a 74 68 65 20 49 6e 69 (C) 2015.the Ini
0390: 74 69 61 6c 20 44 65 76 65 6c 6f 70 65 72 2e 20 tial Developer.
03a0: 41 6c 6c 20 52 69 67 68 74 73 20 52 65 73 65 72 All Rights Reser
03b0: 76 65 64 2e 0a 0a 43 6f 6e 74 72 69 62 75 74 6f ved...Contributo
03c0: 72 28 73 29 3a 20 0a 0a 41 6c 74 65 72 6e 61 74 r(s): ..Alternat
03d0: 69 76 65 6c 79 2c 20 74 68 65 20 63 6f 6e 74 65 ively, the conte
03e0: 6e 74 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 nts of this file
03f0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 75 6e 64 may be used und
0400: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 0a er the terms of.
0410: 65 69 74 68 65 72 20 74 68 65 20 47 4e 55 20 47 either the GNU G
0420: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 eneral Public Li
0430: 63 65 6e 73 65 20 56 65 72 73 69 6f 6e 20 32 20 cense Version 2
0440: 6f 72 20 6c 61 74 65 72 20 28 74 68 65 20 22 47 or later (the "G
0450: 50 4c 22 29 2c 20 6f 72 0a 74 68 65 20 47 4e 55 PL"), or.the GNU
0460: 20 4c 65 73 73 65 72 20 47 65 6e 65 72 61 6c 20 Lesser General
0470: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 56 Public License V
0480: 65 72 73 69 6f 6e 20 32 2e 31 20 6f 72 20 6c 61 ersion 2.1 or la
0490: 74 65 72 20 28 74 68 65 20 22 4c 47 50 4c 22 29 ter (the "LGPL")
04a0: 2c 0a 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 ,.in which case
04b0: 74 68 65 20 70 72 6f 76 69 73 69 6f 6e 73 20 6f the provisions o
04c0: 66 20 74 68 65 20 47 50 4c 20 6f 72 20 74 68 65 f the GPL or the
04d0: 20 4c 47 50 4c 20 61 72 65 20 61 70 70 6c 69 63 LGPL are applic
04e0: 61 62 6c 65 20 69 6e 73 74 65 61 64 0a 6f 66 20 able instead.of
04f0: 74 68 6f 73 65 20 61 62 6f 76 65 2e 20 49 66 20 those above. If
0500: 79 6f 75 20 77 69 73 68 20 74 6f 20 61 6c 6c 6f you wish to allo
0510: 77 20 75 73 65 20 6f 66 20 79 6f 75 72 20 76 65 w use of your ve
0520: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 rsion of this fi
0530: 6c 65 20 6f 6e 6c 79 0a 75 6e 64 65 72 20 74 68 le only.under th
0540: 65 20 74 65 72 6d 73 20 6f 66 20 65 69 74 68 65 e terms of eithe
0550: 72 20 74 68 65 20 47 50 4c 20 6f 72 20 74 68 65 r the GPL or the
0560: 20 4c 47 50 4c 2c 20 61 6e 64 20 6e 6f 74 20 74 LGPL, and not t
0570: 6f 20 61 6c 6c 6f 77 20 6f 74 68 65 72 73 20 74 o allow others t
0580: 6f 0a 75 73 65 20 79 6f 75 72 20 76 65 72 73 69 o.use your versi
0590: 6f 6e 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 on of this file
05a0: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 under the terms
05b0: 6f 66 20 74 68 65 20 4d 50 4c 2c 20 69 6e 64 69 of the MPL, indi
05c0: 63 61 74 65 20 79 6f 75 72 0a 64 65 63 69 73 69 cate your.decisi
05d0: 6f 6e 20 62 79 20 64 65 6c 65 74 69 6e 67 20 74 on by deleting t
05e0: 68 65 20 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 he provisions ab
05f0: 6f 76 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 ove and replace
0600: 74 68 65 6d 20 77 69 74 68 20 74 68 65 20 6e 6f them with the no
0610: 74 69 63 65 0a 61 6e 64 20 6f 74 68 65 72 20 70 tice.and other p
0620: 72 6f 76 69 73 69 6f 6e 73 20 72 65 71 75 69 72 rovisions requir
0630: 65 64 20 62 79 20 74 68 65 20 47 50 4c 20 6f 72 ed by the GPL or
0640: 20 74 68 65 20 4c 47 50 4c 2e 20 49 66 20 79 6f the LGPL. If yo
0650: 75 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 0a u do not delete.
0660: 74 68 65 20 70 72 6f 76 69 73 69 6f 6e 73 20 61 the provisions a
0670: 62 6f 76 65 2c 20 61 20 72 65 63 69 70 69 65 6e bove, a recipien
0680: 74 20 6d 61 79 20 75 73 65 20 79 6f 75 72 20 76 t may use your v
0690: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 66 ersion of this f
06a0: 69 6c 65 20 75 6e 64 65 72 0a 74 68 65 20 74 65 ile under.the te
06b0: 72 6d 73 20 6f 66 20 61 6e 79 20 6f 6e 65 20 6f rms of any one o
06c0: 66 20 74 68 65 20 4d 50 4c 2c 20 74 68 65 20 47 f the MPL, the G
06d0: 50 4c 20 6f 72 20 74 68 65 20 4c 47 50 4c 2e 0a PL or the LGPL..
06e0: 20 0a 2a 2f 0a 0a 2f 2a 0a 20 0a 43 52 45 44 49 .*/../*. .CREDI
06f0: 54 53 3a 0a 0a 74 68 69 73 20 6d 6f 64 75 6c 65 TS:..this module
0700: 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 has been comple
0710: 74 65 6c 79 20 66 75 6e 64 65 64 20 62 79 3a 0a tely funded by:.
0720: 52 65 67 69 6f 6e 65 20 54 6f 73 63 61 6e 61 20 Regione Toscana
0730: 2d 20 53 65 74 74 6f 72 65 20 53 69 73 74 65 6d - Settore Sistem
0740: 61 20 49 6e 66 6f 72 6d 61 74 69 76 6f 20 54 65 a Informativo Te
0750: 72 72 69 74 6f 72 69 61 6c 65 20 65 64 20 41 6d rritoriale ed Am
0760: 62 69 65 6e 74 61 6c 65 0a 28 54 6f 70 6f 6c 6f bientale.(Topolo
0770: 67 79 20 73 75 70 70 6f 72 74 29 20 0a 0a 43 49 gy support) ..CI
0780: 47 3a 20 36 30 33 38 30 31 39 41 45 35 0a 0a 2a G: 6038019AE5..*
0790: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 /..#include <std
07a0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 lib.h>.#include
07b0: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 <stdio.h>.#inclu
07c0: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 de <string.h>.#i
07d0: 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e 68 3e 0a nclude <math.h>.
07e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 .#if defined(_WI
07f0: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 N32) && !defined
0800: 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23 69 (__MINGW32__).#i
0810: 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2d 6d nclude "config-m
0820: 73 76 63 2e 68 22 0a 23 65 6c 73 65 0a 23 69 6e svc.h".#else.#in
0830: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 clude "config.h"
0840: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 .#endif..#ifdef
0850: 45 4e 41 42 4c 45 5f 52 54 54 4f 50 4f 09 09 2f ENABLE_RTTOPO../
0860: 2a 20 6f 6e 6c 79 20 69 66 20 52 54 54 4f 50 4f * only if RTTOPO
0870: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 0a is enabled */..
0880: 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 #include <spatia
0890: 6c 69 74 65 2f 73 71 6c 69 74 65 2e 68 3e 0a 23 lite/sqlite.h>.#
08a0: 69 6e 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c include <spatial
08b0: 69 74 65 2f 64 65 62 75 67 2e 68 3e 0a 23 69 6e ite/debug.h>.#in
08c0: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74 clude <spatialit
08d0: 65 2f 67 61 69 61 67 65 6f 2e 68 3e 0a 23 69 6e e/gaiageo.h>.#in
08e0: 63 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74 clude <spatialit
08f0: 65 2f 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 2e e/gaia_topology.
0900: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 61 h>.#include <spa
0910: 74 69 61 6c 69 74 65 2f 67 61 69 61 61 75 78 2e tialite/gaiaaux.
0920: 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 70 h>..#include <sp
0930: 61 74 69 61 6c 69 74 65 2e 68 3e 0a 23 69 6e 63 atialite.h>.#inc
0940: 6c 75 64 65 20 3c 73 70 61 74 69 61 6c 69 74 65 lude <spatialite
0950: 5f 70 72 69 76 61 74 65 2e 68 3e 0a 0a 23 69 6e _private.h>..#in
0960: 63 6c 75 64 65 20 3c 6c 69 62 72 74 74 6f 70 6f clude <librttopo
0970: 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 .h>..#include "t
0980: 6f 70 6f 6c 6f 67 79 5f 70 72 69 76 61 74 65 2e opology_private.
0990: 68 22 0a 0a 73 74 72 75 63 74 20 74 6f 70 6f 5f h"..struct topo_
09a0: 6e 6f 64 65 0a 7b 0a 2f 2a 20 61 20 73 74 72 75 node.{./* a stru
09b0: 63 74 20 77 72 61 70 70 69 6e 67 20 61 20 54 6f ct wrapping a To
09c0: 70 6f 6c 6f 67 79 20 4e 6f 64 65 20 2a 2f 0a 20 pology Node */.
09d0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 sqlite3_int64
09e0: 20 6e 6f 64 65 5f 69 64 3b 0a 20 20 20 20 73 71 node_id;. sq
09f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 63 6f 6e 74 lite3_int64 cont
0a00: 61 69 6e 69 6e 67 5f 66 61 63 65 3b 0a 20 20 20 aining_face;.
0a10: 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 64 double x;. d
0a20: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f 75 ouble y;. dou
0a30: 62 6c 65 20 7a 3b 0a 20 20 20 20 69 6e 74 20 68 ble z;. int h
0a40: 61 73 5f 7a 3b 0a 20 20 20 20 73 74 72 75 63 74 as_z;. struct
0a50: 20 74 6f 70 6f 5f 6e 6f 64 65 20 2a 6e 65 78 74 topo_node *next
0a60: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 74 6f 70 ;.};..struct top
0a70: 6f 5f 6e 6f 64 65 73 5f 6c 69 73 74 0a 7b 0a 2f o_nodes_list.{./
0a80: 2a 20 61 20 73 74 72 75 63 74 20 77 72 61 70 70 * a struct wrapp
0a90: 69 6e 67 20 61 20 6c 69 73 74 20 6f 66 20 54 6f ing a list of To
0aa0: 70 6f 6c 6f 67 79 20 4e 6f 64 65 73 20 2a 2f 0a pology Nodes */.
0ab0: 20 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f struct topo_
0ac0: 6e 6f 64 65 20 2a 66 69 72 73 74 3b 0a 20 20 20 node *first;.
0ad0: 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 struct topo_nod
0ae0: 65 20 2a 6c 61 73 74 3b 0a 20 20 20 20 69 6e 74 e *last;. int
0af0: 20 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 count;.};..stru
0b00: 63 74 20 74 6f 70 6f 5f 65 64 67 65 0a 7b 0a 2f ct topo_edge.{./
0b10: 2a 20 61 20 73 74 72 75 63 74 20 77 72 61 70 70 * a struct wrapp
0b20: 69 6e 67 20 61 20 54 6f 70 6f 6c 6f 67 79 20 45 ing a Topology E
0b30: 64 67 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 dge */. sqlit
0b40: 65 33 5f 69 6e 74 36 34 20 65 64 67 65 5f 69 64 e3_int64 edge_id
0b50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e ;. sqlite3_in
0b60: 74 36 34 20 73 74 61 72 74 5f 6e 6f 64 65 3b 0a t64 start_node;.
0b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
0b80: 34 20 65 6e 64 5f 6e 6f 64 65 3b 0a 20 20 20 20 4 end_node;.
0b90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 61 sqlite3_int64 fa
0ba0: 63 65 5f 6c 65 66 74 3b 0a 20 20 20 20 73 71 6c ce_left;. sql
0bb0: 69 74 65 33 5f 69 6e 74 36 34 20 66 61 63 65 5f ite3_int64 face_
0bc0: 72 69 67 68 74 3b 0a 20 20 20 20 73 71 6c 69 74 right;. sqlit
0bd0: 65 33 5f 69 6e 74 36 34 20 6e 65 78 74 5f 6c 65 e3_int64 next_le
0be0: 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ft;. sqlite3_
0bf0: 69 6e 74 36 34 20 6e 65 78 74 5f 72 69 67 68 74 int64 next_right
0c00: 3b 0a 20 20 20 20 67 61 69 61 4c 69 6e 65 73 74 ;. gaiaLinest
0c10: 72 69 6e 67 50 74 72 20 67 65 6f 6d 3b 0a 20 20 ringPtr geom;.
0c20: 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 65 64 struct topo_ed
0c30: 67 65 20 2a 6e 65 78 74 3b 0a 7d 3b 0a 0a 73 74 ge *next;.};..st
0c40: 72 75 63 74 20 74 6f 70 6f 5f 65 64 67 65 73 5f ruct topo_edges_
0c50: 6c 69 73 74 0a 7b 0a 2f 2a 20 61 20 73 74 72 75 list.{./* a stru
0c60: 63 74 20 77 72 61 70 70 69 6e 67 20 61 20 6c 69 ct wrapping a li
0c70: 73 74 20 6f 66 20 54 6f 70 6f 6c 6f 67 79 20 45 st of Topology E
0c80: 64 65 67 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 degs */. stru
0c90: 63 74 20 74 6f 70 6f 5f 65 64 67 65 20 2a 66 69 ct topo_edge *fi
0ca0: 72 73 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 rst;. struct
0cb0: 74 6f 70 6f 5f 65 64 67 65 20 2a 6c 61 73 74 3b topo_edge *last;
0cc0: 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 0a . int count;.
0cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 74 6f 70 6f 5f };..struct topo_
0ce0: 66 61 63 65 0a 7b 0a 2f 2a 20 61 20 73 74 72 75 face.{./* a stru
0cf0: 63 74 20 77 72 61 70 70 69 6e 67 20 61 20 54 6f ct wrapping a To
0d00: 70 6f 6c 6f 67 79 20 46 61 63 65 20 2a 2f 0a 20 pology Face */.
0d10: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 sqlite3_int64
0d20: 20 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 id;. sqlite3
0d30: 5f 69 6e 74 36 34 20 66 61 63 65 5f 69 64 3b 0a _int64 face_id;.
0d40: 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e 78 3b double minx;
0d50: 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 69 6e 79 . double miny
0d60: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 61 78 ;. double max
0d70: 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 61 x;. double ma
0d80: 78 79 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 xy;. struct t
0d90: 6f 70 6f 5f 66 61 63 65 20 2a 6e 65 78 74 3b 0a opo_face *next;.
0da0: 7d 3b 0a 0a 73 74 72 75 63 74 20 74 6f 70 6f 5f };..struct topo_
0db0: 66 61 63 65 73 5f 6c 69 73 74 0a 7b 0a 2f 2a 20 faces_list.{./*
0dc0: 61 20 73 74 72 75 63 74 20 77 72 61 70 70 69 6e a struct wrappin
0dd0: 67 20 61 20 6c 69 73 74 20 6f 66 20 54 6f 70 6f g a list of Topo
0de0: 6c 6f 67 79 20 45 64 65 67 73 20 2a 2f 0a 20 20 logy Edegs */.
0df0: 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 66 61 struct topo_fa
0e00: 63 65 20 2a 66 69 72 73 74 3b 0a 20 20 20 20 73 ce *first;. s
0e10: 74 72 75 63 74 20 74 6f 70 6f 5f 66 61 63 65 20 truct topo_face
0e20: 2a 6c 61 73 74 3b 0a 20 20 20 20 69 6e 74 20 63 *last;. int c
0e30: 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 ount;.};..static
0e40: 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 struct topo_nod
0e50: 65 20 2a 0a 63 72 65 61 74 65 5f 74 6f 70 6f 5f e *.create_topo_
0e60: 6e 6f 64 65 20 28 73 71 6c 69 74 65 33 5f 69 6e node (sqlite3_in
0e70: 74 36 34 20 6e 6f 64 65 5f 69 64 2c 20 73 71 6c t64 node_id, sql
0e80: 69 74 65 33 5f 69 6e 74 36 34 20 63 6f 6e 74 61 ite3_int64 conta
0e90: 69 6e 69 6e 67 5f 66 61 63 65 2c 0a 09 09 20 20 ining_face,...
0ea0: 64 6f 75 62 6c 65 20 78 2c 20 64 6f 75 62 6c 65 double x, double
0eb0: 20 79 2c 20 64 6f 75 62 6c 65 20 7a 2c 20 69 6e y, double z, in
0ec0: 74 20 68 61 73 5f 7a 29 0a 7b 0a 2f 2a 20 63 72 t has_z).{./* cr
0ed0: 65 61 74 69 6e 67 20 61 20 54 6f 70 6f 6c 6f 67 eating a Topolog
0ee0: 79 20 4e 6f 64 65 20 2a 2f 0a 20 20 20 20 73 74 y Node */. st
0ef0: 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 65 20 2a ruct topo_node *
0f00: 70 74 72 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 69 ptr = malloc (si
0f10: 7a 65 6f 66 20 28 73 74 72 75 63 74 20 74 6f 70 zeof (struct top
0f20: 6f 5f 6e 6f 64 65 29 29 3b 0a 20 20 20 20 70 74 o_node));. pt
0f30: 72 2d 3e 6e 6f 64 65 5f 69 64 20 3d 20 6e 6f 64 r->node_id = nod
0f40: 65 5f 69 64 3b 0a 20 20 20 20 70 74 72 2d 3e 63 e_id;. ptr->c
0f50: 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 3d ontaining_face =
0f60: 20 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 containing_face
0f70: 3b 0a 20 20 20 20 70 74 72 2d 3e 78 20 3d 20 78 ;. ptr->x = x
0f80: 3b 0a 20 20 20 20 70 74 72 2d 3e 79 20 3d 20 79 ;. ptr->y = y
0f90: 3b 0a 20 20 20 20 70 74 72 2d 3e 7a 20 3d 20 7a ;. ptr->z = z
0fa0: 3b 0a 20 20 20 20 70 74 72 2d 3e 68 61 73 5f 7a ;. ptr->has_z
0fb0: 20 3d 20 68 61 73 5f 7a 3b 0a 20 20 20 20 70 74 = has_z;. pt
0fc0: 72 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a r->next = NULL;.
0fd0: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 3b 0a return ptr;.
0fe0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 64 }..static void.d
0ff0: 65 73 74 72 6f 79 5f 74 6f 70 6f 5f 6e 6f 64 65 estroy_topo_node
1000: 20 28 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f (struct topo_no
1010: 64 65 20 2a 70 74 72 29 0a 7b 0a 2f 2a 20 64 65 de *ptr).{./* de
1020: 73 74 72 6f 79 69 6e 67 20 61 20 54 6f 70 6f 6c stroying a Topol
1030: 6f 67 79 20 4e 6f 64 65 20 2a 2f 0a 20 20 20 20 ogy Node */.
1040: 69 66 20 28 70 74 72 20 3d 3d 20 4e 55 4c 4c 29 if (ptr == NULL)
1050: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 72 ..return;. fr
1060: 65 65 20 28 70 74 72 29 3b 0a 7d 0a 0a 73 74 61 ee (ptr);.}..sta
1070: 74 69 63 20 73 74 72 75 63 74 20 74 6f 70 6f 5f tic struct topo_
1080: 65 64 67 65 20 2a 0a 63 72 65 61 74 65 5f 74 6f edge *.create_to
1090: 70 6f 5f 65 64 67 65 20 28 73 71 6c 69 74 65 33 po_edge (sqlite3
10a0: 5f 69 6e 74 36 34 20 65 64 67 65 5f 69 64 2c 20 _int64 edge_id,
10b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 74 sqlite3_int64 st
10c0: 61 72 74 5f 6e 6f 64 65 2c 0a 09 09 20 20 73 71 art_node,... sq
10d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 65 6e 64 5f lite3_int64 end_
10e0: 6e 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e node, sqlite3_in
10f0: 74 36 34 20 66 61 63 65 5f 6c 65 66 74 2c 0a 09 t64 face_left,..
1100: 09 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
1110: 20 66 61 63 65 5f 72 69 67 68 74 2c 20 73 71 6c face_right, sql
1120: 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 78 74 5f ite3_int64 next_
1130: 6c 65 66 74 2c 0a 09 09 20 20 73 71 6c 69 74 65 left,... sqlite
1140: 33 5f 69 6e 74 36 34 20 6e 65 78 74 5f 72 69 67 3_int64 next_rig
1150: 68 74 2c 20 67 61 69 61 4c 69 6e 65 73 74 72 69 ht, gaiaLinestri
1160: 6e 67 50 74 72 20 6c 6e 29 0a 7b 0a 2f 2a 20 63 ngPtr ln).{./* c
1170: 72 65 61 74 69 6e 67 20 61 20 54 6f 70 6f 6c 6f reating a Topolo
1180: 67 79 20 45 64 67 65 20 2a 2f 0a 20 20 20 20 73 gy Edge */. s
1190: 74 72 75 63 74 20 74 6f 70 6f 5f 65 64 67 65 20 truct topo_edge
11a0: 2a 70 74 72 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 *ptr = malloc (s
11b0: 69 7a 65 6f 66 20 28 73 74 72 75 63 74 20 74 6f izeof (struct to
11c0: 70 6f 5f 65 64 67 65 29 29 3b 0a 20 20 20 20 70 po_edge));. p
11d0: 74 72 2d 3e 65 64 67 65 5f 69 64 20 3d 20 65 64 tr->edge_id = ed
11e0: 67 65 5f 69 64 3b 0a 20 20 20 20 70 74 72 2d 3e ge_id;. ptr->
11f0: 73 74 61 72 74 5f 6e 6f 64 65 20 3d 20 73 74 61 start_node = sta
1200: 72 74 5f 6e 6f 64 65 3b 0a 20 20 20 20 70 74 72 rt_node;. ptr
1210: 2d 3e 65 6e 64 5f 6e 6f 64 65 20 3d 20 65 6e 64 ->end_node = end
1220: 5f 6e 6f 64 65 3b 0a 20 20 20 20 70 74 72 2d 3e _node;. ptr->
1230: 66 61 63 65 5f 6c 65 66 74 20 3d 20 66 61 63 65 face_left = face
1240: 5f 6c 65 66 74 3b 0a 20 20 20 20 70 74 72 2d 3e _left;. ptr->
1250: 66 61 63 65 5f 72 69 67 68 74 20 3d 20 66 61 63 face_right = fac
1260: 65 5f 72 69 67 68 74 3b 0a 20 20 20 20 70 74 72 e_right;. ptr
1270: 2d 3e 6e 65 78 74 5f 6c 65 66 74 20 3d 20 6e 65 ->next_left = ne
1280: 78 74 5f 6c 65 66 74 3b 0a 20 20 20 20 70 74 72 xt_left;. ptr
1290: 2d 3e 6e 65 78 74 5f 72 69 67 68 74 20 3d 20 6e ->next_right = n
12a0: 65 78 74 5f 72 69 67 68 74 3b 0a 20 20 20 20 70 ext_right;. p
12b0: 74 72 2d 3e 67 65 6f 6d 20 3d 20 6c 6e 3b 0a 20 tr->geom = ln;.
12c0: 20 20 20 70 74 72 2d 3e 6e 65 78 74 20 3d 20 4e ptr->next = N
12d0: 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ULL;. return
12e0: 70 74 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 ptr;.}..static v
12f0: 6f 69 64 0a 64 65 73 74 72 6f 79 5f 74 6f 70 6f oid.destroy_topo
1300: 5f 65 64 67 65 20 28 73 74 72 75 63 74 20 74 6f _edge (struct to
1310: 70 6f 5f 65 64 67 65 20 2a 70 74 72 29 0a 7b 0a po_edge *ptr).{.
1320: 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67 20 61 20 /* destroying a
1330: 54 6f 70 6f 6c 6f 67 79 20 45 64 67 65 20 2a 2f Topology Edge */
1340: 0a 20 20 20 20 69 66 20 28 70 74 72 20 3d 3d 20 . if (ptr ==
1350: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 20 NULL)..return;.
1360: 20 20 20 69 66 20 28 70 74 72 2d 3e 67 65 6f 6d if (ptr->geom
1370: 20 21 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 != NULL)..gaiaF
1380: 72 65 65 4c 69 6e 65 73 74 72 69 6e 67 20 28 70 reeLinestring (p
1390: 74 72 2d 3e 67 65 6f 6d 29 3b 0a 20 20 20 20 66 tr->geom);. f
13a0: 72 65 65 20 28 70 74 72 29 3b 0a 7d 0a 0a 73 74 ree (ptr);.}..st
13b0: 61 74 69 63 20 73 74 72 75 63 74 20 74 6f 70 6f atic struct topo
13c0: 5f 66 61 63 65 20 2a 0a 63 72 65 61 74 65 5f 74 _face *.create_t
13d0: 6f 70 6f 5f 66 61 63 65 20 28 73 71 6c 69 74 65 opo_face (sqlite
13e0: 33 5f 69 6e 74 36 34 20 69 64 2c 20 73 71 6c 69 3_int64 id, sqli
13f0: 74 65 33 5f 69 6e 74 36 34 20 66 61 63 65 5f 69 te3_int64 face_i
1400: 64 2c 20 64 6f 75 62 6c 65 20 6d 69 6e 78 2c 0a d, double minx,.
1410: 09 09 20 20 64 6f 75 62 6c 65 20 6d 69 6e 79 2c .. double miny,
1420: 20 64 6f 75 62 6c 65 20 6d 61 78 78 2c 20 64 6f double maxx, do
1430: 75 62 6c 65 20 6d 61 78 79 29 0a 7b 0a 2f 2a 20 uble maxy).{./*
1440: 63 72 65 61 74 69 6e 67 20 61 20 54 6f 70 6f 6c creating a Topol
1450: 6f 67 79 20 46 61 63 65 20 2a 2f 0a 20 20 20 20 ogy Face */.
1460: 73 74 72 75 63 74 20 74 6f 70 6f 5f 66 61 63 65 struct topo_face
1470: 20 2a 70 74 72 20 3d 20 6d 61 6c 6c 6f 63 20 28 *ptr = malloc (
1480: 73 69 7a 65 6f 66 20 28 73 74 72 75 63 74 20 74 sizeof (struct t
1490: 6f 70 6f 5f 66 61 63 65 29 29 3b 0a 20 20 20 20 opo_face));.
14a0: 70 74 72 2d 3e 69 64 20 3d 20 69 64 3b 0a 20 20 ptr->id = id;.
14b0: 20 20 70 74 72 2d 3e 66 61 63 65 5f 69 64 20 3d ptr->face_id =
14c0: 20 66 61 63 65 5f 69 64 3b 0a 20 20 20 20 70 74 face_id;. pt
14d0: 72 2d 3e 6d 69 6e 78 20 3d 20 6d 69 6e 78 3b 0a r->minx = minx;.
14e0: 20 20 20 20 70 74 72 2d 3e 6d 69 6e 79 20 3d 20 ptr->miny =
14f0: 6d 69 6e 79 3b 0a 20 20 20 20 70 74 72 2d 3e 6d miny;. ptr->m
1500: 61 78 78 20 3d 20 6d 61 78 78 3b 0a 20 20 20 20 axx = maxx;.
1510: 70 74 72 2d 3e 6d 61 78 79 20 3d 20 6d 61 78 79 ptr->maxy = maxy
1520: 3b 0a 20 20 20 20 70 74 72 2d 3e 6e 65 78 74 20 ;. ptr->next
1530: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 = NULL;. retu
1540: 72 6e 20 70 74 72 3b 0a 7d 0a 0a 73 74 61 74 69 rn ptr;.}..stati
1550: 63 20 76 6f 69 64 0a 64 65 73 74 72 6f 79 5f 74 c void.destroy_t
1560: 6f 70 6f 5f 66 61 63 65 20 28 73 74 72 75 63 74 opo_face (struct
1570: 20 74 6f 70 6f 5f 66 61 63 65 20 2a 70 74 72 29 topo_face *ptr)
1580: 0a 7b 0a 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67 .{./* destroying
1590: 20 61 20 54 6f 70 6f 6c 6f 67 79 20 46 61 63 65 a Topology Face
15a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 74 72 20 */. if (ptr
15b0: 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e == NULL)..return
15c0: 3b 0a 20 20 20 20 66 72 65 65 20 28 70 74 72 29 ;. free (ptr)
15d0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 ;.}..static stru
15e0: 63 74 20 74 6f 70 6f 5f 6e 6f 64 65 73 5f 6c 69 ct topo_nodes_li
15f0: 73 74 20 2a 0a 63 72 65 61 74 65 5f 6e 6f 64 65 st *.create_node
1600: 73 5f 6c 69 73 74 20 28 76 6f 69 64 29 0a 7b 0a s_list (void).{.
1610: 2f 2a 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 /* creating an e
1620: 6d 70 74 79 20 6c 69 73 74 20 6f 66 20 54 6f 70 mpty list of Top
1630: 6f 6c 6f 67 79 20 4e 6f 64 65 73 20 2a 2f 0a 20 ology Nodes */.
1640: 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e struct topo_n
1650: 6f 64 65 73 5f 6c 69 73 74 20 2a 70 74 72 20 3d odes_list *ptr =
1660: 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 malloc (sizeof
1670: 28 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 (struct topo_nod
1680: 65 73 5f 6c 69 73 74 29 29 3b 0a 20 20 20 20 70 es_list));. p
1690: 74 72 2d 3e 66 69 72 73 74 20 3d 20 4e 55 4c 4c tr->first = NULL
16a0: 3b 0a 20 20 20 20 70 74 72 2d 3e 6c 61 73 74 20 ;. ptr->last
16b0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 74 72 2d = NULL;. ptr-
16c0: 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 >count = 0;.
16d0: 72 65 74 75 72 6e 20 70 74 72 3b 0a 7d 0a 0a 73 return ptr;.}..s
16e0: 74 61 74 69 63 20 76 6f 69 64 0a 64 65 73 74 72 tatic void.destr
16f0: 6f 79 5f 6e 6f 64 65 73 5f 6c 69 73 74 20 28 73 oy_nodes_list (s
1700: 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 65 73 truct topo_nodes
1710: 5f 6c 69 73 74 20 2a 70 74 72 29 0a 7b 0a 2f 2a _list *ptr).{./*
1720: 20 64 65 73 74 72 6f 79 69 6e 67 20 61 20 6c 69 destroying a li
1730: 73 74 20 6f 66 20 54 6f 70 6f 6c 6f 67 79 20 4e st of Topology N
1740: 6f 64 65 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 odes */. stru
1750: 63 74 20 74 6f 70 6f 5f 6e 6f 64 65 20 2a 70 3b ct topo_node *p;
1760: 0a 20 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f . struct topo
1770: 5f 6e 6f 64 65 20 2a 70 6e 3b 0a 20 20 20 20 69 _node *pn;. i
1780: 66 20 28 70 74 72 20 3d 3d 20 4e 55 4c 4c 29 0a f (ptr == NULL).
1790: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 70 20 .return;.. p
17a0: 3d 20 70 74 72 2d 3e 66 69 72 73 74 3b 0a 20 20 = ptr->first;.
17b0: 20 20 77 68 69 6c 65 20 28 70 20 21 3d 20 4e 55 while (p != NU
17c0: 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 70 LL). {.. p
17d0: 6e 20 3d 20 70 2d 3e 6e 65 78 74 3b 0a 09 20 20 n = p->next;..
17e0: 64 65 73 74 72 6f 79 5f 74 6f 70 6f 5f 6e 6f 64 destroy_topo_nod
17f0: 65 20 28 70 29 3b 0a 09 20 20 70 20 3d 20 70 6e e (p);.. p = pn
1800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 66 72 ;. }. fr
1810: 65 65 20 28 70 74 72 29 3b 0a 7d 0a 0a 73 74 61 ee (ptr);.}..sta
1820: 74 69 63 20 76 6f 69 64 0a 61 64 64 5f 6e 6f 64 tic void.add_nod
1830: 65 5f 32 44 20 28 73 74 72 75 63 74 20 74 6f 70 e_2D (struct top
1840: 6f 5f 6e 6f 64 65 73 5f 6c 69 73 74 20 2a 6c 69 o_nodes_list *li
1850: 73 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 st, sqlite3_int6
1860: 34 20 6e 6f 64 65 5f 69 64 2c 0a 09 20 20 20 20 4 node_id,..
1870: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 63 sqlite3_int64 c
1880: 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 2c 20 ontaining_face,
1890: 64 6f 75 62 6c 65 20 78 2c 20 64 6f 75 62 6c 65 double x, double
18a0: 20 79 29 0a 7b 0a 2f 2a 20 69 6e 73 65 72 74 69 y).{./* inserti
18b0: 6e 67 20 61 20 54 6f 70 6f 6c 6f 67 79 20 4e 6f ng a Topology No
18c0: 64 65 20 32 44 20 69 6e 74 6f 20 74 68 65 20 6c de 2D into the l
18d0: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 ist */. struc
18e0: 74 20 74 6f 70 6f 5f 6e 6f 64 65 20 2a 70 74 72 t topo_node *ptr
18f0: 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 74 20 3d ;. if (list =
1900: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b = NULL)..return;
1910: 0a 0a 20 20 20 20 70 74 72 20 3d 20 63 72 65 61 .. ptr = crea
1920: 74 65 5f 74 6f 70 6f 5f 6e 6f 64 65 20 28 6e 6f te_topo_node (no
1930: 64 65 5f 69 64 2c 20 63 6f 6e 74 61 69 6e 69 6e de_id, containin
1940: 67 5f 66 61 63 65 2c 20 78 2c 20 79 2c 20 30 2e g_face, x, y, 0.
1950: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 6c 0, 0);. if (l
1960: 69 73 74 2d 3e 66 69 72 73 74 20 3d 3d 20 4e 55 ist->first == NU
1970: 4c 4c 29 0a 09 6c 69 73 74 2d 3e 66 69 72 73 74 LL)..list->first
1980: 20 3d 20 70 74 72 3b 0a 20 20 20 20 69 66 20 28 = ptr;. if (
1990: 6c 69 73 74 2d 3e 6c 61 73 74 20 21 3d 20 4e 55 list->last != NU
19a0: 4c 4c 29 0a 09 6c 69 73 74 2d 3e 6c 61 73 74 2d LL)..list->last-
19b0: 3e 6e 65 78 74 20 3d 20 70 74 72 3b 0a 20 20 20 >next = ptr;.
19c0: 20 6c 69 73 74 2d 3e 6c 61 73 74 20 3d 20 70 74 list->last = pt
19d0: 72 3b 0a 20 20 20 20 6c 69 73 74 2d 3e 63 6f 75 r;. list->cou
19e0: 6e 74 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 nt++;.}..static
19f0: 76 6f 69 64 0a 61 64 64 5f 6e 6f 64 65 5f 33 44 void.add_node_3D
1a00: 20 28 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f (struct topo_no
1a10: 64 65 73 5f 6c 69 73 74 20 2a 6c 69 73 74 2c 20 des_list *list,
1a20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 6f sqlite3_int64 no
1a30: 64 65 5f 69 64 2c 0a 09 20 20 20 20 20 73 71 6c de_id,.. sql
1a40: 69 74 65 33 5f 69 6e 74 36 34 20 63 6f 6e 74 61 ite3_int64 conta
1a50: 69 6e 69 6e 67 5f 66 61 63 65 2c 20 64 6f 75 62 ining_face, doub
1a60: 6c 65 20 78 2c 20 64 6f 75 62 6c 65 20 79 2c 20 le x, double y,
1a70: 64 6f 75 62 6c 65 20 7a 29 0a 7b 0a 2f 2a 20 69 double z).{./* i
1a80: 6e 73 65 72 74 69 6e 67 20 61 20 54 6f 70 6f 6c nserting a Topol
1a90: 6f 67 79 20 4e 6f 64 65 20 33 44 20 69 6e 74 6f ogy Node 3D into
1aa0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 the list */.
1ab0: 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 struct topo_nod
1ac0: 65 20 2a 70 74 72 3b 0a 20 20 20 20 69 66 20 28 e *ptr;. if (
1ad0: 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 list == NULL)..r
1ae0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 70 74 72 20 eturn;.. ptr
1af0: 3d 20 63 72 65 61 74 65 5f 74 6f 70 6f 5f 6e 6f = create_topo_no
1b00: 64 65 20 28 6e 6f 64 65 5f 69 64 2c 20 63 6f 6e de (node_id, con
1b10: 74 61 69 6e 69 6e 67 5f 66 61 63 65 2c 20 78 2c taining_face, x,
1b20: 20 79 2c 20 7a 2c 20 31 29 3b 0a 20 20 20 20 69 y, z, 1);. i
1b30: 66 20 28 6c 69 73 74 2d 3e 66 69 72 73 74 20 3d f (list->first =
1b40: 3d 20 4e 55 4c 4c 29 0a 09 6c 69 73 74 2d 3e 66 = NULL)..list->f
1b50: 69 72 73 74 20 3d 20 70 74 72 3b 0a 20 20 20 20 irst = ptr;.
1b60: 69 66 20 28 6c 69 73 74 2d 3e 6c 61 73 74 20 21 if (list->last !
1b70: 3d 20 4e 55 4c 4c 29 0a 09 6c 69 73 74 2d 3e 6c = NULL)..list->l
1b80: 61 73 74 2d 3e 6e 65 78 74 20 3d 20 70 74 72 3b ast->next = ptr;
1b90: 0a 20 20 20 20 6c 69 73 74 2d 3e 6c 61 73 74 20 . list->last
1ba0: 3d 20 70 74 72 3b 0a 20 20 20 20 6c 69 73 74 2d = ptr;. list-
1bb0: 3e 63 6f 75 6e 74 2b 2b 3b 0a 7d 0a 0a 73 74 61 >count++;.}..sta
1bc0: 74 69 63 20 73 74 72 75 63 74 20 74 6f 70 6f 5f tic struct topo_
1bd0: 65 64 67 65 73 5f 6c 69 73 74 20 2a 0a 63 72 65 edges_list *.cre
1be0: 61 74 65 5f 65 64 67 65 73 5f 6c 69 73 74 20 28 ate_edges_list (
1bf0: 76 6f 69 64 29 0a 7b 0a 2f 2a 20 63 72 65 61 74 void).{./* creat
1c00: 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 ing an empty lis
1c10: 74 20 6f 66 20 54 6f 70 6f 6c 6f 67 79 20 45 64 t of Topology Ed
1c20: 67 65 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 ges */. struc
1c30: 74 20 74 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 t topo_edges_lis
1c40: 74 20 2a 70 74 72 20 3d 20 6d 61 6c 6c 6f 63 20 t *ptr = malloc
1c50: 28 73 69 7a 65 6f 66 20 28 73 74 72 75 63 74 20 (sizeof (struct
1c60: 74 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 74 29 topo_edges_list)
1c70: 29 3b 0a 20 20 20 20 70 74 72 2d 3e 66 69 72 73 );. ptr->firs
1c80: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 74 t = NULL;. pt
1c90: 72 2d 3e 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a r->last = NULL;.
1ca0: 20 20 20 20 70 74 72 2d 3e 63 6f 75 6e 74 20 3d ptr->count =
1cb0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 0;. return p
1cc0: 74 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f tr;.}..static vo
1cd0: 69 64 0a 64 65 73 74 72 6f 79 5f 65 64 67 65 73 id.destroy_edges
1ce0: 5f 6c 69 73 74 20 28 73 74 72 75 63 74 20 74 6f _list (struct to
1cf0: 70 6f 5f 65 64 67 65 73 5f 6c 69 73 74 20 2a 70 po_edges_list *p
1d00: 74 72 29 0a 7b 0a 2f 2a 20 64 65 73 74 72 6f 79 tr).{./* destroy
1d10: 69 6e 67 20 61 20 6c 69 73 74 20 6f 66 20 54 6f ing a list of To
1d20: 70 6f 6c 6f 67 79 20 45 64 67 65 73 20 2a 2f 0a pology Edges */.
1d30: 20 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f struct topo_
1d40: 65 64 67 65 20 2a 70 3b 0a 20 20 20 20 73 74 72 edge *p;. str
1d50: 75 63 74 20 74 6f 70 6f 5f 65 64 67 65 20 2a 70 uct topo_edge *p
1d60: 6e 3b 0a 20 20 20 20 69 66 20 28 70 74 72 20 3d n;. if (ptr =
1d70: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b = NULL)..return;
1d80: 0a 0a 20 20 20 20 70 20 3d 20 70 74 72 2d 3e 66 .. p = ptr->f
1d90: 69 72 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 irst;. while
1da0: 28 70 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 (p != NULL).
1db0: 20 20 7b 0a 09 20 20 70 6e 20 3d 20 70 2d 3e 6e {.. pn = p->n
1dc0: 65 78 74 3b 0a 09 20 20 64 65 73 74 72 6f 79 5f ext;.. destroy_
1dd0: 74 6f 70 6f 5f 65 64 67 65 20 28 70 29 3b 0a 09 topo_edge (p);..
1de0: 20 20 70 20 3d 20 70 6e 3b 0a 20 20 20 20 20 20 p = pn;.
1df0: 7d 0a 20 20 20 20 66 72 65 65 20 28 70 74 72 29 }. free (ptr)
1e00: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 ;.}..static void
1e10: 0a 61 64 64 5f 65 64 67 65 20 28 73 74 72 75 63 .add_edge (struc
1e20: 74 20 74 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 t topo_edges_lis
1e30: 74 20 2a 6c 69 73 74 2c 20 73 71 6c 69 74 65 33 t *list, sqlite3
1e40: 5f 69 6e 74 36 34 20 65 64 67 65 5f 69 64 2c 0a _int64 edge_id,.
1e50: 09 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
1e60: 20 73 74 61 72 74 5f 6e 6f 64 65 2c 20 73 71 6c start_node, sql
1e70: 69 74 65 33 5f 69 6e 74 36 34 20 65 6e 64 5f 6e ite3_int64 end_n
1e80: 6f 64 65 2c 0a 09 20 20 73 71 6c 69 74 65 33 5f ode,.. sqlite3_
1e90: 69 6e 74 36 34 20 66 61 63 65 5f 6c 65 66 74 2c int64 face_left,
1ea0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 sqlite3_int64 f
1eb0: 61 63 65 5f 72 69 67 68 74 2c 0a 09 20 20 73 71 ace_right,.. sq
1ec0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 78 74 lite3_int64 next
1ed0: 5f 6c 65 66 74 2c 20 73 71 6c 69 74 65 33 5f 69 _left, sqlite3_i
1ee0: 6e 74 36 34 20 6e 65 78 74 5f 72 69 67 68 74 2c nt64 next_right,
1ef0: 0a 09 20 20 67 61 69 61 4c 69 6e 65 73 74 72 69 .. gaiaLinestri
1f00: 6e 67 50 74 72 20 6c 6e 29 0a 7b 0a 2f 2a 20 69 ngPtr ln).{./* i
1f10: 6e 73 65 72 74 69 6e 67 20 61 20 54 6f 70 6f 6c nserting a Topol
1f20: 6f 67 79 20 45 64 67 65 20 69 6e 74 6f 20 74 68 ogy Edge into th
1f30: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 e list */. st
1f40: 72 75 63 74 20 74 6f 70 6f 5f 65 64 67 65 20 2a ruct topo_edge *
1f50: 70 74 72 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 ptr;. if (lis
1f60: 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 t == NULL)..retu
1f70: 72 6e 3b 0a 0a 20 20 20 20 70 74 72 20 3d 20 6c rn;.. ptr = l
1f80: 69 73 74 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 ist->first;.
1f90: 77 68 69 6c 65 20 28 70 74 72 20 21 3d 20 4e 55 while (ptr != NU
1fa0: 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f LL). {.. /
1fb0: 2a 20 61 76 6f 69 64 69 6e 67 20 74 6f 20 69 6e * avoiding to in
1fc0: 73 65 72 74 20 64 75 70 6c 69 63 61 74 65 20 65 sert duplicate e
1fd0: 6e 74 72 69 65 73 20 2a 2f 0a 09 20 20 69 66 20 ntries */.. if
1fe0: 28 70 74 72 2d 3e 65 64 67 65 5f 69 64 20 3d 3d (ptr->edge_id ==
1ff0: 20 65 64 67 65 5f 69 64 29 0a 09 20 20 20 20 20 edge_id)..
2000: 20 72 65 74 75 72 6e 3b 0a 09 20 20 70 74 72 20 return;.. ptr
2010: 3d 20 70 74 72 2d 3e 6e 65 78 74 3b 0a 20 20 20 = ptr->next;.
2020: 20 20 20 7d 0a 0a 20 20 20 20 70 74 72 20 3d 0a }.. ptr =.
2030: 09 63 72 65 61 74 65 5f 74 6f 70 6f 5f 65 64 67 .create_topo_edg
2040: 65 20 28 65 64 67 65 5f 69 64 2c 20 73 74 61 72 e (edge_id, star
2050: 74 5f 6e 6f 64 65 2c 20 65 6e 64 5f 6e 6f 64 65 t_node, end_node
2060: 2c 20 66 61 63 65 5f 6c 65 66 74 2c 20 66 61 63 , face_left, fac
2070: 65 5f 72 69 67 68 74 2c 0a 09 09 09 20 20 6e 65 e_right,.... ne
2080: 78 74 5f 6c 65 66 74 2c 20 6e 65 78 74 5f 72 69 xt_left, next_ri
2090: 67 68 74 2c 20 6c 6e 29 3b 0a 20 20 20 20 69 66 ght, ln);. if
20a0: 20 28 6c 69 73 74 2d 3e 66 69 72 73 74 20 3d 3d (list->first ==
20b0: 20 4e 55 4c 4c 29 0a 09 6c 69 73 74 2d 3e 66 69 NULL)..list->fi
20c0: 72 73 74 20 3d 20 70 74 72 3b 0a 20 20 20 20 69 rst = ptr;. i
20d0: 66 20 28 6c 69 73 74 2d 3e 6c 61 73 74 20 21 3d f (list->last !=
20e0: 20 4e 55 4c 4c 29 0a 09 6c 69 73 74 2d 3e 6c 61 NULL)..list->la
20f0: 73 74 2d 3e 6e 65 78 74 20 3d 20 70 74 72 3b 0a st->next = ptr;.
2100: 20 20 20 20 6c 69 73 74 2d 3e 6c 61 73 74 20 3d list->last =
2110: 20 70 74 72 3b 0a 20 20 20 20 6c 69 73 74 2d 3e ptr;. list->
2120: 63 6f 75 6e 74 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 count++;.}..stat
2130: 69 63 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 66 ic struct topo_f
2140: 61 63 65 73 5f 6c 69 73 74 20 2a 0a 63 72 65 61 aces_list *.crea
2150: 74 65 5f 66 61 63 65 73 5f 6c 69 73 74 20 28 76 te_faces_list (v
2160: 6f 69 64 29 0a 7b 0a 2f 2a 20 63 72 65 61 74 69 oid).{./* creati
2170: 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 ng an empty list
2180: 20 6f 66 20 54 6f 70 6f 6c 6f 67 79 20 46 61 63 of Topology Fac
2190: 65 73 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 es */. struct
21a0: 20 74 6f 70 6f 5f 66 61 63 65 73 5f 6c 69 73 74 topo_faces_list
21b0: 20 2a 70 74 72 20 3d 20 6d 61 6c 6c 6f 63 20 28 *ptr = malloc (
21c0: 73 69 7a 65 6f 66 20 28 73 74 72 75 63 74 20 74 sizeof (struct t
21d0: 6f 70 6f 5f 66 61 63 65 73 5f 6c 69 73 74 29 29 opo_faces_list))
21e0: 3b 0a 20 20 20 20 70 74 72 2d 3e 66 69 72 73 74 ;. ptr->first
21f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 70 74 72 = NULL;. ptr
2200: 2d 3e 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 ->last = NULL;.
2210: 20 20 20 70 74 72 2d 3e 63 6f 75 6e 74 20 3d 20 ptr->count =
2220: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 0;. return pt
2230: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 r;.}..static voi
2240: 64 0a 64 65 73 74 72 6f 79 5f 66 61 63 65 73 5f d.destroy_faces_
2250: 6c 69 73 74 20 28 73 74 72 75 63 74 20 74 6f 70 list (struct top
2260: 6f 5f 66 61 63 65 73 5f 6c 69 73 74 20 2a 70 74 o_faces_list *pt
2270: 72 29 0a 7b 0a 2f 2a 20 64 65 73 74 72 6f 79 69 r).{./* destroyi
2280: 6e 67 20 61 20 6c 69 73 74 20 6f 66 20 54 6f 70 ng a list of Top
2290: 6f 6c 6f 67 79 20 46 61 63 65 73 20 2a 2f 0a 20 ology Faces */.
22a0: 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 66 struct topo_f
22b0: 61 63 65 20 2a 70 3b 0a 20 20 20 20 73 74 72 75 ace *p;. stru
22c0: 63 74 20 74 6f 70 6f 5f 66 61 63 65 20 2a 70 6e ct topo_face *pn
22d0: 3b 0a 20 20 20 20 69 66 20 28 70 74 72 20 3d 3d ;. if (ptr ==
22e0: 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a NULL)..return;.
22f0: 0a 20 20 20 20 70 20 3d 20 70 74 72 2d 3e 66 69 . p = ptr->fi
2300: 72 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 rst;. while (
2310: 70 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 p != NULL).
2320: 20 7b 0a 09 20 20 70 6e 20 3d 20 70 2d 3e 6e 65 {.. pn = p->ne
2330: 78 74 3b 0a 09 20 20 64 65 73 74 72 6f 79 5f 74 xt;.. destroy_t
2340: 6f 70 6f 5f 66 61 63 65 20 28 70 29 3b 0a 09 20 opo_face (p);..
2350: 20 70 20 3d 20 70 6e 3b 0a 20 20 20 20 20 20 7d p = pn;. }
2360: 0a 20 20 20 20 66 72 65 65 20 28 70 74 72 29 3b . free (ptr);
2370: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a .}..static void.
2380: 61 64 64 5f 66 61 63 65 20 28 73 74 72 75 63 74 add_face (struct
2390: 20 74 6f 70 6f 5f 66 61 63 65 73 5f 6c 69 73 74 topo_faces_list
23a0: 20 2a 6c 69 73 74 2c 20 73 71 6c 69 74 65 33 5f *list, sqlite3_
23b0: 69 6e 74 36 34 20 69 64 2c 20 73 71 6c 69 74 65 int64 id, sqlite
23c0: 33 5f 69 6e 74 36 34 20 66 61 63 65 5f 69 64 2c 3_int64 face_id,
23d0: 0a 09 20 20 64 6f 75 62 6c 65 20 6d 69 6e 78 2c .. double minx,
23e0: 20 64 6f 75 62 6c 65 20 6d 69 6e 79 2c 20 64 6f double miny, do
23f0: 75 62 6c 65 20 6d 61 78 78 2c 20 64 6f 75 62 6c uble maxx, doubl
2400: 65 20 6d 61 78 79 29 0a 7b 0a 2f 2a 20 69 6e 73 e maxy).{./* ins
2410: 65 72 74 69 6e 67 20 61 20 54 6f 70 6f 6c 6f 67 erting a Topolog
2420: 79 20 46 61 63 65 20 69 6e 74 6f 20 74 68 65 20 y Face into the
2430: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 72 75 list */. stru
2440: 63 74 20 74 6f 70 6f 5f 66 61 63 65 20 2a 70 74 ct topo_face *pt
2450: 72 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 74 20 r;. if (list
2460: 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e == NULL)..return
2470: 3b 0a 0a 20 20 20 20 70 74 72 20 3d 20 63 72 65 ;.. ptr = cre
2480: 61 74 65 5f 74 6f 70 6f 5f 66 61 63 65 20 28 69 ate_topo_face (i
2490: 64 2c 20 66 61 63 65 5f 69 64 2c 20 6d 69 6e 78 d, face_id, minx
24a0: 2c 20 6d 69 6e 79 2c 20 6d 61 78 78 2c 20 6d 61 , miny, maxx, ma
24b0: 78 79 29 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 xy);. if (lis
24c0: 74 2d 3e 66 69 72 73 74 20 3d 3d 20 4e 55 4c 4c t->first == NULL
24d0: 29 0a 09 6c 69 73 74 2d 3e 66 69 72 73 74 20 3d )..list->first =
24e0: 20 70 74 72 3b 0a 20 20 20 20 69 66 20 28 6c 69 ptr;. if (li
24f0: 73 74 2d 3e 6c 61 73 74 20 21 3d 20 4e 55 4c 4c st->last != NULL
2500: 29 0a 09 6c 69 73 74 2d 3e 6c 61 73 74 2d 3e 6e )..list->last->n
2510: 65 78 74 20 3d 20 70 74 72 3b 0a 20 20 20 20 6c ext = ptr;. l
2520: 69 73 74 2d 3e 6c 61 73 74 20 3d 20 70 74 72 3b ist->last = ptr;
2530: 0a 20 20 20 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 . list->count
2540: 2b 2b 3b 0a 7d 0a 0a 54 4f 50 4f 4c 4f 47 59 5f ++;.}..TOPOLOGY_
2550: 50 52 49 56 41 54 45 20 52 54 4c 49 4e 45 20 2a PRIVATE RTLINE *
2560: 0a 67 61 69 61 5f 63 6f 6e 76 65 72 74 5f 6c 69 .gaia_convert_li
2570: 6e 65 73 74 72 69 6e 67 5f 74 6f 5f 72 74 6c 69 nestring_to_rtli
2580: 6e 65 20 28 63 6f 6e 73 74 20 52 54 43 54 58 20 ne (const RTCTX
2590: 2a 20 63 74 78 2c 20 67 61 69 61 4c 69 6e 65 73 * ctx, gaiaLines
25a0: 74 72 69 6e 67 50 74 72 20 6c 6e 2c 0a 09 09 09 tringPtr ln,....
25b0: 09 20 20 20 69 6e 74 20 73 72 69 64 2c 20 69 6e . int srid, in
25c0: 74 20 68 61 73 5f 7a 29 0a 7b 0a 2f 2a 20 63 6f t has_z).{./* co
25d0: 6e 76 65 72 74 69 6e 67 20 61 20 4c 69 6e 65 73 nverting a Lines
25e0: 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20 52 54 tring into an RT
25f0: 4c 49 4e 45 20 2a 2f 0a 20 20 20 20 52 54 50 4f LINE */. RTPO
2600: 49 4e 54 41 52 52 41 59 20 2a 70 61 3b 0a 20 20 INTARRAY *pa;.
2610: 20 20 52 54 50 4f 49 4e 54 34 44 20 70 6f 69 6e RTPOINT4D poin
2620: 74 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 t;. int iv;.
2630: 20 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 double x;.
2640: 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 double y;. d
2650: 6f 75 62 6c 65 20 7a 3b 0a 20 20 20 20 64 6f 75 ouble z;. dou
2660: 62 6c 65 20 6d 3b 0a 0a 20 20 20 20 70 61 20 3d ble m;.. pa =
2670: 20 70 74 61 72 72 61 79 5f 63 6f 6e 73 74 72 75 ptarray_constru
2680: 63 74 20 28 63 74 78 2c 20 68 61 73 5f 7a 2c 20 ct (ctx, has_z,
2690: 30 2c 20 6c 6e 2d 3e 50 6f 69 6e 74 73 29 3b 0a 0, ln->Points);.
26a0: 20 20 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b for (iv = 0;
26b0: 20 69 76 20 3c 20 6c 6e 2d 3e 50 6f 69 6e 74 73 iv < ln->Points
26c0: 3b 20 69 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a ; iv++). {.
26d0: 09 20 20 2f 2a 20 63 6f 70 79 69 6e 67 20 76 65 . /* copying ve
26e0: 72 74 69 63 65 73 20 2a 2f 0a 09 20 20 69 66 20 rtices */.. if
26f0: 28 6c 6e 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f (ln->DimensionMo
2700: 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a del == GAIA_XY_Z
2710: 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47 ).. {...gaiaG
2720: 65 74 50 6f 69 6e 74 58 59 5a 20 28 6c 6e 2d 3e etPointXYZ (ln->
2730: 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 Coords, iv, &x,
2740: 26 79 2c 20 26 7a 29 3b 0a 09 20 20 20 20 7d 0a &y, &z);.. }.
2750: 09 20 20 65 6c 73 65 20 69 66 20 28 6c 6e 2d 3e . else if (ln->
2760: 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d DimensionModel =
2770: 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 20 = GAIA_XY_M)..
2780: 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 {...gaiaGetPoi
2790: 6e 74 58 59 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 ntXYM (ln->Coord
27a0: 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 s, iv, &x, &y, &
27b0: 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c m);.. }.. el
27c0: 73 65 20 69 66 20 28 6c 6e 2d 3e 44 69 6d 65 6e se if (ln->Dimen
27d0: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 sionModel == GAI
27e0: 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 20 7b A_XY_Z_M).. {
27f0: 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 58 ...gaiaGetPointX
2800: 59 5a 4d 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c YZM (ln->Coords,
2810: 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 26 7a 2c iv, &x, &y, &z,
2820: 20 26 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 &m);.. }..
2830: 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 67 61 else.. {...ga
2840: 69 61 47 65 74 50 6f 69 6e 74 20 28 6c 6e 2d 3e iaGetPoint (ln->
2850: 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 Coords, iv, &x,
2860: 26 79 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70 &y);.. }.. p
2870: 6f 69 6e 74 2e 78 20 3d 20 78 3b 0a 09 20 20 70 oint.x = x;.. p
2880: 6f 69 6e 74 2e 79 20 3d 20 79 3b 0a 09 20 20 69 oint.y = y;.. i
2890: 66 20 28 68 61 73 5f 7a 29 0a 09 20 20 20 20 20 f (has_z)..
28a0: 20 70 6f 69 6e 74 2e 7a 20 3d 20 7a 3b 0a 09 20 point.z = z;..
28b0: 20 70 74 61 72 72 61 79 5f 73 65 74 5f 70 6f 69 ptarray_set_poi
28c0: 6e 74 34 64 20 28 63 74 78 2c 20 70 61 2c 20 69 nt4d (ctx, pa, i
28d0: 76 2c 20 26 70 6f 69 6e 74 29 3b 0a 20 20 20 20 v, &point);.
28e0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 }. return r
28f0: 74 6c 69 6e 65 5f 63 6f 6e 73 74 72 75 63 74 20 tline_construct
2900: 28 63 74 78 2c 20 73 72 69 64 2c 20 4e 55 4c 4c (ctx, srid, NULL
2910: 2c 20 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 , pa);.}..static
2920: 20 69 6e 74 0a 63 68 65 63 6b 5f 75 6e 63 6c 6f int.check_unclo
2930: 73 65 64 5f 72 69 6e 67 20 28 67 61 69 61 52 69 sed_ring (gaiaRi
2940: 6e 67 50 74 72 20 72 6e 67 29 0a 7b 0a 2f 2a 20 ngPtr rng).{./*
2950: 63 68 65 63 6b 73 20 69 66 20 61 20 52 69 6e 67 checks if a Ring
2960: 20 69 73 20 63 6c 6f 73 65 64 20 6f 72 20 6e 6f is closed or no
2970: 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 t */. double
2980: 78 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79 x0;. double y
2990: 30 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a 30 0;. double z0
29a0: 20 3d 20 30 2e 30 3b 0a 20 20 20 20 64 6f 75 62 = 0.0;. doub
29b0: 6c 65 20 6d 30 20 3d 20 30 2e 30 3b 0a 20 20 20 le m0 = 0.0;.
29c0: 20 64 6f 75 62 6c 65 20 78 31 3b 0a 20 20 20 20 double x1;.
29d0: 64 6f 75 62 6c 65 20 79 31 3b 0a 20 20 20 20 64 double y1;. d
29e0: 6f 75 62 6c 65 20 7a 31 20 3d 20 30 2e 30 3b 0a ouble z1 = 0.0;.
29f0: 20 20 20 20 64 6f 75 62 6c 65 20 6d 31 20 3d 20 double m1 =
2a00: 30 2e 30 3b 0a 20 20 20 20 69 6e 74 20 6c 61 73 0.0;. int las
2a10: 74 20 3d 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 20 t = rng->Points
2a20: 2d 20 31 3b 0a 20 20 20 20 69 66 20 28 72 6e 67 - 1;. if (rng
2a30: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c ->DimensionModel
2a40: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a 20 == GAIA_XY_Z).
2a50: 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 47 65 {.. gaiaGe
2a60: 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e 67 2d 3e tPointXYZ (rng->
2a70: 43 6f 6f 72 64 73 2c 20 30 2c 20 26 78 30 2c 20 Coords, 0, &x0,
2a80: 26 79 30 2c 20 26 7a 30 29 3b 0a 20 20 20 20 20 &y0, &z0);.
2a90: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 }. else if (
2aa0: 72 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f rng->DimensionMo
2ab0: 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d del == GAIA_XY_M
2ac0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 ). {.. gai
2ad0: 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 72 6e aGetPointXYM (rn
2ae0: 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 26 78 g->Coords, 0, &x
2af0: 30 2c 20 26 79 30 2c 20 26 6d 30 29 3b 0a 20 20 0, &y0, &m0);.
2b00: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 }. else i
2b10: 66 20 28 72 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f f (rng->Dimensio
2b20: 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 nModel == GAIA_X
2b30: 59 5f 5a 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 Y_Z_M). {..
2b40: 20 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 gaiaGetPointXY
2b50: 5a 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c ZM (rng->Coords,
2b60: 20 30 2c 20 26 78 30 2c 20 26 79 30 2c 20 26 7a 0, &x0, &y0, &z
2b70: 30 2c 20 26 6d 30 29 3b 0a 20 20 20 20 20 20 7d 0, &m0);. }
2b80: 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 . else.
2b90: 7b 0a 09 20 20 67 61 69 61 47 65 74 50 6f 69 6e {.. gaiaGetPoin
2ba0: 74 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 t (rng->Coords,
2bb0: 30 2c 20 26 78 30 2c 20 26 79 30 29 3b 0a 20 20 0, &x0, &y0);.
2bc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 6e }. if (rn
2bd0: 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 g->DimensionMode
2be0: 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a l == GAIA_XY_Z).
2bf0: 20 20 20 20 20 20 7b 0a 09 20 20 67 61 69 61 47 {.. gaiaG
2c00: 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e 67 2d etPointXYZ (rng-
2c10: 3e 43 6f 6f 72 64 73 2c 20 6c 61 73 74 2c 20 26 >Coords, last, &
2c20: 78 31 2c 20 26 79 31 2c 20 26 7a 31 29 3b 0a 20 x1, &y1, &z1);.
2c30: 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 }. else
2c40: 69 66 20 28 72 6e 67 2d 3e 44 69 6d 65 6e 73 69 if (rng->Dimensi
2c50: 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 41 5f onModel == GAIA_
2c60: 58 59 5f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 XY_M). {..
2c70: 20 67 61 69 61 47 65 74 50 6f 69 6e 74 58 59 4d gaiaGetPointXYM
2c80: 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 6c (rng->Coords, l
2c90: 61 73 74 2c 20 26 78 31 2c 20 26 79 31 2c 20 26 ast, &x1, &y1, &
2ca0: 6d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 m1);. }.
2cb0: 20 65 6c 73 65 20 69 66 20 28 72 6e 67 2d 3e 44 else if (rng->D
2cc0: 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d imensionModel ==
2cd0: 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 20 20 GAIA_XY_Z_M).
2ce0: 20 20 20 20 7b 0a 09 20 20 67 61 69 61 47 65 74 {.. gaiaGet
2cf0: 50 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e PointXYZM (rng->
2d00: 43 6f 6f 72 64 73 2c 20 6c 61 73 74 2c 20 26 78 Coords, last, &x
2d10: 31 2c 20 26 79 31 2c 20 26 7a 31 2c 20 26 6d 31 1, &y1, &z1, &m1
2d20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 );. }. e
2d30: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 67 lse. {.. g
2d40: 61 69 61 47 65 74 50 6f 69 6e 74 20 28 72 6e 67 aiaGetPoint (rng
2d50: 2d 3e 43 6f 6f 72 64 73 2c 20 6c 61 73 74 2c 20 ->Coords, last,
2d60: 26 78 31 2c 20 26 79 31 29 3b 0a 20 20 20 20 20 &x1, &y1);.
2d70: 20 7d 0a 20 20 20 20 69 66 20 28 78 30 20 3d 3d }. if (x0 ==
2d80: 20 78 31 20 26 26 20 79 30 20 3d 3d 20 79 31 20 x1 && y0 == y1
2d90: 26 26 20 7a 30 20 3d 3d 20 7a 31 20 26 26 20 6d && z0 == z1 && m
2da0: 30 20 3d 3d 20 6d 31 29 0a 09 72 65 74 75 72 6e 0 == m1)..return
2db0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0;. return 1
2dc0: 3b 0a 7d 0a 0a 54 4f 50 4f 4c 4f 47 59 5f 50 52 ;.}..TOPOLOGY_PR
2dd0: 49 56 41 54 45 20 52 54 50 4f 4c 59 20 2a 0a 67 IVATE RTPOLY *.g
2de0: 61 69 61 5f 63 6f 6e 76 65 72 74 5f 70 6f 6c 79 aia_convert_poly
2df0: 67 6f 6e 5f 74 6f 5f 72 74 70 6f 6c 79 20 28 63 gon_to_rtpoly (c
2e00: 6f 6e 73 74 20 52 54 43 54 58 20 2a 20 63 74 78 onst RTCTX * ctx
2e10: 2c 20 67 61 69 61 50 6f 6c 79 67 6f 6e 50 74 72 , gaiaPolygonPtr
2e20: 20 70 67 2c 20 69 6e 74 20 73 72 69 64 2c 0a 09 pg, int srid,..
2e30: 09 09 09 69 6e 74 20 68 61 73 5f 7a 29 0a 7b 0a ...int has_z).{.
2e40: 2f 2a 20 63 6f 6e 76 65 72 74 69 6e 67 20 61 20 /* converting a
2e50: 50 6f 6c 79 67 6f 6e 20 69 6e 74 6f 20 61 6e 20 Polygon into an
2e60: 52 54 50 4f 4c 59 20 2a 2f 0a 20 20 20 20 69 6e RTPOLY */. in
2e70: 74 20 6e 67 65 6f 6d 73 3b 0a 20 20 20 20 52 54 t ngeoms;. RT
2e80: 50 4f 49 4e 54 41 52 52 41 59 20 2a 2a 70 70 61 POINTARRAY **ppa
2e90: 61 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 34 44 a;. RTPOINT4D
2ea0: 20 70 6f 69 6e 74 3b 0a 20 20 20 20 67 61 69 61 point;. gaia
2eb0: 52 69 6e 67 50 74 72 20 72 6e 67 3b 0a 20 20 20 RingPtr rng;.
2ec0: 20 69 6e 74 20 63 6c 6f 73 65 5f 72 69 6e 67 3b int close_ring;
2ed0: 0a 20 20 20 20 69 6e 74 20 69 62 3b 0a 20 20 20 . int ib;.
2ee0: 20 69 6e 74 20 69 76 3b 0a 20 20 20 20 64 6f 75 int iv;. dou
2ef0: 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c ble x;. doubl
2f00: 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 e y;. double
2f10: 7a 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 6d 3b z;. double m;
2f20: 0a 0a 20 20 20 20 6e 67 65 6f 6d 73 20 3d 20 70 .. ngeoms = p
2f30: 67 2d 3e 4e 75 6d 49 6e 74 65 72 69 6f 72 73 3b g->NumInteriors;
2f40: 0a 20 20 20 20 70 70 61 61 20 3d 20 72 74 61 6c . ppaa = rtal
2f50: 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a 65 6f 66 loc (ctx, sizeof
2f60: 20 28 52 54 50 4f 49 4e 54 41 52 52 41 59 20 2a (RTPOINTARRAY *
2f70: 29 20 2a 20 28 6e 67 65 6f 6d 73 20 2b 20 31 29 ) * (ngeoms + 1)
2f80: 29 3b 0a 20 20 20 20 72 6e 67 20 3d 20 70 67 2d );. rng = pg-
2f90: 3e 45 78 74 65 72 69 6f 72 3b 0a 20 20 20 20 63 >Exterior;. c
2fa0: 6c 6f 73 65 5f 72 69 6e 67 20 3d 20 63 68 65 63 lose_ring = chec
2fb0: 6b 5f 75 6e 63 6c 6f 73 65 64 5f 72 69 6e 67 20 k_unclosed_ring
2fc0: 28 72 6e 67 29 3b 0a 20 20 20 20 69 66 20 28 63 (rng);. if (c
2fd0: 6c 6f 73 65 5f 72 69 6e 67 29 0a 09 70 70 61 61 lose_ring)..ppaa
2fe0: 5b 30 5d 20 3d 20 70 74 61 72 72 61 79 5f 63 6f [0] = ptarray_co
2ff0: 6e 73 74 72 75 63 74 20 28 63 74 78 2c 20 68 61 nstruct (ctx, ha
3000: 73 5f 7a 2c 20 30 2c 20 72 6e 67 2d 3e 50 6f 69 s_z, 0, rng->Poi
3010: 6e 74 73 20 2b 20 31 29 3b 0a 20 20 20 20 65 6c nts + 1);. el
3020: 73 65 0a 09 70 70 61 61 5b 30 5d 20 3d 20 70 74 se..ppaa[0] = pt
3030: 61 72 72 61 79 5f 63 6f 6e 73 74 72 75 63 74 20 array_construct
3040: 28 63 74 78 2c 20 68 61 73 5f 7a 2c 20 30 2c 20 (ctx, has_z, 0,
3050: 72 6e 67 2d 3e 50 6f 69 6e 74 73 29 3b 0a 20 20 rng->Points);.
3060: 20 20 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 for (iv = 0; i
3070: 76 20 3c 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 3b v < rng->Points;
3080: 20 69 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 iv++). {..
3090: 20 20 2f 2a 20 63 6f 70 79 69 6e 67 20 76 65 72 /* copying ver
30a0: 74 69 63 65 73 20 2a 2f 0a 09 20 20 69 66 20 28 tices */.. if (
30b0: 72 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f rng->DimensionMo
30c0: 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a del == GAIA_XY_Z
30d0: 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47 ).. {...gaiaG
30e0: 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e 67 2d etPointXYZ (rng-
30f0: 3e 43 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c >Coords, iv, &x,
3100: 20 26 79 2c 20 26 7a 29 3b 0a 09 20 20 20 20 7d &y, &z);.. }
3110: 0a 09 20 20 65 6c 73 65 20 69 66 20 28 72 6e 67 .. else if (rng
3120: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c ->DimensionModel
3130: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 == GAIA_XY_M)..
3140: 20 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 {...gaiaGetP
3150: 6f 69 6e 74 58 59 4d 20 28 72 6e 67 2d 3e 43 6f ointXYM (rng->Co
3160: 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 ords, iv, &x, &y
3170: 2c 20 26 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 , &m);.. }..
3180: 20 65 6c 73 65 20 69 66 20 28 72 6e 67 2d 3e 44 else if (rng->D
3190: 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d imensionModel ==
31a0: 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 GAIA_XY_Z_M)..
31b0: 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f {...gaiaGetPo
31c0: 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43 6f intXYZM (rng->Co
31d0: 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 ords, iv, &x, &y
31e0: 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 20 20 20 20 , &z, &m);..
31f0: 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b }.. else.. {
3200: 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e 74 20 ...gaiaGetPoint
3210: 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 (rng->Coords, iv
3220: 2c 20 26 78 2c 20 26 79 29 3b 0a 09 20 20 20 20 , &x, &y);..
3230: 7d 0a 09 20 20 70 6f 69 6e 74 2e 78 20 3d 20 78 }.. point.x = x
3240: 3b 0a 09 20 20 70 6f 69 6e 74 2e 79 20 3d 20 79 ;.. point.y = y
3250: 3b 0a 09 20 20 69 66 20 28 68 61 73 5f 7a 29 0a ;.. if (has_z).
3260: 09 20 20 20 20 20 20 70 6f 69 6e 74 2e 7a 20 3d . point.z =
3270: 20 7a 3b 0a 09 20 20 70 74 61 72 72 61 79 5f 73 z;.. ptarray_s
3280: 65 74 5f 70 6f 69 6e 74 34 64 20 28 63 74 78 2c et_point4d (ctx,
3290: 20 70 70 61 61 5b 30 5d 2c 20 69 76 2c 20 26 70 ppaa[0], iv, &p
32a0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 oint);. }.
32b0: 20 20 20 69 66 20 28 63 6c 6f 73 65 5f 72 69 6e if (close_rin
32c0: 67 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a g). {.. /*
32d0: 20 6d 61 6b 69 6e 67 20 61 6e 20 75 6e 63 6c 6f making an unclo
32e0: 73 65 64 20 72 69 6e 67 20 74 6f 20 62 65 20 63 sed ring to be c
32f0: 6c 6f 73 65 64 20 2a 2f 0a 09 20 20 69 66 20 28 losed */.. if (
3300: 72 6e 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f rng->DimensionMo
3310: 64 65 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a del == GAIA_XY_Z
3320: 29 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 47 ).. {...gaiaG
3330: 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 6e 67 2d etPointXYZ (rng-
3340: 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 26 78 2c 20 >Coords, 0, &x,
3350: 26 79 2c 20 26 7a 29 3b 0a 09 20 20 20 20 7d 0a &y, &z);.. }.
3360: 09 20 20 65 6c 73 65 20 69 66 20 28 72 6e 67 2d . else if (rng-
3370: 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 >DimensionModel
3380: 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 20 == GAIA_XY_M)..
3390: 20 20 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f {...gaiaGetPo
33a0: 69 6e 74 58 59 4d 20 28 72 6e 67 2d 3e 43 6f 6f intXYM (rng->Coo
33b0: 72 64 73 2c 20 30 2c 20 26 78 2c 20 26 79 2c 20 rds, 0, &x, &y,
33c0: 26 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 &m);.. }.. e
33d0: 6c 73 65 20 69 66 20 28 72 6e 67 2d 3e 44 69 6d lse if (rng->Dim
33e0: 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 ensionModel == G
33f0: 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a 09 20 20 20 AIA_XY_Z_M)..
3400: 20 7b 0a 09 09 67 61 69 61 47 65 74 50 6f 69 6e {...gaiaGetPoin
3410: 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 tXYZM (rng->Coor
3420: 64 73 2c 20 30 2c 20 26 78 2c 20 26 79 2c 20 26 ds, 0, &x, &y, &
3430: 7a 2c 20 26 6d 29 3b 0a 09 20 20 20 20 7d 0a 09 z, &m);.. }..
3440: 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 else.. {...
3450: 67 61 69 61 47 65 74 50 6f 69 6e 74 20 28 72 6e gaiaGetPoint (rn
3460: 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 26 78 g->Coords, 0, &x
3470: 2c 20 26 79 29 3b 0a 09 20 20 20 20 7d 0a 09 20 , &y);.. }..
3480: 20 70 6f 69 6e 74 2e 78 20 3d 20 78 3b 0a 09 20 point.x = x;..
3490: 20 70 6f 69 6e 74 2e 79 20 3d 20 79 3b 0a 09 20 point.y = y;..
34a0: 20 69 66 20 28 68 61 73 5f 7a 29 0a 09 20 20 20 if (has_z)..
34b0: 20 20 20 70 6f 69 6e 74 2e 7a 20 3d 20 7a 3b 0a point.z = z;.
34c0: 09 20 20 70 74 61 72 72 61 79 5f 73 65 74 5f 70 . ptarray_set_p
34d0: 6f 69 6e 74 34 64 20 28 63 74 78 2c 20 70 70 61 oint4d (ctx, ppa
34e0: 61 5b 30 5d 2c 20 72 6e 67 2d 3e 50 6f 69 6e 74 a[0], rng->Point
34f0: 73 2c 20 26 70 6f 69 6e 74 29 3b 0a 20 20 20 20 s, &point);.
3500: 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 69 62 20 }. for (ib
3510: 3d 20 30 3b 20 69 62 20 3c 20 70 67 2d 3e 4e 75 = 0; ib < pg->Nu
3520: 6d 49 6e 74 65 72 69 6f 72 73 3b 20 69 62 2b 2b mInteriors; ib++
3530: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 ). {.. /*
3540: 63 6f 70 79 69 6e 67 20 76 65 72 74 69 63 65 73 copying vertices
3550: 20 2d 20 49 6e 74 65 72 69 6f 72 20 52 69 6e 67 - Interior Ring
3560: 73 20 2a 2f 0a 09 20 20 72 6e 67 20 3d 20 70 67 s */.. rng = pg
3570: 2d 3e 49 6e 74 65 72 69 6f 72 73 20 2b 20 69 62 ->Interiors + ib
3580: 3b 0a 09 20 20 63 6c 6f 73 65 5f 72 69 6e 67 20 ;.. close_ring
3590: 3d 20 63 68 65 63 6b 5f 75 6e 63 6c 6f 73 65 64 = check_unclosed
35a0: 5f 72 69 6e 67 20 28 72 6e 67 29 3b 0a 09 20 20 _ring (rng);..
35b0: 69 66 20 28 63 6c 6f 73 65 5f 72 69 6e 67 29 0a if (close_ring).
35c0: 09 20 20 20 20 20 20 70 70 61 61 5b 31 20 2b 20 . ppaa[1 +
35d0: 69 62 5d 20 3d 20 70 74 61 72 72 61 79 5f 63 6f ib] = ptarray_co
35e0: 6e 73 74 72 75 63 74 20 28 63 74 78 2c 20 68 61 nstruct (ctx, ha
35f0: 73 5f 7a 2c 20 30 2c 20 72 6e 67 2d 3e 50 6f 69 s_z, 0, rng->Poi
3600: 6e 74 73 20 2b 20 31 29 3b 0a 09 20 20 65 6c 73 nts + 1);.. els
3610: 65 0a 09 20 20 20 20 20 20 70 70 61 61 5b 31 20 e.. ppaa[1
3620: 2b 20 69 62 5d 20 3d 20 70 74 61 72 72 61 79 5f + ib] = ptarray_
3630: 63 6f 6e 73 74 72 75 63 74 20 28 63 74 78 2c 20 construct (ctx,
3640: 68 61 73 5f 7a 2c 20 30 2c 20 72 6e 67 2d 3e 50 has_z, 0, rng->P
3650: 6f 69 6e 74 73 29 3b 0a 09 20 20 66 6f 72 20 28 oints);.. for (
3660: 69 76 20 3d 20 30 3b 20 69 76 20 3c 20 72 6e 67 iv = 0; iv < rng
3670: 2d 3e 50 6f 69 6e 74 73 3b 20 69 76 2b 2b 29 0a ->Points; iv++).
3680: 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f 70 79 . {.../* copy
3690: 69 6e 67 20 76 65 72 74 69 63 65 73 20 2a 2f 0a ing vertices */.
36a0: 09 09 69 66 20 28 72 6e 67 2d 3e 44 69 6d 65 6e ..if (rng->Dimen
36b0: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 sionModel == GAI
36c0: 41 5f 58 59 5f 5a 29 0a 09 09 20 20 7b 0a 09 09 A_XY_Z)... {...
36d0: 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 gaiaGetPoi
36e0: 6e 74 58 59 5a 20 28 72 6e 67 2d 3e 43 6f 6f 72 ntXYZ (rng->Coor
36f0: 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 ds, iv, &x, &y,
3700: 26 7a 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 &z);... }...els
3710: 65 20 69 66 20 28 72 6e 67 2d 3e 44 69 6d 65 6e e if (rng->Dimen
3720: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 sionModel == GAI
3730: 41 5f 58 59 5f 4d 29 0a 09 09 20 20 7b 0a 09 09 A_XY_M)... {...
3740: 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f 69 gaiaGetPoi
3750: 6e 74 58 59 4d 20 28 72 6e 67 2d 3e 43 6f 6f 72 ntXYM (rng->Coor
3760: 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 79 2c 20 ds, iv, &x, &y,
3770: 26 6d 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 &m);... }...els
3780: 65 20 69 66 20 28 72 6e 67 2d 3e 44 69 6d 65 6e e if (rng->Dimen
3790: 73 69 6f 6e 4d 6f 64 65 6c 20 3d 3d 20 47 41 49 sionModel == GAI
37a0: 41 5f 58 59 5f 5a 5f 4d 29 0a 09 09 20 20 7b 0a A_XY_Z_M)... {.
37b0: 09 09 20 20 20 20 20 20 67 61 69 61 47 65 74 50 .. gaiaGetP
37c0: 6f 69 6e 74 58 59 5a 4d 20 28 72 6e 67 2d 3e 43 ointXYZM (rng->C
37d0: 6f 6f 72 64 73 2c 20 69 76 2c 20 26 78 2c 20 26 oords, iv, &x, &
37e0: 79 2c 20 26 7a 2c 20 26 6d 29 3b 0a 09 09 20 20 y, &z, &m);...
37f0: 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 }...else... {..
3800: 09 20 20 20 20 20 20 67 61 69 61 47 65 74 50 6f . gaiaGetPo
3810: 69 6e 74 20 28 72 6e 67 2d 3e 43 6f 6f 72 64 73 int (rng->Coords
3820: 2c 20 69 76 2c 20 26 78 2c 20 26 79 29 3b 0a 09 , iv, &x, &y);..
3830: 09 20 20 7d 0a 09 09 70 6f 69 6e 74 2e 78 20 3d . }...point.x =
3840: 20 78 3b 0a 09 09 70 6f 69 6e 74 2e 79 20 3d 20 x;...point.y =
3850: 79 3b 0a 09 09 69 66 20 28 68 61 73 5f 7a 29 0a y;...if (has_z).
3860: 09 09 20 20 20 20 70 6f 69 6e 74 2e 7a 20 3d 20 .. point.z =
3870: 7a 3b 0a 09 09 70 74 61 72 72 61 79 5f 73 65 74 z;...ptarray_set
3880: 5f 70 6f 69 6e 74 34 64 20 28 63 74 78 2c 20 70 _point4d (ctx, p
3890: 70 61 61 5b 31 20 2b 20 69 62 5d 2c 20 69 76 2c paa[1 + ib], iv,
38a0: 20 26 70 6f 69 6e 74 29 3b 0a 09 20 20 20 20 7d &point);.. }
38b0: 0a 09 20 20 69 66 20 28 63 6c 6f 73 65 5f 72 69 .. if (close_ri
38c0: 6e 67 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 ng).. {.../*
38d0: 6d 61 6b 69 6e 67 20 61 6e 20 75 6e 63 6c 6f 73 making an unclos
38e0: 65 64 20 72 69 6e 67 20 74 6f 20 62 65 20 63 6c ed ring to be cl
38f0: 6f 73 65 64 20 2a 2f 0a 09 09 69 66 20 28 72 6e osed */...if (rn
3900: 67 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 g->DimensionMode
3910: 6c 20 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 29 0a l == GAIA_XY_Z).
3920: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 .. {... ga
3930: 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 20 28 72 iaGetPointXYZ (r
3940: 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 26 ng->Coords, 0, &
3950: 78 2c 20 26 79 2c 20 26 7a 29 3b 0a 09 09 20 20 x, &y, &z);...
3960: 7d 0a 09 09 65 6c 73 65 20 69 66 20 28 72 6e 67 }...else if (rng
3970: 2d 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c ->DimensionModel
3980: 20 3d 3d 20 47 41 49 41 5f 58 59 5f 4d 29 0a 09 == GAIA_XY_M)..
3990: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 . {... gai
39a0: 61 47 65 74 50 6f 69 6e 74 58 59 4d 20 28 72 6e aGetPointXYM (rn
39b0: 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 26 78 g->Coords, 0, &x
39c0: 2c 20 26 79 2c 20 26 6d 29 3b 0a 09 09 20 20 7d , &y, &m);... }
39d0: 0a 09 09 65 6c 73 65 20 69 66 20 28 72 6e 67 2d ...else if (rng-
39e0: 3e 44 69 6d 65 6e 73 69 6f 6e 4d 6f 64 65 6c 20 >DimensionModel
39f0: 3d 3d 20 47 41 49 41 5f 58 59 5f 5a 5f 4d 29 0a == GAIA_XY_Z_M).
3a00: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 .. {... ga
3a10: 69 61 47 65 74 50 6f 69 6e 74 58 59 5a 4d 20 28 iaGetPointXYZM (
3a20: 72 6e 67 2d 3e 43 6f 6f 72 64 73 2c 20 30 2c 20 rng->Coords, 0,
3a30: 26 78 2c 20 26 79 2c 20 26 7a 2c 20 26 6d 29 3b &x, &y, &z, &m);
3a40: 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 ... }...else...
3a50: 20 20 7b 0a 09 09 20 20 20 20 20 20 67 61 69 61 {... gaia
3a60: 47 65 74 50 6f 69 6e 74 20 28 72 6e 67 2d 3e 43 GetPoint (rng->C
3a70: 6f 6f 72 64 73 2c 20 30 2c 20 26 78 2c 20 26 79 oords, 0, &x, &y
3a80: 29 3b 0a 09 09 20 20 7d 0a 09 09 70 6f 69 6e 74 );... }...point
3a90: 2e 78 20 3d 20 78 3b 0a 09 09 70 6f 69 6e 74 2e .x = x;...point.
3aa0: 79 20 3d 20 79 3b 0a 09 09 69 66 20 28 68 61 73 y = y;...if (has
3ab0: 5f 7a 29 0a 09 09 20 20 20 20 70 6f 69 6e 74 2e _z)... point.
3ac0: 7a 20 3d 20 7a 3b 0a 09 09 70 74 61 72 72 61 79 z = z;...ptarray
3ad0: 5f 73 65 74 5f 70 6f 69 6e 74 34 64 20 28 63 74 _set_point4d (ct
3ae0: 78 2c 20 70 70 61 61 5b 31 20 2b 20 69 62 5d 2c x, ppaa[1 + ib],
3af0: 20 72 6e 67 2d 3e 50 6f 69 6e 74 73 2c 20 26 70 rng->Points, &p
3b00: 6f 69 6e 74 29 3b 0a 09 20 20 20 20 7d 0a 20 20 oint);.. }.
3b10: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
3b20: 20 72 74 70 6f 6c 79 5f 63 6f 6e 73 74 72 75 63 rtpoly_construc
3b30: 74 20 28 63 74 78 2c 20 73 72 69 64 2c 20 4e 55 t (ctx, srid, NU
3b40: 4c 4c 2c 20 6e 67 65 6f 6d 73 20 2b 20 31 2c 20 LL, ngeoms + 1,
3b50: 70 70 61 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 ppaa);.}..static
3b60: 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 gaiaGeomCollPtr
3b70: 0a 64 6f 5f 72 74 6c 69 6e 65 5f 74 6f 5f 67 65 .do_rtline_to_ge
3b80: 6f 6d 20 28 63 6f 6e 73 74 20 52 54 43 54 58 20 om (const RTCTX
3b90: 2a 20 63 74 78 2c 20 52 54 4c 49 4e 45 20 2a 20 * ctx, RTLINE *
3ba0: 72 74 6c 69 6e 65 2c 20 69 6e 74 20 73 72 69 64 rtline, int srid
3bb0: 29 0a 7b 0a 2f 2a 20 63 6f 6e 76 65 72 74 69 6e ).{./* convertin
3bc0: 67 20 61 20 52 54 4c 49 4e 45 20 69 6e 74 6f 20 g a RTLINE into
3bd0: 61 20 47 65 6f 6d 65 74 72 79 20 28 4c 69 6e 65 a Geometry (Line
3be0: 73 74 72 69 6e 67 29 20 2a 2f 0a 20 20 20 20 52 string) */. R
3bf0: 54 50 4f 49 4e 54 41 52 52 41 59 20 2a 70 61 3b TPOINTARRAY *pa;
3c00: 0a 20 20 20 20 52 54 50 4f 49 4e 54 34 44 20 70 . RTPOINT4D p
3c10: 74 34 64 3b 0a 20 20 20 20 69 6e 74 20 68 61 73 t4d;. int has
3c20: 5f 7a 20 3d 20 30 3b 0a 20 20 20 20 64 6f 75 62 _z = 0;. doub
3c30: 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 le x;. double
3c40: 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 7a y;. double z
3c50: 3b 0a 20 20 20 20 69 6e 74 20 69 76 3b 0a 20 20 ;. int iv;.
3c60: 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 gaiaGeomCollPt
3c70: 72 20 67 65 6f 6d 3b 0a 20 20 20 20 67 61 69 61 r geom;. gaia
3c80: 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 6c 6e LinestringPtr ln
3c90: 3b 0a 0a 20 20 20 20 70 61 20 3d 20 72 74 6c 69 ;.. pa = rtli
3ca0: 6e 65 2d 3e 70 6f 69 6e 74 73 3b 0a 20 20 20 20 ne->points;.
3cb0: 69 66 20 28 52 54 46 4c 41 47 53 5f 47 45 54 5f if (RTFLAGS_GET_
3cc0: 5a 20 28 70 61 2d 3e 66 6c 61 67 73 29 29 0a 09 Z (pa->flags))..
3cd0: 68 61 73 5f 7a 20 3d 20 31 3b 0a 20 20 20 20 69 has_z = 1;. i
3ce0: 66 20 28 68 61 73 5f 7a 29 0a 09 67 65 6f 6d 20 f (has_z)..geom
3cf0: 3d 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 = gaiaAllocGeomC
3d00: 6f 6c 6c 58 59 5a 20 28 29 3b 0a 20 20 20 20 65 ollXYZ ();. e
3d10: 6c 73 65 0a 09 67 65 6f 6d 20 3d 20 67 61 69 61 lse..geom = gaia
3d20: 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c 6c 20 28 29 AllocGeomColl ()
3d30: 3b 0a 20 20 20 20 6c 6e 20 3d 20 67 61 69 61 41 ;. ln = gaiaA
3d40: 64 64 4c 69 6e 65 73 74 72 69 6e 67 54 6f 47 65 ddLinestringToGe
3d50: 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 2c 20 70 61 omColl (geom, pa
3d60: 2d 3e 6e 70 6f 69 6e 74 73 29 3b 0a 20 20 20 20 ->npoints);.
3d70: 66 6f 72 20 28 69 76 20 3d 20 30 3b 20 69 76 20 for (iv = 0; iv
3d80: 3c 20 70 61 2d 3e 6e 70 6f 69 6e 74 73 3b 20 69 < pa->npoints; i
3d90: 76 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 v++). {..
3da0: 2f 2a 20 63 6f 70 79 69 6e 67 20 4c 49 4e 45 53 /* copying LINES
3db0: 54 52 49 4e 47 20 76 65 72 74 69 63 65 73 20 2a TRING vertices *
3dc0: 2f 0a 09 20 20 72 74 5f 67 65 74 50 6f 69 6e 74 /.. rt_getPoint
3dd0: 34 64 5f 70 20 28 63 74 78 2c 20 70 61 2c 20 69 4d_p (ctx, pa, i
3de0: 76 2c 20 26 70 74 34 64 29 3b 0a 09 20 20 78 20 v, &pt4d);.. x
3df0: 3d 20 70 74 34 64 2e 78 3b 0a 09 20 20 79 20 3d = pt4d.x;.. y =
3e00: 20 70 74 34 64 2e 79 3b 0a 09 20 20 69 66 20 28 pt4d.y;.. if (
3e10: 68 61 73 5f 7a 29 0a 09 20 20 20 20 20 20 7a 20 has_z).. z
3e20: 3d 20 70 74 34 64 2e 7a 3b 0a 09 20 20 69 66 20 = pt4d.z;.. if
3e30: 28 68 61 73 5f 7a 29 0a 09 20 20 20 20 7b 0a 09 (has_z).. {..
3e40: 09 67 61 69 61 53 65 74 50 6f 69 6e 74 58 59 5a .gaiaSetPointXYZ
3e50: 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 (ln->Coords, iv
3e60: 2c 20 78 2c 20 79 2c 20 7a 29 3b 0a 09 20 20 20 , x, y, z);..
3e70: 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 }.. else..
3e80: 7b 0a 09 09 67 61 69 61 53 65 74 50 6f 69 6e 74 {...gaiaSetPoint
3e90: 20 28 6c 6e 2d 3e 43 6f 6f 72 64 73 2c 20 69 76 (ln->Coords, iv
3ea0: 2c 20 78 2c 20 79 29 3b 0a 09 20 20 20 20 7d 0a , x, y);.. }.
3eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 67 65 6f 6d }. geom
3ec0: 2d 3e 44 65 63 6c 61 72 65 64 54 79 70 65 20 3d ->DeclaredType =
3ed0: 20 47 41 49 41 5f 4c 49 4e 45 53 54 52 49 4e 47 GAIA_LINESTRING
3ee0: 3b 0a 20 20 20 20 67 65 6f 6d 2d 3e 53 72 69 64 ;. geom->Srid
3ef0: 20 3d 20 73 72 69 64 3b 0a 0a 20 20 20 20 72 65 = srid;.. re
3f00: 74 75 72 6e 20 67 65 6f 6d 3b 0a 7d 0a 0a 73 74 turn geom;.}..st
3f10: 61 74 69 63 20 63 68 61 72 20 2a 0a 64 6f 5f 70 atic char *.do_p
3f20: 72 65 70 61 72 65 5f 72 65 61 64 5f 6e 6f 64 65 repare_read_node
3f30: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 6f (const char *to
3f40: 70 6f 6c 6f 67 79 5f 6e 61 6d 65 2c 20 69 6e 74 pology_name, int
3f50: 20 66 69 65 6c 64 73 2c 20 69 6e 74 20 68 61 73 fields, int has
3f60: 5f 7a 29 0a 7b 0a 2f 2a 20 70 72 65 70 61 72 69 _z).{./* prepari
3f70: 6e 67 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 ng the auxiliary
3f80: 20 22 72 65 61 64 5f 6e 6f 64 65 22 20 53 51 4c "read_node" SQL
3f90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 statement */.
3fa0: 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20 char *sql;.
3fb0: 20 63 68 61 72 20 2a 70 72 65 76 3b 0a 20 20 20 char *prev;.
3fc0: 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20 char *table;.
3fd0: 20 20 63 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a char *xtable;.
3fe0: 20 20 20 20 69 6e 74 20 63 6f 6d 6d 61 20 3d 20 int comma =
3ff0: 30 3b 0a 0a 20 20 20 20 73 71 6c 20 3d 20 73 71 0;.. sql = sq
4000: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
4010: 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 20 20 70 SELECT ");. p
4020: 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 69 rev = sql;. i
4030: 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
4040: 43 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 45 5f 49 44 COL_NODE_NODE_ID
4050: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
4060: 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 (comma).. s
4070: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
4080: 69 6e 74 66 20 28 22 25 73 2c 20 6e 6f 64 65 5f intf ("%s, node_
4090: 69 64 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 id", prev);.. e
40a0: 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d lse.. sql =
40b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
40c0: 20 28 22 25 73 20 6e 6f 64 65 5f 69 64 22 2c 20 ("%s node_id",
40d0: 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
40e0: 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
40f0: 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
4100: 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
4110: 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 6c }. if (fiel
4120: 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 ds & RTT_COL_NOD
4130: 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 5f 46 41 43 E_CONTAINING_FAC
4140: 45 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 E). {.. if
4150: 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 (comma)..
4160: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
4170: 72 69 6e 74 66 20 28 22 25 73 2c 20 63 6f 6e 74 rintf ("%s, cont
4180: 61 69 6e 69 6e 67 5f 66 61 63 65 22 2c 20 70 72 aining_face", pr
4190: 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 ev);.. else..
41a0: 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
41b0: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 63 3_mprintf ("%s c
41c0: 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 22 2c ontaining_face",
41d0: 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 prev);.. comma
41e0: 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 = 1;.. sqlite3
41f0: 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 _free (prev);..
4200: 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
4210: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 }. if (fie
4220: 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f lds & RTT_COL_NO
4230: 44 45 5f 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b DE_GEOM). {
4240: 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 .. if (comma)..
4250: 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
4260: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
4270: 2c 20 53 54 5f 58 28 67 65 6f 6d 29 2c 20 53 54 , ST_X(geom), ST
4280: 5f 59 28 67 65 6f 6d 29 22 2c 20 70 72 65 76 29 _Y(geom)", prev)
4290: 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
42a0: 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
42b0: 70 72 69 6e 74 66 20 28 22 25 73 20 53 54 5f 58 printf ("%s ST_X
42c0: 28 67 65 6f 6d 29 2c 20 53 54 5f 59 28 67 65 6f (geom), ST_Y(geo
42d0: 6d 29 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 m)", prev);.. c
42e0: 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c omma = 1;.. sql
42f0: 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 ite3_free (prev)
4300: 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b ;.. prev = sql;
4310: 0a 09 20 20 69 66 20 28 68 61 73 5f 7a 29 0a 09 .. if (has_z)..
4320: 20 20 20 20 7b 0a 09 09 73 71 6c 20 3d 20 73 71 {...sql = sq
4330: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
4340: 25 73 2c 20 53 54 5f 5a 28 67 65 6f 6d 29 22 2c %s, ST_Z(geom)",
4350: 20 70 72 65 76 29 3b 0a 09 09 73 71 6c 69 74 65 prev);...sqlite
4360: 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 3_free (prev);..
4370: 09 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 20 20 .prev = sql;..
4380: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
4390: 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f table = sqlite3_
43a0: 6d 70 72 69 6e 74 66 20 28 22 25 73 5f 6e 6f 64 mprintf ("%s_nod
43b0: 65 22 2c 20 74 6f 70 6f 6c 6f 67 79 5f 6e 61 6d e", topology_nam
43c0: 65 29 3b 0a 20 20 20 20 78 74 61 62 6c 65 20 3d e);. xtable =
43d0: 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f 74 65 gaiaDoubleQuote
43e0: 64 53 71 6c 20 28 74 61 62 6c 65 29 3b 0a 20 20 dSql (table);.
43f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
4400: 74 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 20 table);. sql
4410: 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e =..sqlite3_mprin
4420: 74 66 20 28 22 25 73 20 46 52 4f 4d 20 4d 41 49 tf ("%s FROM MAI
4430: 4e 2e 5c 22 25 73 5c 22 20 57 48 45 52 45 20 6e N.\"%s\" WHERE n
4440: 6f 64 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 65 ode_id = ?", pre
4450: 76 2c 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 v, xtable);.
4460: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 sqlite3_free (pr
4470: 65 76 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78 ev);. free (x
4480: 74 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 table);. retu
4490: 72 6e 20 73 71 6c 3b 0a 7d 0a 0a 73 74 61 74 69 rn sql;.}..stati
44a0: 63 20 69 6e 74 0a 64 6f 5f 72 65 61 64 5f 6e 6f c int.do_read_no
44b0: 64 65 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 de (sqlite3_stmt
44c0: 20 2a 20 73 74 6d 74 2c 20 73 74 72 75 63 74 20 * stmt, struct
44d0: 74 6f 70 6f 5f 6e 6f 64 65 73 5f 6c 69 73 74 20 topo_nodes_list
44e0: 2a 6c 69 73 74 2c 0a 09 20 20 20 20 20 20 73 71 *list,.. sq
44f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 64 2c 20 lite3_int64 id,
4500: 69 6e 74 20 66 69 65 6c 64 73 2c 20 69 6e 74 20 int fields, int
4510: 68 61 73 5f 7a 2c 0a 09 20 20 20 20 20 20 63 6f has_z,.. co
4520: 6e 73 74 20 63 68 61 72 20 2a 63 61 6c 6c 62 61 nst char *callba
4530: 63 6b 5f 6e 61 6d 65 2c 20 63 68 61 72 20 2a 2a ck_name, char **
4540: 65 72 72 6d 73 67 29 0a 7b 0a 2f 2a 20 72 65 61 errmsg).{./* rea
4550: 64 69 6e 67 20 4e 6f 64 65 73 20 6f 75 74 20 66 ding Nodes out f
4560: 72 6f 6d 20 74 68 65 20 44 42 4d 53 20 2a 2f 0a rom the DBMS */.
4570: 20 20 20 20 69 6e 74 20 69 63 6f 6c 20 3d 20 30 int icol = 0
4580: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 0a ;. int ret;..
4590: 2f 2a 20 73 65 74 74 69 6e 67 20 75 70 20 74 68 /* setting up th
45a0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 e prepared state
45b0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 ment */. sqli
45c0: 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 te3_reset (stmt)
45d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c ;. sqlite3_cl
45e0: 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 ear_bindings (st
45f0: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 mt);. sqlite3
4600: 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d _bind_int64 (stm
4610: 74 2c 20 31 2c 20 69 64 29 3b 0a 0a 20 20 20 20 t, 1, id);..
4620: 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 while (1).
4630: 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e {.. /* scrollin
4640: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 g the result set
4650: 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 rows */.. ret
4660: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 = sqlite3_step (
4670: 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 stmt);.. if (re
4680: 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 t == SQLITE_DONE
4690: 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 ).. break;.
46a0: 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c ./* end of resul
46b0: 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 t set */.. if (
46c0: 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f ret == SQLITE_RO
46d0: 57 29 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 W).. {...int
46e0: 6f 6b 5f 69 64 20 3d 20 30 3b 0a 09 09 69 6e 74 ok_id = 0;...int
46f0: 20 6f 6b 5f 66 61 63 65 20 3d 20 30 3b 0a 09 09 ok_face = 0;...
4700: 69 6e 74 20 6f 6b 5f 78 20 3d 20 30 3b 0a 09 09 int ok_x = 0;...
4710: 69 6e 74 20 6f 6b 5f 79 20 3d 20 30 3b 0a 09 09 int ok_y = 0;...
4720: 69 6e 74 20 6f 6b 5f 7a 20 3d 20 30 3b 0a 09 09 int ok_z = 0;...
4730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 6f sqlite3_int64 no
4740: 64 65 5f 69 64 20 3d 20 2d 31 3b 0a 09 09 73 71 de_id = -1;...sq
4750: 6c 69 74 65 33 5f 69 6e 74 36 34 20 63 6f 6e 74 lite3_int64 cont
4760: 61 69 6e 69 6e 67 5f 66 61 63 65 20 3d 20 2d 31 aining_face = -1
4770: 3b 0a 09 09 64 6f 75 62 6c 65 20 78 20 3d 20 30 ;...double x = 0
4780: 2e 30 3b 0a 09 09 64 6f 75 62 6c 65 20 79 20 3d .0;...double y =
4790: 20 30 2e 30 3b 0a 09 09 64 6f 75 62 6c 65 20 7a 0.0;...double z
47a0: 20 3d 20 30 2e 30 3b 0a 09 09 69 66 20 28 66 69 = 0.0;...if (fi
47b0: 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e elds & RTT_COL_N
47c0: 4f 44 45 5f 4e 4f 44 45 5f 49 44 29 0a 09 09 20 ODE_NODE_ID)...
47d0: 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 73 {... if (s
47e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 qlite3_column_ty
47f0: 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 20 pe (stmt, icol)
4800: 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 == SQLITE_INTEGE
4810: 52 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 6e R)....{.... n
4820: 6f 64 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 ode_id = sqlite3
4830: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 _column_int64 (s
4840: 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 09 20 tmt, icol);....
4850: 20 20 20 6f 6b 5f 69 64 20 3d 20 31 3b 0a 09 09 ok_id = 1;...
4860: 09 7d 0a 09 09 20 20 20 20 20 20 69 63 6f 6c 2b .}... icol+
4870: 2b 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a +;... }...else.
4880: 09 09 20 20 20 20 6f 6b 5f 69 64 20 3d 20 31 3b .. ok_id = 1;
4890: 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
48a0: 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e RTT_COL_NODE_CON
48b0: 54 41 49 4e 49 4e 47 5f 46 41 43 45 29 0a 09 09 TAINING_FACE)...
48c0: 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 {... if (
48d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
48e0: 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 ype (stmt, icol)
48f0: 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 == SQLITE_NULL)
4900: 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 63 6f 6e ....{.... con
4910: 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 3d 20 2d taining_face = -
4920: 31 3b 0a 09 09 09 20 20 20 20 6f 6b 5f 66 61 63 1;.... ok_fac
4930: 65 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 20 20 e = 1;....}...
4940: 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f if (sqlite3_
4950: 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 74 6d column_type (stm
4960: 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 4c 49 t, icol) == SQLI
4970: 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 09 09 7b TE_INTEGER)....{
4980: 0a 09 09 09 20 20 20 20 63 6f 6e 74 61 69 6e 69 .... containi
4990: 6e 67 5f 66 61 63 65 20 3d 20 73 71 6c 69 74 65 ng_face = sqlite
49a0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 3_column_int64 (
49b0: 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 09 stmt, icol);....
49c0: 20 20 20 20 6f 6b 5f 66 61 63 65 20 3d 20 31 3b ok_face = 1;
49d0: 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 69 63 ....}... ic
49e0: 6f 6c 2b 2b 3b 0a 09 09 20 20 7d 0a 09 09 65 6c ol++;... }...el
49f0: 73 65 0a 09 09 20 20 20 20 6f 6b 5f 66 61 63 65 se... ok_face
4a00: 20 3d 20 31 3b 0a 09 09 69 66 20 28 66 69 65 6c = 1;...if (fiel
4a10: 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 ds & RTT_COL_NOD
4a20: 45 5f 47 45 4f 4d 29 0a 09 09 20 20 7b 0a 09 09 E_GEOM)... {...
4a30: 20 20 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 if (sqlite
4a40: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 3_column_type (s
4a50: 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 tmt, icol) == SQ
4a60: 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 09 09 7b LITE_FLOAT)....{
4a70: 0a 09 09 09 20 20 20 20 78 20 3d 20 73 71 6c 69 .... x = sqli
4a80: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c te3_column_doubl
4a90: 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a e (stmt, icol);.
4aa0: 09 09 09 20 20 20 20 6f 6b 5f 78 20 3d 20 31 3b ... ok_x = 1;
4ab0: 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 69 63 ....}... ic
4ac0: 6f 6c 2b 2b 3b 0a 09 09 20 20 20 20 20 20 69 66 ol++;... if
4ad0: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e (sqlite3_column
4ae0: 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f _type (stmt, ico
4af0: 6c 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f l) == SQLITE_FLO
4b00: 41 54 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 AT)....{....
4b10: 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 y = sqlite3_colu
4b20: 6d 6e 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c mn_double (stmt,
4b30: 20 69 63 6f 6c 29 3b 0a 09 09 09 20 20 20 20 6f icol);.... o
4b40: 6b 5f 79 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 k_y = 1;....}...
4b50: 20 20 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 icol++;...
4b60: 20 20 20 20 20 20 69 66 20 28 68 61 73 5f 7a 29 if (has_z)
4b70: 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 ....{.... if
4b80: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f (sqlite3_column_
4b90: 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c type (stmt, icol
4ba0: 29 20 3d 3d 0a 09 09 09 09 53 51 4c 49 54 45 5f ) ==.....SQLITE_
4bb0: 46 4c 4f 41 54 29 0a 09 09 09 20 20 20 20 20 20 FLOAT)....
4bc0: 7b 0a 09 09 09 09 20 20 7a 20 3d 20 73 71 6c 69 {..... z = sqli
4bd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c te3_column_doubl
4be0: 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a e (stmt, icol);.
4bf0: 09 09 09 09 20 20 6f 6b 5f 7a 20 3d 20 31 3b 0a .... ok_z = 1;.
4c00: 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 7d 0a ... }....}.
4c10: 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 .. }...else...
4c20: 20 7b 0a 09 09 20 20 20 20 20 20 6f 6b 5f 78 20 {... ok_x
4c30: 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 6f 6b 5f = 1;... ok_
4c40: 79 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 6f y = 1;... o
4c50: 6b 5f 7a 20 3d 20 31 3b 0a 09 09 20 20 7d 0a 09 k_z = 1;... }..
4c60: 09 69 66 20 28 68 61 73 5f 7a 29 0a 09 09 20 20 .if (has_z)...
4c70: 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 6f 6b {... if (ok
4c80: 5f 69 64 20 26 26 20 6f 6b 5f 66 61 63 65 20 26 _id && ok_face &
4c90: 26 20 6f 6b 5f 78 20 26 26 20 6f 6b 5f 79 20 26 & ok_x && ok_y &
4ca0: 26 20 6f 6b 5f 7a 29 0a 09 09 09 7b 0a 09 09 09 & ok_z)....{....
4cb0: 20 20 20 20 61 64 64 5f 6e 6f 64 65 5f 33 44 20 add_node_3D
4cc0: 28 6c 69 73 74 2c 20 6e 6f 64 65 5f 69 64 2c 20 (list, node_id,
4cd0: 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 2c containing_face,
4ce0: 20 78 2c 20 79 2c 0a 09 09 09 09 09 20 7a 29 3b x, y,...... z);
4cf0: 0a 09 09 09 20 20 20 20 2a 65 72 72 6d 73 67 20 .... *errmsg
4d00: 3d 20 4e 55 4c 4c 3b 0a 09 09 09 20 20 20 20 73 = NULL;.... s
4d10: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
4d20: 6d 74 29 3b 0a 09 09 09 20 20 20 20 72 65 74 75 mt);.... retu
4d30: 72 6e 20 31 3b 0a 09 09 09 7d 0a 09 09 20 20 7d rn 1;....}... }
4d40: 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 ...else... {...
4d50: 20 20 20 20 20 20 69 66 20 28 6f 6b 5f 69 64 20 if (ok_id
4d60: 26 26 20 6f 6b 5f 66 61 63 65 20 26 26 20 6f 6b && ok_face && ok
4d70: 5f 78 20 26 26 20 6f 6b 5f 79 29 0a 09 09 09 7b _x && ok_y)....{
4d80: 0a 09 09 09 20 20 20 20 61 64 64 5f 6e 6f 64 65 .... add_node
4d90: 5f 32 44 20 28 6c 69 73 74 2c 20 6e 6f 64 65 5f _2D (list, node_
4da0: 69 64 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 id, containing_f
4db0: 61 63 65 2c 20 78 2c 20 79 29 3b 0a 09 09 09 20 ace, x, y);....
4dc0: 20 20 20 2a 65 72 72 6d 73 67 20 3d 20 4e 55 4c *errmsg = NUL
4dd0: 4c 3b 0a 09 09 09 20 20 20 20 73 71 6c 69 74 65 L;.... sqlite
4de0: 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 3_reset (stmt);.
4df0: 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b ... return 1;
4e00: 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 2f 2a ....}... }.../*
4e10: 20 61 6e 20 69 6e 76 61 6c 69 64 20 4e 6f 64 65 an invalid Node
4e20: 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 has been found
4e30: 2a 2f 0a 09 09 2a 65 72 72 6d 73 67 20 3d 0a 09 */...*errmsg =..
4e40: 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 . sqlite3_mpr
4e50: 69 6e 74 66 0a 09 09 20 20 20 20 28 22 25 73 3a intf... ("%s:
4e60: 20 66 6f 75 6e 64 20 61 6e 20 69 6e 76 61 6c 69 found an invali
4e70: 64 20 4e 6f 64 65 20 5c 22 25 6c 6c 64 5c 22 22 d Node \"%lld\""
4e80: 2c 20 63 61 6c 6c 62 61 63 6b 5f 6e 61 6d 65 2c , callback_name,
4e90: 0a 09 09 20 20 20 20 20 6e 6f 64 65 5f 69 64 29 ... node_id)
4ea0: 3b 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 ;...return 0;..
4eb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
4ec0: 20 2a 65 72 72 6d 73 67 20 3d 20 4e 55 4c 4c 3b *errmsg = NULL;
4ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 . sqlite3_res
4ee0: 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 et (stmt);. r
4ef0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 eturn 1;.}..stat
4f00: 69 63 20 69 6e 74 0a 64 6f 5f 72 65 61 64 5f 6e ic int.do_read_n
4f10: 6f 64 65 5f 62 79 5f 66 61 63 65 20 28 73 71 6c ode_by_face (sql
4f20: 69 74 65 33 5f 73 74 6d 74 20 2a 20 73 74 6d 74 ite3_stmt * stmt
4f30: 2c 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f , struct topo_no
4f40: 64 65 73 5f 6c 69 73 74 20 2a 6c 69 73 74 2c 0a des_list *list,.
4f50: 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
4f60: 69 6e 74 36 34 20 69 64 2c 20 69 6e 74 20 66 69 int64 id, int fi
4f70: 65 6c 64 73 2c 20 63 6f 6e 73 74 20 52 54 47 42 elds, const RTGB
4f80: 4f 58 20 2a 20 62 6f 78 2c 0a 09 09 20 20 20 20 OX * box,...
4f90: 20 20 69 6e 74 20 68 61 73 5f 7a 2c 20 63 6f 6e int has_z, con
4fa0: 73 74 20 63 68 61 72 20 2a 63 61 6c 6c 62 61 63 st char *callbac
4fb0: 6b 5f 6e 61 6d 65 2c 20 63 68 61 72 20 2a 2a 65 k_name, char **e
4fc0: 72 72 6d 73 67 29 0a 7b 0a 2f 2a 20 72 65 61 64 rrmsg).{./* read
4fd0: 69 6e 67 20 4e 6f 64 65 73 20 6f 75 74 20 66 72 ing Nodes out fr
4fe0: 6f 6d 20 74 68 65 20 44 42 4d 53 20 2a 2f 0a 20 om the DBMS */.
4ff0: 20 20 20 69 6e 74 20 69 63 6f 6c 20 3d 20 30 3b int icol = 0;
5000: 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 0a 2f . int ret;../
5010: 2a 20 73 65 74 74 69 6e 67 20 75 70 20 74 68 65 * setting up the
5020: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d prepared statem
5030: 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 ent */. sqlit
5040: 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b e3_reset (stmt);
5050: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 . sqlite3_cle
5060: 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d ar_bindings (stm
5070: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f t);. sqlite3_
5080: 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 bind_int64 (stmt
5090: 2c 20 31 2c 20 69 64 29 3b 0a 20 20 20 20 69 66 , 1, id);. if
50a0: 20 28 62 6f 78 20 21 3d 20 4e 55 4c 4c 29 0a 20 (box != NULL).
50b0: 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 {.. sqlite
50c0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 3_bind_double (s
50d0: 74 6d 74 2c 20 32 2c 20 62 6f 78 2d 3e 78 6d 69 tmt, 2, box->xmi
50e0: 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 n);.. sqlite3_b
50f0: 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 ind_double (stmt
5100: 2c 20 33 2c 20 62 6f 78 2d 3e 79 6d 69 6e 29 3b , 3, box->ymin);
5110: 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 .. sqlite3_bind
5120: 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 34 _double (stmt, 4
5130: 2c 20 62 6f 78 2d 3e 78 6d 61 78 29 3b 0a 09 20 , box->xmax);..
5140: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f sqlite3_bind_do
5150: 75 62 6c 65 20 28 73 74 6d 74 2c 20 35 2c 20 62 uble (stmt, 5, b
5160: 6f 78 2d 3e 79 6d 61 78 29 3b 0a 20 20 20 20 20 ox->ymax);.
5170: 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 }.. while (1
5180: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 ). {.. /*
5190: 73 63 72 6f 6c 6c 69 6e 67 20 74 68 65 20 72 65 scrolling the re
51a0: 73 75 6c 74 20 73 65 74 20 72 6f 77 73 20 2a 2f sult set rows */
51b0: 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 .. ret = sqlite
51c0: 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 3_step (stmt);..
51d0: 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c if (ret == SQL
51e0: 49 54 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20 ITE_DONE)..
51f0: 20 62 72 65 61 6b 3b 09 09 2f 2a 20 65 6e 64 20 break;../* end
5200: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f of result set */
5210: 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 .. if (ret == S
5220: 51 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 QLITE_ROW)..
5230: 7b 0a 09 09 69 6e 74 20 6f 6b 5f 69 64 20 3d 20 {...int ok_id =
5240: 30 3b 0a 09 09 69 6e 74 20 6f 6b 5f 66 61 63 65 0;...int ok_face
5250: 20 3d 20 30 3b 0a 09 09 69 6e 74 20 6f 6b 5f 78 = 0;...int ok_x
5260: 20 3d 20 30 3b 0a 09 09 69 6e 74 20 6f 6b 5f 79 = 0;...int ok_y
5270: 20 3d 20 30 3b 0a 09 09 69 6e 74 20 6f 6b 5f 7a = 0;...int ok_z
5280: 20 3d 20 30 3b 0a 09 09 73 71 6c 69 74 65 33 5f = 0;...sqlite3_
5290: 69 6e 74 36 34 20 6e 6f 64 65 5f 69 64 20 3d 20 int64 node_id =
52a0: 2d 31 3b 0a 09 09 73 71 6c 69 74 65 33 5f 69 6e -1;...sqlite3_in
52b0: 74 36 34 20 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 t64 containing_f
52c0: 61 63 65 20 3d 20 2d 31 3b 0a 09 09 64 6f 75 62 ace = -1;...doub
52d0: 6c 65 20 78 20 3d 20 30 2e 30 3b 0a 09 09 64 6f le x = 0.0;...do
52e0: 75 62 6c 65 20 79 20 3d 20 30 2e 30 3b 0a 09 09 uble y = 0.0;...
52f0: 64 6f 75 62 6c 65 20 7a 20 3d 20 30 2e 30 3b 0a double z = 0.0;.
5300: 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 ..if (fields & R
5310: 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 45 TT_COL_NODE_NODE
5320: 5f 49 44 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 _ID)... {...
5330: 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 63 if (sqlite3_c
5340: 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 olumn_type (stmt
5350: 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 4c 49 54 , icol) == SQLIT
5360: 45 5f 49 4e 54 45 47 45 52 29 0a 09 09 09 7b 0a E_INTEGER)....{.
5370: 09 09 09 20 20 20 20 6e 6f 64 65 5f 69 64 20 3d ... node_id =
5380: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
5390: 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f int64 (stmt, ico
53a0: 6c 29 3b 0a 09 09 09 20 20 20 20 6f 6b 5f 69 64 l);.... ok_id
53b0: 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 20 20 20 = 1;....}...
53c0: 20 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 20 20 7d icol++;... }
53d0: 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 6f 6b ...else... ok
53e0: 5f 69 64 20 3d 20 31 3b 0a 09 09 69 66 20 28 66 _id = 1;...if (f
53f0: 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
5400: 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 5f NODE_CONTAINING_
5410: 46 41 43 45 29 0a 09 09 20 20 7b 0a 09 09 20 20 FACE)... {...
5420: 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f if (sqlite3_
5430: 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 74 6d column_type (stm
5440: 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 4c 49 t, icol) == SQLI
5450: 54 45 5f 4e 55 4c 4c 29 0a 09 09 09 7b 0a 09 09 TE_NULL)....{...
5460: 09 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67 5f . containing_
5470: 66 61 63 65 20 3d 20 2d 31 3b 0a 09 09 09 20 20 face = -1;....
5480: 20 20 6f 6b 5f 66 61 63 65 20 3d 20 31 3b 0a 09 ok_face = 1;..
5490: 09 09 7d 0a 09 09 20 20 20 20 20 20 69 66 20 28 ..}... if (
54a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
54b0: 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 ype (stmt, icol)
54c0: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 == SQLITE_INTEG
54d0: 45 52 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 ER)....{....
54e0: 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 containing_face
54f0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e = sqlite3_column
5500: 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 _int64 (stmt, ic
5510: 6f 6c 29 3b 0a 09 09 09 20 20 20 20 6f 6b 5f 66 ol);.... ok_f
5520: 61 63 65 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 ace = 1;....}...
5530: 20 20 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 icol++;...
5540: 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 }...else...
5550: 20 6f 6b 5f 66 61 63 65 20 3d 20 31 3b 0a 09 09 ok_face = 1;...
5560: 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 if (fields & RTT
5570: 5f 43 4f 4c 5f 4e 4f 44 45 5f 47 45 4f 4d 29 0a _COL_NODE_GEOM).
5580: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 .. {... if
5590: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e (sqlite3_column
55a0: 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f _type (stmt, ico
55b0: 6c 29 20 3d 3d 20 53 51 4c 49 54 45 5f 46 4c 4f l) == SQLITE_FLO
55c0: 41 54 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 AT)....{....
55d0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 x = sqlite3_colu
55e0: 6d 6e 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c mn_double (stmt,
55f0: 20 69 63 6f 6c 29 3b 0a 09 09 09 20 20 20 20 6f icol);.... o
5600: 6b 5f 78 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 k_x = 1;....}...
5610: 20 20 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 icol++;...
5620: 20 20 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 if (sqlite
5630: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 3_column_type (s
5640: 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 tmt, icol) == SQ
5650: 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 09 09 7b LITE_FLOAT)....{
5660: 0a 09 09 09 20 20 20 20 79 20 3d 20 73 71 6c 69 .... y = sqli
5670: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c te3_column_doubl
5680: 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a e (stmt, icol);.
5690: 09 09 09 20 20 20 20 6f 6b 5f 79 20 3d 20 31 3b ... ok_y = 1;
56a0: 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 69 63 ....}... ic
56b0: 6f 6c 2b 2b 3b 0a 09 09 20 20 20 20 20 20 69 66 ol++;... if
56c0: 20 28 68 61 73 5f 7a 29 0a 09 09 09 7b 0a 09 09 (has_z)....{...
56d0: 09 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 33 . if (sqlite3
56e0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 74 _column_type (st
56f0: 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d 0a 09 09 09 mt, icol) ==....
5700: 09 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 0a 09 .SQLITE_FLOAT)..
5710: 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 20 20 .. {.....
5720: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 z = sqlite3_colu
5730: 6d 6e 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c mn_double (stmt,
5740: 20 69 63 6f 6c 29 3b 0a 09 09 09 09 20 20 6f 6b icol);..... ok
5750: 5f 7a 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 20 _z = 1;....
5760: 20 7d 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 }....}... }...
5770: 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 else... {...
5780: 20 20 20 6f 6b 5f 78 20 3d 20 31 3b 0a 09 09 20 ok_x = 1;...
5790: 20 20 20 20 20 6f 6b 5f 79 20 3d 20 31 3b 0a 09 ok_y = 1;..
57a0: 09 20 20 20 20 20 20 6f 6b 5f 7a 20 3d 20 31 3b . ok_z = 1;
57b0: 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 68 61 73 ... }...if (has
57c0: 5f 7a 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 _z)... {...
57d0: 20 20 69 66 20 28 6f 6b 5f 69 64 20 26 26 20 6f if (ok_id && o
57e0: 6b 5f 66 61 63 65 20 26 26 20 6f 6b 5f 78 20 26 k_face && ok_x &
57f0: 26 20 6f 6b 5f 79 20 26 26 20 6f 6b 5f 7a 29 0a & ok_y && ok_z).
5800: 09 09 09 7b 0a 09 09 09 20 20 20 20 61 64 64 5f ...{.... add_
5810: 6e 6f 64 65 5f 33 44 20 28 6c 69 73 74 2c 20 6e node_3D (list, n
5820: 6f 64 65 5f 69 64 2c 20 63 6f 6e 74 61 69 6e 69 ode_id, containi
5830: 6e 67 5f 66 61 63 65 2c 20 78 2c 20 79 2c 0a 09 ng_face, x, y,..
5840: 09 09 09 09 20 7a 29 3b 0a 09 09 09 20 20 20 20 .... z);....
5850: 2a 65 72 72 6d 73 67 20 3d 20 4e 55 4c 4c 3b 0a *errmsg = NULL;.
5860: 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 72 ... sqlite3_r
5870: 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 09 09 09 eset (stmt);....
5880: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 09 return 1;...
5890: 09 7d 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a .}... }...else.
58a0: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 .. {... if
58b0: 20 28 6f 6b 5f 69 64 20 26 26 20 6f 6b 5f 66 61 (ok_id && ok_fa
58c0: 63 65 20 26 26 20 6f 6b 5f 78 20 26 26 20 6f 6b ce && ok_x && ok
58d0: 5f 79 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 _y)....{....
58e0: 61 64 64 5f 6e 6f 64 65 5f 32 44 20 28 6c 69 73 add_node_2D (lis
58f0: 74 2c 20 6e 6f 64 65 5f 69 64 2c 20 63 6f 6e 74 t, node_id, cont
5900: 61 69 6e 69 6e 67 5f 66 61 63 65 2c 20 78 2c 20 aining_face, x,
5910: 79 29 3b 0a 09 09 09 20 20 20 20 2a 65 72 72 6d y);.... *errm
5920: 73 67 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 20 20 sg = NULL;....
5930: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 sqlite3_reset
5940: 28 73 74 6d 74 29 3b 0a 09 09 09 20 20 20 20 72 (stmt);.... r
5950: 65 74 75 72 6e 20 31 3b 0a 09 09 09 7d 0a 09 09 eturn 1;....}...
5960: 20 20 7d 0a 09 09 2f 2a 20 61 6e 20 69 6e 76 61 }.../* an inva
5970: 6c 69 64 20 4e 6f 64 65 20 68 61 73 20 62 65 65 lid Node has bee
5980: 6e 20 66 6f 75 6e 64 20 2a 2f 0a 09 09 2a 65 72 n found */...*er
5990: 72 6d 73 67 20 3d 0a 09 09 20 20 20 20 73 71 6c rmsg =... sql
59a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 20 ite3_mprintf...
59b0: 20 20 20 28 22 25 73 3a 20 66 6f 75 6e 64 20 61 ("%s: found a
59c0: 6e 20 69 6e 76 61 6c 69 64 20 4e 6f 64 65 20 5c n invalid Node \
59d0: 22 25 6c 6c 64 5c 22 22 2c 20 63 61 6c 6c 62 61 "%lld\"", callba
59e0: 63 6b 5f 6e 61 6d 65 2c 0a 09 09 20 20 20 20 20 ck_name,...
59f0: 6e 6f 64 65 5f 69 64 29 3b 0a 09 09 72 65 74 75 node_id);...retu
5a00: 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 20 20 20 rn 0;.. }.
5a10: 20 20 20 7d 0a 20 20 20 20 2a 65 72 72 6d 73 67 }. *errmsg
5a20: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c = NULL;. sql
5a30: 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 ite3_reset (stmt
5a40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b );. return 1;
5a50: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 .}..static char
5a60: 2a 0a 64 6f 5f 70 72 65 70 61 72 65 5f 72 65 61 *.do_prepare_rea
5a70: 64 5f 65 64 67 65 20 28 63 6f 6e 73 74 20 63 68 d_edge (const ch
5a80: 61 72 20 2a 74 6f 70 6f 6c 6f 67 79 5f 6e 61 6d ar *topology_nam
5a90: 65 2c 20 69 6e 74 20 66 69 65 6c 64 73 29 0a 7b e, int fields).{
5aa0: 0a 2f 2a 20 70 72 65 70 61 72 69 6e 67 20 74 68 ./* preparing th
5ab0: 65 20 61 75 78 69 6c 69 61 72 79 20 22 72 65 61 e auxiliary "rea
5ac0: 64 5f 65 64 67 65 22 20 53 51 4c 20 73 74 61 74 d_edge" SQL stat
5ad0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 ement */. cha
5ae0: 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 61 72 r *sql;. char
5af0: 20 2a 70 72 65 76 3b 0a 20 20 20 20 63 68 61 72 *prev;. char
5b00: 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 *table;. cha
5b10: 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20 20 20 69 r *xtable;. i
5b20: 6e 74 20 63 6f 6d 6d 61 20 3d 20 30 3b 0a 0a 20 nt comma = 0;..
5b30: 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
5b40: 5f 6d 70 72 69 6e 74 66 20 28 22 53 45 4c 45 43 _mprintf ("SELEC
5b50: 54 20 22 29 3b 0a 20 20 20 20 70 72 65 76 20 3d T ");. prev =
5b60: 20 73 71 6c 3b 0a 20 20 20 20 2f 2a 20 75 6e 63 sql;. /* unc
5b70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 71 75 65 onditionally que
5b80: 72 79 69 6e 67 20 74 68 65 20 45 64 67 65 20 49 rying the Edge I
5b90: 44 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 6d D */. if (com
5ba0: 6d 61 29 0a 09 73 71 6c 20 3d 20 73 71 6c 69 74 ma)..sql = sqlit
5bb0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
5bc0: 20 65 64 67 65 5f 69 64 22 2c 20 70 72 65 76 29 edge_id", prev)
5bd0: 3b 0a 20 20 20 20 65 6c 73 65 0a 09 73 71 6c 20 ;. else..sql
5be0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
5bf0: 66 20 28 22 25 73 20 65 64 67 65 5f 69 64 22 2c f ("%s edge_id",
5c00: 20 70 72 65 76 29 3b 0a 20 20 20 20 63 6f 6d 6d prev);. comm
5c10: 61 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 a = 1;. sqlit
5c20: 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a e3_free (prev);.
5c30: 20 20 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a prev = sql;.
5c40: 20 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 if (fields &
5c50: 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 53 54 RTT_COL_EDGE_ST
5c60: 41 52 54 5f 4e 4f 44 45 29 0a 20 20 20 20 20 20 ART_NODE).
5c70: 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a {.. if (comma).
5c80: 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c . sql = sql
5c90: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
5ca0: 73 2c 20 73 74 61 72 74 5f 6e 6f 64 65 22 2c 20 s, start_node",
5cb0: 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 prev);.. else..
5cc0: 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
5cd0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
5ce0: 20 73 74 61 72 74 5f 6e 6f 64 65 22 2c 20 70 72 start_node", pr
5cf0: 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 ev);.. comma =
5d00: 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 1;.. sqlite3_fr
5d10: 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 ee (prev);.. pr
5d20: 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 ev = sql;.
5d30: 7d 0a 20 20 20 20 69 66 20 28 66 69 65 6c 64 73 }. if (fields
5d40: 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
5d50: 45 4e 44 5f 4e 4f 44 45 29 0a 20 20 20 20 20 20 END_NODE).
5d60: 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a {.. if (comma).
5d70: 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c . sql = sql
5d80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
5d90: 73 2c 20 65 6e 64 5f 6e 6f 64 65 22 2c 20 70 72 s, end_node", pr
5da0: 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 ev);.. else..
5db0: 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
5dc0: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 65 3_mprintf ("%s e
5dd0: 6e 64 5f 6e 6f 64 65 22 2c 20 70 72 65 76 29 3b nd_node", prev);
5de0: 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 .. comma = 1;..
5df0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
5e00: 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 3d prev);.. prev =
5e10: 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 sql;. }.
5e20: 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 if (fields & R
5e30: 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 TT_COL_EDGE_FACE
5e40: 5f 4c 45 46 54 29 0a 20 20 20 20 20 20 7b 0a 09 _LEFT). {..
5e50: 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 if (comma)..
5e60: 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
5e70: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 3_mprintf ("%s,
5e80: 6c 65 66 74 5f 66 61 63 65 22 2c 20 70 72 65 76 left_face", prev
5e90: 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 );.. else..
5ea0: 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
5eb0: 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6c 65 66 mprintf ("%s lef
5ec0: 74 5f 66 61 63 65 22 2c 20 70 72 65 76 29 3b 0a t_face", prev);.
5ed0: 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 . comma = 1;..
5ee0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 sqlite3_free (p
5ef0: 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 rev);.. prev =
5f00: 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 sql;. }.
5f10: 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 if (fields & RT
5f20: 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f T_COL_EDGE_FACE_
5f30: 52 49 47 48 54 29 0a 20 20 20 20 20 20 7b 0a 09 RIGHT). {..
5f40: 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 if (comma)..
5f50: 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
5f60: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 3_mprintf ("%s,
5f70: 72 69 67 68 74 5f 66 61 63 65 22 2c 20 70 72 65 right_face", pre
5f80: 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 v);.. else..
5f90: 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
5fa0: 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 72 69 _mprintf ("%s ri
5fb0: 67 68 74 5f 66 61 63 65 22 2c 20 70 72 65 76 29 ght_face", prev)
5fc0: 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
5fd0: 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
5fe0: 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
5ff0: 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
6000: 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 if (fields &
6010: 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 RTT_COL_EDGE_NEX
6020: 54 5f 4c 45 46 54 29 0a 20 20 20 20 20 20 7b 0a T_LEFT). {.
6030: 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 . if (comma)..
6040: 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
6050: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
6060: 20 6e 65 78 74 5f 6c 65 66 74 5f 65 64 67 65 22 next_left_edge"
6070: 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 , prev);.. else
6080: 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 .. sql = sq
6090: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
60a0: 25 73 20 6e 65 78 74 5f 6c 65 66 74 5f 65 64 67 %s next_left_edg
60b0: 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f e", prev);.. co
60c0: 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 mma = 1;.. sqli
60d0: 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b te3_free (prev);
60e0: 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a .. prev = sql;.
60f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. if (
6100: 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c fields & RTT_COL
6110: 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 47 48 54 _EDGE_NEXT_RIGHT
6120: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
6130: 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 (comma).. s
6140: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
6150: 69 6e 74 66 20 28 22 25 73 2c 20 6e 65 78 74 5f intf ("%s, next_
6160: 72 69 67 68 74 5f 65 64 67 65 22 2c 20 70 72 65 right_edge", pre
6170: 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 v);.. else..
6180: 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
6190: 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6e 65 _mprintf ("%s ne
61a0: 78 74 5f 72 69 67 68 74 5f 65 64 67 65 22 2c 20 xt_right_edge",
61b0: 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
61c0: 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
61d0: 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
61e0: 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
61f0: 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 6c }. if (fiel
6200: 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
6210: 45 5f 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b 0a E_GEOM). {.
6220: 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 . if (comma)..
6230: 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
6240: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
6250: 20 67 65 6f 6d 22 2c 20 70 72 65 76 29 3b 0a 09 geom", prev);..
6260: 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 else.. sq
6270: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
6280: 6e 74 66 20 28 22 25 73 20 67 65 6f 6d 22 2c 20 ntf ("%s geom",
6290: 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
62a0: 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
62b0: 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
62c0: 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
62d0: 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d 20 }. table =
62e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
62f0: 28 22 25 73 5f 65 64 67 65 22 2c 20 74 6f 70 6f ("%s_edge", topo
6300: 6c 6f 67 79 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 logy_name);.
6310: 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44 6f 75 xtable = gaiaDou
6320: 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 74 61 bleQuotedSql (ta
6330: 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 ble);. sqlite
6340: 33 5f 66 72 65 65 20 28 74 61 62 6c 65 29 3b 0a 3_free (table);.
6350: 20 20 20 20 73 71 6c 20 3d 0a 09 73 71 6c 69 74 sql =..sqlit
6360: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
6370: 46 52 4f 4d 20 4d 41 49 4e 2e 5c 22 25 73 5c 22 FROM MAIN.\"%s\"
6380: 20 57 48 45 52 45 20 65 64 67 65 5f 69 64 20 3d WHERE edge_id =
6390: 20 3f 22 2c 20 70 72 65 76 2c 20 78 74 61 62 6c ?", prev, xtabl
63a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78 74 e);. free (xt
63b0: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 able);. sqlit
63c0: 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a e3_free (prev);.
63d0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 3b 0a return sql;.
63e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 64 6f }..static int.do
63f0: 5f 72 65 61 64 5f 65 64 67 65 5f 72 6f 77 20 28 _read_edge_row (
6400: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 20 73 sqlite3_stmt * s
6410: 74 6d 74 2c 20 73 74 72 75 63 74 20 74 6f 70 6f tmt, struct topo
6420: 5f 65 64 67 65 73 5f 6c 69 73 74 20 2a 6c 69 73 _edges_list *lis
6430: 74 2c 20 69 6e 74 20 66 69 65 6c 64 73 2c 0a 09 t, int fields,..
6440: 09 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 . const char *c
6450: 61 6c 6c 62 61 63 6b 5f 6e 61 6d 65 2c 20 63 68 allback_name, ch
6460: 61 72 20 2a 2a 65 72 72 6d 73 67 29 0a 7b 0a 2f ar **errmsg).{./
6470: 2a 20 72 65 61 64 69 6e 67 20 61 6e 20 45 64 67 * reading an Edg
6480: 65 20 52 6f 77 20 6f 75 74 20 66 72 6f 6d 20 74 e Row out from t
6490: 68 65 20 72 65 73 75 6c 74 73 65 74 20 2a 2f 0a he resultset */.
64a0: 20 20 20 20 69 6e 74 20 69 63 6f 6c 20 3d 20 30 int icol = 0
64b0: 3b 0a 0a 20 20 20 20 69 6e 74 20 6f 6b 5f 69 64 ;.. int ok_id
64c0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6b = 0;. int ok
64d0: 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 _start = 0;.
64e0: 69 6e 74 20 6f 6b 5f 65 6e 64 20 3d 20 30 3b 0a int ok_end = 0;.
64f0: 20 20 20 20 69 6e 74 20 6f 6b 5f 6c 65 66 74 20 int ok_left
6500: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f = 0;. int ok_
6510: 72 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 69 right = 0;. i
6520: 6e 74 20 6f 6b 5f 6e 65 78 74 5f 6c 65 66 74 20 nt ok_next_left
6530: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6b 5f = 0;. int ok_
6540: 6e 65 78 74 5f 72 69 67 68 74 20 3d 20 30 3b 0a next_right = 0;.
6550: 20 20 20 20 69 6e 74 20 6f 6b 5f 67 65 6f 6d 20 int ok_geom
6560: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 = 0;. sqlite3
6570: 5f 69 6e 74 36 34 20 65 64 67 65 5f 69 64 3b 0a _int64 edge_id;.
6580: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
6590: 34 20 73 74 61 72 74 5f 6e 6f 64 65 3b 0a 20 20 4 start_node;.
65a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
65b0: 65 6e 64 5f 6e 6f 64 65 3b 0a 20 20 20 20 73 71 end_node;. sq
65c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 61 63 65 lite3_int64 face
65d0: 5f 6c 65 66 74 3b 0a 20 20 20 20 73 71 6c 69 74 _left;. sqlit
65e0: 65 33 5f 69 6e 74 36 34 20 66 61 63 65 5f 72 69 e3_int64 face_ri
65f0: 67 68 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 ght;. sqlite3
6600: 5f 69 6e 74 36 34 20 6e 65 78 74 5f 6c 65 66 74 _int64 next_left
6610: 5f 65 64 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 _edge;. sqlit
6620: 65 33 5f 69 6e 74 36 34 20 6e 65 78 74 5f 72 69 e3_int64 next_ri
6630: 67 68 74 5f 65 64 67 65 3b 0a 20 20 20 20 67 61 ght_edge;. ga
6640: 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 iaGeomCollPtr ge
6650: 6f 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 67 om = NULL;. g
6660: 61 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 aiaLinestringPtr
6670: 20 6c 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ln = NULL;.
6680: 2f 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c /* unconditional
6690: 6c 79 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 ly querying the
66a0: 45 64 67 65 20 49 44 20 2a 2f 0a 20 20 20 20 69 Edge ID */. i
66b0: 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d f (sqlite3_colum
66c0: 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 n_type (stmt, ic
66d0: 6f 6c 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e ol) == SQLITE_IN
66e0: 54 45 47 45 52 29 0a 20 20 20 20 20 20 7b 0a 09 TEGER). {..
66f0: 20 20 65 64 67 65 5f 69 64 20 3d 20 73 71 6c 69 edge_id = sqli
6700: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 te3_column_int64
6710: 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 (stmt, icol);..
6720: 20 20 6f 6b 5f 69 64 20 3d 20 31 3b 0a 20 20 20 ok_id = 1;.
6730: 20 20 20 7d 0a 20 20 20 20 69 63 6f 6c 2b 2b 3b }. icol++;
6740: 0a 20 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 . if (fields
6750: 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 53 & RTT_COL_EDGE_S
6760: 54 41 52 54 5f 4e 4f 44 45 29 0a 20 20 20 20 20 TART_NODE).
6770: 20 7b 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 {.. if (sqlite
6780: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 3_column_type (s
6790: 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 tmt, icol) == SQ
67a0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 LITE_INTEGER)..
67b0: 20 20 20 7b 0a 09 09 73 74 61 72 74 5f 6e 6f 64 {...start_nod
67c0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 e = sqlite3_colu
67d0: 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 mn_int64 (stmt,
67e0: 69 63 6f 6c 29 3b 0a 09 09 6f 6b 5f 73 74 61 72 icol);...ok_star
67f0: 74 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 t = 1;.. }..
6800: 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d icol++;. }
6810: 0a 20 20 20 20 65 6c 73 65 0a 09 6f 6b 5f 73 74 . else..ok_st
6820: 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 art = 1;. if
6830: 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f (fields & RTT_CO
6840: 4c 5f 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 L_EDGE_END_NODE)
6850: 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
6860: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
6870: 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 ype (stmt, icol)
6880: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 == SQLITE_INTEG
6890: 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 65 6e 64 ER).. {...end
68a0: 5f 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f _node = sqlite3_
68b0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 74 column_int64 (st
68c0: 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 6f 6b 5f mt, icol);...ok_
68d0: 65 6e 64 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a end = 1;.. }.
68e0: 09 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 . icol++;.
68f0: 20 7d 0a 20 20 20 20 65 6c 73 65 0a 09 6f 6b 5f }. else..ok_
6900: 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 end = 1;. if
6910: 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f (fields & RTT_CO
6920: 4c 5f 45 44 47 45 5f 46 41 43 45 5f 4c 45 46 54 L_EDGE_FACE_LEFT
6930: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
6940: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f (sqlite3_column_
6950: 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c type (stmt, icol
6960: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c ) == SQLITE_NULL
6970: 29 0a 09 20 20 20 20 7b 0a 09 09 66 61 63 65 5f ).. {...face_
6980: 6c 65 66 74 20 3d 20 2d 31 3b 0a 09 09 6f 6b 5f left = -1;...ok_
6990: 6c 65 66 74 20 3d 20 31 3b 0a 09 20 20 20 20 7d left = 1;.. }
69a0: 0a 09 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f .. if (sqlite3_
69b0: 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 74 6d column_type (stm
69c0: 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 53 51 4c 49 t, icol) == SQLI
69d0: 54 45 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 TE_INTEGER)..
69e0: 20 7b 0a 09 09 66 61 63 65 5f 6c 65 66 74 20 3d {...face_left =
69f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
6a00: 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f int64 (stmt, ico
6a10: 6c 29 3b 0a 09 09 6f 6b 5f 6c 65 66 74 20 3d 20 l);...ok_left =
6a20: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 63 6f 1;.. }.. ico
6a30: 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 l++;. }.
6a40: 20 65 6c 73 65 0a 09 6f 6b 5f 6c 65 66 74 20 3d else..ok_left =
6a50: 20 31 3b 0a 20 20 20 20 69 66 20 28 66 69 65 6c 1;. if (fiel
6a60: 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
6a70: 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a 20 20 E_FACE_RIGHT).
6a80: 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c {.. if (sql
6a90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 ite3_column_type
6aa0: 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d (stmt, icol) ==
6ab0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 0a 09 20 SQLITE_NULL)..
6ac0: 20 20 20 7b 0a 09 09 66 61 63 65 5f 72 69 67 68 {...face_righ
6ad0: 74 20 3d 20 2d 31 3b 0a 09 09 6f 6b 5f 72 69 67 t = -1;...ok_rig
6ae0: 68 74 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 ht = 1;.. }..
6af0: 20 20 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f if (sqlite3_co
6b00: 6c 75 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c lumn_type (stmt,
6b10: 20 69 63 6f 6c 29 20 3d 3d 20 53 51 4c 49 54 45 icol) == SQLITE
6b20: 5f 49 4e 54 45 47 45 52 29 0a 09 20 20 20 20 7b _INTEGER).. {
6b30: 0a 09 09 66 61 63 65 5f 72 69 67 68 74 20 3d 20 ...face_right =
6b40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 sqlite3_column_i
6b50: 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c nt64 (stmt, icol
6b60: 29 3b 0a 09 09 6f 6b 5f 72 69 67 68 74 20 3d 20 );...ok_right =
6b70: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 63 6f 1;.. }.. ico
6b80: 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 l++;. }.
6b90: 20 65 6c 73 65 0a 09 6f 6b 5f 72 69 67 68 74 20 else..ok_right
6ba0: 3d 20 31 3b 0a 20 20 20 20 69 66 20 28 66 69 65 = 1;. if (fie
6bb0: 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
6bc0: 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 20 20 GE_NEXT_LEFT).
6bd0: 20 20 20 20 7b 0a 09 20 20 69 66 20 28 73 71 6c {.. if (sql
6be0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 ite3_column_type
6bf0: 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d (stmt, icol) ==
6c00: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 SQLITE_INTEGER)
6c10: 0a 09 20 20 20 20 7b 0a 09 09 6e 65 78 74 5f 6c .. {...next_l
6c20: 65 66 74 5f 65 64 67 65 20 3d 20 73 71 6c 69 74 eft_edge = sqlit
6c30: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 e3_column_int64
6c40: 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 (stmt, icol);...
6c50: 6f 6b 5f 6e 65 78 74 5f 6c 65 66 74 20 3d 20 31 ok_next_left = 1
6c60: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 63 6f 6c ;.. }.. icol
6c70: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ++;. }.
6c80: 65 6c 73 65 0a 09 6f 6b 5f 6e 65 78 74 5f 6c 65 else..ok_next_le
6c90: 66 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 28 ft = 1;. if (
6ca0: 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c fields & RTT_COL
6cb0: 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 47 48 54 _EDGE_NEXT_RIGHT
6cc0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
6cd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f (sqlite3_column_
6ce0: 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c type (stmt, icol
6cf0: 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 ) == SQLITE_INTE
6d00: 47 45 52 29 0a 09 20 20 20 20 7b 0a 09 09 6e 65 GER).. {...ne
6d10: 78 74 5f 72 69 67 68 74 5f 65 64 67 65 20 3d 20 xt_right_edge =
6d20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 sqlite3_column_i
6d30: 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c nt64 (stmt, icol
6d40: 29 3b 0a 09 09 6f 6b 5f 6e 65 78 74 5f 72 69 67 );...ok_next_rig
6d50: 68 74 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 ht = 1;.. }..
6d60: 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 icol++;.
6d70: 7d 0a 20 20 20 20 65 6c 73 65 0a 09 6f 6b 5f 6e }. else..ok_n
6d80: 65 78 74 5f 72 69 67 68 74 20 3d 20 31 3b 0a 20 ext_right = 1;.
6d90: 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 if (fields &
6da0: 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 47 45 4f RTT_COL_EDGE_GEO
6db0: 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 M). {.. if
6dc0: 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e (sqlite3_column
6dd0: 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f _type (stmt, ico
6de0: 6c 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f l) == SQLITE_BLO
6df0: 42 29 0a 09 20 20 20 20 7b 0a 09 09 63 6f 6e 73 B).. {...cons
6e00: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
6e10: 2a 62 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f *blob = sqlite3_
6e20: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 28 73 74 6d column_blob (stm
6e30: 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 69 6e 74 20 t, icol);...int
6e40: 62 6c 6f 62 5f 73 7a 20 3d 20 73 71 6c 69 74 65 blob_sz = sqlite
6e50: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 28 3_column_bytes (
6e60: 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 67 stmt, icol);...g
6e70: 65 6f 6d 20 3d 20 67 61 69 61 46 72 6f 6d 53 70 eom = gaiaFromSp
6e80: 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 20 atiaLiteBlobWkb
6e90: 28 62 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29 3b (blob, blob_sz);
6ea0: 0a 09 09 69 66 20 28 67 65 6f 6d 20 21 3d 20 4e ...if (geom != N
6eb0: 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 ULL)... {...
6ec0: 20 20 20 69 66 20 28 67 65 6f 6d 2d 3e 46 69 72 if (geom->Fir
6ed0: 73 74 50 6f 69 6e 74 20 3d 3d 20 4e 55 4c 4c 0a stPoint == NULL.
6ee0: 09 09 09 20 20 26 26 20 67 65 6f 6d 2d 3e 46 69 ... && geom->Fi
6ef0: 72 73 74 50 6f 6c 79 67 6f 6e 20 3d 3d 20 4e 55 rstPolygon == NU
6f00: 4c 4c 0a 09 09 09 20 20 26 26 20 67 65 6f 6d 2d LL.... && geom-
6f10: 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 >FirstLinestring
6f20: 20 3d 3d 0a 09 09 09 20 20 67 65 6f 6d 2d 3e 4c ==.... geom->L
6f30: 61 73 74 4c 69 6e 65 73 74 72 69 6e 67 20 26 26 astLinestring &&
6f40: 20 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 geom->FirstLine
6f50: 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a string != NULL).
6f60: 09 09 09 7b 0a 09 09 09 20 20 20 20 6f 6b 5f 67 ...{.... ok_g
6f70: 65 6f 6d 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 eom = 1;....
6f80: 6c 6e 20 3d 20 67 65 6f 6d 2d 3e 46 69 72 73 74 ln = geom->First
6f90: 4c 69 6e 65 73 74 72 69 6e 67 3b 0a 09 09 09 7d Linestring;....}
6fa0: 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 ... }.. }..
6fb0: 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d icol++;. }
6fc0: 0a 20 20 20 20 65 6c 73 65 0a 09 6f 6b 5f 67 65 . else..ok_ge
6fd0: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 69 66 20 28 om = 1;. if (
6fe0: 6f 6b 5f 69 64 20 26 26 20 6f 6b 5f 73 74 61 72 ok_id && ok_star
6ff0: 74 20 26 26 20 6f 6b 5f 65 6e 64 20 26 26 20 6f t && ok_end && o
7000: 6b 5f 6c 65 66 74 20 26 26 20 6f 6b 5f 72 69 67 k_left && ok_rig
7010: 68 74 0a 09 26 26 20 6f 6b 5f 6e 65 78 74 5f 6c ht..&& ok_next_l
7020: 65 66 74 20 26 26 20 6f 6b 5f 6e 65 78 74 5f 72 eft && ok_next_r
7030: 69 67 68 74 20 26 26 20 6f 6b 5f 67 65 6f 6d 29 ight && ok_geom)
7040: 0a 20 20 20 20 20 20 7b 0a 09 20 20 61 64 64 5f . {.. add_
7050: 65 64 67 65 20 28 6c 69 73 74 2c 20 65 64 67 65 edge (list, edge
7060: 5f 69 64 2c 20 73 74 61 72 74 5f 6e 6f 64 65 2c _id, start_node,
7070: 20 65 6e 64 5f 6e 6f 64 65 2c 0a 09 09 20 20 20 end_node,...
7080: 20 66 61 63 65 5f 6c 65 66 74 2c 20 66 61 63 65 face_left, face
7090: 5f 72 69 67 68 74 2c 20 6e 65 78 74 5f 6c 65 66 _right, next_lef
70a0: 74 5f 65 64 67 65 2c 20 6e 65 78 74 5f 72 69 67 t_edge, next_rig
70b0: 68 74 5f 65 64 67 65 2c 20 6c 6e 29 3b 0a 09 20 ht_edge, ln);..
70c0: 20 69 66 20 28 67 65 6f 6d 20 21 3d 20 4e 55 4c if (geom != NUL
70d0: 4c 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 72 L).. {.../* r
70e0: 65 6c 65 61 73 69 6e 67 20 6f 77 6e 65 72 73 68 eleasing ownersh
70f0: 69 70 20 6f 6e 20 4c 69 6e 65 73 74 72 69 6e 67 ip on Linestring
7100: 20 2a 2f 0a 09 09 67 65 6f 6d 2d 3e 46 69 72 73 */...geom->Firs
7110: 74 4c 69 6e 65 73 74 72 69 6e 67 20 3d 20 4e 55 tLinestring = NU
7120: 4c 4c 3b 0a 09 09 67 65 6f 6d 2d 3e 4c 61 73 74 LL;...geom->Last
7130: 4c 69 6e 65 73 74 72 69 6e 67 20 3d 20 4e 55 4c Linestring = NUL
7140: 4c 3b 0a 09 09 67 61 69 61 46 72 65 65 47 65 6f L;...gaiaFreeGeo
7150: 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 mColl (geom);..
7160: 20 20 20 7d 0a 09 20 20 2a 65 72 72 6d 73 67 20 }.. *errmsg
7170: 3d 20 4e 55 4c 4c 3b 0a 09 20 20 72 65 74 75 72 = NULL;.. retur
7180: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 n 1;. }./*
7190: 61 6e 20 69 6e 76 61 6c 69 64 20 45 64 67 65 20 an invalid Edge
71a0: 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 2a has been found *
71b0: 2f 0a 20 20 20 20 69 66 20 28 67 65 6f 6d 20 21 /. if (geom !
71c0: 3d 20 4e 55 4c 4c 29 0a 09 67 61 69 61 46 72 65 = NULL)..gaiaFre
71d0: 65 47 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 eGeomColl (geom)
71e0: 3b 0a 20 20 20 20 2a 65 72 72 6d 73 67 20 3d 0a ;. *errmsg =.
71f0: 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 .sqlite3_mprintf
7200: 0a 09 28 22 25 73 3a 20 66 6f 75 6e 64 20 61 6e ..("%s: found an
7210: 20 69 6e 76 61 6c 69 64 20 45 64 67 65 20 5c 22 invalid Edge \"
7220: 25 6c 6c 64 5c 22 22 2c 20 63 61 6c 6c 62 61 63 %lld\"", callbac
7230: 6b 5f 6e 61 6d 65 2c 20 65 64 67 65 5f 69 64 29 k_name, edge_id)
7240: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
7250: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 64 6f }..static int.do
7260: 5f 72 65 61 64 5f 65 64 67 65 20 28 73 71 6c 69 _read_edge (sqli
7270: 74 65 33 5f 73 74 6d 74 20 2a 20 73 74 6d 74 2c te3_stmt * stmt,
7280: 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 65 64 67 struct topo_edg
7290: 65 73 5f 6c 69 73 74 20 2a 6c 69 73 74 2c 0a 09 es_list *list,..
72a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e sqlite3_in
72b0: 74 36 34 20 65 64 67 65 5f 69 64 2c 20 69 6e 74 t64 edge_id, int
72c0: 20 66 69 65 6c 64 73 2c 20 63 6f 6e 73 74 20 63 fields, const c
72d0: 68 61 72 20 2a 63 61 6c 6c 62 61 63 6b 5f 6e 61 har *callback_na
72e0: 6d 65 2c 0a 09 20 20 20 20 20 20 63 68 61 72 20 me,.. char
72f0: 2a 2a 65 72 72 6d 73 67 29 0a 7b 0a 2f 2a 20 72 **errmsg).{./* r
7300: 65 61 64 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 eading a single
7310: 45 64 67 65 20 6f 75 74 20 66 72 6f 6d 20 74 68 Edge out from th
7320: 65 20 44 42 4d 53 20 2a 2f 0a 20 20 20 20 69 6e e DBMS */. in
7330: 74 20 72 65 74 3b 0a 0a 2f 2a 20 73 65 74 74 69 t ret;../* setti
7340: 6e 67 20 75 70 20 74 68 65 20 70 72 65 70 61 72 ng up the prepar
7350: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a ed statement */.
7360: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 sqlite3_rese
7370: 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 t (stmt);. sq
7380: 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 lite3_clear_bind
7390: 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 ings (stmt);.
73a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
73b0: 74 36 34 20 28 73 74 6d 74 2c 20 31 2c 20 65 64 t64 (stmt, 1, ed
73c0: 67 65 5f 69 64 29 3b 0a 0a 20 20 20 20 77 68 69 ge_id);.. whi
73d0: 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 le (1). {..
73e0: 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 74 /* scrolling t
73f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 6f he result set ro
7400: 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 ws */.. ret = s
7410: 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d qlite3_step (stm
7420: 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d t);.. if (ret =
7430: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a 09 = SQLITE_DONE)..
7440: 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f 2a break;../*
7450: 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 73 end of result s
7460: 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 74 et */.. if (ret
7470: 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a == SQLITE_ROW).
7480: 09 20 20 20 20 7b 0a 09 09 69 66 20 28 21 64 6f . {...if (!do
7490: 5f 72 65 61 64 5f 65 64 67 65 5f 72 6f 77 0a 09 _read_edge_row..
74a0: 09 20 20 20 20 28 73 74 6d 74 2c 20 6c 69 73 74 . (stmt, list
74b0: 2c 20 66 69 65 6c 64 73 2c 20 63 61 6c 6c 62 61 , fields, callba
74c0: 63 6b 5f 6e 61 6d 65 2c 20 65 72 72 6d 73 67 29 ck_name, errmsg)
74d0: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
74e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 sqlite3_reset (s
74f0: 74 6d 74 29 3b 0a 09 09 20 20 20 20 20 20 72 65 tmt);... re
7500: 74 75 72 6e 20 30 3b 0a 09 09 20 20 7d 0a 09 20 turn 0;... }..
7510: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
7520: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 sqlite3_reset (
7530: 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 stmt);. retur
7540: 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 n 1;.}..static i
7550: 6e 74 0a 64 6f 5f 72 65 61 64 5f 65 64 67 65 5f nt.do_read_edge_
7560: 62 79 5f 6e 6f 64 65 20 28 73 71 6c 69 74 65 33 by_node (sqlite3
7570: 5f 73 74 6d 74 20 2a 20 73 74 6d 74 2c 20 73 74 _stmt * stmt, st
7580: 72 75 63 74 20 74 6f 70 6f 5f 65 64 67 65 73 5f ruct topo_edges_
7590: 6c 69 73 74 20 2a 6c 69 73 74 2c 0a 09 09 20 20 list *list,...
75a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
75b0: 34 20 6e 6f 64 65 5f 69 64 2c 20 69 6e 74 20 66 4 node_id, int f
75c0: 69 65 6c 64 73 2c 0a 09 09 20 20 20 20 20 20 63 ields,... c
75d0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 61 6c 6c 62 onst char *callb
75e0: 61 63 6b 5f 6e 61 6d 65 2c 20 63 68 61 72 20 2a ack_name, char *
75f0: 2a 65 72 72 6d 73 67 29 0a 7b 0a 2f 2a 20 72 65 *errmsg).{./* re
7600: 61 64 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 45 ading a single E
7610: 64 67 65 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 dge out from the
7620: 20 44 42 4d 53 20 2a 2f 0a 20 20 20 20 69 6e 74 DBMS */. int
7630: 20 72 65 74 3b 0a 0a 2f 2a 20 73 65 74 74 69 6e ret;../* settin
7640: 67 20 75 70 20 74 68 65 20 70 72 65 70 61 72 65 g up the prepare
7650: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 d statement */.
7660: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 sqlite3_reset
7670: 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c (stmt);. sql
7680: 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 ite3_clear_bindi
7690: 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 ngs (stmt);.
76a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
76b0: 36 34 20 28 73 74 6d 74 2c 20 31 2c 20 6e 6f 64 64 (stmt, 1, nod
76c0: 65 5f 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 e_id);. sqlit
76d0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 e3_bind_int64 (s
76e0: 74 6d 74 2c 20 32 2c 20 6e 6f 64 65 5f 69 64 29 tmt, 2, node_id)
76f0: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29 ;.. while (1)
7700: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 . {.. /* s
7710: 63 72 6f 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 crolling the res
7720: 75 6c 74 20 73 65 74 20 72 6f 77 73 20 2a 2f 0a ult set rows */.
7730: 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 . ret = sqlite3
7740: 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 _step (stmt);..
7750: 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 if (ret == SQLI
7760: 54 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20 20 TE_DONE)..
7770: 62 72 65 61 6b 3b 09 09 2f 2a 20 65 6e 64 20 6f break;../* end o
7780: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a f result set */.
7790: 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 . if (ret == SQ
77a0: 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 7b LITE_ROW).. {
77b0: 0a 09 09 69 66 20 28 21 64 6f 5f 72 65 61 64 5f ...if (!do_read_
77c0: 65 64 67 65 5f 72 6f 77 0a 09 09 20 20 20 20 28 edge_row... (
77d0: 73 74 6d 74 2c 20 6c 69 73 74 2c 20 66 69 65 6c stmt, list, fiel
77e0: 64 73 2c 20 63 61 6c 6c 62 61 63 6b 5f 6e 61 6d ds, callback_nam
77f0: 65 2c 20 65 72 72 6d 73 67 29 29 0a 09 09 20 20 e, errmsg))...
7800: 7b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 {... sqlite
7810: 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 3_reset (stmt);.
7820: 09 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 .. return 0
7830: 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 20 ;... }.. }.
7840: 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 }. sqlit
7850: 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b e3_reset (stmt);
7860: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d . return 1;.}
7870: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 64 6f 5f ..static int.do_
7880: 72 65 61 64 5f 65 64 67 65 5f 62 79 5f 66 61 63 read_edge_by_fac
7890: 65 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 e (sqlite3_stmt
78a0: 2a 20 73 74 6d 74 2c 20 73 74 72 75 63 74 20 74 * stmt, struct t
78b0: 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 74 20 2a opo_edges_list *
78c0: 6c 69 73 74 2c 0a 09 09 20 20 20 20 20 20 73 71 list,... sq
78d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 61 63 65 lite3_int64 face
78e0: 5f 69 64 2c 20 69 6e 74 20 66 69 65 6c 64 73 2c _id, int fields,
78f0: 20 63 6f 6e 73 74 20 52 54 47 42 4f 58 20 2a 20 const RTGBOX *
7900: 62 6f 78 2c 0a 09 09 20 20 20 20 20 20 63 6f 6e box,... con
7910: 73 74 20 63 68 61 72 20 2a 63 61 6c 6c 62 61 63 st char *callbac
7920: 6b 5f 6e 61 6d 65 2c 20 63 68 61 72 20 2a 2a 65 k_name, char **e
7930: 72 72 6d 73 67 29 0a 7b 0a 2f 2a 20 72 65 61 64 rrmsg).{./* read
7940: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 45 64 67 ing a single Edg
7950: 65 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 44 e out from the D
7960: 42 4d 53 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 BMS */. int r
7970: 65 74 3b 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20 et;../* setting
7980: 75 70 20 74 68 65 20 70 72 65 70 61 72 65 64 20 up the prepared
7990: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 statement */.
79a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 sqlite3_reset (
79b0: 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 stmt);. sqlit
79c0: 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 e3_clear_binding
79d0: 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 s (stmt);. sq
79e0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 lite3_bind_int64
79f0: 20 28 73 74 6d 74 2c 20 31 2c 20 66 61 63 65 5f (stmt, 1, face_
7a00: 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 id);. sqlite3
7a10: 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d _bind_int64 (stm
7a20: 74 2c 20 32 2c 20 66 61 63 65 5f 69 64 29 3b 0a t, 2, face_id);.
7a30: 20 20 20 20 69 66 20 28 62 6f 78 20 21 3d 20 4e if (box != N
7a40: 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 ULL). {..
7a50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 sqlite3_bind_dou
7a60: 62 6c 65 20 28 73 74 6d 74 2c 20 33 2c 20 62 6f ble (stmt, 3, bo
7a70: 78 2d 3e 78 6d 69 6e 29 3b 0a 09 20 20 73 71 6c x->xmin);.. sql
7a80: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 ite3_bind_double
7a90: 20 28 73 74 6d 74 2c 20 34 2c 20 62 6f 78 2d 3e (stmt, 4, box->
7aa0: 79 6d 69 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 ymin);.. sqlite
7ab0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 3_bind_double (s
7ac0: 74 6d 74 2c 20 35 2c 20 62 6f 78 2d 3e 78 6d 61 tmt, 5, box->xma
7ad0: 78 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 x);.. sqlite3_b
7ae0: 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 ind_double (stmt
7af0: 2c 20 36 2c 20 62 6f 78 2d 3e 79 6d 61 78 29 3b , 6, box->ymax);
7b00: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 . }.. wh
7b10: 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a ile (1). {.
7b20: 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 . /* scrolling
7b30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 the result set r
7b40: 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 ows */.. ret =
7b50: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 sqlite3_step (st
7b60: 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 mt);.. if (ret
7b70: 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a == SQLITE_DONE).
7b80: 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f . break;../
7b90: 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 * end of result
7ba0: 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 set */.. if (re
7bb0: 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 t == SQLITE_ROW)
7bc0: 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 21 64 .. {...if (!d
7bd0: 6f 5f 72 65 61 64 5f 65 64 67 65 5f 72 6f 77 0a o_read_edge_row.
7be0: 09 09 20 20 20 20 28 73 74 6d 74 2c 20 6c 69 73 .. (stmt, lis
7bf0: 74 2c 20 66 69 65 6c 64 73 2c 20 63 61 6c 6c 62 t, fields, callb
7c00: 61 63 6b 5f 6e 61 6d 65 2c 20 65 72 72 6d 73 67 ack_name, errmsg
7c10: 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 ))... {...
7c20: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 sqlite3_reset (
7c30: 73 74 6d 74 29 3b 0a 09 09 20 20 20 20 20 20 72 stmt);... r
7c40: 65 74 75 72 6e 20 30 3b 0a 09 09 20 20 7d 0a 09 eturn 0;... }..
7c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
7c60: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 sqlite3_reset
7c70: 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 (stmt);. retu
7c80: 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 rn 1;.}..static
7c90: 69 6e 74 0a 64 6f 5f 72 65 61 64 5f 66 61 63 65 int.do_read_face
7ca0: 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a (sqlite3_stmt *
7cb0: 20 73 74 6d 74 2c 20 73 74 72 75 63 74 20 74 6f stmt, struct to
7cc0: 70 6f 5f 66 61 63 65 73 5f 6c 69 73 74 20 2a 6c po_faces_list *l
7cd0: 69 73 74 2c 0a 09 20 20 20 20 20 20 73 71 6c 69 ist,.. sqli
7ce0: 74 65 33 5f 69 6e 74 36 34 20 69 64 2c 20 69 6e te3_int64 id, in
7cf0: 74 20 66 69 65 6c 64 73 2c 20 63 6f 6e 73 74 20 t fields, const
7d00: 63 68 61 72 20 2a 63 61 6c 6c 62 61 63 6b 5f 6e char *callback_n
7d10: 61 6d 65 2c 0a 09 20 20 20 20 20 20 63 68 61 72 ame,.. char
7d20: 20 2a 2a 65 72 72 6d 73 67 29 0a 7b 0a 2f 2a 20 **errmsg).{./*
7d30: 72 65 61 64 69 6e 67 20 46 61 63 65 73 20 6f 75 reading Faces ou
7d40: 74 20 66 72 6f 6d 20 74 68 65 20 44 42 4d 53 20 t from the DBMS
7d50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 63 6f 6c 20 */. int icol
7d60: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 = 0;. int ret
7d70: 3b 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20 75 70 ;../* setting up
7d80: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
7d90: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 atement */. s
7da0: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
7db0: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 mt);. sqlite3
7dc0: 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 _clear_bindings
7dd0: 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 (stmt);. if (
7de0: 69 64 20 3c 3d 20 30 29 0a 09 73 71 6c 69 74 65 id <= 0)..sqlite
7df0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
7e00: 6d 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 65 mt, 1, 0);. e
7e10: 6c 73 65 0a 09 73 71 6c 69 74 65 33 5f 62 69 6e lse..sqlite3_bin
7e20: 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 31 d_int64 (stmt, 1
7e30: 2c 20 69 64 29 3b 0a 0a 20 20 20 20 77 68 69 6c , id);.. whil
7e40: 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 e (1). {..
7e50: 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 74 68 /* scrolling th
7e60: 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 6f 77 e result set row
7e70: 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 71 s */.. ret = sq
7e80: 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 lite3_step (stmt
7e90: 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d );.. if (ret ==
7ea0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a 09 20 SQLITE_DONE)..
7eb0: 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f 2a 20 break;../*
7ec0: 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 73 65 end of result se
7ed0: 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 74 20 t */.. if (ret
7ee0: 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 == SQLITE_ROW)..
7ef0: 20 20 20 20 7b 0a 09 09 69 6e 74 20 6f 6b 5f 69 {...int ok_i
7f00: 64 20 3d 20 30 3b 0a 09 09 69 6e 74 20 6f 6b 5f d = 0;...int ok_
7f10: 6d 69 6e 78 20 3d 20 30 3b 0a 09 09 69 6e 74 20 minx = 0;...int
7f20: 6f 6b 5f 6d 69 6e 79 20 3d 20 30 3b 0a 09 09 69 ok_miny = 0;...i
7f30: 6e 74 20 6f 6b 5f 6d 61 78 78 20 3d 20 30 3b 0a nt ok_maxx = 0;.
7f40: 09 09 69 6e 74 20 6f 6b 5f 6d 61 78 79 20 3d 20 ..int ok_maxy =
7f50: 30 3b 0a 09 09 73 71 6c 69 74 65 33 5f 69 6e 74 0;...sqlite3_int
7f60: 36 34 20 66 61 63 65 5f 69 64 20 3d 20 2d 31 3b 64 face_id = -1;
7f70: 0a 09 09 64 6f 75 62 6c 65 20 6d 69 6e 78 20 3d ...double minx =
7f80: 20 30 2e 30 3b 0a 09 09 64 6f 75 62 6c 65 20 6d 0.0;...double m
7f90: 69 6e 79 20 3d 20 30 2e 30 3b 0a 09 09 64 6f 75 iny = 0.0;...dou
7fa0: 62 6c 65 20 6d 61 78 78 20 3d 20 30 2e 30 3b 0a ble maxx = 0.0;.
7fb0: 09 09 64 6f 75 62 6c 65 20 6d 61 78 79 20 3d 20 ..double maxy =
7fc0: 30 2e 30 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 0.0;...if (field
7fd0: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 46 41 43 45 s & RTT_COL_FACE
7fe0: 5f 46 41 43 45 5f 49 44 29 0a 09 09 20 20 7b 0a _FACE_ID)... {.
7ff0: 09 09 20 20 20 20 20 20 69 66 20 28 73 71 6c 69 .. if (sqli
8000: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 te3_column_type
8010: 28 73 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d 20 (stmt, icol) ==
8020: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 29 0a SQLITE_INTEGER).
8030: 09 09 09 7b 0a 09 09 09 20 20 20 20 66 61 63 65 ...{.... face
8040: 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f _id = sqlite3_co
8050: 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 lumn_int64 (stmt
8060: 2c 20 69 63 6f 6c 29 3b 0a 09 09 09 20 20 20 20 , icol);....
8070: 6f 6b 5f 69 64 20 3d 20 31 3b 0a 09 09 09 7d 0a ok_id = 1;....}.
8080: 09 09 20 20 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a .. icol++;.
8090: 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 .. }...else...
80a0: 20 20 20 6f 6b 5f 69 64 20 3d 20 31 3b 0a 09 09 ok_id = 1;...
80b0: 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 if (fields & RTT
80c0: 5f 43 4f 4c 5f 46 41 43 45 5f 4d 42 52 29 0a 09 _COL_FACE_MBR)..
80d0: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 . {... if
80e0: 28 69 64 20 3c 3d 20 30 29 0a 09 09 09 7b 0a 09 (id <= 0)....{..
80f0: 09 09 20 20 20 20 6f 6b 5f 6d 69 6e 78 20 3d 20 .. ok_minx =
8100: 31 3b 0a 09 09 09 20 20 20 20 6f 6b 5f 6d 69 6e 1;.... ok_min
8110: 79 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 6f 6b y = 1;.... ok
8120: 5f 6d 61 78 78 20 3d 20 31 3b 0a 09 09 09 20 20 _maxx = 1;....
8130: 20 20 6f 6b 5f 6d 61 78 79 20 3d 20 31 3b 0a 09 ok_maxy = 1;..
8140: 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 ..}... else
8150: 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 ....{.... if
8160: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f (sqlite3_column_
8170: 74 79 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c type (stmt, icol
8180: 29 20 3d 3d 0a 09 09 09 09 53 51 4c 49 54 45 5f ) ==.....SQLITE_
8190: 46 4c 4f 41 54 29 0a 09 09 09 20 20 20 20 20 20 FLOAT)....
81a0: 7b 0a 09 09 09 09 20 20 6d 69 6e 78 20 3d 20 73 {..... minx = s
81b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f qlite3_column_do
81c0: 75 62 6c 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c uble (stmt, icol
81d0: 29 3b 0a 09 09 09 09 20 20 6f 6b 5f 6d 69 6e 78 );..... ok_minx
81e0: 20 3d 20 31 3b 0a 09 09 09 20 20 20 20 20 20 7d = 1;.... }
81f0: 0a 09 09 09 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a .... icol++;.
8200: 09 09 09 20 20 20 20 69 66 20 28 73 71 6c 69 74 ... if (sqlit
8210: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 e3_column_type (
8220: 73 74 6d 74 2c 20 69 63 6f 6c 29 20 3d 3d 0a 09 stmt, icol) ==..
8230: 09 09 09 53 51 4c 49 54 45 5f 46 4c 4f 41 54 29 ...SQLITE_FLOAT)
8240: 0a 09 09 09 20 20 20 20 20 20 7b 0a 09 09 09 09 .... {.....
8250: 20 20 6d 69 6e 79 20 3d 20 73 71 6c 69 74 65 33 miny = sqlite3
8260: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 28 _column_double (
8270: 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 09 stmt, icol);....
8280: 09 20 20 6f 6b 5f 6d 69 6e 79 20 3d 20 31 3b 0a . ok_miny = 1;.
8290: 09 09 09 20 20 20 20 20 20 7d 0a 09 09 09 20 20 ... }....
82a0: 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 09 20 20 20 icol++;....
82b0: 20 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c if (sqlite3_col
82c0: 75 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 umn_type (stmt,
82d0: 69 63 6f 6c 29 20 3d 3d 0a 09 09 09 09 53 51 4c icol) ==.....SQL
82e0: 49 54 45 5f 46 4c 4f 41 54 29 0a 09 09 09 20 20 ITE_FLOAT)....
82f0: 20 20 20 20 7b 0a 09 09 09 09 20 20 6d 61 78 78 {..... maxx
8300: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d = sqlite3_colum
8310: 6e 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 n_double (stmt,
8320: 69 63 6f 6c 29 3b 0a 09 09 09 09 20 20 6f 6b 5f icol);..... ok_
8330: 6d 61 78 78 20 3d 20 31 3b 0a 09 09 09 20 20 20 maxx = 1;....
8340: 20 20 20 7d 0a 09 09 09 20 20 20 20 69 63 6f 6c }.... icol
8350: 2b 2b 3b 0a 09 09 09 20 20 20 20 69 66 20 28 73 ++;.... if (s
8360: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 qlite3_column_ty
8370: 70 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 20 pe (stmt, icol)
8380: 3d 3d 0a 09 09 09 09 53 51 4c 49 54 45 5f 46 4c ==.....SQLITE_FL
8390: 4f 41 54 29 0a 09 09 09 20 20 20 20 20 20 7b 0a OAT).... {.
83a0: 09 09 09 09 20 20 6d 61 78 79 20 3d 20 73 71 6c .... maxy = sql
83b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 ite3_column_doub
83c0: 6c 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b le (stmt, icol);
83d0: 0a 09 09 09 09 20 20 6f 6b 5f 6d 61 78 79 20 3d ..... ok_maxy =
83e0: 20 31 3b 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 1;.... }..
83f0: 09 09 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 .. icol++;...
8400: 09 7d 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a .}... }...else.
8410: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 6f 6b .. {... ok
8420: 5f 6d 69 6e 78 20 3d 20 31 3b 0a 09 09 20 20 20 _minx = 1;...
8430: 20 20 20 6f 6b 5f 6d 69 6e 79 20 3d 20 31 3b 0a ok_miny = 1;.
8440: 09 09 20 20 20 20 20 20 6f 6b 5f 6d 61 78 78 20 .. ok_maxx
8450: 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 6f 6b 5f = 1;... ok_
8460: 6d 61 78 79 20 3d 20 31 3b 0a 09 09 20 20 7d 0a maxy = 1;... }.
8470: 09 09 69 66 20 28 6f 6b 5f 69 64 20 26 26 20 6f ..if (ok_id && o
8480: 6b 5f 6d 69 6e 78 20 26 26 20 6f 6b 5f 6d 69 6e k_minx && ok_min
8490: 79 20 26 26 20 6f 6b 5f 6d 61 78 78 20 26 26 20 y && ok_maxx &&
84a0: 6f 6b 5f 6d 61 78 79 29 0a 09 09 20 20 7b 0a 09 ok_maxy)... {..
84b0: 09 20 20 20 20 20 20 61 64 64 5f 66 61 63 65 20 . add_face
84c0: 28 6c 69 73 74 2c 20 69 64 2c 20 66 61 63 65 5f (list, id, face_
84d0: 69 64 2c 20 6d 69 6e 78 2c 20 6d 69 6e 79 2c 20 id, minx, miny,
84e0: 6d 61 78 78 2c 20 6d 61 78 79 29 3b 0a 09 09 20 maxx, maxy);...
84f0: 20 20 20 20 20 2a 65 72 72 6d 73 67 20 3d 20 4e *errmsg = N
8500: 55 4c 4c 3b 0a 09 09 20 20 20 20 20 20 73 71 6c ULL;... sql
8510: 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 ite3_reset (stmt
8520: 29 3b 0a 09 09 20 20 20 20 20 20 72 65 74 75 72 );... retur
8530: 6e 20 31 3b 0a 09 09 20 20 7d 0a 09 09 2f 2a 20 n 1;... }.../*
8540: 61 6e 20 69 6e 76 61 6c 69 64 20 46 61 63 65 20 an invalid Face
8550: 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20 2a has been found *
8560: 2f 0a 09 09 2a 65 72 72 6d 73 67 20 3d 0a 09 09 /...*errmsg =...
8570: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 sqlite3_mpri
8580: 6e 74 66 0a 09 09 20 20 20 20 28 22 25 73 3a 20 ntf... ("%s:
8590: 66 6f 75 6e 64 20 61 6e 20 69 6e 76 61 6c 69 64 found an invalid
85a0: 20 46 61 63 65 20 5c 22 25 6c 6c 64 5c 22 22 2c Face \"%lld\"",
85b0: 20 63 61 6c 6c 62 61 63 6b 5f 6e 61 6d 65 2c 0a callback_name,.
85c0: 09 09 20 20 20 20 20 66 61 63 65 5f 69 64 29 3b .. face_id);
85d0: 0a 09 09 73 71 6c 69 74 65 33 5f 72 65 73 65 74 ...sqlite3_reset
85e0: 20 28 73 74 6d 74 29 3b 0a 09 09 72 65 74 75 72 (stmt);...retur
85f0: 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 n 0;.. }.
8600: 20 20 7d 0a 20 20 20 20 2a 65 72 72 6d 73 67 20 }. *errmsg
8610: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 71 6c 69 = NULL;. sqli
8620: 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 te3_reset (stmt)
8630: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
8640: 7d 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 0a }..const char *.
8650: 63 61 6c 6c 62 61 63 6b 5f 6c 61 73 74 45 72 72 callback_lastErr
8660: 6f 72 4d 65 73 73 61 67 65 20 28 63 6f 6e 73 74 orMessage (const
8670: 20 52 54 54 5f 42 45 5f 44 41 54 41 20 2a 20 62 RTT_BE_DATA * b
8680: 65 29 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 e).{. return
8690: 67 61 69 61 74 6f 70 6f 5f 67 65 74 5f 6c 61 73 gaiatopo_get_las
86a0: 74 5f 65 78 63 65 70 74 69 6f 6e 20 28 28 47 61 t_exception ((Ga
86b0: 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 iaTopologyAccess
86c0: 6f 72 50 74 72 29 20 62 65 29 3b 0a 7d 0a 0a 52 orPtr) be);.}..R
86d0: 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a TT_BE_TOPOLOGY *
86e0: 0a 63 61 6c 6c 62 61 63 6b 5f 6c 6f 61 64 54 6f .callback_loadTo
86f0: 70 6f 6c 6f 67 79 42 79 4e 61 6d 65 20 28 63 6f pologyByName (co
8700: 6e 73 74 20 52 54 54 5f 42 45 5f 44 41 54 41 20 nst RTT_BE_DATA
8710: 2a 20 62 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 * be, const char
8720: 20 2a 6e 61 6d 65 29 0a 7b 0a 2f 2a 20 63 61 6c *name).{./* cal
8730: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 lback function:
8740: 6c 6f 61 64 54 6f 70 6f 6c 6f 67 79 42 79 4e 61 loadTopologyByNa
8750: 6d 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 me */. struct
8760: 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a gaia_topology *
8770: 70 74 72 20 3d 20 28 73 74 72 75 63 74 20 67 61 ptr = (struct ga
8780: 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 62 ia_topology *) b
8790: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 6f 70 e;. char *top
87a0: 6f 6c 6f 67 79 5f 6e 61 6d 65 3b 0a 20 20 20 20 ology_name;.
87b0: 69 6e 74 20 73 72 69 64 3b 0a 20 20 20 20 64 6f int srid;. do
87c0: 75 62 6c 65 20 74 6f 6c 65 72 61 6e 63 65 3b 0a uble tolerance;.
87d0: 20 20 20 20 69 6e 74 20 68 61 73 5f 7a 3b 0a 20 int has_z;.
87e0: 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 struct splite
87f0: 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 _internal_cache
8800: 2a 63 61 63 68 65 20 3d 0a 09 28 73 74 72 75 63 *cache =..(struc
8810: 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 t splite_interna
8820: 6c 5f 63 61 63 68 65 20 2a 29 20 70 74 72 2d 3e l_cache *) ptr->
8830: 63 61 63 68 65 3b 0a 20 20 20 20 69 66 20 28 67 cache;. if (g
8840: 61 69 61 52 65 61 64 54 6f 70 6f 6c 6f 67 79 46 aiaReadTopologyF
8850: 72 6f 6d 44 42 4d 53 0a 09 28 70 74 72 2d 3e 64 romDBMS..(ptr->d
8860: 62 5f 68 61 6e 64 6c 65 2c 20 6e 61 6d 65 2c 20 b_handle, name,
8870: 26 74 6f 70 6f 6c 6f 67 79 5f 6e 61 6d 65 2c 20 &topology_name,
8880: 26 73 72 69 64 2c 20 26 74 6f 6c 65 72 61 6e 63 &srid, &toleranc
8890: 65 2c 20 26 68 61 73 5f 7a 29 29 0a 20 20 20 20 e, &has_z)).
88a0: 20 20 7b 0a 09 20 20 70 74 72 2d 3e 74 6f 70 6f {.. ptr->topo
88b0: 6c 6f 67 79 5f 6e 61 6d 65 20 3d 20 74 6f 70 6f logy_name = topo
88c0: 6c 6f 67 79 5f 6e 61 6d 65 3b 0a 09 20 20 70 74 logy_name;.. pt
88d0: 72 2d 3e 73 72 69 64 20 3d 20 73 72 69 64 3b 0a r->srid = srid;.
88e0: 09 20 20 70 74 72 2d 3e 74 6f 6c 65 72 61 6e 63 . ptr->toleranc
88f0: 65 20 3d 20 74 6f 6c 65 72 61 6e 63 65 3b 0a 09 e = tolerance;..
8900: 20 20 70 74 72 2d 3e 68 61 73 5f 7a 20 3d 20 68 ptr->has_z = h
8910: 61 73 5f 7a 3b 0a 09 20 20 2f 2a 20 72 65 67 69 as_z;.. /* regi
8920: 73 74 65 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 stering into the
8930: 20 49 6e 74 65 72 6e 61 6c 20 43 61 63 68 65 20 Internal Cache
8940: 64 6f 75 62 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 double linked li
8950: 73 74 20 2a 2f 0a 09 20 20 69 66 20 28 63 61 63 st */.. if (cac
8960: 68 65 2d 3e 66 69 72 73 74 54 6f 70 6f 6c 6f 67 he->firstTopolog
8970: 79 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 y == NULL)..
8980: 20 20 63 61 63 68 65 2d 3e 66 69 72 73 74 54 6f cache->firstTo
8990: 70 6f 6c 6f 67 79 20 3d 20 70 74 72 3b 0a 09 20 pology = ptr;..
89a0: 20 69 66 20 28 63 61 63 68 65 2d 3e 6c 61 73 74 if (cache->last
89b0: 54 6f 70 6f 6c 6f 67 79 20 21 3d 20 4e 55 4c 4c Topology != NULL
89c0: 29 0a 09 20 20 20 20 7b 0a 09 09 73 74 72 75 63 ).. {...struc
89d0: 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 t gaia_topology
89e0: 2a 70 32 20 3d 0a 09 09 20 20 20 20 28 73 74 72 *p2 =... (str
89f0: 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 uct gaia_topolog
8a00: 79 20 2a 29 20 28 63 61 63 68 65 2d 3e 6c 61 73 y *) (cache->las
8a10: 74 54 6f 70 6f 6c 6f 67 79 29 3b 0a 09 09 70 32 tTopology);...p2
8a20: 2d 3e 6e 65 78 74 20 3d 20 70 74 72 3b 0a 09 20 ->next = ptr;..
8a30: 20 20 20 7d 0a 09 20 20 63 61 63 68 65 2d 3e 6c }.. cache->l
8a40: 61 73 74 54 6f 70 6f 6c 6f 67 79 20 3d 20 70 74 astTopology = pt
8a50: 72 3b 0a 09 20 20 72 65 74 75 72 6e 20 28 52 54 r;.. return (RT
8a60: 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a 29 T_BE_TOPOLOGY *)
8a70: 20 70 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ptr;. }.
8a80: 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 4e else..return N
8a90: 55 4c 4c 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c ULL;.}..int.call
8aa0: 62 61 63 6b 5f 66 72 65 65 54 6f 70 6f 6c 6f 67 back_freeTopolog
8ab0: 79 20 28 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f y (RTT_BE_TOPOLO
8ac0: 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 29 0a 7b GY * rtt_topo).{
8ad0: 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e ./* callback fun
8ae0: 63 74 69 6f 6e 3a 20 66 72 65 65 54 6f 70 6f 6c ction: freeTopol
8af0: 6f 67 79 20 2d 20 64 6f 65 73 20 6e 6f 74 68 69 ogy - does nothi
8b00: 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 74 ng */. if (rt
8b10: 74 5f 74 6f 70 6f 20 21 3d 20 4e 55 4c 4c 29 0a t_topo != NULL).
8b20: 09 72 74 74 5f 74 6f 70 6f 20 3d 20 4e 55 4c 4c .rtt_topo = NULL
8b30: 3b 09 2f 2a 20 73 69 6c 65 6e 63 69 6e 67 20 73 ;./* silencing s
8b40: 74 75 70 69 64 20 63 6f 6d 70 69 6c 65 72 20 77 tupid compiler w
8b50: 61 72 6e 69 6e 67 73 20 6f 6e 20 75 6e 75 73 65 arnings on unuse
8b60: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 72 65 74 args */. ret
8b70: 75 72 6e 20 31 3b 0a 7d 0a 0a 52 54 54 5f 49 53 urn 1;.}..RTT_IS
8b80: 4f 5f 4e 4f 44 45 20 2a 0a 63 61 6c 6c 62 61 63 O_NODE *.callbac
8b90: 6b 5f 67 65 74 4e 6f 64 65 42 79 49 64 20 28 63 k_getNodeById (c
8ba0: 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f onst RTT_BE_TOPO
8bb0: 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c LOGY * rtt_topo,
8bc0: 0a 09 09 20 20 20 20 20 20 63 6f 6e 73 74 20 52 ... const R
8bd0: 54 54 5f 45 4c 45 4d 49 44 20 2a 20 69 64 73 2c TT_ELEMID * ids,
8be0: 20 69 6e 74 20 2a 6e 75 6d 65 6c 65 6d 73 2c 20 int *numelems,
8bf0: 69 6e 74 20 66 69 65 6c 64 73 29 0a 7b 0a 2f 2a int fields).{./*
8c00: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 callback functi
8c10: 6f 6e 3a 20 67 65 74 4e 6f 64 65 42 79 49 64 20 on: getNodeById
8c20: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 52 54 43 */. const RTC
8c30: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a TX *ctx = NULL;.
8c40: 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 struct split
8c50: 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 e_internal_cache
8c60: 20 2a 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a *cache = NULL;.
8c70: 20 20 20 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 GaiaTopology
8c80: 41 63 63 65 73 73 6f 72 50 74 72 20 74 6f 70 6f AccessorPtr topo
8c90: 20 3d 20 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 = (GaiaTopology
8ca0: 41 63 63 65 73 73 6f 72 50 74 72 29 20 72 74 74 AccessorPtr) rtt
8cb0: 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 _topo;. struc
8cc0: 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 t gaia_topology
8cd0: 2a 61 63 63 65 73 73 6f 72 20 3d 20 28 73 74 72 *accessor = (str
8ce0: 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 uct gaia_topolog
8cf0: 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 y *) topo;. s
8d00: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d qlite3_stmt *stm
8d10: 74 5f 61 75 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 t_aux = NULL;.
8d20: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 int ret;. i
8d30: 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a nt i;. char *
8d40: 73 71 6c 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 sql;. RTPOINT
8d50: 41 52 52 41 59 20 2a 70 61 3b 0a 20 20 20 20 52 ARRAY *pa;. R
8d60: 54 50 4f 49 4e 54 34 44 20 70 74 34 64 3b 0a 20 TPOINT4D pt4d;.
8d70: 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e struct topo_n
8d80: 6f 64 65 73 5f 6c 69 73 74 20 2a 6c 69 73 74 20 odes_list *list
8d90: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 52 54 54 5f = NULL;. RTT_
8da0: 49 53 4f 5f 4e 4f 44 45 20 2a 72 65 73 75 6c 74 ISO_NODE *result
8db0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 = NULL;. if
8dc0: 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c (accessor == NUL
8dd0: 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 6e L). {.. *n
8de0: 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 umelems = -1;..
8df0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
8e00: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 63 68 65 }.. cache
8e10: 20 3d 20 28 73 74 72 75 63 74 20 73 70 6c 69 74 = (struct split
8e20: 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 e_internal_cache
8e30: 20 2a 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 *) accessor->ca
8e40: 63 68 65 3b 0a 20 20 20 20 69 66 20 28 63 61 63 che;. if (cac
8e50: 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 he == NULL)..ret
8e60: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 urn NULL;. if
8e70: 20 28 63 61 63 68 65 2d 3e 6d 61 67 69 63 31 20 (cache->magic1
8e80: 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 != SPATIALITE_CA
8e90: 43 48 45 5f 4d 41 47 49 43 31 0a 09 7c 7c 20 63 CHE_MAGIC1..|| c
8ea0: 61 63 68 65 2d 3e 6d 61 67 69 63 32 20 21 3d 20 ache->magic2 !=
8eb0: 53 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 SPATIALITE_CACHE
8ec0: 5f 4d 41 47 49 43 32 29 0a 09 72 65 74 75 72 6e _MAGIC2)..return
8ed0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 74 78 20 3d NULL;. ctx =
8ee0: 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 4f 5f 68 cache->RTTOPO_h
8ef0: 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 63 andle;. if (c
8f00: 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 tx == NULL)..ret
8f10: 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f urn NULL;.. /
8f20: 2a 20 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 * preparing the
8f30: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f SQL statement */
8f40: 0a 20 20 20 20 73 71 6c 20 3d 0a 09 64 6f 5f 70 . sql =..do_p
8f50: 72 65 70 61 72 65 5f 72 65 61 64 5f 6e 6f 64 65 repare_read_node
8f60: 20 28 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 6f (accessor->topo
8f70: 6c 6f 67 79 5f 6e 61 6d 65 2c 20 66 69 65 6c 64 logy_name, field
8f80: 73 2c 20 61 63 63 65 73 73 6f 72 2d 3e 68 61 73 s, accessor->has
8f90: 5f 7a 29 3b 0a 20 20 20 20 72 65 74 20 3d 0a 09 _z);. ret =..
8fa0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f sqlite3_prepare_
8fb0: 76 32 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 v2 (accessor->db
8fc0: 5f 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 73 74 _handle, sql, st
8fd0: 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d rlen (sql), &stm
8fe0: 74 5f 61 75 78 2c 0a 09 09 09 20 20 20 20 4e 55 t_aux,.... NU
8ff0: 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 LL);. sqlite3
9000: 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20 _free (sql);.
9010: 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 if (ret != SQLI
9020: 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 TE_OK). {..
9030: 20 20 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 char *msg = sq
9040: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
9050: 50 72 65 70 61 72 65 5f 67 65 74 4e 6f 64 65 42 Prepare_getNodeB
9060: 79 49 64 20 41 55 58 20 65 72 72 6f 72 3a 20 5c yId AUX error: \
9070: 22 25 73 5c 22 22 2c 0a 09 09 09 09 20 20 20 20 "%s\"",.....
9080: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 sqlite3_errms
9090: 67 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f g (accessor->db_
90a0: 68 61 6e 64 6c 65 29 29 3b 0a 09 20 20 67 61 69 handle));.. gai
90b0: 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 atopo_set_last_e
90c0: 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 rror_msg (topo,
90d0: 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 msg);.. sqlite3
90e0: 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 20 20 _free (msg);..
90f0: 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a *numelems = -1;.
9100: 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a . return NULL;.
9110: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73 }.. lis
9120: 74 20 3d 20 63 72 65 61 74 65 5f 6e 6f 64 65 73 t = create_nodes
9130: 5f 6c 69 73 74 20 28 29 3b 0a 20 20 20 20 66 6f _list ();. fo
9140: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 2a 6e r (i = 0; i < *n
9150: 75 6d 65 6c 65 6d 73 3b 20 69 2b 2b 29 0a 20 20 umelems; i++).
9160: 20 20 20 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d {.. char *m
9170: 73 67 3b 0a 09 20 20 69 66 20 28 21 64 6f 5f 72 sg;.. if (!do_r
9180: 65 61 64 5f 6e 6f 64 65 0a 09 20 20 20 20 20 20 ead_node..
9190: 28 73 74 6d 74 5f 61 75 78 2c 20 6c 69 73 74 2c (stmt_aux, list,
91a0: 20 2a 28 69 64 73 20 2b 20 69 29 2c 20 66 69 65 *(ids + i), fie
91b0: 6c 64 73 2c 20 61 63 63 65 73 73 6f 72 2d 3e 68 lds, accessor->h
91c0: 61 73 5f 7a 2c 0a 09 20 20 20 20 20 20 20 22 63 as_z,.. "c
91d0: 61 6c 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 65 42 allback_getNodeB
91e0: 79 49 64 22 2c 20 26 6d 73 67 29 29 0a 09 20 20 yId", &msg))..
91f0: 20 20 7b 0a 09 09 67 61 69 61 74 6f 70 6f 5f 73 {...gaiatopo_s
9200: 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 et_last_error_ms
9210: 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 g (topo, msg);..
9220: 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d .sqlite3_free (m
9230: 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f sg);...goto erro
9240: 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 r;.. }.
9250: 7d 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 2d }.. if (list-
9260: 3e 63 6f 75 6e 74 20 3d 3d 20 30 29 0a 20 20 20 >count == 0).
9270: 20 20 20 7b 0a 09 20 20 2f 2a 20 6e 6f 20 6e 6f {.. /* no no
9280: 64 65 20 77 61 73 20 66 6f 75 6e 64 20 2a 2f 0a de was found */.
9290: 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 6c . *numelems = l
92a0: 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 ist->count;.
92b0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 }. else.
92c0: 20 20 20 7b 0a 09 20 20 73 74 72 75 63 74 20 74 {.. struct t
92d0: 6f 70 6f 5f 6e 6f 64 65 20 2a 70 5f 6e 64 3b 0a opo_node *p_nd;.
92e0: 09 20 20 72 65 73 75 6c 74 20 3d 20 72 74 61 6c . result = rtal
92f0: 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a 65 6f 66 loc (ctx, sizeof
9300: 20 28 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 29 20 (RTT_ISO_NODE)
9310: 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 29 3b 0a * list->count);.
9320: 09 20 20 70 5f 6e 64 20 3d 20 6c 69 73 74 2d 3e . p_nd = list->
9330: 66 69 72 73 74 3b 0a 09 20 20 69 20 3d 20 30 3b first;.. i = 0;
9340: 0a 09 20 20 77 68 69 6c 65 20 28 70 5f 6e 64 20 .. while (p_nd
9350: 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a != NULL).. {.
9360: 09 09 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a ..RTT_ISO_NODE *
9370: 6e 64 20 3d 20 72 65 73 75 6c 74 20 2b 20 69 3b nd = result + i;
9380: 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
9390: 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 RTT_COL_NODE_NOD
93a0: 45 5f 49 44 29 0a 09 09 20 20 20 20 6e 64 2d 3e E_ID)... nd->
93b0: 6e 6f 64 65 5f 69 64 20 3d 20 70 5f 6e 64 2d 3e node_id = p_nd->
93c0: 6e 6f 64 65 5f 69 64 3b 0a 09 09 69 66 20 28 66 node_id;...if (f
93d0: 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
93e0: 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 5f NODE_CONTAINING_
93f0: 46 41 43 45 29 0a 09 09 20 20 20 20 6e 64 2d 3e FACE)... nd->
9400: 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 containing_face
9410: 3d 20 70 5f 6e 64 2d 3e 63 6f 6e 74 61 69 6e 69 = p_nd->containi
9420: 6e 67 5f 66 61 63 65 3b 0a 09 09 69 66 20 28 66 ng_face;...if (f
9430: 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
9440: 4e 4f 44 45 5f 47 45 4f 4d 29 0a 09 09 20 20 7b NODE_GEOM)... {
9450: 0a 09 09 20 20 20 20 20 20 70 61 20 3d 20 70 74 ... pa = pt
9460: 61 72 72 61 79 5f 63 6f 6e 73 74 72 75 63 74 20 array_construct
9470: 28 63 74 78 2c 20 61 63 63 65 73 73 6f 72 2d 3e (ctx, accessor->
9480: 68 61 73 5f 7a 2c 20 30 2c 20 31 29 3b 0a 09 09 has_z, 0, 1);...
9490: 20 20 20 20 20 20 70 74 34 64 2e 78 20 3d 20 70 pt4d.x = p
94a0: 5f 6e 64 2d 3e 78 3b 0a 09 09 20 20 20 20 20 20 _nd->x;...
94b0: 70 74 34 64 2e 79 20 3d 20 70 5f 6e 64 2d 3e 79 pt4d.y = p_nd->y
94c0: 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 61 63 ;... if (ac
94d0: 63 65 73 73 6f 72 2d 3e 68 61 73 5f 7a 29 0a 09 cessor->has_z)..
94e0: 09 09 20 20 70 74 34 64 2e 7a 20 3d 20 70 5f 6e .. pt4d.z = p_n
94f0: 64 2d 3e 7a 3b 0a 09 09 20 20 20 20 20 20 70 74 d->z;... pt
9500: 61 72 72 61 79 5f 73 65 74 5f 70 6f 69 6e 74 34 array_set_point4
9510: 64 20 28 63 74 78 2c 20 70 61 2c 20 30 2c 20 26 d (ctx, pa, 0, &
9520: 70 74 34 64 29 3b 0a 09 09 20 20 20 20 20 20 6e pt4d);... n
9530: 64 2d 3e 67 65 6f 6d 20 3d 0a 09 09 09 20 20 72 d->geom =.... r
9540: 74 70 6f 69 6e 74 5f 63 6f 6e 73 74 72 75 63 74 tpoint_construct
9550: 20 28 63 74 78 2c 20 61 63 63 65 73 73 6f 72 2d (ctx, accessor-
9560: 3e 73 72 69 64 2c 20 4e 55 4c 4c 2c 20 70 61 29 >srid, NULL, pa)
9570: 3b 0a 09 09 20 20 7d 0a 09 09 69 2b 2b 3b 0a 09 ;... }...i++;..
9580: 09 70 5f 6e 64 20 3d 20 70 5f 6e 64 2d 3e 6e 65 .p_nd = p_nd->ne
9590: 78 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 6e xt;.. }.. *n
95a0: 75 6d 65 6c 65 6d 73 20 3d 20 6c 69 73 74 2d 3e umelems = list->
95b0: 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 count;. }.
95c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c sqlite3_final
95d0: 69 7a 65 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a ize (stmt_aux);.
95e0: 20 20 20 20 64 65 73 74 72 6f 79 5f 6e 6f 64 65 destroy_node
95f0: 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 s_list (list);.
9600: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 return result
9610: 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 ;.. error:.
9620: 69 66 20 28 73 74 6d 74 5f 61 75 78 20 21 3d 20 if (stmt_aux !=
9630: 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 66 NULL)..sqlite3_f
9640: 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 5f 61 75 inalize (stmt_au
9650: 78 29 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 74 x);. if (list
9660: 20 21 3d 20 4e 55 4c 4c 29 0a 09 64 65 73 74 72 != NULL)..destr
9670: 6f 79 5f 6e 6f 64 65 73 5f 6c 69 73 74 20 28 6c oy_nodes_list (l
9680: 69 73 74 29 3b 0a 20 20 20 20 2a 6e 75 6d 65 6c ist);. *numel
9690: 65 6d 73 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 ems = -1;. re
96a0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 52 54 turn NULL;.}..RT
96b0: 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a 0a 63 61 6c T_ISO_NODE *.cal
96c0: 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 65 57 69 74 lback_getNodeWit
96d0: 68 69 6e 44 69 73 74 61 6e 63 65 32 44 20 28 63 hinDistance2D (c
96e0: 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f onst RTT_BE_TOPO
96f0: 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c LOGY * rtt_topo,
9700: 0a 09 09 09 09 20 20 63 6f 6e 73 74 20 52 54 50 ..... const RTP
9710: 4f 49 4e 54 20 2a 20 70 74 2c 20 64 6f 75 62 6c OINT * pt, doubl
9720: 65 20 64 69 73 74 2c 0a 09 09 09 09 20 20 69 6e e dist,..... in
9730: 74 20 2a 6e 75 6d 65 6c 65 6d 73 2c 20 69 6e 74 t *numelems, int
9740: 20 66 69 65 6c 64 73 2c 20 69 6e 74 20 6c 69 6d fields, int lim
9750: 69 74 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 it).{./* callbac
9760: 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 67 65 74 4e k function: getN
9770: 6f 64 65 57 69 74 68 69 6e 44 69 73 74 61 6e 63 odeWithinDistanc
9780: 65 32 44 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 e2D */. const
9790: 20 52 54 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 RTCTX *ctx = NU
97a0: 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 LL;. struct s
97b0: 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 plite_internal_c
97c0: 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 4e 55 ache *cache = NU
97d0: 4c 4c 3b 0a 20 20 20 20 47 61 69 61 54 6f 70 6f LL;. GaiaTopo
97e0: 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 logyAccessorPtr
97f0: 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f topo = (GaiaTopo
9800: 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 logyAccessorPtr)
9810: 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 rtt_topo;. s
9820: 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c truct gaia_topol
9830: 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 ogy *accessor =
9840: 28 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 (struct gaia_top
9850: 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 ology *) topo;.
9860: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 sqlite3_stmt
9870: 2a 73 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 72 *stmt;. int r
9880: 65 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 et;. double c
9890: 78 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 79 x;. double cy
98a0: 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 41 52 52 ;. RTPOINTARR
98b0: 41 59 20 2a 70 61 3b 0a 20 20 20 20 52 54 50 4f AY *pa;. RTPO
98c0: 49 4e 54 34 44 20 70 74 34 64 3b 0a 20 20 20 20 INT4D pt4d;.
98d0: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 int count = 0;.
98e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 sqlite3_stmt
98f0: 2a 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 4c 4c *stmt_aux = NULL
9900: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b ;. char *sql;
9910: 0a 20 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f . struct topo
9920: 5f 6e 6f 64 65 73 5f 6c 69 73 74 20 2a 6c 69 73 _nodes_list *lis
9930: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 52 54 t = NULL;. RT
9940: 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a 72 65 73 75 T_ISO_NODE *resu
9950: 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 lt = NULL;. i
9960: 66 20 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e f (accessor == N
9970: 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 ULL). {..
9980: 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a *numelems = -1;.
9990: 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a . return NULL;.
99a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 6d }.. stm
99b0: 74 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e 73 74 t = accessor->st
99c0: 6d 74 5f 67 65 74 4e 6f 64 65 57 69 74 68 69 6e mt_getNodeWithin
99d0: 44 69 73 74 61 6e 63 65 32 44 3b 0a 20 20 20 20 Distance2D;.
99e0: 69 66 20 28 73 74 6d 74 20 3d 3d 20 4e 55 4c 4c if (stmt == NULL
99f0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 6e 75 ). {.. *nu
9a00: 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 20 melems = -1;..
9a10: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
9a20: 20 20 20 7d 0a 0a 20 20 20 20 63 61 63 68 65 20 }.. cache
9a30: 3d 20 28 73 74 72 75 63 74 20 73 70 6c 69 74 65 = (struct splite
9a40: 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 _internal_cache
9a50: 2a 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 *) accessor->cac
9a60: 68 65 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 he;. if (cach
9a70: 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 e == NULL)..retu
9a80: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 rn NULL;. if
9a90: 28 63 61 63 68 65 2d 3e 6d 61 67 69 63 31 20 21 (cache->magic1 !
9aa0: 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 43 = SPATIALITE_CAC
9ab0: 48 45 5f 4d 41 47 49 43 31 0a 09 7c 7c 20 63 61 HE_MAGIC1..|| ca
9ac0: 63 68 65 2d 3e 6d 61 67 69 63 32 20 21 3d 20 53 che->magic2 != S
9ad0: 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f PATIALITE_CACHE_
9ae0: 4d 41 47 49 43 32 29 0a 09 72 65 74 75 72 6e 20 MAGIC2)..return
9af0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 74 78 20 3d 20 NULL;. ctx =
9b00: 63 61 63 68 65 2d 3e 52 54 54 4f 50 4f 5f 68 61 cache->RTTOPO_ha
9b10: 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 63 74 ndle;. if (ct
9b20: 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 x == NULL)..retu
9b30: 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 rn NULL;.. if
9b40: 20 28 6c 69 6d 69 74 20 3e 3d 20 30 29 0a 20 20 (limit >= 0).
9b50: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 72 65 70 {.. /* prep
9b60: 61 72 69 6e 67 20 74 68 65 20 61 75 78 69 6c 69 aring the auxili
9b70: 61 72 79 20 53 51 4c 20 73 74 61 74 65 6d 65 6e ary SQL statemen
9b80: 74 20 2a 2f 0a 09 20 20 73 71 6c 20 3d 0a 09 20 t */.. sql =..
9b90: 20 20 20 20 20 64 6f 5f 70 72 65 70 61 72 65 5f do_prepare_
9ba0: 72 65 61 64 5f 6e 6f 64 65 20 28 61 63 63 65 73 read_node (acces
9bb0: 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 79 5f 6e 61 sor->topology_na
9bc0: 6d 65 2c 20 66 69 65 6c 64 73 2c 0a 09 09 09 09 me, fields,.....
9bd0: 20 20 20 20 61 63 63 65 73 73 6f 72 2d 3e 68 61 accessor->ha
9be0: 73 5f 7a 29 3b 0a 09 20 20 72 65 74 20 3d 0a 09 s_z);.. ret =..
9bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 sqlite3_pr
9c00: 65 70 61 72 65 5f 76 32 20 28 61 63 63 65 73 73 epare_v2 (access
9c10: 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 2c 20 73 or->db_handle, s
9c20: 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 ql, strlen (sql)
9c30: 2c 0a 09 09 09 09 20 20 26 73 74 6d 74 5f 61 75 ,..... &stmt_au
9c40: 78 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 73 71 6c x, NULL);.. sql
9c50: 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b ite3_free (sql);
9c60: 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 .. if (ret != S
9c70: 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 7b QLITE_OK).. {
9c80: 0a 09 09 63 68 61 72 20 2a 6d 73 67 20 3d 0a 09 ...char *msg =..
9c90: 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 . sqlite3_mpr
9ca0: 69 6e 74 66 0a 09 09 20 20 20 20 28 22 50 72 65 intf... ("Pre
9cb0: 70 61 72 65 5f 67 65 74 4e 6f 64 65 57 69 74 68 pare_getNodeWith
9cc0: 69 6e 44 69 73 74 61 6e 63 65 32 44 20 41 55 58 inDistance2D AUX
9cd0: 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 22 2c error: \"%s\"",
9ce0: 0a 09 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f ... sqlite3_
9cf0: 65 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f 72 errmsg (accessor
9d00: 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 ->db_handle));..
9d10: 09 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 .gaiatopo_set_la
9d20: 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f st_error_msg (to
9d30: 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 po, msg);...sqli
9d40: 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a te3_free (msg);.
9d50: 09 09 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 ..*numelems = -1
9d60: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b ;...return NULL;
9d70: 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a .. }. }.
9d80: 0a 2f 2a 20 65 78 74 72 61 63 74 69 6e 67 20 58 ./* extracting X
9d90: 20 61 6e 64 20 59 20 66 72 6f 6d 20 52 54 50 4f and Y from RTPO
9da0: 49 4e 54 20 2a 2f 0a 20 20 20 20 70 61 20 3d 20 INT */. pa =
9db0: 70 74 2d 3e 70 6f 69 6e 74 3b 0a 20 20 20 20 72 pt->point;. r
9dc0: 74 5f 67 65 74 50 6f 69 6e 74 34 64 5f 70 20 28 t_getPoint4d_p (
9dd0: 63 74 78 2c 20 70 61 2c 20 30 2c 20 26 70 74 34 ctx, pa, 0, &pt4
9de0: 64 29 3b 0a 20 20 20 20 63 78 20 3d 20 70 74 34 d);. cx = pt4
9df0: 64 2e 78 3b 0a 20 20 20 20 63 79 20 3d 20 70 74 d.x;. cy = pt
9e00: 34 64 2e 79 3b 0a 0a 2f 2a 20 73 65 74 74 69 6e 4d.y;../* settin
9e10: 67 20 75 70 20 74 68 65 20 70 72 65 70 61 72 65 g up the prepare
9e20: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 d statement */.
9e30: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 sqlite3_reset
9e40: 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c (stmt);. sql
9e50: 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 ite3_clear_bindi
9e60: 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 ngs (stmt);.
9e70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 sqlite3_bind_dou
9e80: 62 6c 65 20 28 73 74 6d 74 2c 20 31 2c 20 63 78 ble (stmt, 1, cx
9e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 );. sqlite3_b
9ea0: 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 ind_double (stmt
9eb0: 2c 20 32 2c 20 63 79 29 3b 0a 20 20 20 20 73 71 , 2, cy);. sq
9ec0: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c lite3_bind_doubl
9ed0: 65 20 28 73 74 6d 74 2c 20 33 2c 20 64 69 73 74 e (stmt, 3, dist
9ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 );. sqlite3_b
9ef0: 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 ind_double (stmt
9f00: 2c 20 34 2c 20 63 78 29 3b 0a 20 20 20 20 73 71 , 4, cx);. sq
9f10: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c lite3_bind_doubl
9f20: 65 20 28 73 74 6d 74 2c 20 35 2c 20 63 79 29 3b e (stmt, 5, cy);
9f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e . sqlite3_bin
9f40: 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 d_double (stmt,
9f50: 36 2c 20 64 69 73 74 29 3b 0a 20 20 20 20 6c 69 6, dist);. li
9f60: 73 74 20 3d 20 63 72 65 61 74 65 5f 6e 6f 64 65 st = create_node
9f70: 73 5f 6c 69 73 74 20 28 29 3b 0a 0a 20 20 20 20 s_list ();..
9f80: 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 while (1).
9f90: 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e {.. /* scrollin
9fa0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 g the result set
9fb0: 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 rows */.. ret
9fc0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 = sqlite3_step (
9fd0: 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 stmt);.. if (re
9fe0: 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 t == SQLITE_DONE
9ff0: 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 ).. break;.
a000: 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c ./* end of resul
a010: 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 t set */.. if (
a020: 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f ret == SQLITE_RO
a030: 57 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 W).. {...sqli
a040: 74 65 33 5f 69 6e 74 36 34 20 6e 6f 64 65 5f 69 te3_int64 node_i
a050: 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 d = sqlite3_colu
a060: 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 mn_int64 (stmt,
a070: 30 29 3b 0a 09 09 69 66 20 28 73 74 6d 74 5f 61 0);...if (stmt_a
a080: 75 78 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 ux != NULL)...
a090: 7b 0a 09 09 20 20 20 20 20 20 63 68 61 72 20 2a {... char *
a0a0: 6d 73 67 3b 0a 09 09 20 20 20 20 20 20 69 66 20 msg;... if
a0b0: 28 21 64 6f 5f 72 65 61 64 5f 6e 6f 64 65 0a 09 (!do_read_node..
a0c0: 09 09 20 20 28 73 74 6d 74 5f 61 75 78 2c 20 6c .. (stmt_aux, l
a0d0: 69 73 74 2c 20 6e 6f 64 65 5f 69 64 2c 20 66 69 ist, node_id, fi
a0e0: 65 6c 64 73 2c 20 61 63 63 65 73 73 6f 72 2d 3e elds, accessor->
a0f0: 68 61 73 5f 7a 2c 0a 09 09 09 20 20 20 22 63 61 has_z,.... "ca
a100: 6c 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 65 57 69 llback_getNodeWi
a110: 74 68 69 6e 44 69 73 74 61 6e 63 65 32 44 22 2c thinDistance2D",
a120: 20 26 6d 73 67 29 29 0a 09 09 09 7b 0a 09 09 09 &msg))....{....
a130: 20 20 20 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 gaiatopo_set
a140: 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 _last_error_msg
a150: 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 09 (topo, msg);....
a160: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
a170: 20 28 6d 73 67 29 3b 0a 09 09 09 20 20 20 20 67 (msg);.... g
a180: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 09 09 7d 0a oto error;....}.
a190: 09 09 20 20 7d 0a 09 09 63 6f 75 6e 74 2b 2b 3b .. }...count++;
a1a0: 0a 09 09 69 66 20 28 6c 69 6d 69 74 20 3e 20 30 ...if (limit > 0
a1b0: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
a1c0: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6c 69 6d 69 if (count > limi
a1d0: 74 29 0a 09 09 09 20 20 62 72 65 61 6b 3b 0a 09 t).... break;..
a1e0: 09 20 20 7d 0a 09 09 69 66 20 28 6c 69 6d 69 74 . }...if (limit
a1f0: 20 3c 20 30 29 0a 09 09 20 20 20 20 62 72 65 61 < 0)... brea
a200: 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 k;.. }.. els
a210: 65 0a 09 20 20 20 20 7b 0a 09 09 63 68 61 72 20 e.. {...char
a220: 2a 6d 73 67 20 3d 0a 09 09 20 20 20 20 73 71 6c *msg =... sql
a230: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 63 ite3_mprintf ("c
a240: 61 6c 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 65 57 allback_getNodeW
a250: 69 74 68 69 6e 44 69 73 74 61 6e 63 65 32 44 3a ithinDistance2D:
a260: 20 25 73 22 2c 0a 09 09 09 09 20 20 20 20 20 73 %s",..... s
a270: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 28 61 qlite3_errmsg (a
a280: 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 ccessor->db_hand
a290: 6c 65 29 29 3b 0a 09 09 67 61 69 61 74 6f 70 6f le));...gaiatopo
a2a0: 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f _set_last_error_
a2b0: 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b msg (topo, msg);
a2c0: 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 ...sqlite3_free
a2d0: 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 72 (msg);...goto er
a2e0: 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 ror;.. }.
a2f0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c 69 6d }.. if (lim
a300: 69 74 20 3c 20 30 29 0a 20 20 20 20 20 20 7b 0a it < 0). {.
a310: 09 20 20 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c . result = NULL
a320: 3b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d ;.. *numelems =
a330: 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 7d 0a count;. }.
a340: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b else. {
a350: 0a 09 20 20 69 66 20 28 6c 69 73 74 2d 3e 63 6f .. if (list->co
a360: 75 6e 74 20 3c 3d 20 30 29 0a 09 20 20 20 20 7b unt <= 0).. {
a370: 0a 09 09 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c ...result = NULL
a380: 3b 0a 09 09 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 ;...*numelems =
a390: 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 0;.. }.. els
a3a0: 65 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 69 e.. {...int i
a3b0: 20 3d 20 30 3b 0a 09 09 73 74 72 75 63 74 20 74 = 0;...struct t
a3c0: 6f 70 6f 5f 6e 6f 64 65 20 2a 70 5f 6e 64 3b 0a opo_node *p_nd;.
a3d0: 09 09 72 65 73 75 6c 74 20 3d 20 72 74 61 6c 6c ..result = rtall
a3e0: 6f 63 20 28 63 74 78 2c 20 73 69 7a 65 6f 66 20 oc (ctx, sizeof
a3f0: 28 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 29 20 2a (RTT_ISO_NODE) *
a400: 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 29 3b 0a 09 list->count);..
a410: 09 70 5f 6e 64 20 3d 20 6c 69 73 74 2d 3e 66 69 .p_nd = list->fi
a420: 72 73 74 3b 0a 09 09 77 68 69 6c 65 20 28 70 5f rst;...while (p_
a430: 6e 64 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 nd != NULL)...
a440: 7b 0a 09 09 20 20 20 20 20 20 52 54 54 5f 49 53 {... RTT_IS
a450: 4f 5f 4e 4f 44 45 20 2a 6e 64 20 3d 20 72 65 73 O_NODE *nd = res
a460: 75 6c 74 20 2b 20 69 3b 0a 09 09 20 20 20 20 20 ult + i;...
a470: 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 if (fields & RT
a480: 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 45 5f T_COL_NODE_NODE_
a490: 49 44 29 0a 09 09 09 20 20 6e 64 2d 3e 6e 6f 64 ID).... nd->nod
a4a0: 65 5f 69 64 20 3d 20 70 5f 6e 64 2d 3e 6e 6f 64 e_id = p_nd->nod
a4b0: 65 5f 69 64 3b 0a 09 09 20 20 20 20 20 20 69 66 e_id;... if
a4c0: 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
a4d0: 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 OL_NODE_CONTAINI
a4e0: 4e 47 5f 46 41 43 45 29 0a 09 09 09 20 20 6e 64 NG_FACE).... nd
a4f0: 2d 3e 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 ->containing_fac
a500: 65 20 3d 20 70 5f 6e 64 2d 3e 63 6f 6e 74 61 69 e = p_nd->contai
a510: 6e 69 6e 67 5f 66 61 63 65 3b 0a 09 09 20 20 20 ning_face;...
a520: 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 if (fields &
a530: 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 47 45 4f RTT_COL_NODE_GEO
a540: 4d 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 70 M)....{.... p
a550: 61 20 3d 20 70 74 61 72 72 61 79 5f 63 6f 6e 73 a = ptarray_cons
a560: 74 72 75 63 74 20 28 63 74 78 2c 20 61 63 63 65 truct (ctx, acce
a570: 73 73 6f 72 2d 3e 68 61 73 5f 7a 2c 20 30 2c 20 ssor->has_z, 0,
a580: 31 29 3b 0a 09 09 09 20 20 20 20 70 74 34 64 2e 1);.... pt4d.
a590: 78 20 3d 20 70 5f 6e 64 2d 3e 78 3b 0a 09 09 09 x = p_nd->x;....
a5a0: 20 20 20 20 70 74 34 64 2e 79 20 3d 20 70 5f 6e pt4d.y = p_n
a5b0: 64 2d 3e 79 3b 0a 09 09 09 20 20 20 20 69 66 20 d->y;.... if
a5c0: 28 61 63 63 65 73 73 6f 72 2d 3e 68 61 73 5f 7a (accessor->has_z
a5d0: 29 0a 09 09 09 09 70 74 34 64 2e 7a 20 3d 20 70 ).....pt4d.z = p
a5e0: 5f 6e 64 2d 3e 7a 3b 0a 09 09 09 20 20 20 20 70 _nd->z;.... p
a5f0: 74 61 72 72 61 79 5f 73 65 74 5f 70 6f 69 6e 74 tarray_set_point
a600: 34 64 20 28 63 74 78 2c 20 70 61 2c 20 30 2c 20 4d (ctx, pa, 0,
a610: 26 70 74 34 64 29 3b 0a 09 09 09 20 20 20 20 6e &pt4d);.... n
a620: 64 2d 3e 67 65 6f 6d 20 3d 0a 09 09 09 09 72 74 d->geom =.....rt
a630: 70 6f 69 6e 74 5f 63 6f 6e 73 74 72 75 63 74 20 point_construct
a640: 28 63 74 78 2c 20 61 63 63 65 73 73 6f 72 2d 3e (ctx, accessor->
a650: 73 72 69 64 2c 20 4e 55 4c 4c 2c 0a 09 09 09 09 srid, NULL,.....
a660: 09 09 20 20 20 70 61 29 3b 0a 09 09 09 7d 0a 09 .. pa);....}..
a670: 09 20 20 20 20 20 20 69 2b 2b 3b 0a 09 09 20 20 . i++;...
a680: 20 20 20 20 70 5f 6e 64 20 3d 20 70 5f 6e 64 2d p_nd = p_nd-
a690: 3e 6e 65 78 74 3b 0a 09 09 20 20 7d 0a 09 09 2a >next;... }...*
a6a0: 6e 75 6d 65 6c 65 6d 73 20 3d 20 6c 69 73 74 2d numelems = list-
a6b0: 3e 63 6f 75 6e 74 3b 0a 09 20 20 20 20 7d 0a 20 >count;.. }.
a6c0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 }.. if (
a6d0: 73 74 6d 74 5f 61 75 78 20 21 3d 20 4e 55 4c 4c stmt_aux != NULL
a6e0: 29 0a 09 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c )..sqlite3_final
a6f0: 69 7a 65 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a ize (stmt_aux);.
a700: 20 20 20 20 64 65 73 74 72 6f 79 5f 6e 6f 64 65 destroy_node
a710: 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 s_list (list);.
a720: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 sqlite3_reset
a730: 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 (stmt);. ret
a740: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 0a 20 20 65 urn result;.. e
a750: 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 rror:. sqlite
a760: 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 3_reset (stmt);.
a770: 20 20 20 20 69 66 20 28 73 74 6d 74 5f 61 75 78 if (stmt_aux
a780: 20 21 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 != NULL)..sqlit
a790: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d e3_finalize (stm
a7a0: 74 5f 61 75 78 29 3b 0a 20 20 20 20 69 66 20 28 t_aux);. if (
a7b0: 6c 69 73 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 64 list != NULL)..d
a7c0: 65 73 74 72 6f 79 5f 6e 6f 64 65 73 5f 6c 69 73 estroy_nodes_lis
a7d0: 74 20 28 6c 69 73 74 29 3b 0a 20 20 20 20 2a 6e t (list);. *n
a7e0: 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 20 20 umelems = -1;.
a7f0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d return NULL;.}
a800: 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b 5f 69 ..int.callback_i
a810: 6e 73 65 72 74 4e 6f 64 65 73 20 28 63 6f 6e 73 nsertNodes (cons
a820: 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 t RTT_BE_TOPOLOG
a830: 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 20 52 54 Y * rtt_topo, RT
a840: 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a 20 6e 6f 64 T_ISO_NODE * nod
a850: 65 73 2c 0a 09 09 20 20 20 20 20 20 69 6e 74 20 es,... int
a860: 6e 75 6d 65 6c 65 6d 73 29 0a 7b 0a 2f 2a 20 63 numelems).{./* c
a870: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e allback function
a880: 3a 20 69 6e 73 65 72 74 4e 6f 64 65 73 20 2a 2f : insertNodes */
a890: 0a 20 20 20 20 63 6f 6e 73 74 20 52 54 43 54 58 . const RTCTX
a8a0: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *ctx = NULL;.
a8b0: 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f struct splite_
a8c0: 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a internal_cache *
a8d0: 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 cache = NULL;.
a8e0: 20 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 GaiaTopologyAc
a8f0: 63 65 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d cessorPtr topo =
a900: 20 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 (GaiaTopologyAc
a910: 63 65 73 73 6f 72 50 74 72 29 20 72 74 74 5f 74 cessorPtr) rtt_t
a920: 6f 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 opo;. struct
a930: 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 gaia_topology *a
a940: 63 63 65 73 73 6f 72 20 3d 20 28 73 74 72 75 63 ccessor = (struc
a950: 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 t gaia_topology
a960: 2a 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c *) topo;. sql
a970: 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b ite3_stmt *stmt;
a980: 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 . int ret;.
a990: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 64 6f 75 int i;. dou
a9a0: 62 6c 65 20 78 3b 0a 20 20 20 20 64 6f 75 62 6c ble x;. doubl
a9b0: 65 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 e y;. double
a9c0: 7a 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 41 52 z;. RTPOINTAR
a9d0: 52 41 59 20 2a 70 61 3b 0a 20 20 20 20 52 54 50 RAY *pa;. RTP
a9e0: 4f 49 4e 54 34 44 20 70 74 34 64 3b 0a 20 20 20 OINT4D pt4d;.
a9f0: 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c 50 74 72 gaiaGeomCollPtr
aa00: 20 67 65 6f 6d 3b 0a 20 20 20 20 75 6e 73 69 67 geom;. unsig
aa10: 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c 6f 62 ned char *p_blob
aa20: 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 74 65 ;. int n_byte
aa30: 73 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b 67 5f s;. int gpkg_
aa40: 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e mode = 0;. in
aa50: 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 30 t tiny_point = 0
aa60: 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 73 73 ;. if (access
aa70: 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 or == NULL)..ret
aa80: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 73 74 6d 74 urn 0;.. stmt
aa90: 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e 73 74 6d = accessor->stm
aaa0: 74 5f 69 6e 73 65 72 74 4e 6f 64 65 73 3b 0a 20 t_insertNodes;.
aab0: 20 20 20 69 66 20 28 73 74 6d 74 20 3d 3d 20 4e if (stmt == N
aac0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a ULL)..return 0;.
aad0: 0a 20 20 20 20 63 61 63 68 65 20 3d 20 28 73 74 . cache = (st
aae0: 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 ruct splite_inte
aaf0: 72 6e 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 63 rnal_cache *) ac
ab00: 63 65 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 cessor->cache;.
ab10: 20 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 if (cache ==
ab20: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b NULL)..return 0;
ab30: 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e . if (cache->
ab40: 6d 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 magic1 != SPATIA
ab50: 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 LITE_CACHE_MAGIC
ab60: 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 1..|| cache->mag
ab70: 69 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 ic2 != SPATIALIT
ab80: 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a E_CACHE_MAGIC2).
ab90: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 .return 0;. c
aba0: 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f tx = cache->RTTO
abb0: 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 PO_handle;. i
abc0: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a f (ctx == NULL).
abd0: 09 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 .return 0;..
abe0: 69 66 20 28 61 63 63 65 73 73 6f 72 2d 3e 63 61 if (accessor->ca
abf0: 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 che != NULL).
ac00: 20 20 20 7b 0a 09 20 20 73 74 72 75 63 74 20 73 {.. struct s
ac10: 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 plite_internal_c
ac20: 61 63 68 65 20 2a 63 61 63 68 65 20 3d 0a 09 20 ache *cache =..
ac30: 20 20 20 20 20 28 73 74 72 75 63 74 20 73 70 6c (struct spl
ac40: 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 ite_internal_cac
ac50: 68 65 20 2a 29 20 28 61 63 63 65 73 73 6f 72 2d he *) (accessor-
ac60: 3e 63 61 63 68 65 29 3b 0a 09 20 20 67 70 6b 67 >cache);.. gpkg
ac70: 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 _mode = cache->g
ac80: 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e pkg_mode;.. tin
ac90: 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d y_point = cache-
aca0: 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 >tinyPointEnable
acb0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 d;. }..
acc0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
acd0: 6e 75 6d 65 6c 65 6d 73 3b 20 69 2b 2b 29 0a 20 numelems; i++).
ace0: 20 20 20 20 20 7b 0a 09 20 20 52 54 54 5f 49 53 {.. RTT_IS
acf0: 4f 5f 4e 4f 44 45 20 2a 6e 64 20 3d 20 6e 6f 64 O_NODE *nd = nod
ad00: 65 73 20 2b 20 69 3b 0a 09 20 20 2f 2a 20 73 65 es + i;.. /* se
ad10: 74 74 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 tting up the pre
ad20: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 pared statement
ad30: 2a 2f 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 65 */.. sqlite3_re
ad40: 73 65 74 20 28 73 74 6d 74 29 3b 0a 09 20 20 73 set (stmt);.. s
ad50: 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e qlite3_clear_bin
ad60: 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a 09 20 dings (stmt);..
ad70: 20 69 66 20 28 6e 64 2d 3e 6e 6f 64 65 5f 69 64 if (nd->node_id
ad80: 20 3c 3d 20 30 29 0a 09 20 20 20 20 20 20 73 71 <= 0).. sq
ad90: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 lite3_bind_null
ada0: 28 73 74 6d 74 2c 20 31 29 3b 0a 09 20 20 65 6c (stmt, 1);.. el
adb0: 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 se.. sqlite
adc0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
add0: 6d 74 2c 20 31 2c 20 6e 64 2d 3e 6e 6f 64 65 5f mt, 1, nd->node_
ade0: 69 64 29 3b 0a 09 20 20 69 66 20 28 6e 64 2d 3e id);.. if (nd->
adf0: 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 containing_face
ae00: 3c 20 30 29 0a 09 20 20 20 20 20 20 73 71 6c 69 < 0).. sqli
ae10: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 te3_bind_null (s
ae20: 74 6d 74 2c 20 32 29 3b 0a 09 20 20 65 6c 73 65 tmt, 2);.. else
ae30: 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
ae40: 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 bind_int64 (stmt
ae50: 2c 20 32 2c 20 6e 64 2d 3e 63 6f 6e 74 61 69 6e , 2, nd->contain
ae60: 69 6e 67 5f 66 61 63 65 29 3b 0a 09 20 20 69 66 ing_face);.. if
ae70: 20 28 61 63 63 65 73 73 6f 72 2d 3e 68 61 73 5f (accessor->has_
ae80: 7a 29 0a 09 20 20 20 20 20 20 67 65 6f 6d 20 3d z).. geom =
ae90: 20 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f gaiaAllocGeomCo
aea0: 6c 6c 58 59 5a 20 28 29 3b 0a 09 20 20 65 6c 73 llXYZ ();.. els
aeb0: 65 0a 09 20 20 20 20 20 20 67 65 6f 6d 20 3d 20 e.. geom =
aec0: 67 61 69 61 41 6c 6c 6f 63 47 65 6f 6d 43 6f 6c gaiaAllocGeomCol
aed0: 6c 20 28 29 3b 0a 09 20 20 2f 2a 20 65 78 74 72 l ();.. /* extr
aee0: 61 63 74 69 6e 67 20 58 20 61 6e 64 20 59 20 66 acting X and Y f
aef0: 72 6f 6d 20 52 54 50 4f 49 4e 54 20 2a 2f 0a 09 rom RTPOINT */..
af00: 20 20 70 61 20 3d 20 6e 64 2d 3e 67 65 6f 6d 2d pa = nd->geom-
af10: 3e 70 6f 69 6e 74 3b 0a 09 20 20 72 74 5f 67 65 >point;.. rt_ge
af20: 74 50 6f 69 6e 74 34 64 5f 70 20 28 63 74 78 2c tPoint4d_p (ctx,
af30: 20 70 61 2c 20 30 2c 20 26 70 74 34 64 29 3b 0a pa, 0, &pt4d);.
af40: 09 20 20 78 20 3d 20 70 74 34 64 2e 78 3b 0a 09 . x = pt4d.x;..
af50: 20 20 79 20 3d 20 70 74 34 64 2e 79 3b 0a 09 20 y = pt4d.y;..
af60: 20 69 66 20 28 61 63 63 65 73 73 6f 72 2d 3e 68 if (accessor->h
af70: 61 73 5f 7a 29 0a 09 20 20 20 20 7b 0a 09 09 7a as_z).. {...z
af80: 20 3d 20 70 74 34 64 2e 7a 3b 0a 09 09 67 61 69 = pt4d.z;...gai
af90: 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d 43 aAddPointToGeomC
afa0: 6f 6c 6c 58 59 5a 20 28 67 65 6f 6d 2c 20 78 2c ollXYZ (geom, x,
afb0: 20 79 2c 20 7a 29 3b 0a 09 20 20 20 20 7d 0a 09 y, z);.. }..
afc0: 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 67 61 else.. ga
afd0: 69 61 41 64 64 50 6f 69 6e 74 54 6f 47 65 6f 6d iaAddPointToGeom
afe0: 43 6f 6c 6c 20 28 67 65 6f 6d 2c 20 78 2c 20 79 Coll (geom, x, y
aff0: 29 3b 0a 09 20 20 67 65 6f 6d 2d 3e 53 72 69 64 );.. geom->Srid
b000: 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e 73 72 69 = accessor->sri
b010: 64 3b 0a 09 20 20 67 65 6f 6d 2d 3e 44 65 63 6c d;.. geom->Decl
b020: 61 72 65 64 54 79 70 65 20 3d 20 47 41 49 41 5f aredType = GAIA_
b030: 50 4f 49 4e 54 3b 0a 09 20 20 67 61 69 61 54 6f POINT;.. gaiaTo
b040: 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 6b SpatiaLiteBlobWk
b050: 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 70 5f 62 bEx2 (geom, &p_b
b060: 6c 6f 62 2c 20 26 6e 5f 62 79 74 65 73 2c 20 67 lob, &n_bytes, g
b070: 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 20 pkg_mode,.....
b080: 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 3b tiny_point);
b090: 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f 6d .. gaiaFreeGeom
b0a0: 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 20 Coll (geom);..
b0b0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f sqlite3_bind_blo
b0c0: 62 20 28 73 74 6d 74 2c 20 33 2c 20 70 5f 62 6c b (stmt, 3, p_bl
b0d0: 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 66 72 65 ob, n_bytes, fre
b0e0: 65 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c e);.. ret = sql
b0f0: 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29 ite3_step (stmt)
b100: 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 ;.. if (ret ==
b110: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 SQLITE_DONE || r
b120: 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 et == SQLITE_ROW
b130: 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 72 65 ).. {.../* re
b140: 74 72 69 65 76 69 6e 67 20 74 68 65 20 50 4b 20 trieving the PK
b150: 76 61 6c 75 65 20 2a 2f 0a 09 09 6e 64 2d 3e 6e value */...nd->n
b160: 6f 64 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 ode_id = sqlite3
b170: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 _last_insert_row
b180: 69 64 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 id (accessor->db
b190: 5f 68 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20 7d _handle);.. }
b1a0: 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a .. else.. {.
b1b0: 09 09 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 ..char *msg = sq
b1c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
b1d0: 63 61 6c 6c 62 61 63 6b 5f 69 6e 73 65 72 74 4e callback_insertN
b1e0: 6f 64 65 73 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 odes: \"%s\"",..
b1f0: 09 09 09 09 20 20 20 20 20 73 71 6c 69 74 65 33 .... sqlite3
b200: 5f 65 72 72 6d 73 67 0a 09 09 09 09 09 20 20 20 _errmsg......
b210: 20 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f (accessor->db_
b220: 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 61 69 61 handle));...gaia
b230: 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 topo_set_last_er
b240: 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d ror_msg (topo, m
b250: 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 sg);...sqlite3_f
b260: 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 ree (msg);...got
b270: 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a o error;.. }.
b280: 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 }. sqli
b290: 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 te3_reset (stmt)
b2a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
b2b0: 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 . error:. sq
b2c0: 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d lite3_reset (stm
b2d0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 t);. return 0
b2e0: 3b 0a 7d 0a 0a 52 54 54 5f 49 53 4f 5f 45 44 47 ;.}..RTT_ISO_EDG
b2f0: 45 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 E *.callback_get
b300: 45 64 67 65 42 79 49 64 20 28 63 6f 6e 73 74 20 EdgeById (const
b310: 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 RTT_BE_TOPOLOGY
b320: 2a 20 72 74 74 5f 74 6f 70 6f 2c 0a 09 09 20 20 * rtt_topo,...
b330: 20 20 20 20 63 6f 6e 73 74 20 52 54 54 5f 45 4c const RTT_EL
b340: 45 4d 49 44 20 2a 20 69 64 73 2c 20 69 6e 74 20 EMID * ids, int
b350: 2a 6e 75 6d 65 6c 65 6d 73 2c 20 69 6e 74 20 66 *numelems, int f
b360: 69 65 6c 64 73 29 0a 7b 0a 2f 2a 20 63 61 6c 6c ields).{./* call
b370: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 67 back function: g
b380: 65 74 45 64 67 65 42 79 49 64 20 2a 2f 0a 20 20 etEdgeById */.
b390: 20 20 63 6f 6e 73 74 20 52 54 43 54 58 20 2a 63 const RTCTX *c
b3a0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 tx = NULL;. s
b3b0: 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 truct splite_int
b3c0: 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 ernal_cache *cac
b3d0: 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 he = NULL;. G
b3e0: 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 aiaTopologyAcces
b3f0: 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 sorPtr topo = (G
b400: 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 aiaTopologyAcces
b410: 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f sorPtr) rtt_topo
b420: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 69 ;. struct gai
b430: 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 a_topology *acce
b440: 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 ssor = (struct g
b450: 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 aia_topology *)
b460: 74 6f 70 6f 3b 0a 20 20 20 20 69 6e 74 20 72 65 topo;. int re
b470: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 t;. int i;.
b480: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a sqlite3_stmt *
b490: 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 4c 4c 3b stmt_aux = NULL;
b4a0: 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a . char *sql;.
b4b0: 20 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f struct topo_
b4c0: 65 64 67 65 73 5f 6c 69 73 74 20 2a 6c 69 73 74 edges_list *list
b4d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 52 54 54 = NULL;. RTT
b4e0: 5f 49 53 4f 5f 45 44 47 45 20 2a 72 65 73 75 6c _ISO_EDGE *resul
b4f0: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 t = NULL;. if
b500: 20 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 (accessor == NU
b510: 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a LL). {.. *
b520: 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 numelems = -1;..
b530: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 return NULL;.
b540: 20 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 63 68 }.. cach
b550: 65 20 3d 20 28 73 74 72 75 63 74 20 73 70 6c 69 e = (struct spli
b560: 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 te_internal_cach
b570: 65 20 2a 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 e *) accessor->c
b580: 61 63 68 65 3b 0a 20 20 20 20 69 66 20 28 63 61 ache;. if (ca
b590: 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 che == NULL)..re
b5a0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 turn NULL;. i
b5b0: 66 20 28 63 61 63 68 65 2d 3e 6d 61 67 69 63 31 f (cache->magic1
b5c0: 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 != SPATIALITE_C
b5d0: 41 43 48 45 5f 4d 41 47 49 43 31 0a 09 7c 7c 20 ACHE_MAGIC1..||
b5e0: 63 61 63 68 65 2d 3e 6d 61 67 69 63 32 20 21 3d cache->magic2 !=
b5f0: 20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 SPATIALITE_CACH
b600: 45 5f 4d 41 47 49 43 32 29 0a 09 72 65 74 75 72 E_MAGIC2)..retur
b610: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 74 78 20 n NULL;. ctx
b620: 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 4f 5f = cache->RTTOPO_
b630: 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 handle;. if (
b640: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 ctx == NULL)..re
b650: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 turn NULL;..
b660: 2f 2a 20 70 72 65 70 61 72 69 6e 67 20 74 68 65 /* preparing the
b670: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a SQL statement *
b680: 2f 0a 20 20 20 20 73 71 6c 20 3d 20 64 6f 5f 70 /. sql = do_p
b690: 72 65 70 61 72 65 5f 72 65 61 64 5f 65 64 67 65 repare_read_edge
b6a0: 20 28 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 6f (accessor->topo
b6b0: 6c 6f 67 79 5f 6e 61 6d 65 2c 20 66 69 65 6c 64 logy_name, field
b6c0: 73 29 3b 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 s);. ret =..s
b6d0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 qlite3_prepare_v
b6e0: 32 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 2 (accessor->db_
b6f0: 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 73 74 72 handle, sql, str
b700: 6c 65 6e 20 28 73 71 6c 29 2c 0a 09 09 09 20 20 len (sql),....
b710: 20 20 26 73 74 6d 74 5f 61 75 78 2c 20 4e 55 4c &stmt_aux, NUL
b720: 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f L);. sqlite3_
b730: 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20 20 free (sql);.
b740: 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 if (ret != SQLIT
b750: 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 E_OK). {..
b760: 20 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c char *msg = sql
b770: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 50 ite3_mprintf ("P
b780: 72 65 70 61 72 65 5f 67 65 74 45 64 67 65 42 79 repare_getEdgeBy
b790: 49 64 20 41 55 58 20 65 72 72 6f 72 3a 20 5c 22 Id AUX error: \"
b7a0: 25 73 5c 22 22 2c 0a 09 09 09 09 20 20 20 20 20 %s\"",.....
b7b0: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 sqlite3_errmsg
b7c0: 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
b7d0: 61 6e 64 6c 65 29 29 3b 0a 09 20 20 67 61 69 61 andle));.. gaia
b7e0: 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 topo_set_last_er
b7f0: 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d ror_msg (topo, m
b800: 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f sg);.. sqlite3_
b810: 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 20 20 2a free (msg);.. *
b820: 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 numelems = -1;..
b830: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 return NULL;.
b840: 20 20 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73 74 }.. list
b850: 20 3d 20 63 72 65 61 74 65 5f 65 64 67 65 73 5f = create_edges_
b860: 6c 69 73 74 20 28 29 3b 0a 20 20 20 20 66 6f 72 list ();. for
b870: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 2a 6e 75 (i = 0; i < *nu
b880: 6d 65 6c 65 6d 73 3b 20 69 2b 2b 29 0a 20 20 20 melems; i++).
b890: 20 20 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d 73 {.. char *ms
b8a0: 67 3b 0a 09 20 20 69 66 20 28 21 64 6f 5f 72 65 g;.. if (!do_re
b8b0: 61 64 5f 65 64 67 65 0a 09 20 20 20 20 20 20 28 ad_edge.. (
b8c0: 73 74 6d 74 5f 61 75 78 2c 20 6c 69 73 74 2c 20 stmt_aux, list,
b8d0: 2a 28 69 64 73 20 2b 20 69 29 2c 20 66 69 65 6c *(ids + i), fiel
b8e0: 64 73 2c 20 22 63 61 6c 6c 62 61 63 6b 5f 67 65 ds, "callback_ge
b8f0: 74 45 64 67 65 42 79 49 64 22 2c 0a 09 20 20 20 tEdgeById",..
b900: 20 20 20 20 26 6d 73 67 29 29 0a 09 20 20 20 20 &msg))..
b910: 7b 0a 09 09 67 61 69 61 74 6f 70 6f 5f 73 65 74 {...gaiatopo_set
b920: 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 _last_error_msg
b930: 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 73 (topo, msg);...s
b940: 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 qlite3_free (msg
b950: 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b );...goto error;
b960: 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a .. }. }.
b970: 0a 20 20 20 20 69 66 20 28 6c 69 73 74 2d 3e 63 . if (list->c
b980: 6f 75 6e 74 20 3d 3d 20 30 29 0a 20 20 20 20 20 ount == 0).
b990: 20 7b 0a 09 20 20 2f 2a 20 6e 6f 20 65 64 67 65 {.. /* no edge
b9a0: 20 77 61 73 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 was found */..
b9b0: 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 6c 69 73 *numelems = lis
b9c0: 74 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 t->count;.
b9d0: 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 }. else.
b9e0: 20 7b 0a 09 20 20 73 74 72 75 63 74 20 74 6f 70 {.. struct top
b9f0: 6f 5f 65 64 67 65 20 2a 70 5f 65 64 3b 0a 09 20 o_edge *p_ed;..
ba00: 20 72 65 73 75 6c 74 20 3d 20 72 74 61 6c 6c 6f result = rtallo
ba10: 63 20 28 63 74 78 2c 20 73 69 7a 65 6f 66 20 28 c (ctx, sizeof (
ba20: 52 54 54 5f 49 53 4f 5f 45 44 47 45 29 20 2a 20 RTT_ISO_EDGE) *
ba30: 6c 69 73 74 2d 3e 63 6f 75 6e 74 29 3b 0a 09 20 list->count);..
ba40: 20 70 5f 65 64 20 3d 20 6c 69 73 74 2d 3e 66 69 p_ed = list->fi
ba50: 72 73 74 3b 0a 09 20 20 69 20 3d 20 30 3b 0a 09 rst;.. i = 0;..
ba60: 20 20 77 68 69 6c 65 20 28 70 5f 65 64 20 21 3d while (p_ed !=
ba70: 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 NULL).. {...
ba80: 52 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 65 64 RTT_ISO_EDGE *ed
ba90: 20 3d 20 72 65 73 75 6c 74 20 2b 20 69 3b 0a 09 = result + i;..
baa0: 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 .if (fields & RT
bab0: 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f T_COL_EDGE_EDGE_
bac0: 49 44 29 0a 09 09 20 20 20 20 65 64 2d 3e 65 64 ID)... ed->ed
bad0: 67 65 5f 69 64 20 3d 20 70 5f 65 64 2d 3e 65 64 ge_id = p_ed->ed
bae0: 67 65 5f 69 64 3b 0a 09 09 69 66 20 28 66 69 65 ge_id;...if (fie
baf0: 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
bb00: 47 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 GE_START_NODE)..
bb10: 09 20 20 20 20 65 64 2d 3e 73 74 61 72 74 5f 6e . ed->start_n
bb20: 6f 64 65 20 3d 20 70 5f 65 64 2d 3e 73 74 61 72 ode = p_ed->star
bb30: 74 5f 6e 6f 64 65 3b 0a 09 09 69 66 20 28 66 69 t_node;...if (fi
bb40: 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
bb50: 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 09 09 DGE_END_NODE)...
bb60: 20 20 20 20 65 64 2d 3e 65 6e 64 5f 6e 6f 64 65 ed->end_node
bb70: 20 3d 20 70 5f 65 64 2d 3e 65 6e 64 5f 6e 6f 64 = p_ed->end_nod
bb80: 65 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 e;...if (fields
bb90: 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 & RTT_COL_EDGE_F
bba0: 41 43 45 5f 4c 45 46 54 29 0a 09 09 20 20 20 20 ACE_LEFT)...
bbb0: 65 64 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3d 20 ed->face_left =
bbc0: 70 5f 65 64 2d 3e 66 61 63 65 5f 6c 65 66 74 3b p_ed->face_left;
bbd0: 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
bbe0: 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 RTT_COL_EDGE_FAC
bbf0: 45 5f 52 49 47 48 54 29 0a 09 09 20 20 20 20 65 E_RIGHT)... e
bc00: 64 2d 3e 66 61 63 65 5f 72 69 67 68 74 20 3d 20 d->face_right =
bc10: 70 5f 65 64 2d 3e 66 61 63 65 5f 72 69 67 68 74 p_ed->face_right
bc20: 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 ;...if (fields &
bc30: 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 RTT_COL_EDGE_NE
bc40: 58 54 5f 4c 45 46 54 29 0a 09 09 20 20 20 20 65 XT_LEFT)... e
bc50: 64 2d 3e 6e 65 78 74 5f 6c 65 66 74 20 3d 20 70 d->next_left = p
bc60: 5f 65 64 2d 3e 6e 65 78 74 5f 6c 65 66 74 3b 0a _ed->next_left;.
bc70: 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 ..if (fields & R
bc80: 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 TT_COL_EDGE_NEXT
bc90: 5f 52 49 47 48 54 29 0a 09 09 20 20 20 20 65 64 _RIGHT)... ed
bca0: 2d 3e 6e 65 78 74 5f 72 69 67 68 74 20 3d 20 70 ->next_right = p
bcb0: 5f 65 64 2d 3e 6e 65 78 74 5f 72 69 67 68 74 3b _ed->next_right;
bcc0: 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
bcd0: 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 47 45 4f RTT_COL_EDGE_GEO
bce0: 4d 29 0a 09 09 20 20 20 20 65 64 2d 3e 67 65 6f M)... ed->geo
bcf0: 6d 20 3d 0a 09 09 09 67 61 69 61 5f 63 6f 6e 76 m =....gaia_conv
bd00: 65 72 74 5f 6c 69 6e 65 73 74 72 69 6e 67 5f 74 ert_linestring_t
bd10: 6f 5f 72 74 6c 69 6e 65 20 28 63 74 78 2c 20 70 o_rtline (ctx, p
bd20: 5f 65 64 2d 3e 67 65 6f 6d 2c 0a 09 09 09 09 09 _ed->geom,......
bd30: 09 09 20 20 20 61 63 63 65 73 73 6f 72 2d 3e 73 .. accessor->s
bd40: 72 69 64 2c 0a 09 09 09 09 09 09 09 20 20 20 61 rid,........ a
bd50: 63 63 65 73 73 6f 72 2d 3e 68 61 73 5f 7a 29 3b ccessor->has_z);
bd60: 0a 09 09 69 2b 2b 3b 0a 09 09 70 5f 65 64 20 3d ...i++;...p_ed =
bd70: 20 70 5f 65 64 2d 3e 6e 65 78 74 3b 0a 09 20 20 p_ed->next;..
bd80: 20 20 7d 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 }.. *numelems
bd90: 20 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a = list->count;.
bda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 }. sqli
bdb0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 te3_finalize (st
bdc0: 6d 74 5f 61 75 78 29 3b 0a 20 20 20 20 64 65 73 mt_aux);. des
bdd0: 74 72 6f 79 5f 65 64 67 65 73 5f 6c 69 73 74 20 troy_edges_list
bde0: 28 6c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 (list);. retu
bdf0: 72 6e 20 72 65 73 75 6c 74 3b 0a 0a 20 20 65 72 rn result;.. er
be00: 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 73 74 6d ror:. if (stm
be10: 74 5f 61 75 78 20 21 3d 20 4e 55 4c 4c 29 0a 09 t_aux != NULL)..
be20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 sqlite3_finalize
be30: 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a 20 20 20 (stmt_aux);.
be40: 20 69 66 20 28 6c 69 73 74 20 21 3d 20 4e 55 4c if (list != NUL
be50: 4c 29 0a 09 64 65 73 74 72 6f 79 5f 65 64 67 65 L)..destroy_edge
be60: 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 s_list (list);.
be70: 20 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d *numelems = -
be80: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 1;. return NU
be90: 4c 4c 3b 0a 7d 0a 0a 52 54 54 5f 49 53 4f 5f 45 LL;.}..RTT_ISO_E
bea0: 44 47 45 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 DGE *.callback_g
beb0: 65 74 45 64 67 65 57 69 74 68 69 6e 44 69 73 74 etEdgeWithinDist
bec0: 61 6e 63 65 32 44 20 28 63 6f 6e 73 74 20 52 54 ance2D (const RT
bed0: 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 T_BE_TOPOLOGY *
bee0: 72 74 74 5f 74 6f 70 6f 2c 0a 09 09 09 09 20 20 rtt_topo,.....
bef0: 63 6f 6e 73 74 20 52 54 50 4f 49 4e 54 20 2a 20 const RTPOINT *
bf00: 70 74 2c 20 64 6f 75 62 6c 65 20 64 69 73 74 2c pt, double dist,
bf10: 0a 09 09 09 09 20 20 69 6e 74 20 2a 6e 75 6d 65 ..... int *nume
bf20: 6c 65 6d 73 2c 20 69 6e 74 20 66 69 65 6c 64 73 lems, int fields
bf30: 2c 20 69 6e 74 20 6c 69 6d 69 74 29 0a 7b 0a 2f , int limit).{./
bf40: 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 * callback funct
bf50: 69 6f 6e 3a 20 67 65 74 45 64 67 65 57 69 74 68 ion: getEdgeWith
bf60: 69 6e 44 69 73 74 61 6e 63 65 32 44 20 2a 2f 0a inDistance2D */.
bf70: 20 20 20 20 63 6f 6e 73 74 20 52 54 43 54 58 20 const RTCTX
bf80: 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
bf90: 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 struct splite_i
bfa0: 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 nternal_cache *c
bfb0: 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ache = NULL;.
bfc0: 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 GaiaTopologyAcc
bfd0: 65 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 essorPtr topo =
bfe0: 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 (GaiaTopologyAcc
bff0: 65 73 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f essorPtr) rtt_to
c000: 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 po;. struct g
c010: 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 aia_topology *ac
c020: 63 65 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 cessor = (struct
c030: 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a gaia_topology *
c040: 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 ) topo;. sqli
c050: 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b 0a te3_stmt *stmt;.
c060: 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 int ret;.
c070: 20 64 6f 75 62 6c 65 20 63 78 3b 0a 20 20 20 20 double cx;.
c080: 64 6f 75 62 6c 65 20 63 79 3b 0a 20 20 20 20 52 double cy;. R
c090: 54 50 4f 49 4e 54 41 52 52 41 59 20 2a 70 61 3b TPOINTARRAY *pa;
c0a0: 0a 20 20 20 20 52 54 50 4f 49 4e 54 34 44 20 70 . RTPOINT4D p
c0b0: 74 34 64 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 t4d;. int cou
c0c0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 nt = 0;. sqli
c0d0: 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 5f 61 te3_stmt *stmt_a
c0e0: 75 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 ux = NULL;. c
c0f0: 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20 20 73 74 har *sql;. st
c100: 72 75 63 74 20 74 6f 70 6f 5f 65 64 67 65 73 5f ruct topo_edges_
c110: 6c 69 73 74 20 2a 6c 69 73 74 20 3d 20 4e 55 4c list *list = NUL
c120: 4c 3b 0a 20 20 20 20 52 54 54 5f 49 53 4f 5f 45 L;. RTT_ISO_E
c130: 44 47 45 20 2a 72 65 73 75 6c 74 20 3d 20 4e 55 DGE *result = NU
c140: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 LL;. if (acce
c150: 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 ssor == NULL).
c160: 20 20 20 20 7b 0a 09 20 20 2a 6e 75 6d 65 6c 65 {.. *numele
c170: 6d 73 20 3d 20 2d 31 3b 0a 09 20 20 72 65 74 75 ms = -1;.. retu
c180: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d rn NULL;. }
c190: 0a 0a 20 20 20 20 73 74 6d 74 20 3d 20 61 63 63 .. stmt = acc
c1a0: 65 73 73 6f 72 2d 3e 73 74 6d 74 5f 67 65 74 45 essor->stmt_getE
c1b0: 64 67 65 57 69 74 68 69 6e 44 69 73 74 61 6e 63 dgeWithinDistanc
c1c0: 65 32 44 3b 0a 20 20 20 20 69 66 20 28 73 74 6d e2D;. if (stm
c1d0: 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 t == NULL).
c1e0: 20 7b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 {.. *numelems
c1f0: 3d 20 2d 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 = -1;.. return
c200: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 NULL;. }..
c210: 20 20 20 63 61 63 68 65 20 3d 20 28 73 74 72 75 cache = (stru
c220: 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e ct splite_intern
c230: 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 63 63 65 al_cache *) acce
c240: 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 20 20 ssor->cache;.
c250: 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 if (cache == NU
c260: 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 LL)..return 0;.
c270: 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 if (cache->ma
c280: 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 gic1 != SPATIALI
c290: 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a TE_CACHE_MAGIC1.
c2a0: 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 .|| cache->magic
c2b0: 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 2 != SPATIALITE_
c2c0: 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 CACHE_MAGIC2)..r
c2d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 74 78 eturn 0;. ctx
c2e0: 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 4f = cache->RTTOPO
c2f0: 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 _handle;. if
c300: 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 (ctx == NULL)..r
c310: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 63 61 eturn 0;.. ca
c320: 63 68 65 20 3d 20 28 73 74 72 75 63 74 20 73 70 che = (struct sp
c330: 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 lite_internal_ca
c340: 63 68 65 20 2a 29 20 61 63 63 65 73 73 6f 72 2d che *) accessor-
c350: 3e 63 61 63 68 65 3b 0a 20 20 20 20 69 66 20 28 >cache;. if (
c360: 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 cache == NULL)..
c370: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
c380: 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 67 69 if (cache->magi
c390: 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 c1 != SPATIALITE
c3a0: 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a 09 7c _CACHE_MAGIC1..|
c3b0: 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 32 20 | cache->magic2
c3c0: 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 != SPATIALITE_CA
c3d0: 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 65 74 CHE_MAGIC2)..ret
c3e0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 74 urn NULL;. ct
c3f0: 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 x = cache->RTTOP
c400: 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 O_handle;. if
c410: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 (ctx == NULL)..
c420: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 return NULL;..
c430: 20 20 69 66 20 28 6c 69 6d 69 74 20 3e 3d 20 30 if (limit >= 0
c440: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 ). {.. /*
c450: 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 61 75 preparing the au
c460: 78 69 6c 69 61 72 79 20 53 51 4c 20 73 74 61 74 xiliary SQL stat
c470: 65 6d 65 6e 74 20 2a 2f 0a 09 20 20 73 71 6c 20 ement */.. sql
c480: 3d 20 64 6f 5f 70 72 65 70 61 72 65 5f 72 65 61 = do_prepare_rea
c490: 64 5f 65 64 67 65 20 28 61 63 63 65 73 73 6f 72 d_edge (accessor
c4a0: 2d 3e 74 6f 70 6f 6c 6f 67 79 5f 6e 61 6d 65 2c ->topology_name,
c4b0: 20 66 69 65 6c 64 73 29 3b 0a 09 20 20 72 65 74 fields);.. ret
c4c0: 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 =.. sqlite
c4d0: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28 61 63 3_prepare_v2 (ac
c4e0: 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c cessor->db_handl
c4f0: 65 2c 20 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28 e, sql, strlen (
c500: 73 71 6c 29 2c 0a 09 09 09 09 20 20 26 73 74 6d sql),..... &stm
c510: 74 5f 61 75 78 2c 20 4e 55 4c 4c 29 3b 0a 09 20 t_aux, NULL);..
c520: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 sqlite3_free (s
c530: 71 6c 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 ql);.. if (ret
c540: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 != SQLITE_OK)..
c550: 20 20 20 7b 0a 09 09 63 68 61 72 20 2a 6d 73 67 {...char *msg
c560: 20 3d 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 =... sqlite3
c570: 5f 6d 70 72 69 6e 74 66 20 28 22 50 72 65 70 61 _mprintf ("Prepa
c580: 72 65 5f 67 65 74 45 64 67 65 42 79 49 64 20 41 re_getEdgeById A
c590: 55 58 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 UX error: \"%s\"
c5a0: 22 2c 0a 09 09 09 09 20 20 20 20 20 73 71 6c 69 ",..... sqli
c5b0: 74 65 33 5f 65 72 72 6d 73 67 20 28 61 63 63 65 te3_errmsg (acce
c5c0: 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 ssor->db_handle)
c5d0: 29 3b 0a 09 09 67 61 69 61 74 6f 70 6f 5f 73 65 );...gaiatopo_se
c5e0: 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 t_last_error_msg
c5f0: 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 (topo, msg);...
c600: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 sqlite3_free (ms
c610: 67 29 3b 0a 09 09 2a 6e 75 6d 65 6c 65 6d 73 20 g);...*numelems
c620: 3d 20 2d 31 3b 0a 09 09 72 65 74 75 72 6e 20 4e = -1;...return N
c630: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 ULL;.. }.
c640: 20 20 7d 0a 0a 2f 2a 20 65 78 74 72 61 63 74 69 }../* extracti
c650: 6e 67 20 58 20 61 6e 64 20 59 20 66 72 6f 6d 20 ng X and Y from
c660: 52 54 50 4f 49 4e 54 20 2a 2f 0a 20 20 20 20 70 RTPOINT */. p
c670: 61 20 3d 20 70 74 2d 3e 70 6f 69 6e 74 3b 0a 20 a = pt->point;.
c680: 20 20 20 72 74 5f 67 65 74 50 6f 69 6e 74 34 64 rt_getPoint4d
c690: 5f 70 20 28 63 74 78 2c 20 70 61 2c 20 30 2c 20 _p (ctx, pa, 0,
c6a0: 26 70 74 34 64 29 3b 0a 20 20 20 20 63 78 20 3d &pt4d);. cx =
c6b0: 20 70 74 34 64 2e 78 3b 0a 20 20 20 20 63 79 20 pt4d.x;. cy
c6c0: 3d 20 70 74 34 64 2e 79 3b 0a 0a 2f 2a 20 73 65 = pt4d.y;../* se
c6d0: 74 74 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 tting up the pre
c6e0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 pared statement
c6f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 */. sqlite3_r
c700: 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 eset (stmt);.
c710: 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 sqlite3_clear_b
c720: 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a indings (stmt);.
c730: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
c740: 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 31 _double (stmt, 1
c750: 2c 20 63 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 , cx);. sqlit
c760: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 e3_bind_double (
c770: 73 74 6d 74 2c 20 32 2c 20 63 79 29 3b 0a 20 20 stmt, 2, cy);.
c780: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 sqlite3_bind_d
c790: 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 33 2c 20 ouble (stmt, 3,
c7a0: 64 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 dist);. sqlit
c7b0: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 e3_bind_double (
c7c0: 73 74 6d 74 2c 20 34 2c 20 63 78 29 3b 0a 20 20 stmt, 4, cx);.
c7d0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 sqlite3_bind_d
c7e0: 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 35 2c 20 ouble (stmt, 5,
c7f0: 63 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 cy);. sqlite3
c800: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 _bind_double (st
c810: 6d 74 2c 20 36 2c 20 64 69 73 74 29 3b 0a 20 20 mt, 6, dist);.
c820: 20 20 6c 69 73 74 20 3d 20 63 72 65 61 74 65 5f list = create_
c830: 65 64 67 65 73 5f 6c 69 73 74 20 28 29 3b 0a 0a edges_list ();..
c840: 20 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 while (1).
c850: 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 63 72 6f {.. /* scro
c860: 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 lling the result
c870: 20 73 65 74 20 72 6f 77 73 20 2a 2f 0a 09 20 20 set rows */..
c880: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 ret = sqlite3_st
c890: 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20 69 66 ep (stmt);.. if
c8a0: 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f (ret == SQLITE_
c8b0: 44 4f 4e 45 29 0a 09 20 20 20 20 20 20 62 72 65 DONE).. bre
c8c0: 61 6b 3b 09 09 2f 2a 20 65 6e 64 20 6f 66 20 72 ak;../* end of r
c8d0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 09 20 20 esult set */..
c8e0: 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 if (ret == SQLIT
c8f0: 45 5f 52 4f 57 29 0a 09 20 20 20 20 7b 0a 09 09 E_ROW).. {...
c900: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 65 64 sqlite3_int64 ed
c910: 67 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 5f ge_id = sqlite3_
c920: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 74 column_int64 (st
c930: 6d 74 2c 20 30 29 3b 0a 09 09 69 66 20 28 73 74 mt, 0);...if (st
c940: 6d 74 5f 61 75 78 20 21 3d 20 4e 55 4c 4c 29 0a mt_aux != NULL).
c950: 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 63 68 .. {... ch
c960: 61 72 20 2a 6d 73 67 3b 0a 09 09 20 20 20 20 20 ar *msg;...
c970: 20 69 66 20 28 21 64 6f 5f 72 65 61 64 5f 65 64 if (!do_read_ed
c980: 67 65 0a 09 09 09 20 20 28 73 74 6d 74 5f 61 75 ge.... (stmt_au
c990: 78 2c 20 6c 69 73 74 2c 20 65 64 67 65 5f 69 64 x, list, edge_id
c9a0: 2c 20 66 69 65 6c 64 73 2c 0a 09 09 09 20 20 20 , fields,....
c9b0: 22 63 61 6c 6c 62 61 63 6b 5f 67 65 74 45 64 67 "callback_getEdg
c9c0: 65 57 69 74 68 69 6e 44 69 73 74 61 6e 63 65 32 eWithinDistance2
c9d0: 44 22 2c 20 26 6d 73 67 29 29 0a 09 09 09 7b 0a D", &msg))....{.
c9e0: 09 09 09 20 20 20 20 67 61 69 61 74 6f 70 6f 5f ... gaiatopo_
c9f0: 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d set_last_error_m
ca00: 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a sg (topo, msg);.
ca10: 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 66 ... sqlite3_f
ca20: 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 09 20 20 ree (msg);....
ca30: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 09 goto error;...
ca40: 09 7d 0a 09 09 20 20 7d 0a 09 09 63 6f 75 6e 74 .}... }...count
ca50: 2b 2b 3b 0a 09 09 69 66 20 28 6c 69 6d 69 74 20 ++;...if (limit
ca60: 3e 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 > 0)... {...
ca70: 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3e 20 6c if (count > l
ca80: 69 6d 69 74 29 0a 09 09 09 20 20 62 72 65 61 6b imit).... break
ca90: 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 6c 69 ;... }...if (li
caa0: 6d 69 74 20 3c 20 30 29 0a 09 09 20 20 20 20 62 mit < 0)... b
cab0: 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 reak;.. }..
cac0: 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 63 68 else.. {...ch
cad0: 61 72 20 2a 6d 73 67 20 3d 0a 09 09 20 20 20 20 ar *msg =...
cae0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
caf0: 28 22 63 61 6c 6c 62 61 63 6b 5f 67 65 74 45 64 ("callback_getEd
cb00: 67 65 57 69 74 68 69 6e 44 69 73 74 61 6e 63 65 geWithinDistance
cb10: 32 44 3a 20 25 73 22 2c 0a 09 09 09 09 20 20 20 2D: %s",.....
cb20: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 sqlite3_errmsg
cb30: 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
cb40: 61 6e 64 6c 65 29 29 3b 0a 09 09 67 61 69 61 74 andle));...gaiat
cb50: 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 opo_set_last_err
cb60: 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 or_msg (topo, ms
cb70: 67 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 g);...sqlite3_fr
cb80: 65 65 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f ee (msg);...goto
cb90: 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 error;.. }.
cba0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 }.. if (
cbb0: 6c 69 6d 69 74 20 3c 20 30 29 0a 20 20 20 20 20 limit < 0).
cbc0: 20 7b 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 4e {.. result = N
cbd0: 55 4c 4c 3b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d ULL;.. *numelem
cbe0: 73 20 3d 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 s = count;.
cbf0: 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 }. else.
cc00: 20 20 7b 0a 09 20 20 69 66 20 28 6c 69 73 74 2d {.. if (list-
cc10: 3e 63 6f 75 6e 74 20 3c 3d 20 30 29 0a 09 20 20 >count <= 0)..
cc20: 20 20 7b 0a 09 09 72 65 73 75 6c 74 20 3d 20 4e {...result = N
cc30: 55 4c 4c 3b 0a 09 09 2a 6e 75 6d 65 6c 65 6d 73 ULL;...*numelems
cc40: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 = 0;.. }..
cc50: 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 6e else.. {...in
cc60: 74 20 69 20 3d 20 30 3b 0a 09 09 73 74 72 75 63 t i = 0;...struc
cc70: 74 20 74 6f 70 6f 5f 65 64 67 65 20 2a 70 5f 65 t topo_edge *p_e
cc80: 64 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20 72 74 d;...result = rt
cc90: 61 6c 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a 65 alloc (ctx, size
cca0: 6f 66 20 28 52 54 54 5f 49 53 4f 5f 45 44 47 45 of (RTT_ISO_EDGE
ccb0: 29 20 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 29 ) * list->count)
ccc0: 3b 0a 09 09 70 5f 65 64 20 3d 20 6c 69 73 74 2d ;...p_ed = list-
ccd0: 3e 66 69 72 73 74 3b 0a 09 09 77 68 69 6c 65 20 >first;...while
cce0: 28 70 5f 65 64 20 21 3d 20 4e 55 4c 4c 29 0a 09 (p_ed != NULL)..
ccf0: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 52 54 54 . {... RTT
cd00: 5f 49 53 4f 5f 45 44 47 45 20 2a 65 64 20 3d 20 _ISO_EDGE *ed =
cd10: 72 65 73 75 6c 74 20 2b 20 69 3b 0a 09 09 20 20 result + i;...
cd20: 20 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 if (fields &
cd30: 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 44 RTT_COL_EDGE_ED
cd40: 47 45 5f 49 44 29 0a 09 09 09 20 20 65 64 2d 3e GE_ID).... ed->
cd50: 65 64 67 65 5f 69 64 20 3d 20 70 5f 65 64 2d 3e edge_id = p_ed->
cd60: 65 64 67 65 5f 69 64 3b 0a 09 09 20 20 20 20 20 edge_id;...
cd70: 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 if (fields & RT
cd80: 54 5f 43 4f 4c 5f 45 44 47 45 5f 53 54 41 52 54 T_COL_EDGE_START
cd90: 5f 4e 4f 44 45 29 0a 09 09 09 20 20 65 64 2d 3e _NODE).... ed->
cda0: 73 74 61 72 74 5f 6e 6f 64 65 20 3d 20 70 5f 65 start_node = p_e
cdb0: 64 2d 3e 73 74 61 72 74 5f 6e 6f 64 65 3b 0a 09 d->start_node;..
cdc0: 09 20 20 20 20 20 20 69 66 20 28 66 69 65 6c 64 . if (field
cdd0: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
cde0: 5f 45 4e 44 5f 4e 4f 44 45 29 0a 09 09 09 20 20 _END_NODE)....
cdf0: 65 64 2d 3e 65 6e 64 5f 6e 6f 64 65 20 3d 20 70 ed->end_node = p
ce00: 5f 65 64 2d 3e 65 6e 64 5f 6e 6f 64 65 3b 0a 09 _ed->end_node;..
ce10: 09 20 20 20 20 20 20 69 66 20 28 66 69 65 6c 64 . if (field
ce20: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
ce30: 5f 46 41 43 45 5f 4c 45 46 54 29 0a 09 09 09 20 _FACE_LEFT)....
ce40: 20 65 64 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3d ed->face_left =
ce50: 20 70 5f 65 64 2d 3e 66 61 63 65 5f 6c 65 66 74 p_ed->face_left
ce60: 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 66 69 ;... if (fi
ce70: 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
ce80: 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a DGE_FACE_RIGHT).
ce90: 09 09 09 20 20 65 64 2d 3e 66 61 63 65 5f 72 69 ... ed->face_ri
cea0: 67 68 74 20 3d 20 70 5f 65 64 2d 3e 66 61 63 65 ght = p_ed->face
ceb0: 5f 72 69 67 68 74 3b 0a 09 09 20 20 20 20 20 20 _right;...
cec0: 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 if (fields & RTT
ced0: 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 4c _COL_EDGE_NEXT_L
cee0: 45 46 54 29 0a 09 09 09 20 20 65 64 2d 3e 6e 65 EFT).... ed->ne
cef0: 78 74 5f 6c 65 66 74 20 3d 20 70 5f 65 64 2d 3e xt_left = p_ed->
cf00: 6e 65 78 74 5f 6c 65 66 74 3b 0a 09 09 20 20 20 next_left;...
cf10: 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 if (fields &
cf20: 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 RTT_COL_EDGE_NEX
cf30: 54 5f 52 49 47 48 54 29 0a 09 09 09 20 20 65 64 T_RIGHT).... ed
cf40: 2d 3e 6e 65 78 74 5f 72 69 67 68 74 20 3d 20 70 ->next_right = p
cf50: 5f 65 64 2d 3e 6e 65 78 74 5f 72 69 67 68 74 3b _ed->next_right;
cf60: 0a 09 09 20 20 20 20 20 20 69 66 20 28 66 69 65 ... if (fie
cf70: 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
cf80: 47 45 5f 47 45 4f 4d 29 0a 09 09 09 20 20 65 64 GE_GEOM).... ed
cf90: 2d 3e 67 65 6f 6d 20 3d 0a 09 09 09 20 20 20 20 ->geom =....
cfa0: 20 20 67 61 69 61 5f 63 6f 6e 76 65 72 74 5f 6c gaia_convert_l
cfb0: 69 6e 65 73 74 72 69 6e 67 5f 74 6f 5f 72 74 6c inestring_to_rtl
cfc0: 69 6e 65 20 28 63 74 78 2c 0a 09 09 09 09 09 09 ine (ctx,.......
cfd0: 09 09 20 70 5f 65 64 2d 3e 67 65 6f 6d 2c 0a 09 .. p_ed->geom,..
cfe0: 09 09 09 09 09 09 09 20 61 63 63 65 73 73 6f 72 ....... accessor
cff0: 2d 3e 73 72 69 64 2c 0a 09 09 09 09 09 09 09 09 ->srid,.........
d000: 20 61 63 63 65 73 73 6f 72 2d 3e 0a 09 09 09 09 accessor->.....
d010: 09 09 09 09 20 68 61 73 5f 7a 29 3b 0a 09 09 20 .... has_z);...
d020: 20 20 20 20 20 69 2b 2b 3b 0a 09 09 20 20 20 20 i++;...
d030: 20 20 70 5f 65 64 20 3d 20 70 5f 65 64 2d 3e 6e p_ed = p_ed->n
d040: 65 78 74 3b 0a 09 09 20 20 7d 0a 09 09 2a 6e 75 ext;... }...*nu
d050: 6d 65 6c 65 6d 73 20 3d 20 6c 69 73 74 2d 3e 63 melems = list->c
d060: 6f 75 6e 74 3b 0a 09 20 20 20 20 7d 0a 20 20 20 ount;.. }.
d070: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
d080: 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 _reset (stmt);.
d090: 20 20 20 69 66 20 28 73 74 6d 74 5f 61 75 78 20 if (stmt_aux
d0a0: 21 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 != NULL)..sqlite
d0b0: 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 3_finalize (stmt
d0c0: 5f 61 75 78 29 3b 0a 20 20 20 20 64 65 73 74 72 _aux);. destr
d0d0: 6f 79 5f 65 64 67 65 73 5f 6c 69 73 74 20 28 6c oy_edges_list (l
d0e0: 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ist);. return
d0f0: 20 72 65 73 75 6c 74 3b 0a 0a 20 20 65 72 72 6f result;.. erro
d100: 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 r:. sqlite3_r
d110: 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 eset (stmt);.
d120: 20 69 66 20 28 73 74 6d 74 5f 61 75 78 20 21 3d if (stmt_aux !=
d130: 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f NULL)..sqlite3_
d140: 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 5f 61 finalize (stmt_a
d150: 75 78 29 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 ux);. if (lis
d160: 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 64 65 73 74 t != NULL)..dest
d170: 72 6f 79 5f 65 64 67 65 73 5f 6c 69 73 74 20 28 roy_edges_list (
d180: 6c 69 73 74 29 3b 0a 20 20 20 20 2a 6e 75 6d 65 list);. *nume
d190: 6c 65 6d 73 20 3d 20 2d 31 3b 0a 20 20 20 20 72 lems = -1;. r
d1a0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 52 eturn NULL;.}..R
d1b0: 54 54 5f 45 4c 45 4d 49 44 0a 63 61 6c 6c 62 61 TT_ELEMID.callba
d1c0: 63 6b 5f 67 65 74 4e 65 78 74 45 64 67 65 49 64 ck_getNextEdgeId
d1d0: 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 (const RTT_BE_T
d1e0: 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f OPOLOGY * rtt_to
d1f0: 70 6f 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 po).{./* callbac
d200: 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 67 65 74 4e k function: getN
d210: 65 78 74 45 64 67 65 49 64 20 2a 2f 0a 20 20 20 extEdgeId */.
d220: 20 63 6f 6e 73 74 20 52 54 43 54 58 20 2a 63 74 const RTCTX *ct
d230: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 x = NULL;. st
d240: 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 ruct splite_inte
d250: 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 rnal_cache *cach
d260: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 61 e = NULL;. Ga
d270: 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 iaTopologyAccess
d280: 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 orPtr topo = (Ga
d290: 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 iaTopologyAccess
d2a0: 6f 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b orPtr) rtt_topo;
d2b0: 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61 . struct gaia
d2c0: 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 _topology *acces
d2d0: 73 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 61 sor = (struct ga
d2e0: 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 ia_topology *) t
d2f0: 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 opo;. sqlite3
d300: 5f 73 74 6d 74 20 2a 73 74 6d 74 5f 69 6e 3b 0a _stmt *stmt_in;.
d310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
d320: 20 2a 73 74 6d 74 5f 6f 75 74 3b 0a 20 20 20 20 *stmt_out;.
d330: 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 73 71 6c int ret;. sql
d340: 69 74 65 33 5f 69 6e 74 36 34 20 65 64 67 65 5f ite3_int64 edge_
d350: 69 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 20 id = -1;. if
d360: 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c (accessor == NUL
d370: 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 0a L)..return -1;..
d380: 20 20 20 20 73 74 6d 74 5f 69 6e 20 3d 20 61 63 stmt_in = ac
d390: 63 65 73 73 6f 72 2d 3e 73 74 6d 74 5f 67 65 74 cessor->stmt_get
d3a0: 4e 65 78 74 45 64 67 65 49 64 3b 0a 20 20 20 20 NextEdgeId;.
d3b0: 69 66 20 28 73 74 6d 74 5f 69 6e 20 3d 3d 20 4e if (stmt_in == N
d3c0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b ULL)..return -1;
d3d0: 0a 20 20 20 20 73 74 6d 74 5f 6f 75 74 20 3d 20 . stmt_out =
d3e0: 61 63 63 65 73 73 6f 72 2d 3e 73 74 6d 74 5f 73 accessor->stmt_s
d3f0: 65 74 4e 65 78 74 45 64 67 65 49 64 3b 0a 20 20 etNextEdgeId;.
d400: 20 20 69 66 20 28 73 74 6d 74 5f 6f 75 74 20 3d if (stmt_out =
d410: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
d420: 2d 31 3b 0a 0a 20 20 20 20 63 61 63 68 65 20 3d -1;.. cache =
d430: 20 28 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f (struct splite_
d440: 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a internal_cache *
d450: 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 68 ) accessor->cach
d460: 65 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 e;. if (cache
d470: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 == NULL)..retur
d480: 6e 20 2d 31 3b 0a 20 20 20 20 69 66 20 28 63 61 n -1;. if (ca
d490: 63 68 65 2d 3e 6d 61 67 69 63 31 20 21 3d 20 53 che->magic1 != S
d4a0: 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f PATIALITE_CACHE_
d4b0: 4d 41 47 49 43 31 0a 09 7c 7c 20 63 61 63 68 65 MAGIC1..|| cache
d4c0: 2d 3e 6d 61 67 69 63 32 20 21 3d 20 53 50 41 54 ->magic2 != SPAT
d4d0: 49 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 IALITE_CACHE_MAG
d4e0: 49 43 32 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b IC2)..return -1;
d4f0: 0a 20 20 20 20 63 74 78 20 3d 20 63 61 63 68 65 . ctx = cache
d500: 2d 3e 52 54 54 4f 50 4f 5f 68 61 6e 64 6c 65 3b ->RTTOPO_handle;
d510: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 . if (ctx ==
d520: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 NULL)..return -1
d530: 3b 0a 0a 2f 2a 20 73 65 74 74 69 6e 67 20 75 70 ;../* setting up
d540: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
d550: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 atement */. s
d560: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
d570: 6d 74 5f 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 mt_in);. sqli
d580: 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e te3_clear_bindin
d590: 67 73 20 28 73 74 6d 74 5f 69 6e 29 3b 0a 0a 20 gs (stmt_in);..
d5a0: 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 while (1).
d5b0: 20 20 20 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c {.. /* scrol
d5c0: 6c 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 ling the result
d5d0: 73 65 74 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 set rows */.. r
d5e0: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 et = sqlite3_ste
d5f0: 70 20 28 73 74 6d 74 5f 69 6e 29 3b 0a 09 20 20 p (stmt_in);..
d600: 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 if (ret == SQLIT
d610: 45 5f 44 4f 4e 45 29 0a 09 20 20 20 20 20 20 62 E_DONE).. b
d620: 72 65 61 6b 3b 09 09 2f 2a 20 65 6e 64 20 6f 66 reak;../* end of
d630: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 09 result set */..
d640: 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c if (ret == SQL
d650: 49 54 45 5f 52 4f 57 29 0a 09 20 20 20 20 7b 0a ITE_ROW).. {.
d660: 09 09 65 64 67 65 5f 69 64 20 3d 20 73 71 6c 69 ..edge_id = sqli
d670: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 te3_column_int64
d680: 20 28 73 74 6d 74 5f 69 6e 2c 20 30 29 3b 0a 09 (stmt_in, 0);..
d690: 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 }.. else..
d6a0: 20 20 20 7b 0a 09 09 63 68 61 72 20 2a 6d 73 67 {...char *msg
d6b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
d6c0: 74 66 20 28 22 63 61 6c 6c 62 61 63 6b 5f 67 65 tf ("callback_ge
d6d0: 74 4e 65 78 74 45 64 67 65 49 64 3a 20 25 73 22 tNextEdgeId: %s"
d6e0: 2c 0a 09 09 09 09 09 20 20 20 20 20 73 71 6c 69 ,...... sqli
d6f0: 74 65 33 5f 65 72 72 6d 73 67 0a 09 09 09 09 09 te3_errmsg......
d700: 20 20 20 20 20 28 61 63 63 65 73 73 6f 72 2d 3e (accessor->
d710: 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 db_handle));...g
d720: 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 aiatopo_set_last
d730: 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f _error_msg (topo
d740: 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 , msg);...sqlite
d750: 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 3_free (msg);...
d760: 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 20 20 20 20 goto stop;..
d770: 7d 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 75 70 }. }../* up
d780: 64 61 74 69 6e 67 20 6e 65 78 74 5f 65 64 67 65 dating next_edge
d790: 5f 69 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 _id */. sqlit
d7a0: 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 5f 6f e3_reset (stmt_o
d7b0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 ut);. sqlite3
d7c0: 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 _clear_bindings
d7d0: 28 73 74 6d 74 5f 6f 75 74 29 3b 0a 20 20 20 20 (stmt_out);.
d7e0: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 ret = sqlite3_st
d7f0: 65 70 20 28 73 74 6d 74 5f 6f 75 74 29 3b 0a 20 ep (stmt_out);.
d800: 20 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 if (ret == SQ
d810: 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 LITE_DONE || ret
d820: 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a == SQLITE_ROW).
d830: 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 {.. sqlit
d840: 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 5f 69 e3_reset (stmt_i
d850: 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 72 n);.. sqlite3_r
d860: 65 73 65 74 20 28 73 74 6d 74 5f 6f 75 74 29 3b eset (stmt_out);
d870: 0a 09 20 20 72 65 74 75 72 6e 20 65 64 67 65 5f .. return edge_
d880: 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 id;. }.
d890: 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 else. {..
d8a0: 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c 69 char *msg = sqli
d8b0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 63 61 te3_mprintf ("ca
d8c0: 6c 6c 62 61 63 6b 5f 73 65 74 4e 65 78 74 45 64 llback_setNextEd
d8d0: 67 65 49 64 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 geId: \"%s\"",..
d8e0: 09 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 ... sqlite
d8f0: 33 5f 65 72 72 6d 73 67 20 28 61 63 63 65 73 73 3_errmsg (access
d900: 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b or->db_handle));
d910: 0a 09 20 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 .. gaiatopo_set
d920: 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 _last_error_msg
d930: 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 (topo, msg);..
d940: 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 sqlite3_free (ms
d950: 67 29 3b 0a 09 20 20 65 64 67 65 5f 69 64 20 3d g);.. edge_id =
d960: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 73 -1;. }. s
d970: 74 6f 70 3a 0a 20 20 20 20 69 66 20 28 65 64 67 top:. if (edg
d980: 65 5f 69 64 20 3e 3d 20 30 29 0a 09 65 64 67 65 e_id >= 0)..edge
d990: 5f 69 64 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 _id++;. sqlit
d9a0: 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 5f 69 e3_reset (stmt_i
d9b0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f n);. sqlite3_
d9c0: 72 65 73 65 74 20 28 73 74 6d 74 5f 6f 75 74 29 reset (stmt_out)
d9d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 64 67 ;. return edg
d9e0: 65 5f 69 64 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c e_id;.}..int.cal
d9f0: 6c 62 61 63 6b 5f 69 6e 73 65 72 74 45 64 67 65 lback_insertEdge
da00: 73 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f s (const RTT_BE_
da10: 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 TOPOLOGY * rtt_t
da20: 6f 70 6f 2c 20 52 54 54 5f 49 53 4f 5f 45 44 47 opo, RTT_ISO_EDG
da30: 45 20 2a 20 65 64 67 65 73 2c 0a 09 09 20 20 20 E * edges,...
da40: 20 20 20 69 6e 74 20 6e 75 6d 65 6c 65 6d 73 29 int numelems)
da50: 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 .{./* callback f
da60: 75 6e 63 74 69 6f 6e 3a 20 69 6e 73 65 72 74 45 unction: insertE
da70: 64 67 65 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 dges */. cons
da80: 74 20 52 54 43 54 58 20 2a 63 74 78 20 3d 20 4e t RTCTX *ctx = N
da90: 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 ULL;. struct
daa0: 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f splite_internal_
dab0: 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 4e cache *cache = N
dac0: 55 4c 4c 3b 0a 20 20 20 20 47 61 69 61 54 6f 70 ULL;. GaiaTop
dad0: 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 ologyAccessorPtr
dae0: 20 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 topo = (GaiaTop
daf0: 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 ologyAccessorPtr
db00: 29 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 ) rtt_topo;.
db10: 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f struct gaia_topo
db20: 6c 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d logy *accessor =
db30: 20 28 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f (struct gaia_to
db40: 70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a pology *) topo;.
db50: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
db60: 20 2a 73 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 *stmt;. int
db70: 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a ret;. int i;.
db80: 20 20 20 20 67 61 69 61 47 65 6f 6d 43 6f 6c 6c gaiaGeomColl
db90: 50 74 72 20 67 65 6f 6d 3b 0a 20 20 20 20 75 6e Ptr geom;. un
dba0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 signed char *p_b
dbb0: 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 lob;. int n_b
dbc0: 79 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 67 70 ytes;. int gp
dbd0: 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 kg_mode = 0;.
dbe0: 20 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 int tiny_point
dbf0: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 61 63 63 = 0;. if (acc
dc00: 65 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 essor == NULL)..
dc10: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 73 return 0;.. s
dc20: 74 6d 74 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e tmt = accessor->
dc30: 73 74 6d 74 5f 69 6e 73 65 72 74 45 64 67 65 73 stmt_insertEdges
dc40: 3b 0a 20 20 20 20 69 66 20 28 73 74 6d 74 20 3d ;. if (stmt =
dc50: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
dc60: 30 3b 0a 0a 20 20 20 20 63 61 63 68 65 20 3d 20 0;.. cache =
dc70: 28 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 (struct splite_i
dc80: 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 29 nternal_cache *)
dc90: 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 68 65 accessor->cache
dca0: 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 ;. if (cache
dcb0: 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e == NULL)..return
dcc0: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 0;. if (cach
dcd0: 65 2d 3e 6d 61 67 69 63 31 20 21 3d 20 53 50 41 e->magic1 != SPA
dce0: 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 TIALITE_CACHE_MA
dcf0: 47 49 43 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e GIC1..|| cache->
dd00: 6d 61 67 69 63 32 20 21 3d 20 53 50 41 54 49 41 magic2 != SPATIA
dd10: 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 LITE_CACHE_MAGIC
dd20: 32 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 2)..return 0;.
dd30: 20 20 63 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 ctx = cache->R
dd40: 54 54 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 TTOPO_handle;.
dd50: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c if (ctx == NUL
dd60: 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a 20 L)..return 0;..
dd70: 20 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 2d if (accessor-
dd80: 3e 63 61 63 68 65 20 21 3d 20 4e 55 4c 4c 29 0a >cache != NULL).
dd90: 20 20 20 20 20 20 7b 0a 09 20 20 73 74 72 75 63 {.. struc
dda0: 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 t splite_interna
ddb0: 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d l_cache *cache =
ddc0: 0a 09 20 20 20 20 20 20 28 73 74 72 75 63 74 20 .. (struct
ddd0: 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f splite_internal_
dde0: 63 61 63 68 65 20 2a 29 20 28 61 63 63 65 73 73 cache *) (access
ddf0: 6f 72 2d 3e 63 61 63 68 65 29 3b 0a 09 20 20 67 or->cache);.. g
de00: 70 6b 67 5f 6d 6f 64 65 20 3d 20 63 61 63 68 65 pkg_mode = cache
de10: 2d 3e 67 70 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 ->gpkg_mode;..
de20: 74 69 6e 79 5f 70 6f 69 6e 74 20 3d 20 63 61 63 tiny_point = cac
de30: 68 65 2d 3e 74 69 6e 79 50 6f 69 6e 74 45 6e 61 he->tinyPointEna
de40: 62 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 bled;. }..
de50: 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 for (i = 0; i
de60: 20 3c 20 6e 75 6d 65 6c 65 6d 73 3b 20 69 2b 2b < numelems; i++
de70: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 52 54 54 ). {.. RTT
de80: 5f 49 53 4f 5f 45 44 47 45 20 2a 65 67 20 3d 20 _ISO_EDGE *eg =
de90: 65 64 67 65 73 20 2b 20 69 3b 0a 09 20 20 2f 2a edges + i;.. /*
dea0: 20 73 65 74 74 69 6e 67 20 75 70 20 74 68 65 20 setting up the
deb0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
dec0: 6e 74 20 2a 2f 0a 09 20 20 73 71 6c 69 74 65 33 nt */.. sqlite3
ded0: 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 09 _reset (stmt);..
dee0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f sqlite3_clear_
def0: 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b bindings (stmt);
df00: 0a 09 20 20 69 66 20 28 65 67 2d 3e 65 64 67 65 .. if (eg->edge
df10: 5f 69 64 20 3c 3d 20 30 29 0a 09 20 20 20 20 20 _id <= 0)..
df20: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 sqlite3_bind_nu
df30: 6c 6c 20 28 73 74 6d 74 2c 20 31 29 3b 0a 09 20 ll (stmt, 1);..
df40: 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c else.. sql
df50: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
df60: 28 73 74 6d 74 2c 20 31 2c 20 65 67 2d 3e 65 64 (stmt, 1, eg->ed
df70: 67 65 5f 69 64 29 3b 0a 09 20 20 73 71 6c 69 74 ge_id);.. sqlit
df80: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 e3_bind_int64 (s
df90: 74 6d 74 2c 20 32 2c 20 65 67 2d 3e 73 74 61 72 tmt, 2, eg->star
dfa0: 74 5f 6e 6f 64 65 29 3b 0a 09 20 20 73 71 6c 69 t_node);.. sqli
dfb0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 te3_bind_int64 (
dfc0: 73 74 6d 74 2c 20 33 2c 20 65 67 2d 3e 65 6e 64 stmt, 3, eg->end
dfd0: 5f 6e 6f 64 65 29 3b 0a 09 20 20 69 66 20 28 65 _node);.. if (e
dfe0: 67 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3c 20 30 g->face_left < 0
dff0: 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 ).. sqlite3
e000: 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 _bind_null (stmt
e010: 2c 20 34 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 , 4);.. else..
e020: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
e030: 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 34 d_int64 (stmt, 4
e040: 2c 20 65 67 2d 3e 66 61 63 65 5f 6c 65 66 74 29 , eg->face_left)
e050: 3b 0a 09 20 20 69 66 20 28 65 67 2d 3e 66 61 63 ;.. if (eg->fac
e060: 65 5f 72 69 67 68 74 20 3c 20 30 29 0a 09 20 20 e_right < 0)..
e070: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
e080: 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 35 29 3b _null (stmt, 5);
e090: 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 .. else..
e0a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
e0b0: 36 34 20 28 73 74 6d 74 2c 20 35 2c 20 65 67 2d 64 (stmt, 5, eg-
e0c0: 3e 66 61 63 65 5f 72 69 67 68 74 29 3b 0a 09 20 >face_right);..
e0d0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
e0e0: 74 36 34 20 28 73 74 6d 74 2c 20 36 2c 20 65 67 t64 (stmt, 6, eg
e0f0: 2d 3e 6e 65 78 74 5f 6c 65 66 74 29 3b 0a 09 20 ->next_left);..
e100: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
e110: 74 36 34 20 28 73 74 6d 74 2c 20 37 2c 20 65 67 t64 (stmt, 7, eg
e120: 2d 3e 6e 65 78 74 5f 72 69 67 68 74 29 3b 0a 09 ->next_right);..
e130: 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 69 6e /* transformin
e140: 67 20 74 68 65 20 52 54 4c 49 4e 45 20 69 6e 74 g the RTLINE int
e150: 6f 20 61 20 47 65 6f 6d 65 74 72 79 2d 4c 69 6e o a Geometry-Lin
e160: 65 73 74 72 69 6e 67 20 2a 2f 0a 09 20 20 67 65 estring */.. ge
e170: 6f 6d 20 3d 20 64 6f 5f 72 74 6c 69 6e 65 5f 74 om = do_rtline_t
e180: 6f 5f 67 65 6f 6d 20 28 63 74 78 2c 20 65 67 2d o_geom (ctx, eg-
e190: 3e 67 65 6f 6d 2c 20 61 63 63 65 73 73 6f 72 2d >geom, accessor-
e1a0: 3e 73 72 69 64 29 3b 0a 09 20 20 67 61 69 61 54 >srid);.. gaiaT
e1b0: 6f 53 70 61 74 69 61 4c 69 74 65 42 6c 6f 62 57 oSpatiaLiteBlobW
e1c0: 6b 62 45 78 32 20 28 67 65 6f 6d 2c 20 26 70 5f kbEx2 (geom, &p_
e1d0: 62 6c 6f 62 2c 20 26 6e 5f 62 79 74 65 73 2c 20 blob, &n_bytes,
e1e0: 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 09 09 09 20 gpkg_mode,.....
e1f0: 20 20 20 20 20 74 69 6e 79 5f 70 6f 69 6e 74 29 tiny_point)
e200: 3b 0a 09 20 20 67 61 69 61 46 72 65 65 47 65 6f ;.. gaiaFreeGeo
e210: 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a 09 20 mColl (geom);..
e220: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c sqlite3_bind_bl
e230: 6f 62 20 28 73 74 6d 74 2c 20 38 2c 20 70 5f 62 ob (stmt, 8, p_b
e240: 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 2c 20 66 72 lob, n_bytes, fr
e250: 65 65 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 ee);.. ret = sq
e260: 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 lite3_step (stmt
e270: 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d );.. if (ret ==
e280: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 SQLITE_DONE ||
e290: 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f ret == SQLITE_RO
e2a0: 57 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 72 W).. {.../* r
e2b0: 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 50 4b etrieving the PK
e2c0: 20 76 61 6c 75 65 20 2a 2f 0a 09 09 65 67 2d 3e value */...eg->
e2d0: 65 64 67 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 edge_id = sqlite
e2e0: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 3_last_insert_ro
e2f0: 77 69 64 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 wid (accessor->d
e300: 62 5f 68 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20 b_handle);..
e310: 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b }.. else.. {
e320: 0a 09 09 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 ...char *msg = s
e330: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
e340: 22 63 61 6c 6c 62 61 63 6b 5f 69 6e 73 65 72 74 "callback_insert
e350: 45 64 67 65 73 3a 20 5c 22 25 73 5c 22 22 2c 0a Edges: \"%s\"",.
e360: 09 09 09 09 09 20 20 20 20 20 73 71 6c 69 74 65 ..... sqlite
e370: 33 5f 65 72 72 6d 73 67 0a 09 09 09 09 09 20 20 3_errmsg......
e380: 20 20 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 (accessor->db
e390: 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 61 69 _handle));...gai
e3a0: 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 atopo_set_last_e
e3b0: 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 rror_msg (topo,
e3c0: 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f msg);...sqlite3_
e3d0: 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 67 6f free (msg);...go
e3e0: 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d to error;.. }
e3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c . }. sql
e400: 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 ite3_reset (stmt
e410: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b );. return 1;
e420: 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 .. error:. s
e430: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
e440: 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 mt);. return
e450: 30 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 0;.}..int.callba
e460: 63 6b 5f 75 70 64 61 74 65 45 64 67 65 73 20 28 ck_updateEdges (
e470: 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 const RTT_BE_TOP
e480: 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f OLOGY * rtt_topo
e490: 2c 0a 09 09 20 20 20 20 20 20 63 6f 6e 73 74 20 ,... const
e4a0: 52 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 20 73 RTT_ISO_EDGE * s
e4b0: 65 6c 5f 65 64 67 65 2c 20 69 6e 74 20 73 65 6c el_edge, int sel
e4c0: 5f 66 69 65 6c 64 73 2c 0a 09 09 20 20 20 20 20 _fields,...
e4d0: 20 63 6f 6e 73 74 20 52 54 54 5f 49 53 4f 5f 45 const RTT_ISO_E
e4e0: 44 47 45 20 2a 20 75 70 64 5f 65 64 67 65 2c 20 DGE * upd_edge,
e4f0: 69 6e 74 20 75 70 64 5f 66 69 65 6c 64 73 2c 0a int upd_fields,.
e500: 09 09 20 20 20 20 20 20 63 6f 6e 73 74 20 52 54 .. const RT
e510: 54 5f 49 53 4f 5f 45 44 47 45 20 2a 20 65 78 63 T_ISO_EDGE * exc
e520: 5f 65 64 67 65 2c 20 69 6e 74 20 65 78 63 5f 66 _edge, int exc_f
e530: 69 65 6c 64 73 29 0a 7b 0a 2f 2a 20 63 61 6c 6c ields).{./* call
e540: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 75 back function: u
e550: 70 64 61 74 65 45 64 67 65 73 20 2a 2f 0a 20 20 pdateEdges */.
e560: 20 20 63 6f 6e 73 74 20 52 54 43 54 58 20 2a 63 const RTCTX *c
e570: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 tx = NULL;. s
e580: 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 truct splite_int
e590: 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 ernal_cache *cac
e5a0: 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 he = NULL;. G
e5b0: 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 aiaTopologyAcces
e5c0: 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 sorPtr topo = (G
e5d0: 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 aiaTopologyAcces
e5e0: 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f sorPtr) rtt_topo
e5f0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 69 ;. struct gai
e600: 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 a_topology *acce
e610: 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 ssor = (struct g
e620: 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 aia_topology *)
e630: 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 topo;. sqlite
e640: 33 5f 73 74 6d 74 20 2a 73 74 6d 74 20 3d 20 4e 3_stmt *stmt = N
e650: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 ULL;. int ret
e660: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b ;. char *sql;
e670: 0a 20 20 20 20 63 68 61 72 20 2a 70 72 65 76 3b . char *prev;
e680: 0a 20 20 20 20 69 6e 74 20 63 6f 6d 6d 61 20 3d . int comma =
e690: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 61 0;. char *ta
e6a0: 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 78 ble;. char *x
e6b0: 74 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69 table;. int i
e6c0: 63 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 75 6e 73 col = 1;. uns
e6d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 6c igned char *p_bl
e6e0: 6f 62 3b 0a 20 20 20 20 69 6e 74 20 6e 5f 62 79 ob;. int n_by
e6f0: 74 65 73 3b 0a 20 20 20 20 69 6e 74 20 67 70 6b tes;. int gpk
e700: 67 5f 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 g_mode = 0;.
e710: 69 6e 74 20 74 69 6e 79 5f 70 6f 69 6e 74 20 3d int tiny_point =
e720: 20 30 3b 0a 20 20 20 20 69 6e 74 20 63 68 61 6e 0;. int chan
e730: 67 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 ged = 0;. if
e740: 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c (accessor == NUL
e750: 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 0a L)..return -1;..
e760: 20 20 20 20 63 61 63 68 65 20 3d 20 28 73 74 72 cache = (str
e770: 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 uct splite_inter
e780: 6e 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 63 63 nal_cache *) acc
e790: 65 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 20 essor->cache;.
e7a0: 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e if (cache == N
e7b0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a ULL)..return 0;.
e7c0: 20 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d if (cache->m
e7d0: 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c agic1 != SPATIAL
e7e0: 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 ITE_CACHE_MAGIC1
e7f0: 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 ..|| cache->magi
e800: 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 c2 != SPATIALITE
e810: 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 _CACHE_MAGIC2)..
e820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 74 return 0;. ct
e830: 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 x = cache->RTTOP
e840: 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 O_handle;. if
e850: 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 (ctx == NULL)..
e860: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 69 return 0;.. i
e870: 66 20 28 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 f (accessor->cac
e880: 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 he != NULL).
e890: 20 20 7b 0a 09 20 20 73 74 72 75 63 74 20 73 70 {.. struct sp
e8a0: 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 lite_internal_ca
e8b0: 63 68 65 20 2a 63 61 63 68 65 20 3d 0a 09 20 20 che *cache =..
e8c0: 20 20 20 20 28 73 74 72 75 63 74 20 73 70 6c 69 (struct spli
e8d0: 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 te_internal_cach
e8e0: 65 20 2a 29 20 28 61 63 63 65 73 73 6f 72 2d 3e e *) (accessor->
e8f0: 63 61 63 68 65 29 3b 0a 09 20 20 67 70 6b 67 5f cache);.. gpkg_
e900: 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 mode = cache->gp
e910: 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 kg_mode;.. tiny
e920: 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e _point = cache->
e930: 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 tinyPointEnabled
e940: 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 6f ;. }../* co
e950: 6d 70 6f 73 69 6e 67 20 74 68 65 20 53 51 4c 20 mposing the SQL
e960: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
e970: 6e 74 20 2a 2f 0a 20 20 20 20 74 61 62 6c 65 20 nt */. table
e980: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
e990: 66 20 28 22 25 73 5f 65 64 67 65 22 2c 20 61 63 f ("%s_edge", ac
e9a0: 63 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 79 cessor->topology
e9b0: 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 78 74 61 62 _name);. xtab
e9c0: 6c 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 le = gaiaDoubleQ
e9d0: 75 6f 74 65 64 53 71 6c 20 28 74 61 62 6c 65 29 uotedSql (table)
e9e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
e9f0: 65 65 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 20 ee (table);.
ea00: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
ea10: 72 69 6e 74 66 20 28 22 55 50 44 41 54 45 20 4d rintf ("UPDATE M
ea20: 41 49 4e 2e 5c 22 25 73 5c 22 20 53 45 54 20 22 AIN.\"%s\" SET "
ea30: 2c 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 , xtable);. f
ea40: 72 65 65 20 28 78 74 61 62 6c 65 29 3b 0a 20 20 ree (xtable);.
ea50: 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 prev = sql;.
ea60: 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 if (upd_fields
ea70: 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
ea80: 45 44 47 45 5f 49 44 29 0a 20 20 20 20 20 20 7b EDGE_ID). {
ea90: 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 .. if (comma)..
eaa0: 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
eab0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
eac0: 2c 20 65 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 , edge_id = ?",
ead0: 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 prev);.. else..
eae0: 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
eaf0: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
eb00: 20 65 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 70 edge_id = ?", p
eb10: 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d rev);.. comma =
eb20: 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 1;.. sqlite3_f
eb30: 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 ree (prev);.. p
eb40: 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 rev = sql;.
eb50: 20 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 }. if (upd_f
eb60: 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
eb70: 45 44 47 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 EDGE_START_NODE)
eb80: 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
eb90: 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 comma).. sq
eba0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
ebb0: 6e 74 66 20 28 22 25 73 2c 20 73 74 61 72 74 5f ntf ("%s, start_
ebc0: 6e 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 node = ?", prev)
ebd0: 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
ebe0: 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
ebf0: 70 72 69 6e 74 66 20 28 22 25 73 20 73 74 61 72 printf ("%s star
ec00: 74 5f 6e 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 t_node = ?", pre
ec10: 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 v);.. comma = 1
ec20: 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 ;.. sqlite3_fre
ec30: 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 e (prev);.. pre
ec40: 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d v = sql;. }
ec50: 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 . if (upd_fie
ec60: 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
ec70: 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 20 20 20 GE_END_NODE).
ec80: 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d {.. if (comm
ec90: 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 a).. sql =
eca0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
ecb0: 28 22 25 73 2c 20 65 6e 64 5f 6e 6f 64 65 20 3d ("%s, end_node =
ecc0: 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 ?", prev);.. e
ecd0: 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d lse.. sql =
ece0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
ecf0: 20 28 22 25 73 20 65 6e 64 5f 6e 6f 64 65 20 3d ("%s end_node =
ed00: 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 ?", prev);.. c
ed10: 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c omma = 1;.. sql
ed20: 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 ite3_free (prev)
ed30: 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b ;.. prev = sql;
ed40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 . }. if
ed50: 28 75 70 64 5f 66 69 65 6c 64 73 20 26 20 52 54 (upd_fields & RT
ed60: 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f T_COL_EDGE_FACE_
ed70: 4c 45 46 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 LEFT). {..
ed80: 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 if (comma)..
ed90: 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
eda0: 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 6c _mprintf ("%s, l
edb0: 65 66 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 eft_face = ?", p
edc0: 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 rev);.. else..
edd0: 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
ede0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
edf0: 6c 65 66 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 left_face = ?",
ee00: 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
ee10: 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
ee20: 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
ee30: 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
ee40: 20 20 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f }. if (upd_
ee50: 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c fields & RTT_COL
ee60: 5f 45 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 _EDGE_FACE_RIGHT
ee70: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
ee80: 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 (comma).. s
ee90: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
eea0: 69 6e 74 66 20 28 22 25 73 2c 20 72 69 67 68 74 intf ("%s, right
eeb0: 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 65 76 _face = ?", prev
eec0: 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 );.. else..
eed0: 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
eee0: 6d 70 72 69 6e 74 66 20 28 22 25 73 20 72 69 67 mprintf ("%s rig
eef0: 68 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 ht_face = ?", pr
ef00: 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 ev);.. comma =
ef10: 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 1;.. sqlite3_fr
ef20: 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 ee (prev);.. pr
ef30: 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 ev = sql;.
ef40: 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 }. if (upd_fi
ef50: 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
ef60: 44 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 20 DGE_NEXT_LEFT).
ef70: 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f {.. if (co
ef80: 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 mma).. sql
ef90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
efa0: 66 20 28 22 25 73 2c 20 6e 65 78 74 5f 6c 65 66 f ("%s, next_lef
efb0: 74 5f 65 64 67 65 20 3d 20 3f 22 2c 20 70 72 65 t_edge = ?", pre
efc0: 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 v);.. else..
efd0: 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
efe0: 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6e 65 _mprintf ("%s ne
eff0: 78 74 5f 6c 65 66 74 5f 65 64 67 65 20 3d 20 3f xt_left_edge = ?
f000: 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d ", prev);.. com
f010: 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 ma = 1;.. sqlit
f020: 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a e3_free (prev);.
f030: 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 . prev = sql;.
f040: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 75 }. if (u
f050: 70 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f pd_fields & RTT_
f060: 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 COL_EDGE_NEXT_RI
f070: 47 48 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 GHT). {..
f080: 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 if (comma)..
f090: 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
f0a0: 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 6e 65 mprintf ("%s, ne
f0b0: 78 74 5f 72 69 67 68 74 5f 65 64 67 65 20 3d 20 xt_right_edge =
f0c0: 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c ?", prev);.. el
f0d0: 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
f0e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
f0f0: 28 22 25 73 20 6e 65 78 74 5f 72 69 67 68 74 5f ("%s next_right_
f100: 65 64 67 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 edge = ?", prev)
f110: 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
f120: 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
f130: 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
f140: 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
f150: 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 if (upd_field
f160: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
f170: 5f 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 _GEOM). {..
f180: 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 if (comma)..
f190: 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
f1a0: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 3_mprintf ("%s,
f1b0: 67 65 6f 6d 20 3d 20 3f 22 2c 20 70 72 65 76 29 geom = ?", prev)
f1c0: 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
f1d0: 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
f1e0: 70 72 69 6e 74 66 20 28 22 25 73 20 67 65 6f 6d printf ("%s geom
f1f0: 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 = ?", prev);..
f200: 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
f210: 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
f220: 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
f230: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 l;. }. i
f240: 66 20 28 65 78 63 5f 65 64 67 65 20 7c 7c 20 73 f (exc_edge || s
f250: 65 6c 5f 65 64 67 65 29 0a 20 20 20 20 20 20 7b el_edge). {
f260: 0a 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 .. sql = sqlite
f270: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 57 3_mprintf ("%s W
f280: 48 45 52 45 22 2c 20 70 72 65 76 29 3b 0a 09 20 HERE", prev);..
f290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 sqlite3_free (p
f2a0: 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 rev);.. prev =
f2b0: 73 71 6c 3b 0a 09 20 20 69 66 20 28 73 65 6c 5f sql;.. if (sel_
f2c0: 65 64 67 65 29 0a 09 20 20 20 20 7b 0a 09 09 63 edge).. {...c
f2d0: 6f 6d 6d 61 20 3d 20 30 3b 0a 09 09 69 66 20 28 omma = 0;...if (
f2e0: 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 sel_fields & RTT
f2f0: 5f 43 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f 49 _COL_EDGE_EDGE_I
f300: 44 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 D)... {...
f310: 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 09 20 if (comma)....
f320: 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
f330: 70 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 20 printf ("%s AND
f340: 65 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 edge_id = ?", pr
f350: 65 76 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 ev);... els
f360: 65 0a 09 09 09 20 20 73 71 6c 20 3d 20 73 71 6c e.... sql = sql
f370: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
f380: 73 20 65 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 s edge_id = ?",
f390: 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 63 prev);... c
f3a0: 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 20 20 20 omma = 1;...
f3b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
f3c0: 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 70 prev);... p
f3d0: 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 20 20 7d rev = sql;... }
f3e0: 0a 09 09 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 ...if (sel_field
f3f0: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
f400: 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 09 20 _START_NODE)...
f410: 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 63 {... if (c
f420: 6f 6d 6d 61 29 0a 09 09 09 20 20 73 71 6c 20 3d omma).... sql =
f430: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
f440: 20 28 22 25 73 20 41 4e 44 20 73 74 61 72 74 5f ("%s AND start_
f450: 6e 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 node = ?", prev)
f460: 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 ;... else..
f470: 09 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 .. sql = sqlite
f480: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 73 3_mprintf ("%s s
f490: 74 61 72 74 5f 6e 6f 64 65 20 3d 20 3f 22 2c 20 tart_node = ?",
f4a0: 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 63 prev);... c
f4b0: 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 20 20 20 omma = 1;...
f4c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
f4d0: 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 70 prev);... p
f4e0: 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 20 20 7d rev = sql;... }
f4f0: 0a 09 09 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 ...if (sel_field
f500: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
f510: 5f 45 4e 44 5f 4e 4f 44 45 29 0a 09 09 20 20 7b _END_NODE)... {
f520: 0a 09 09 20 20 20 20 20 20 69 66 20 28 63 6f 6d ... if (com
f530: 6d 61 29 0a 09 09 09 20 20 73 71 6c 20 3d 20 73 ma).... sql = s
f540: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
f550: 22 25 73 20 41 4e 44 20 65 6e 64 5f 6e 6f 64 65 "%s AND end_node
f560: 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 = ?", prev);...
f570: 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 else....
f580: 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
f590: 72 69 6e 74 66 20 28 22 25 73 20 65 6e 64 5f 6e rintf ("%s end_n
f5a0: 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b ode = ?", prev);
f5b0: 0a 09 09 20 20 20 20 20 20 63 6f 6d 6d 61 20 3d ... comma =
f5c0: 20 31 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 1;... sqli
f5d0: 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b te3_free (prev);
f5e0: 0a 09 09 20 20 20 20 20 20 70 72 65 76 20 3d 20 ... prev =
f5f0: 73 71 6c 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 sql;... }...if
f600: 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 (sel_fields & RT
f610: 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f T_COL_EDGE_FACE_
f620: 4c 45 46 54 29 0a 09 09 20 20 7b 0a 09 09 20 20 LEFT)... {...
f630: 20 20 20 20 69 66 20 28 73 65 6c 5f 65 64 67 65 if (sel_edge
f640: 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3c 20 30 29 ->face_left < 0)
f650: 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 ....{.... if
f660: 28 63 6f 6d 6d 61 29 0a 09 09 09 09 73 71 6c 20 (comma).....sql
f670: 3d 0a 09 09 09 09 20 20 20 20 73 71 6c 69 74 65 =..... sqlite
f680: 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 41 3_mprintf ("%s A
f690: 4e 44 20 6c 65 66 74 5f 66 61 63 65 20 49 53 20 ND left_face IS
f6a0: 4e 55 4c 4c 22 2c 0a 09 09 09 09 09 09 20 20 20 NULL",.......
f6b0: 20 20 70 72 65 76 29 3b 0a 09 09 09 20 20 20 20 prev);....
f6c0: 65 6c 73 65 0a 09 09 09 09 73 71 6c 20 3d 0a 09 else.....sql =..
f6d0: 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d ... sqlite3_m
f6e0: 70 72 69 6e 74 66 20 28 22 25 73 20 6c 65 66 74 printf ("%s left
f6f0: 5f 66 61 63 65 20 49 53 20 4e 55 4c 4c 22 2c 0a _face IS NULL",.
f700: 09 09 09 09 09 09 20 20 20 20 20 70 72 65 76 29 ...... prev)
f710: 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 ;....}... e
f720: 6c 73 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 lse....{....
f730: 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 09 09 73 if (comma).....s
f740: 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 6c ql =..... sql
f750: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
f760: 73 20 41 4e 44 20 6c 65 66 74 5f 66 61 63 65 20 s AND left_face
f770: 3d 20 3f 22 2c 0a 09 09 09 09 09 09 20 20 20 20 = ?",.......
f780: 20 70 72 65 76 29 3b 0a 09 09 09 20 20 20 20 65 prev);.... e
f790: 6c 73 65 0a 09 09 09 09 73 71 6c 20 3d 0a 09 09 lse.....sql =...
f7a0: 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 .. sqlite3_mp
f7b0: 72 69 6e 74 66 20 28 22 25 73 20 6c 65 66 74 5f rintf ("%s left_
f7c0: 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 face = ?", prev)
f7d0: 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 63 ;....}... c
f7e0: 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 20 20 20 omma = 1;...
f7f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
f800: 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 70 prev);... p
f810: 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 20 20 7d rev = sql;... }
f820: 0a 09 09 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 ...if (sel_field
f830: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
f840: 5f 46 41 43 45 5f 52 49 47 48 54 29 0a 09 09 20 _FACE_RIGHT)...
f850: 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 73 {... if (s
f860: 65 6c 5f 65 64 67 65 2d 3e 66 61 63 65 5f 72 69 el_edge->face_ri
f870: 67 68 74 20 3c 20 30 29 0a 09 09 09 7b 0a 09 09 ght < 0)....{...
f880: 09 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a . if (comma).
f890: 09 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 20 ....sql =.....
f8a0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 sqlite3_mprint
f8b0: 66 0a 09 09 09 09 20 20 20 20 28 22 25 73 20 41 f..... ("%s A
f8c0: 4e 44 20 72 69 67 68 74 5f 66 61 63 65 20 49 53 ND right_face IS
f8d0: 20 4e 55 4c 4c 22 2c 20 70 72 65 76 29 3b 0a 09 NULL", prev);..
f8e0: 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 09 73 .. else.....s
f8f0: 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 6c ql =..... sql
f900: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
f910: 73 20 72 69 67 68 74 5f 66 61 63 65 20 49 53 20 s right_face IS
f920: 4e 55 4c 4c 22 2c 0a 09 09 09 09 09 09 20 20 20 NULL",.......
f930: 20 20 70 72 65 76 29 3b 0a 09 09 09 7d 0a 09 09 prev);....}...
f940: 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 7b 0a else....{.
f950: 09 09 09 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 ... if (comma
f960: 29 0a 09 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 ).....sql =.....
f970: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 sqlite3_mpri
f980: 6e 74 66 20 28 22 25 73 20 41 4e 44 20 72 69 67 ntf ("%s AND rig
f990: 68 74 5f 66 61 63 65 20 3d 20 3f 22 2c 0a 09 09 ht_face = ?",...
f9a0: 09 09 09 09 20 20 20 20 20 70 72 65 76 29 3b 0a .... prev);.
f9b0: 09 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 09 ... else.....
f9c0: 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 sql =..... sq
f9d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
f9e0: 25 73 20 72 69 67 68 74 5f 66 61 63 65 20 3d 20 %s right_face =
f9f0: 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 09 7d 0a ?", prev);....}.
fa00: 09 09 20 20 20 20 20 20 63 6f 6d 6d 61 20 3d 20 .. comma =
fa10: 31 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 1;... sqlit
fa20: 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a e3_free (prev);.
fa30: 09 09 20 20 20 20 20 20 70 72 65 76 20 3d 20 73 .. prev = s
fa40: 71 6c 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 ql;... }...if (
fa50: 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 sel_fields & RTT
fa60: 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 4c _COL_EDGE_NEXT_L
fa70: 45 46 54 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 EFT)... {...
fa80: 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 if (comma)...
fa90: 09 20 20 73 71 6c 20 3d 0a 09 09 09 20 20 20 20 . sql =....
faa0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 sqlite3_mprint
fab0: 66 0a 09 09 09 20 20 20 20 20 20 28 22 25 73 20 f.... ("%s
fac0: 41 4e 44 20 6e 65 78 74 5f 6c 65 66 74 5f 65 64 AND next_left_ed
fad0: 67 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a ge = ?", prev);.
fae0: 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 .. else....
faf0: 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
fb00: 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6e 65 78 mprintf ("%s nex
fb10: 74 5f 6c 65 66 74 5f 65 64 67 65 20 3d 20 3f 22 t_left_edge = ?"
fb20: 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 , prev);...
fb30: 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 20 comma = 1;...
fb40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
fb50: 20 28 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 (prev);...
fb60: 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 20 prev = sql;...
fb70: 20 7d 0a 09 09 69 66 20 28 73 65 6c 5f 66 69 65 }...if (sel_fie
fb80: 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
fb90: 47 45 5f 4e 45 58 54 5f 52 49 47 48 54 29 0a 09 GE_NEXT_RIGHT)..
fba0: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 . {... if
fbb0: 28 63 6f 6d 6d 61 29 0a 09 09 09 20 20 73 71 6c (comma).... sql
fbc0: 20 3d 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 =.... sqli
fbd0: 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 09 20 te3_mprintf....
fbe0: 20 20 20 20 20 28 22 25 73 20 41 4e 44 20 6e 65 ("%s AND ne
fbf0: 78 74 5f 72 69 67 68 74 5f 65 64 67 65 20 3d 20 xt_right_edge =
fc00: 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 20 ?", prev);...
fc10: 20 20 20 65 6c 73 65 0a 09 09 09 20 20 73 71 6c else.... sql
fc20: 20 3d 0a 09 09 09 20 20 20 20 20 20 73 71 6c 69 =.... sqli
fc30: 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
fc40: 20 6e 65 78 74 5f 72 69 67 68 74 5f 65 64 67 65 next_right_edge
fc50: 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 = ?", prev);...
fc60: 20 20 20 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b comma = 1;
fc70: 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 ... sqlite3
fc80: 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 09 _free (prev);...
fc90: 20 20 20 20 20 20 70 72 65 76 20 3d 20 73 71 6c prev = sql
fca0: 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 09 ;... }.. }..
fcb0: 20 20 69 66 20 28 65 78 63 5f 65 64 67 65 29 0a if (exc_edge).
fcc0: 09 20 20 20 20 7b 0a 09 09 69 66 20 28 73 65 6c . {...if (sel
fcd0: 5f 65 64 67 65 29 0a 09 09 20 20 7b 0a 09 09 20 _edge)... {...
fce0: 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
fcf0: 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
fd00: 41 4e 44 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 AND", prev);...
fd10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
fd20: 65 20 28 70 72 65 76 29 3b 0a 09 09 20 20 20 20 e (prev);...
fd30: 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 prev = sql;...
fd40: 20 20 7d 0a 09 09 63 6f 6d 6d 61 20 3d 20 30 3b }...comma = 0;
fd50: 0a 09 09 69 66 20 28 65 78 63 5f 66 69 65 6c 64 ...if (exc_field
fd60: 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
fd70: 5f 45 44 47 45 5f 49 44 29 0a 09 09 20 20 7b 0a _EDGE_ID)... {.
fd80: 09 09 20 20 20 20 20 20 69 66 20 28 63 6f 6d 6d .. if (comm
fd90: 61 29 0a 09 09 09 20 20 73 71 6c 20 3d 20 73 71 a).... sql = sq
fda0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
fdb0: 25 73 20 41 4e 44 20 65 64 67 65 5f 69 64 20 3c %s AND edge_id <
fdc0: 3e 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 > ?", prev);...
fdd0: 20 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 73 else.... s
fde0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
fdf0: 69 6e 74 66 20 28 22 25 73 20 65 64 67 65 5f 69 intf ("%s edge_i
fe00: 64 20 3c 3e 20 3f 22 2c 20 70 72 65 76 29 3b 0a d <> ?", prev);.
fe10: 09 09 20 20 20 20 20 20 63 6f 6d 6d 61 20 3d 20 .. comma =
fe20: 31 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 1;... sqlit
fe30: 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a e3_free (prev);.
fe40: 09 09 20 20 20 20 20 20 70 72 65 76 20 3d 20 73 .. prev = s
fe50: 71 6c 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 ql;... }...if (
fe60: 65 78 63 5f 66 69 65 6c 64 73 20 26 20 52 54 54 exc_fields & RTT
fe70: 5f 43 4f 4c 5f 45 44 47 45 5f 53 54 41 52 54 5f _COL_EDGE_START_
fe80: 4e 4f 44 45 29 0a 09 09 20 20 7b 0a 09 09 20 20 NODE)... {...
fe90: 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 if (comma)..
fea0: 09 09 20 20 73 71 6c 20 3d 0a 09 09 09 20 20 20 .. sql =....
feb0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e sqlite3_mprin
fec0: 74 66 20 28 22 25 73 20 41 4e 44 20 73 74 61 72 tf ("%s AND star
fed0: 74 5f 6e 6f 64 65 20 3c 3e 20 3f 22 2c 20 70 72 t_node <> ?", pr
fee0: 65 76 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 ev);... els
fef0: 65 0a 09 09 09 20 20 73 71 6c 20 3d 20 73 71 6c e.... sql = sql
ff00: 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
ff10: 73 20 73 74 61 72 74 5f 6e 6f 64 65 20 3c 3e 20 s start_node <>
ff20: 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 20 ?", prev);...
ff30: 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 comma = 1;...
ff40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
ff50: 65 65 20 28 70 72 65 76 29 3b 0a 09 09 20 20 20 ee (prev);...
ff60: 20 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 prev = sql;..
ff70: 09 20 20 7d 0a 09 09 69 66 20 28 65 78 63 5f 66 . }...if (exc_f
ff80: 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
ff90: 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 09 EDGE_END_NODE)..
ffa0: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 . {... if
ffb0: 28 63 6f 6d 6d 61 29 0a 09 09 09 20 20 73 71 6c (comma).... sql
ffc0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
ffd0: 74 66 20 28 22 25 73 20 41 4e 44 20 65 6e 64 5f tf ("%s AND end_
ffe0: 6e 6f 64 65 20 3c 3e 20 3f 22 2c 20 70 72 65 76 node <> ?", prev
fff0: 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a );... else.
10000 09 09 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 ... sql = sqlit
10010 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
10020 65 6e 64 5f 6e 6f 64 65 20 3c 3e 20 3f 22 2c 20 end_node <> ?",
10030 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 63 prev);... c
10040 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 20 20 20 omma = 1;...
10050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
10060 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 70 prev);... p
10070 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 20 20 7d rev = sql;... }
10080 0a 09 09 69 66 20 28 65 78 63 5f 66 69 65 6c 64 ...if (exc_field
10090 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
100a0 5f 46 41 43 45 5f 4c 45 46 54 29 0a 09 09 20 20 _FACE_LEFT)...
100b0 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 65 78 {... if (ex
100c0 63 5f 65 64 67 65 2d 3e 66 61 63 65 5f 6c 65 66 c_edge->face_lef
100d0 74 20 3c 20 30 29 0a 09 09 09 7b 0a 09 09 09 20 t < 0)....{....
100e0 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 if (comma)...
100f0 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 ..sql =.....
10100 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a sqlite3_mprintf.
10110 09 09 09 09 20 20 20 20 28 22 25 73 20 41 4e 44 .... ("%s AND
10120 20 6c 65 66 74 5f 66 61 63 65 20 49 53 20 4e 4f left_face IS NO
10130 54 20 4e 55 4c 4c 22 2c 20 70 72 65 76 29 3b 0a T NULL", prev);.
10140 09 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 09 ... else.....
10150 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 sql =..... sq
10160 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
10170 25 73 20 6c 65 66 74 5f 66 61 63 65 20 49 53 20 %s left_face IS
10180 4e 4f 54 20 4e 55 4c 4c 22 2c 0a 09 09 09 09 09 NOT NULL",......
10190 09 20 20 20 20 20 70 72 65 76 29 3b 0a 09 09 09 . prev);....
101a0 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 }... else..
101b0 09 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28 63 ..{.... if (c
101c0 6f 6d 6d 61 29 0a 09 09 09 09 73 71 6c 20 3d 0a omma).....sql =.
101d0 09 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f .... sqlite3_
101e0 6d 70 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 mprintf ("%s AND
101f0 20 6c 65 66 74 5f 66 61 63 65 20 3c 3e 20 3f 22 left_face <> ?"
10200 2c 0a 09 09 09 09 09 09 20 20 20 20 20 70 72 65 ,....... pre
10210 76 29 3b 0a 09 09 09 20 20 20 20 65 6c 73 65 0a v);.... else.
10220 09 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 20 ....sql =.....
10230 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 sqlite3_mprint
10240 66 20 28 22 25 73 20 6c 65 66 74 5f 66 61 63 65 f ("%s left_face
10250 20 3c 3e 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 <> ?", prev);..
10260 09 09 7d 0a 09 09 20 20 20 20 20 20 63 6f 6d 6d ..}... comm
10270 61 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 73 a = 1;... s
10280 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
10290 76 29 3b 0a 09 09 20 20 20 20 20 20 70 72 65 76 v);... prev
102a0 20 3d 20 73 71 6c 3b 0a 09 09 20 20 7d 0a 09 09 = sql;... }...
102b0 69 66 20 28 65 78 63 5f 66 69 65 6c 64 73 20 26 if (exc_fields &
102c0 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 RTT_COL_EDGE_FA
102d0 43 45 5f 52 49 47 48 54 29 0a 09 09 20 20 7b 0a CE_RIGHT)... {.
102e0 09 09 20 20 20 20 20 20 69 66 20 28 65 78 63 5f .. if (exc_
102f0 65 64 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 74 edge->face_right
10300 20 3c 20 30 29 0a 09 09 09 7b 0a 09 09 09 20 20 < 0)....{....
10310 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 09 if (comma)....
10320 09 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 .sql =..... s
10330 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 qlite3_mprintf..
10340 09 09 09 20 20 20 20 28 22 25 73 20 41 4e 44 20 ... ("%s AND
10350 72 69 67 68 74 5f 66 61 63 65 20 49 53 20 4e 4f right_face IS NO
10360 54 20 4e 55 4c 4c 22 2c 20 70 72 65 76 29 3b 0a T NULL", prev);.
10370 09 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 09 ... else.....
10380 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 sql =..... sq
10390 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 lite3_mprintf...
103a0 09 09 20 20 20 20 28 22 25 73 20 72 69 67 68 74 .. ("%s right
103b0 5f 66 61 63 65 20 49 53 20 4e 4f 54 20 4e 55 4c _face IS NOT NUL
103c0 4c 22 2c 20 70 72 65 76 29 3b 0a 09 09 09 7d 0a L", prev);....}.
103d0 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 .. else....
103e0 7b 0a 09 09 09 20 20 20 20 69 66 20 28 63 6f 6d {.... if (com
103f0 6d 61 29 0a 09 09 09 09 73 71 6c 20 3d 0a 09 09 ma).....sql =...
10400 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 .. sqlite3_mp
10410 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 20 72 rintf ("%s AND r
10420 69 67 68 74 5f 66 61 63 65 20 3c 3e 20 3f 22 2c ight_face <> ?",
10430 0a 09 09 09 09 09 09 20 20 20 20 20 70 72 65 76 ....... prev
10440 29 3b 0a 09 09 09 20 20 20 20 65 6c 73 65 0a 09 );.... else..
10450 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 ...sql =.....
10460 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
10470 20 28 22 25 73 20 72 69 67 68 74 5f 66 61 63 65 ("%s right_face
10480 20 3c 3e 20 3f 22 2c 0a 09 09 09 09 09 09 20 20 <> ?",.......
10490 20 20 20 70 72 65 76 29 3b 0a 09 09 09 7d 0a 09 prev);....}..
104a0 09 20 20 20 20 20 20 63 6f 6d 6d 61 20 3d 20 31 . comma = 1
104b0 3b 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 ;... sqlite
104c0 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 3_free (prev);..
104d0 09 20 20 20 20 20 20 70 72 65 76 20 3d 20 73 71 . prev = sq
104e0 6c 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 65 l;... }...if (e
104f0 78 63 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f xc_fields & RTT_
10500 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 4c 45 COL_EDGE_NEXT_LE
10510 46 54 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 FT)... {...
10520 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 09 if (comma)....
10530 20 20 73 71 6c 20 3d 0a 09 09 09 20 20 20 20 20 sql =....
10540 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
10550 0a 09 09 09 20 20 20 20 20 20 28 22 25 73 20 41 .... ("%s A
10560 4e 44 20 6e 65 78 74 5f 6c 65 66 74 5f 65 64 67 ND next_left_edg
10570 65 20 3c 3e 20 3f 22 2c 20 70 72 65 76 29 3b 0a e <> ?", prev);.
10580 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 .. else....
10590 20 20 73 71 6c 20 3d 0a 09 09 09 20 20 20 20 20 sql =....
105a0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
105b0 20 28 22 25 73 20 6e 65 78 74 5f 6c 65 66 74 5f ("%s next_left_
105c0 65 64 67 65 20 3c 3e 20 3f 22 2c 20 70 72 65 76 edge <> ?", prev
105d0 29 3b 0a 09 09 20 20 20 20 20 20 63 6f 6d 6d 61 );... comma
105e0 20 3d 20 31 3b 0a 09 09 20 20 20 20 20 20 73 71 = 1;... sq
105f0 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 lite3_free (prev
10600 29 3b 0a 09 09 20 20 20 20 20 20 70 72 65 76 20 );... prev
10610 3d 20 73 71 6c 3b 0a 09 09 20 20 7d 0a 09 09 69 = sql;... }...i
10620 66 20 28 65 78 63 5f 66 69 65 6c 64 73 20 26 20 f (exc_fields &
10630 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 RTT_COL_EDGE_NEX
10640 54 5f 52 49 47 48 54 29 0a 09 09 20 20 7b 0a 09 T_RIGHT)... {..
10650 09 20 20 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 . if (comma
10660 29 0a 09 09 09 20 20 73 71 6c 20 3d 0a 09 09 09 ).... sql =....
10670 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 sqlite3_mp
10680 72 69 6e 74 66 0a 09 09 09 20 20 20 20 20 20 28 rintf.... (
10690 22 25 73 20 41 4e 44 20 6e 65 78 74 5f 72 69 67 "%s AND next_rig
106a0 68 74 5f 65 64 67 65 20 3c 3e 20 3f 22 2c 20 70 ht_edge <> ?", p
106b0 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 65 6c rev);... el
106c0 73 65 0a 09 09 09 20 20 73 71 6c 20 3d 0a 09 09 se.... sql =...
106d0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d . sqlite3_m
106e0 70 72 69 6e 74 66 20 28 22 25 73 20 6e 65 78 74 printf ("%s next
106f0 5f 72 69 67 68 74 5f 65 64 67 65 20 3c 3e 20 3f _right_edge <> ?
10700 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 20 20 ", prev);...
10710 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 comma = 1;...
10720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
10730 65 20 28 70 72 65 76 29 3b 0a 09 09 20 20 20 20 e (prev);...
10740 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 prev = sql;...
10750 20 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 }.. }.
10760 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 71 }. ret =..sq
10770 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 lite3_prepare_v2
10780 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
10790 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 73 74 72 6c andle, sql, strl
107a0 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d 74 2c en (sql), &stmt,
107b0 0a 09 09 09 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 .... NULL);.
107c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 sqlite3_free
107d0 28 73 71 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 (sql);. if (r
107e0 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 et != SQLITE_OK)
107f0 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 68 61 72 . {.. char
10800 20 2a 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f *msg = sqlite3_
10810 6d 70 72 69 6e 74 66 20 28 22 50 72 65 70 61 72 mprintf ("Prepar
10820 65 5f 75 70 64 61 74 65 45 64 67 65 73 20 65 72 e_updateEdges er
10830 72 6f 72 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 ror: \"%s\"",...
10840 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 .. sqlite3
10850 5f 65 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f _errmsg (accesso
10860 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a r->db_handle));.
10870 09 20 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f . gaiatopo_set_
10880 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 last_error_msg (
10890 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 73 topo, msg);.. s
108a0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 qlite3_free (msg
108b0 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 2d 31 3b );.. return -1;
108c0 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 70 61 72 . }../* par
108d0 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 20 2a ameter binding *
108e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 /. sqlite3_re
108f0 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 set (stmt);.
10900 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 sqlite3_clear_bi
10910 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 ndings (stmt);.
10920 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 if (upd_field
10930 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
10940 5f 45 44 47 45 5f 49 44 29 0a 20 20 20 20 20 20 _EDGE_ID).
10950 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e {.. sqlite3_bin
10960 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 d_int64 (stmt, i
10970 63 6f 6c 2c 20 75 70 64 5f 65 64 67 65 2d 3e 65 col, upd_edge->e
10980 64 67 65 5f 69 64 29 3b 0a 09 20 20 69 63 6f 6c dge_id);.. icol
10990 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ++;. }.
109a0 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 26 if (upd_fields &
109b0 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 53 54 RTT_COL_EDGE_ST
109c0 41 52 54 5f 4e 4f 44 45 29 0a 20 20 20 20 20 20 ART_NODE).
109d0 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e {.. sqlite3_bin
109e0 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 d_int64 (stmt, i
109f0 63 6f 6c 2c 20 75 70 64 5f 65 64 67 65 2d 3e 73 col, upd_edge->s
10a00 74 61 72 74 5f 6e 6f 64 65 29 3b 0a 09 20 20 69 tart_node);.. i
10a10 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 col++;. }.
10a20 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 if (upd_field
10a30 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
10a40 5f 45 4e 44 5f 4e 4f 44 45 29 0a 20 20 20 20 20 _END_NODE).
10a50 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 {.. sqlite3_bi
10a60 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 nd_int64 (stmt,
10a70 69 63 6f 6c 2c 20 75 70 64 5f 65 64 67 65 2d 3e icol, upd_edge->
10a80 65 6e 64 5f 6e 6f 64 65 29 3b 0a 09 20 20 69 63 end_node);.. ic
10a90 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ol++;. }.
10aa0 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 if (upd_fields
10ab0 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
10ac0 46 41 43 45 5f 4c 45 46 54 29 0a 20 20 20 20 20 FACE_LEFT).
10ad0 20 7b 0a 09 20 20 69 66 20 28 75 70 64 5f 65 64 {.. if (upd_ed
10ae0 67 65 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3c 20 ge->face_left <
10af0 30 29 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 0).. sqlite
10b00 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 3_bind_null (stm
10b10 74 2c 20 69 63 6f 6c 29 3b 0a 09 20 20 65 6c 73 t, icol);.. els
10b20 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 e.. sqlite3
10b30 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d _bind_int64 (stm
10b40 74 2c 20 69 63 6f 6c 2c 20 75 70 64 5f 65 64 67 t, icol, upd_edg
10b50 65 2d 3e 66 61 63 65 5f 6c 65 66 74 29 3b 0a 09 e->face_left);..
10b60 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 icol++;.
10b70 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 }. if (upd_fi
10b80 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
10b90 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a DGE_FACE_RIGHT).
10ba0 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 75 {.. if (u
10bb0 70 64 5f 65 64 67 65 2d 3e 66 61 63 65 5f 72 69 pd_edge->face_ri
10bc0 67 68 74 20 3c 20 30 29 0a 09 20 20 20 20 20 20 ght < 0)..
10bd0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c sqlite3_bind_nul
10be0 6c 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a l (stmt, icol);.
10bf0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 . else.. s
10c00 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 qlite3_bind_int6
10c10 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 75 4 (stmt, icol, u
10c20 70 64 5f 65 64 67 65 2d 3e 66 61 63 65 5f 72 69 pd_edge->face_ri
10c30 67 68 74 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b ght);.. icol++;
10c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 . }. if
10c50 28 75 70 64 5f 66 69 65 6c 64 73 20 26 20 52 54 (upd_fields & RT
10c60 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f T_COL_EDGE_NEXT_
10c70 4c 45 46 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 LEFT). {..
10c80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
10c90 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c t64 (stmt, icol,
10ca0 20 75 70 64 5f 65 64 67 65 2d 3e 6e 65 78 74 5f upd_edge->next_
10cb0 6c 65 66 74 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b left);.. icol++
10cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 ;. }. if
10cd0 20 28 75 70 64 5f 66 69 65 6c 64 73 20 26 20 52 (upd_fields & R
10ce0 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 TT_COL_EDGE_NEXT
10cf0 5f 52 49 47 48 54 29 0a 20 20 20 20 20 20 7b 0a _RIGHT). {.
10d00 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f . sqlite3_bind_
10d10 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f int64 (stmt, ico
10d20 6c 2c 20 75 70 64 5f 65 64 67 65 2d 3e 6e 65 78 l, upd_edge->nex
10d30 74 5f 72 69 67 68 74 29 3b 0a 09 20 20 69 63 6f t_right);.. ico
10d40 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 l++;. }.
10d50 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 if (upd_fields
10d60 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 47 & RTT_COL_EDGE_G
10d70 45 4f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 EOM). {..
10d80 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 /* transforming
10d90 74 68 65 20 52 54 4c 49 4e 45 20 69 6e 74 6f 20 the RTLINE into
10da0 61 20 47 65 6f 6d 65 74 72 79 2d 4c 69 6e 65 73 a Geometry-Lines
10db0 74 72 69 6e 67 20 2a 2f 0a 09 20 20 67 61 69 61 tring */.. gaia
10dc0 47 65 6f 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d GeomCollPtr geom
10dd0 20 3d 0a 09 20 20 20 20 20 20 64 6f 5f 72 74 6c =.. do_rtl
10de0 69 6e 65 5f 74 6f 5f 67 65 6f 6d 20 28 63 74 78 ine_to_geom (ctx
10df0 2c 20 75 70 64 5f 65 64 67 65 2d 3e 67 65 6f 6d , upd_edge->geom
10e00 2c 20 61 63 63 65 73 73 6f 72 2d 3e 73 72 69 64 , accessor->srid
10e10 29 3b 0a 09 20 20 67 61 69 61 54 6f 53 70 61 74 );.. gaiaToSpat
10e20 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 45 78 32 iaLiteBlobWkbEx2
10e30 20 28 67 65 6f 6d 2c 20 26 70 5f 62 6c 6f 62 2c (geom, &p_blob,
10e40 20 26 6e 5f 62 79 74 65 73 2c 20 67 70 6b 67 5f &n_bytes, gpkg_
10e50 6d 6f 64 65 2c 0a 09 09 09 09 20 20 20 20 20 20 mode,.....
10e60 74 69 6e 79 5f 70 6f 69 6e 74 29 3b 0a 09 20 20 tiny_point);..
10e70 67 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c gaiaFreeGeomColl
10e80 20 28 67 65 6f 6d 29 3b 0a 09 20 20 73 71 6c 69 (geom);.. sqli
10e90 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 28 73 te3_bind_blob (s
10ea0 74 6d 74 2c 20 69 63 6f 6c 2c 20 70 5f 62 6c 6f tmt, icol, p_blo
10eb0 62 2c 20 6e 5f 62 79 74 65 73 2c 20 66 72 65 65 b, n_bytes, free
10ec0 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 );.. icol++;.
10ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 65 }. if (se
10ee0 6c 5f 65 64 67 65 29 0a 20 20 20 20 20 20 7b 0a l_edge). {.
10ef0 09 20 20 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 . if (sel_field
10f00 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
10f10 5f 45 44 47 45 5f 49 44 29 0a 09 20 20 20 20 7b _EDGE_ID).. {
10f20 0a 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f ...sqlite3_bind_
10f30 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f int64 (stmt, ico
10f40 6c 2c 20 73 65 6c 5f 65 64 67 65 2d 3e 65 64 67 l, sel_edge->edg
10f50 65 5f 69 64 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b e_id);...icol++;
10f60 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 .. }.. if (s
10f70 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f el_fields & RTT_
10f80 43 4f 4c 5f 45 44 47 45 5f 53 54 41 52 54 5f 4e COL_EDGE_START_N
10f90 4f 44 45 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 ODE).. {...sq
10fa0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 lite3_bind_int64
10fb0 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 73 65 (stmt, icol, se
10fc0 6c 5f 65 64 67 65 2d 3e 73 74 61 72 74 5f 6e 6f l_edge->start_no
10fd0 64 65 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 de);...icol++;..
10fe0 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 65 6c }.. if (sel
10ff0 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f _fields & RTT_CO
11000 4c 5f 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 L_EDGE_END_NODE)
11010 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 .. {...sqlite
11020 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
11030 6d 74 2c 20 69 63 6f 6c 2c 20 73 65 6c 5f 65 64 mt, icol, sel_ed
11040 67 65 2d 3e 65 6e 64 5f 6e 6f 64 65 29 3b 0a 09 ge->end_node);..
11050 09 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a .icol++;.. }.
11060 09 20 20 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 . if (sel_field
11070 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
11080 5f 46 41 43 45 5f 4c 45 46 54 29 0a 09 20 20 20 _FACE_LEFT)..
11090 20 7b 0a 09 09 69 66 20 28 73 65 6c 5f 65 64 67 {...if (sel_edg
110a0 65 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3c 20 30 e->face_left < 0
110b0 29 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f )... sqlite3_
110c0 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
110d0 20 69 63 6f 6c 29 3b 0a 09 09 65 6c 73 65 0a 09 icol);...else..
110e0 09 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e . sqlite3_bin
110f0 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 d_int64 (stmt, i
11100 63 6f 6c 2c 20 73 65 6c 5f 65 64 67 65 2d 3e 66 col, sel_edge->f
11110 61 63 65 5f 6c 65 66 74 29 3b 0a 09 09 69 63 6f ace_left);...ico
11120 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 l++;.. }.. i
11130 66 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 f (sel_fields &
11140 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 RTT_COL_EDGE_FAC
11150 45 5f 52 49 47 48 54 29 0a 09 20 20 20 20 7b 0a E_RIGHT).. {.
11160 09 09 69 66 20 28 73 65 6c 5f 65 64 67 65 2d 3e ..if (sel_edge->
11170 66 61 63 65 5f 72 69 67 68 74 20 3c 20 30 29 0a face_right < 0).
11180 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 .. sqlite3_bi
11190 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 69 nd_null (stmt, i
111a0 63 6f 6c 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 col);...else...
111b0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
111c0 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f int64 (stmt, ico
111d0 6c 2c 20 73 65 6c 5f 65 64 67 65 2d 3e 66 61 63 l, sel_edge->fac
111e0 65 5f 72 69 67 68 74 29 3b 0a 09 09 69 63 6f 6c e_right);...icol
111f0 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 ++;.. }.. if
11200 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 (sel_fields & R
11210 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 TT_COL_EDGE_NEXT
11220 5f 4c 45 46 54 29 0a 09 20 20 20 20 7b 0a 09 09 _LEFT).. {...
11230 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
11240 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 64 (stmt, icol,
11250 73 65 6c 5f 65 64 67 65 2d 3e 6e 65 78 74 5f 6c sel_edge->next_l
11260 65 66 74 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a eft);...icol++;.
11270 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 73 65 . }.. if (se
11280 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 l_fields & RTT_C
11290 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 47 OL_EDGE_NEXT_RIG
112a0 48 54 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c HT).. {...sql
112b0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
112c0 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 73 65 6c (stmt, icol, sel
112d0 5f 65 64 67 65 2d 3e 6e 65 78 74 5f 72 69 67 68 _edge->next_righ
112e0 74 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 20 t);...icol++;..
112f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
11300 20 69 66 20 28 65 78 63 5f 65 64 67 65 29 0a 20 if (exc_edge).
11310 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 65 78 {.. if (ex
11320 63 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 c_fields & RTT_C
11330 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f 49 44 29 OL_EDGE_EDGE_ID)
11340 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 .. {...sqlite
11350 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
11360 6d 74 2c 20 69 63 6f 6c 2c 20 65 78 63 5f 65 64 mt, icol, exc_ed
11370 67 65 2d 3e 65 64 67 65 5f 69 64 29 3b 0a 09 09 ge->edge_id);...
11380 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 icol++;.. }..
11390 20 20 69 66 20 28 65 78 63 5f 66 69 65 6c 64 73 if (exc_fields
113a0 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
113b0 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 20 20 20 START_NODE)..
113c0 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 62 69 6e {...sqlite3_bin
113d0 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 d_int64 (stmt, i
113e0 63 6f 6c 2c 20 65 78 63 5f 65 64 67 65 2d 3e 73 col, exc_edge->s
113f0 74 61 72 74 5f 6e 6f 64 65 29 3b 0a 09 09 69 63 tart_node);...ic
11400 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 ol++;.. }..
11410 69 66 20 28 65 78 63 5f 66 69 65 6c 64 73 20 26 if (exc_fields &
11420 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 4e RTT_COL_EDGE_EN
11430 44 5f 4e 4f 44 45 29 0a 09 20 20 20 20 7b 0a 09 D_NODE).. {..
11440 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e .sqlite3_bind_in
11450 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c t64 (stmt, icol,
11460 20 65 78 63 5f 65 64 67 65 2d 3e 65 6e 64 5f 6e exc_edge->end_n
11470 6f 64 65 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a ode);...icol++;.
11480 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 65 78 . }.. if (ex
11490 63 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 c_fields & RTT_C
114a0 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f 4c 45 46 OL_EDGE_FACE_LEF
114b0 54 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 T).. {...if (
114c0 65 78 63 5f 65 64 67 65 2d 3e 66 61 63 65 5f 6c exc_edge->face_l
114d0 65 66 74 20 3c 20 30 29 0a 09 09 20 20 20 20 73 eft < 0)... s
114e0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c qlite3_bind_null
114f0 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 (stmt, icol);..
11500 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71 6c 69 .else... sqli
11510 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 te3_bind_int64 (
11520 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 65 78 63 5f stmt, icol, exc_
11530 65 64 67 65 2d 3e 66 61 63 65 5f 6c 65 66 74 29 edge->face_left)
11540 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 ;...icol++;..
11550 20 7d 0a 09 20 20 69 66 20 28 65 78 63 5f 66 69 }.. if (exc_fi
11560 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
11570 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a DGE_FACE_RIGHT).
11580 09 20 20 20 20 7b 0a 09 09 69 66 20 28 65 78 63 . {...if (exc
11590 5f 65 64 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 _edge->face_righ
115a0 74 20 3c 20 30 29 0a 09 09 20 20 20 20 73 71 6c t < 0)... sql
115b0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 ite3_bind_null (
115c0 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 65 stmt, icol);...e
115d0 6c 73 65 0a 09 09 20 20 20 20 73 71 6c 69 74 65 lse... sqlite
115e0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
115f0 6d 74 2c 20 69 63 6f 6c 2c 20 65 78 63 5f 65 64 mt, icol, exc_ed
11600 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 74 29 3b ge->face_right);
11610 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 ...icol++;..
11620 7d 0a 09 20 20 69 66 20 28 65 78 63 5f 66 69 65 }.. if (exc_fie
11630 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
11640 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 09 20 GE_NEXT_LEFT)..
11650 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 62 {...sqlite3_b
11660 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c ind_int64 (stmt,
11670 20 69 63 6f 6c 2c 20 65 78 63 5f 65 64 67 65 2d icol, exc_edge-
11680 3e 6e 65 78 74 5f 6c 65 66 74 29 3b 0a 09 09 69 >next_left);...i
11690 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 col++;.. }..
116a0 20 69 66 20 28 65 78 63 5f 66 69 65 6c 64 73 20 if (exc_fields
116b0 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e & RTT_COL_EDGE_N
116c0 45 58 54 5f 52 49 47 48 54 29 0a 09 20 20 20 20 EXT_RIGHT)..
116d0 7b 0a 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 {...sqlite3_bind
116e0 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 _int64 (stmt, ic
116f0 6f 6c 2c 20 65 78 63 5f 65 64 67 65 2d 3e 6e 65 ol, exc_edge->ne
11700 78 74 5f 72 69 67 68 74 29 3b 0a 09 09 69 63 6f xt_right);...ico
11710 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 l++;.. }.
11720 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 20 73 71 }. ret = sq
11730 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 lite3_step (stmt
11740 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 3d );. if (ret =
11750 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c = SQLITE_DONE ||
11760 20 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 ret == SQLITE_R
11770 4f 57 29 0a 09 63 68 61 6e 67 65 64 20 3d 20 73 OW)..changed = s
11780 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 28 qlite3_changes (
11790 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e accessor->db_han
117a0 64 6c 65 29 3b 0a 20 20 20 20 65 6c 73 65 0a 20 dle);. else.
117b0 20 20 20 20 20 7b 0a 09 20 20 63 68 61 72 20 2a {.. char *
117c0 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 msg = sqlite3_mp
117d0 72 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 6b rintf ("callback
117e0 5f 75 70 64 61 74 65 45 64 67 65 73 3a 20 5c 22 _updateEdges: \"
117f0 25 73 5c 22 22 2c 0a 09 09 09 09 20 20 20 20 20 %s\"",.....
11800 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 sqlite3_errmsg
11810 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
11820 61 6e 64 6c 65 29 29 3b 0a 09 20 20 67 61 69 61 andle));.. gaia
11830 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 topo_set_last_er
11840 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d ror_msg (topo, m
11850 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f sg);.. sqlite3_
11860 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 20 20 67 free (msg);.. g
11870 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20 20 oto error;.
11880 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 }. sqlite3_f
11890 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a inalize (stmt);.
118a0 20 20 20 20 72 65 74 75 72 6e 20 63 68 61 6e 67 return chang
118b0 65 64 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 ed;.. error:.
118c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 sqlite3_finali
118d0 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 ze (stmt);. r
118e0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 52 54 54 eturn -1;.}..RTT
118f0 5f 49 53 4f 5f 46 41 43 45 20 2a 0a 63 61 6c 6c _ISO_FACE *.call
11900 62 61 63 6b 5f 67 65 74 46 61 63 65 42 79 49 64 back_getFaceById
11910 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 (const RTT_BE_T
11920 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f OPOLOGY * rtt_to
11930 70 6f 2c 0a 09 09 20 20 20 20 20 20 63 6f 6e 73 po,... cons
11940 74 20 52 54 54 5f 45 4c 45 4d 49 44 20 2a 20 69 t RTT_ELEMID * i
11950 64 73 2c 20 69 6e 74 20 2a 6e 75 6d 65 6c 65 6d ds, int *numelem
11960 73 2c 20 69 6e 74 20 66 69 65 6c 64 73 29 0a 7b s, int fields).{
11970 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e ./* callback fun
11980 63 74 69 6f 6e 3a 20 67 65 74 46 65 63 65 42 79 ction: getFeceBy
11990 49 64 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 Id */. const
119a0 52 54 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c RTCTX *ctx = NUL
119b0 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 L;. struct sp
119c0 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 lite_internal_ca
119d0 63 68 65 20 2a 63 61 63 68 65 20 3d 20 4e 55 4c che *cache = NUL
119e0 4c 3b 0a 20 20 20 20 47 61 69 61 54 6f 70 6f 6c L;. GaiaTopol
119f0 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 74 ogyAccessorPtr t
11a00 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f 6c opo = (GaiaTopol
11a10 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 20 ogyAccessorPtr)
11a20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 74 rtt_topo;. st
11a30 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f ruct gaia_topolo
11a40 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 28 gy *accessor = (
11a50 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f struct gaia_topo
11a60 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 logy *) topo;.
11a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a sqlite3_stmt *
11a80 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 4c 4c 3b stmt_aux = NULL;
11a90 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 . int ret;.
11aa0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 int i;. cha
11ab0 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 61 72 r *sql;. char
11ac0 20 2a 70 72 65 76 3b 0a 20 20 20 20 63 68 61 72 *prev;. char
11ad0 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 *table;. cha
11ae0 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20 20 20 69 r *xtable;. i
11af0 6e 74 20 63 6f 6d 6d 61 20 3d 20 30 3b 0a 20 20 nt comma = 0;.
11b00 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f 66 61 struct topo_fa
11b10 63 65 73 5f 6c 69 73 74 20 2a 6c 69 73 74 20 3d ces_list *list =
11b20 20 4e 55 4c 4c 3b 0a 20 20 20 20 52 54 54 5f 49 NULL;. RTT_I
11b30 53 4f 5f 46 41 43 45 20 2a 72 65 73 75 6c 74 20 SO_FACE *result
11b40 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 = NULL;. if (
11b50 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c accessor == NULL
11b60 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 6e 75 ). {.. *nu
11b70 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 20 melems = -1;..
11b80 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
11b90 20 20 20 7d 0a 0a 20 20 20 20 63 61 63 68 65 20 }.. cache
11ba0 3d 20 28 73 74 72 75 63 74 20 73 70 6c 69 74 65 = (struct splite
11bb0 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 _internal_cache
11bc0 2a 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 *) accessor->cac
11bd0 68 65 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 he;. if (cach
11be0 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 e == NULL)..retu
11bf0 72 6e 20 30 3b 0a 20 20 20 20 69 66 20 28 63 61 rn 0;. if (ca
11c00 63 68 65 2d 3e 6d 61 67 69 63 31 20 21 3d 20 53 che->magic1 != S
11c10 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f PATIALITE_CACHE_
11c20 4d 41 47 49 43 31 0a 09 7c 7c 20 63 61 63 68 65 MAGIC1..|| cache
11c30 2d 3e 6d 61 67 69 63 32 20 21 3d 20 53 50 41 54 ->magic2 != SPAT
11c40 49 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 IALITE_CACHE_MAG
11c50 49 43 32 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a IC2)..return 0;.
11c60 20 20 20 20 63 74 78 20 3d 20 63 61 63 68 65 2d ctx = cache-
11c70 3e 52 54 54 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a >RTTOPO_handle;.
11c80 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e if (ctx == N
11c90 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a ULL)..return 0;.
11ca0 0a 20 20 20 20 2f 2a 20 70 72 65 70 61 72 69 6e . /* preparin
11cb0 67 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d g the SQL statem
11cc0 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d ent */. sql =
11cd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
11ce0 20 28 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 ("SELECT ");.
11cf0 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 prev = sql;.
11d00 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 if (fields & R
11d10 54 54 5f 43 4f 4c 5f 46 41 43 45 5f 46 41 43 45 TT_COL_FACE_FACE
11d20 5f 49 44 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 _ID). {..
11d30 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 if (comma)..
11d40 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
11d50 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 66 61 mprintf ("%s, fa
11d60 63 65 5f 69 64 22 2c 20 70 72 65 76 29 3b 0a 09 ce_id", prev);..
11d70 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 else.. sq
11d80 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
11d90 6e 74 66 20 28 22 25 73 20 66 61 63 65 5f 69 64 ntf ("%s face_id
11da0 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d ", prev);.. com
11db0 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 ma = 1;.. sqlit
11dc0 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a e3_free (prev);.
11dd0 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 . prev = sql;.
11de0 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 }. if (f
11df0 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
11e00 46 41 43 45 5f 4d 42 52 29 0a 20 20 20 20 20 20 FACE_MBR).
11e10 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a {.. if (comma).
11e20 09 20 20 20 20 20 20 73 71 6c 20 3d 0a 09 09 20 . sql =...
11e30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
11e40 0a 09 09 20 20 28 22 25 73 2c 20 4d 62 72 4d 69 ... ("%s, MbrMi
11e50 6e 58 28 6d 62 72 29 2c 20 4d 62 72 4d 69 6e 59 nX(mbr), MbrMinY
11e60 28 6d 62 72 29 2c 20 4d 62 72 4d 61 78 58 28 6d (mbr), MbrMaxX(m
11e70 62 72 29 2c 20 4d 62 72 4d 61 78 59 28 6d 62 72 br), MbrMaxY(mbr
11e80 29 22 2c 0a 09 09 20 20 20 70 72 65 76 29 3b 0a )",... prev);.
11e90 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 . else.. s
11ea0 71 6c 20 3d 0a 09 09 20 20 73 71 6c 69 74 65 33 ql =... sqlite3
11eb0 5f 6d 70 72 69 6e 74 66 0a 09 09 20 20 28 22 25 _mprintf... ("%
11ec0 73 20 4d 62 72 4d 69 6e 58 28 6d 62 72 29 2c 20 s MbrMinX(mbr),
11ed0 4d 62 72 4d 69 6e 59 28 6d 62 72 29 2c 20 4d 62 MbrMinY(mbr), Mb
11ee0 72 4d 61 78 58 28 6d 62 72 29 2c 20 4d 62 72 4d rMaxX(mbr), MbrM
11ef0 61 78 59 28 6d 62 72 29 22 2c 0a 09 09 20 20 20 axY(mbr)",...
11f00 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
11f10 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
11f20 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
11f30 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
11f40 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 20 3d 20 }. table =
11f50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
11f60 28 22 25 73 5f 66 61 63 65 22 2c 20 61 63 63 65 ("%s_face", acce
11f70 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 79 5f 6e ssor->topology_n
11f80 61 6d 65 29 3b 0a 20 20 20 20 78 74 61 62 6c 65 ame);. xtable
11f90 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 6f = gaiaDoubleQuo
11fa0 74 65 64 53 71 6c 20 28 74 61 62 6c 65 29 3b 0a tedSql (table);.
11fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
11fc0 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 (table);. sq
11fd0 6c 20 3d 0a 09 73 71 6c 69 74 65 33 5f 6d 70 72 l =..sqlite3_mpr
11fe0 69 6e 74 66 20 28 22 25 73 20 46 52 4f 4d 20 4d intf ("%s FROM M
11ff0 41 49 4e 2e 5c 22 25 73 5c 22 20 57 48 45 52 45 AIN.\"%s\" WHERE
12000 20 66 61 63 65 5f 69 64 20 3d 20 3f 22 2c 20 70 face_id = ?", p
12010 72 65 76 2c 20 78 74 61 62 6c 65 29 3b 0a 20 20 rev, xtable);.
12020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
12030 70 72 65 76 29 3b 0a 20 20 20 20 66 72 65 65 20 prev);. free
12040 28 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 (xtable);. re
12050 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 70 72 65 t =..sqlite3_pre
12060 70 61 72 65 5f 76 32 20 28 61 63 63 65 73 73 6f pare_v2 (accesso
12070 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 2c 20 73 71 r->db_handle, sq
12080 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c l, strlen (sql),
12090 20 26 73 74 6d 74 5f 61 75 78 2c 0a 09 09 09 20 &stmt_aux,....
120a0 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 NULL);. sq
120b0 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29 lite3_free (sql)
120c0 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d ;. if (ret !=
120d0 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 SQLITE_OK).
120e0 20 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d 73 67 {.. char *msg
120f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
12100 74 66 20 28 22 50 72 65 70 61 72 65 5f 67 65 74 tf ("Prepare_get
12110 46 61 63 65 42 79 49 64 20 41 55 58 20 65 72 72 FaceById AUX err
12120 6f 72 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 or: \"%s\"",....
12130 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f . sqlite3_
12140 65 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f 72 errmsg (accessor
12150 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 ->db_handle));..
12160 20 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c gaiatopo_set_l
12170 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 ast_error_msg (t
12180 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 73 71 opo, msg);.. sq
12190 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 lite3_free (msg)
121a0 3b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d ;.. *numelems =
121b0 20 2d 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e -1;.. return N
121c0 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 ULL;. }..
121d0 20 20 6c 69 73 74 20 3d 20 63 72 65 61 74 65 5f list = create_
121e0 66 61 63 65 73 5f 6c 69 73 74 20 28 29 3b 0a 20 faces_list ();.
121f0 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 for (i = 0; i
12200 20 3c 20 2a 6e 75 6d 65 6c 65 6d 73 3b 20 69 2b < *numelems; i+
12210 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 68 +). {.. ch
12220 61 72 20 2a 6d 73 67 3b 0a 09 20 20 69 66 20 28 ar *msg;.. if (
12230 21 64 6f 5f 72 65 61 64 5f 66 61 63 65 0a 09 20 !do_read_face..
12240 20 20 20 20 20 28 73 74 6d 74 5f 61 75 78 2c 20 (stmt_aux,
12250 6c 69 73 74 2c 20 2a 28 69 64 73 20 2b 20 69 29 list, *(ids + i)
12260 2c 20 66 69 65 6c 64 73 2c 20 22 63 61 6c 6c 62 , fields, "callb
12270 61 63 6b 5f 67 65 74 46 61 63 65 42 79 49 64 22 ack_getFaceById"
12280 2c 0a 09 20 20 20 20 20 20 20 26 6d 73 67 29 29 ,.. &msg))
12290 0a 09 20 20 20 20 7b 0a 09 09 67 61 69 61 74 6f .. {...gaiato
122a0 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f po_set_last_erro
122b0 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 r_msg (topo, msg
122c0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 );...sqlite3_fre
122d0 65 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 e (msg);...goto
122e0 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 error;.. }.
122f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c }.. if (l
12300 69 73 74 2d 3e 63 6f 75 6e 74 20 3d 3d 20 30 29 ist->count == 0)
12310 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6e . {.. /* n
12320 6f 20 66 61 63 65 20 77 61 73 20 66 6f 75 6e 64 o face was found
12330 20 2a 2f 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 */.. *numelems
12340 20 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a = list->count;.
12350 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 }. else
12360 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 74 72 75 . {.. stru
12370 63 74 20 74 6f 70 6f 5f 66 61 63 65 20 2a 70 5f ct topo_face *p_
12380 66 63 3b 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 fc;.. result =
12390 72 74 61 6c 6c 6f 63 20 28 63 74 78 2c 20 73 69 rtalloc (ctx, si
123a0 7a 65 6f 66 20 28 52 54 54 5f 49 53 4f 5f 46 41 zeof (RTT_ISO_FA
123b0 43 45 29 20 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e CE) * list->coun
123c0 74 29 3b 0a 09 20 20 70 5f 66 63 20 3d 20 6c 69 t);.. p_fc = li
123d0 73 74 2d 3e 66 69 72 73 74 3b 0a 09 20 20 69 20 st->first;.. i
123e0 3d 20 30 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 = 0;.. while (p
123f0 5f 66 63 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 _fc != NULL)..
12400 20 20 7b 0a 09 09 52 54 54 5f 49 53 4f 5f 46 41 {...RTT_ISO_FA
12410 43 45 20 2a 66 63 20 3d 20 72 65 73 75 6c 74 20 CE *fc = result
12420 2b 20 69 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 + i;...if (field
12430 73 20 26 20 52 54 54 5f 43 4f 4c 5f 46 41 43 45 s & RTT_COL_FACE
12440 5f 46 41 43 45 5f 49 44 29 0a 09 09 20 20 20 20 _FACE_ID)...
12450 66 63 2d 3e 66 61 63 65 5f 69 64 20 3d 20 70 5f fc->face_id = p_
12460 66 63 2d 3e 66 61 63 65 5f 69 64 3b 0a 09 09 69 fc->face_id;...i
12470 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
12480 43 4f 4c 5f 46 41 43 45 5f 4d 42 52 29 0a 09 09 COL_FACE_MBR)...
12490 20 20 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 {... if (
124a0 70 5f 66 63 2d 3e 69 64 20 3d 3d 20 30 29 0a 09 p_fc->id == 0)..
124b0 09 09 20 20 66 63 2d 3e 6d 62 72 20 3d 20 4e 55 .. fc->mbr = NU
124c0 4c 4c 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 LL;... else
124d0 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 66 63 2d ....{.... fc-
124e0 3e 6d 62 72 20 3d 20 67 62 6f 78 5f 6e 65 77 20 >mbr = gbox_new
124f0 28 63 74 78 2c 20 30 29 3b 0a 09 09 09 20 20 20 (ctx, 0);....
12500 20 66 63 2d 3e 6d 62 72 2d 3e 78 6d 69 6e 20 3d fc->mbr->xmin =
12510 20 70 5f 66 63 2d 3e 6d 69 6e 78 3b 0a 09 09 09 p_fc->minx;....
12520 20 20 20 20 66 63 2d 3e 6d 62 72 2d 3e 79 6d 69 fc->mbr->ymi
12530 6e 20 3d 20 70 5f 66 63 2d 3e 6d 69 6e 79 3b 0a n = p_fc->miny;.
12540 09 09 09 20 20 20 20 66 63 2d 3e 6d 62 72 2d 3e ... fc->mbr->
12550 78 6d 61 78 20 3d 20 70 5f 66 63 2d 3e 6d 61 78 xmax = p_fc->max
12560 78 3b 0a 09 09 09 20 20 20 20 66 63 2d 3e 6d 62 x;.... fc->mb
12570 72 2d 3e 79 6d 61 78 20 3d 20 70 5f 66 63 2d 3e r->ymax = p_fc->
12580 6d 61 78 79 3b 0a 09 09 09 7d 0a 09 09 20 20 7d maxy;....}... }
12590 0a 09 09 69 2b 2b 3b 0a 09 09 70 5f 66 63 20 3d ...i++;...p_fc =
125a0 20 70 5f 66 63 2d 3e 6e 65 78 74 3b 0a 09 20 20 p_fc->next;..
125b0 20 20 7d 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 }.. *numelems
125c0 20 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a = list->count;.
125d0 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 }. sqli
125e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 te3_finalize (st
125f0 6d 74 5f 61 75 78 29 3b 0a 20 20 20 20 64 65 73 mt_aux);. des
12600 74 72 6f 79 5f 66 61 63 65 73 5f 6c 69 73 74 20 troy_faces_list
12610 28 6c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 (list);. retu
12620 72 6e 20 72 65 73 75 6c 74 3b 0a 0a 20 20 65 72 rn result;.. er
12630 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 73 74 6d ror:. if (stm
12640 74 5f 61 75 78 20 21 3d 20 4e 55 4c 4c 29 0a 09 t_aux != NULL)..
12650 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 sqlite3_finalize
12660 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a 20 20 20 (stmt_aux);.
12670 20 69 66 20 28 6c 69 73 74 20 21 3d 20 4e 55 4c if (list != NUL
12680 4c 29 0a 09 64 65 73 74 72 6f 79 5f 66 61 63 65 L)..destroy_face
12690 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 s_list (list);.
126a0 20 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d *numelems = -
126b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 1;. return NU
126c0 4c 4c 3b 0a 7d 0a 0a 52 54 54 5f 45 4c 45 4d 49 LL;.}..RTT_ELEMI
126d0 44 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 46 61 D.callback_getFa
126e0 63 65 43 6f 6e 74 61 69 6e 69 6e 67 50 6f 69 6e ceContainingPoin
126f0 74 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f t (const RTT_BE_
12700 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 TOPOLOGY * rtt_t
12710 6f 70 6f 2c 0a 09 09 09 09 20 63 6f 6e 73 74 20 opo,..... const
12720 52 54 50 4f 49 4e 54 20 2a 20 70 74 29 0a 7b 0a RTPOINT * pt).{.
12730 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 /* callback func
12740 74 69 6f 6e 3a 20 67 65 74 46 61 63 65 43 6f 6e tion: getFaceCon
12750 74 61 69 6e 69 6e 67 50 6f 69 6e 74 20 2a 2f 0a tainingPoint */.
12760 20 20 20 20 63 6f 6e 73 74 20 52 54 43 54 58 20 const RTCTX
12770 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
12780 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 struct splite_i
12790 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 nternal_cache *c
127a0 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ache = NULL;.
127b0 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 GaiaTopologyAcc
127c0 65 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 essorPtr topo =
127d0 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 (GaiaTopologyAcc
127e0 65 73 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f essorPtr) rtt_to
127f0 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 po;. struct g
12800 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 aia_topology *ac
12810 63 65 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 cessor = (struct
12820 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a gaia_topology *
12830 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 ) topo;. sqli
12840 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b 0a te3_stmt *stmt;.
12850 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
12860 20 2a 73 74 6d 74 5f 61 75 78 3b 0a 20 20 20 20 *stmt_aux;.
12870 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 64 6f 75 int ret;. dou
12880 62 6c 65 20 63 78 3b 0a 20 20 20 20 64 6f 75 62 ble cx;. doub
12890 6c 65 20 63 79 3b 0a 20 20 20 20 66 6c 6f 61 74 le cy;. float
128a0 20 66 78 3b 0a 20 20 20 20 66 6c 6f 61 74 20 66 fx;. float f
128b0 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74 69 y;. double ti
128c0 63 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74 69 c;. double ti
128d0 63 32 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 41 c2;. RTPOINTA
128e0 52 52 41 59 20 2a 70 61 3b 0a 20 20 20 20 52 54 RRAY *pa;. RT
128f0 50 4f 49 4e 54 34 44 20 70 74 34 64 3b 0a 20 20 POINT4D pt4d;.
12900 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b int count = 0;
12910 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 . sqlite3_int
12920 36 34 20 66 61 63 65 5f 69 64 3b 0a 20 20 20 20 64 face_id;.
12930 69 66 20 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 if (accessor ==
12940 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 2d 32 NULL)..return -2
12950 3b 0a 0a 20 20 20 20 73 74 6d 74 20 3d 20 61 63 ;.. stmt = ac
12960 63 65 73 73 6f 72 2d 3e 73 74 6d 74 5f 67 65 74 cessor->stmt_get
12970 46 61 63 65 43 6f 6e 74 61 69 6e 69 6e 67 50 6f FaceContainingPo
12980 69 6e 74 5f 31 3b 0a 20 20 20 20 69 66 20 28 73 int_1;. if (s
12990 74 6d 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 tmt == NULL)..re
129a0 74 75 72 6e 20 2d 32 3b 0a 20 20 20 20 73 74 6d turn -2;. stm
129b0 74 5f 61 75 78 20 3d 20 61 63 63 65 73 73 6f 72 t_aux = accessor
129c0 2d 3e 73 74 6d 74 5f 67 65 74 46 61 63 65 43 6f ->stmt_getFaceCo
129d0 6e 74 61 69 6e 69 6e 67 50 6f 69 6e 74 5f 32 3b ntainingPoint_2;
129e0 0a 20 20 20 20 69 66 20 28 73 74 6d 74 5f 61 75 . if (stmt_au
129f0 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 x == NULL)..retu
12a00 72 6e 20 2d 32 3b 0a 0a 20 20 20 20 63 61 63 68 rn -2;.. cach
12a10 65 20 3d 20 28 73 74 72 75 63 74 20 73 70 6c 69 e = (struct spli
12a20 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 te_internal_cach
12a30 65 20 2a 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 e *) accessor->c
12a40 61 63 68 65 3b 0a 20 20 20 20 69 66 20 28 63 61 ache;. if (ca
12a50 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 che == NULL)..re
12a60 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 20 turn -1;. if
12a70 28 63 61 63 68 65 2d 3e 6d 61 67 69 63 31 20 21 (cache->magic1 !
12a80 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 43 = SPATIALITE_CAC
12a90 48 45 5f 4d 41 47 49 43 31 0a 09 7c 7c 20 63 61 HE_MAGIC1..|| ca
12aa0 63 68 65 2d 3e 6d 61 67 69 63 32 20 21 3d 20 53 che->magic2 != S
12ab0 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f PATIALITE_CACHE_
12ac0 4d 41 47 49 43 32 29 0a 09 72 65 74 75 72 6e 20 MAGIC2)..return
12ad0 2d 31 3b 0a 20 20 20 20 63 74 78 20 3d 20 63 61 -1;. ctx = ca
12ae0 63 68 65 2d 3e 52 54 54 4f 50 4f 5f 68 61 6e 64 che->RTTOPO_hand
12af0 6c 65 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 le;. if (ctx
12b00 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e == NULL)..return
12b10 20 2d 31 3b 0a 0a 2f 2a 20 65 78 74 72 61 63 74 -1;../* extract
12b20 69 6e 67 20 58 20 61 6e 64 20 59 20 66 72 6f 6d ing X and Y from
12b30 20 52 54 50 4f 49 4e 54 20 2a 2f 0a 20 20 20 20 RTPOINT */.
12b40 70 61 20 3d 20 70 74 2d 3e 70 6f 69 6e 74 3b 0a pa = pt->point;.
12b50 20 20 20 20 72 74 5f 67 65 74 50 6f 69 6e 74 34 rt_getPoint4
12b60 64 5f 70 20 28 63 74 78 2c 20 70 61 2c 20 30 2c d_p (ctx, pa, 0,
12b70 20 26 70 74 34 64 29 3b 0a 20 20 20 20 63 78 20 &pt4d);. cx
12b80 3d 20 70 74 34 64 2e 78 3b 0a 20 20 20 20 63 79 = pt4d.x;. cy
12b90 20 3d 20 70 74 34 64 2e 79 3b 0a 0a 2f 2a 20 61 = pt4d.y;../* a
12ba0 64 6a 75 73 74 69 6e 67 20 74 68 65 20 4d 42 52 djusting the MBR
12bb0 20 73 6f 20 74 6f 20 63 6f 6d 70 65 6e 73 61 74 so to compensat
12bc0 65 20 66 6f 72 20 44 4f 55 42 4c 45 2f 46 4c 4f e for DOUBLE/FLO
12bd0 41 54 20 74 72 75 6e 63 61 74 69 6f 6e 73 20 2a AT truncations *
12be0 2f 0a 20 20 20 20 66 78 20 3d 20 28 66 6c 6f 61 /. fx = (floa
12bf0 74 29 20 63 78 3b 0a 20 20 20 20 66 79 20 3d 20 t) cx;. fy =
12c00 28 66 6c 6f 61 74 29 20 63 79 3b 0a 20 20 20 20 (float) cy;.
12c10 74 69 63 20 3d 20 66 61 62 73 20 28 63 78 20 2d tic = fabs (cx -
12c20 20 66 78 29 3b 0a 20 20 20 20 74 69 63 32 20 3d fx);. tic2 =
12c30 20 66 61 62 73 20 28 63 79 20 2d 20 66 79 29 3b fabs (cy - fy);
12c40 0a 20 20 20 20 69 66 20 28 74 69 63 32 20 3e 20 . if (tic2 >
12c50 74 69 63 29 0a 09 74 69 63 20 3d 20 74 69 63 32 tic)..tic = tic2
12c60 3b 0a 20 20 20 20 74 69 63 32 20 3d 20 66 61 62 ;. tic2 = fab
12c70 73 20 28 63 78 20 2d 20 66 78 29 3b 0a 20 20 20 s (cx - fx);.
12c80 20 69 66 20 28 74 69 63 32 20 3e 20 74 69 63 29 if (tic2 > tic)
12c90 0a 09 74 69 63 20 3d 20 74 69 63 32 3b 0a 20 20 ..tic = tic2;.
12ca0 20 20 74 69 63 32 20 3d 20 66 61 62 73 20 28 63 tic2 = fabs (c
12cb0 79 20 2d 20 66 79 29 3b 0a 20 20 20 20 69 66 20 y - fy);. if
12cc0 28 74 69 63 32 20 3e 20 74 69 63 29 0a 09 74 69 (tic2 > tic)..ti
12cd0 63 20 3d 20 74 69 63 32 3b 0a 20 20 20 20 74 69 c = tic2;. ti
12ce0 63 20 2a 3d 20 32 2e 30 3b 0a 0a 2f 2a 20 73 65 c *= 2.0;../* se
12cf0 74 74 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 tting up the pre
12d00 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 pared statement
12d10 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 */. sqlite3_r
12d20 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 eset (stmt);.
12d30 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 sqlite3_clear_b
12d40 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a indings (stmt);.
12d50 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
12d60 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 31 _double (stmt, 1
12d70 2c 20 63 78 20 2b 20 74 69 63 29 3b 0a 20 20 20 , cx + tic);.
12d80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f sqlite3_bind_do
12d90 75 62 6c 65 20 28 73 74 6d 74 2c 20 32 2c 20 63 uble (stmt, 2, c
12da0 78 20 2d 20 74 69 63 29 3b 0a 20 20 20 20 73 71 x - tic);. sq
12db0 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c lite3_bind_doubl
12dc0 65 20 28 73 74 6d 74 2c 20 33 2c 20 63 79 20 2b e (stmt, 3, cy +
12dd0 20 74 69 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 tic);. sqlit
12de0 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 e3_bind_double (
12df0 73 74 6d 74 2c 20 34 2c 20 63 79 20 2d 20 74 69 stmt, 4, cy - ti
12e00 63 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 c);.. while (
12e10 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 1). {.. /*
12e20 20 73 63 72 6f 6c 6c 69 6e 67 20 74 68 65 20 72 scrolling the r
12e30 65 73 75 6c 74 20 73 65 74 20 72 6f 77 73 20 5b esult set rows [
12e40 52 2a 54 72 65 65 5d 20 2a 2f 0a 09 20 20 72 65 R*Tree] */.. re
12e50 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 t = sqlite3_step
12e60 20 28 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 (stmt);.. if (
12e70 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f ret == SQLITE_DO
12e80 4e 45 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b NE).. break
12e90 3b 09 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 ;../* end of res
12ea0 75 6c 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 ult set */.. if
12eb0 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f (ret == SQLITE_
12ec0 52 4f 57 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 ROW).. {...sq
12ed0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 64 20 3d lite3_int64 id =
12ee0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
12ef0 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 30 29 3b int64 (stmt, 0);
12f00 0a 09 09 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f .../* testing fo
12f10 72 20 72 65 61 6c 20 69 6e 74 65 72 73 65 63 74 r real intersect
12f20 69 6f 6e 20 2a 2f 0a 09 09 73 71 6c 69 74 65 33 ion */...sqlite3
12f30 5f 72 65 73 65 74 20 28 73 74 6d 74 5f 61 75 78 _reset (stmt_aux
12f40 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 63 6c 65 );...sqlite3_cle
12f50 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d ar_bindings (stm
12f60 74 5f 61 75 78 29 3b 0a 09 09 73 71 6c 69 74 65 t_aux);...sqlite
12f70 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
12f80 6d 74 5f 61 75 78 2c 20 31 2c 20 69 64 29 3b 0a mt_aux, 1, id);.
12f90 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 ..sqlite3_bind_d
12fa0 6f 75 62 6c 65 20 28 73 74 6d 74 5f 61 75 78 2c ouble (stmt_aux,
12fb0 20 32 2c 20 63 78 29 3b 0a 09 09 73 71 6c 69 74 2, cx);...sqlit
12fc0 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 e3_bind_double (
12fd0 73 74 6d 74 5f 61 75 78 2c 20 33 2c 20 63 79 29 stmt_aux, 3, cy)
12fe0 3b 0a 09 09 77 68 69 6c 65 20 28 31 29 0a 09 09 ;...while (1)...
12ff0 20 20 7b 0a 09 09 20 20 20 20 20 20 72 65 74 20 {... ret
13000 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 = sqlite3_step (
13010 73 74 6d 74 5f 61 75 78 29 3b 0a 09 09 20 20 20 stmt_aux);...
13020 20 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 if (ret == SQ
13030 4c 49 54 45 5f 44 4f 4e 45 29 0a 09 09 09 20 20 LITE_DONE)....
13040 62 72 65 61 6b 3b 09 2f 2a 20 65 6e 64 20 6f 66 break;./* end of
13050 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 09 result set */..
13060 09 20 20 20 20 20 20 69 66 20 28 72 65 74 20 3d . if (ret =
13070 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 09 = SQLITE_ROW)...
13080 09 7b 0a 09 09 09 20 20 20 20 69 66 20 28 73 71 .{.... if (sq
13090 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 lite3_column_typ
130a0 65 20 28 73 74 6d 74 5f 61 75 78 2c 20 30 29 20 e (stmt_aux, 0)
130b0 3d 3d 0a 09 09 09 09 53 51 4c 49 54 45 5f 49 4e ==.....SQLITE_IN
130c0 54 45 47 45 52 29 0a 09 09 09 20 20 20 20 20 20 TEGER)....
130d0 7b 0a 09 09 09 09 20 20 69 66 20 28 73 71 6c 69 {..... if (sqli
130e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 28 te3_column_int (
130f0 73 74 6d 74 5f 61 75 78 2c 20 30 29 20 3d 3d 20 stmt_aux, 0) ==
13100 31 29 0a 09 09 09 09 20 20 20 20 7b 0a 09 09 09 1)..... {....
13110 09 09 66 61 63 65 5f 69 64 20 3d 20 69 64 3b 0a ..face_id = id;.
13120 09 09 09 09 09 63 6f 75 6e 74 2b 2b 3b 0a 09 09 .....count++;...
13130 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 20 20 ...break;.....
13140 20 20 7d 0a 09 09 09 20 20 20 20 20 20 7d 0a 09 }.... }..
13150 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 65 ..}... else
13160 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 63 68 61 ....{.... cha
13170 72 20 2a 6d 73 67 20 3d 0a 09 09 09 09 73 71 6c r *msg =.....sql
13180 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 09 ite3_mprintf....
13190 09 28 22 63 61 6c 6c 62 61 63 6b 5f 67 65 74 46 .("callback_getF
131a0 61 63 65 43 6f 6e 74 61 69 6e 69 6e 67 50 6f 69 aceContainingPoi
131b0 6e 74 20 23 32 3a 20 25 73 22 2c 0a 09 09 09 09 nt #2: %s",.....
131c0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 sqlite3_errmsg
131d0 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 (accessor->db_ha
131e0 6e 64 6c 65 29 29 3b 0a 09 09 09 20 20 20 20 67 ndle));.... g
131f0 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 aiatopo_set_last
13200 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f _error_msg (topo
13210 2c 20 6d 73 67 29 3b 0a 09 09 09 20 20 20 20 73 , msg);.... s
13220 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 qlite3_free (msg
13230 29 3b 0a 09 09 09 20 20 20 20 67 6f 74 6f 20 65 );.... goto e
13240 72 72 6f 72 3b 0a 09 09 09 7d 0a 09 09 20 20 7d rror;....}... }
13250 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 30 ...if (count > 0
13260 29 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 )... break;..
13270 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 }.. else..
13280 20 20 20 7b 0a 09 09 63 68 61 72 20 2a 6d 73 67 {...char *msg
13290 20 3d 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 =... sqlite3
132a0 5f 6d 70 72 69 6e 74 66 20 28 22 63 61 6c 6c 62 _mprintf ("callb
132b0 61 63 6b 5f 67 65 74 46 61 63 65 43 6f 6e 74 61 ack_getFaceConta
132c0 69 6e 69 6e 67 50 6f 69 6e 74 20 23 31 3a 20 25 iningPoint #1: %
132d0 73 22 2c 0a 09 09 09 09 20 20 20 20 20 73 71 6c s",..... sql
132e0 69 74 65 33 5f 65 72 72 6d 73 67 20 28 61 63 63 ite3_errmsg (acc
132f0 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 essor->db_handle
13300 29 29 3b 0a 09 09 67 61 69 61 74 6f 70 6f 5f 73 ));...gaiatopo_s
13310 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 et_last_error_ms
13320 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 g (topo, msg);..
13330 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d .sqlite3_free (m
13340 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f sg);...goto erro
13350 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 r;.. }.
13360 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 }.. sqlite3_r
13370 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 eset (stmt);.
13380 20 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 30 29 if (count == 0)
13390 0a 09 72 65 74 75 72 6e 20 2d 31 3b 09 09 2f 2a ..return -1;../*
133a0 20 6e 6f 6e 65 20 66 6f 75 6e 64 20 2a 2f 0a 20 none found */.
133b0 20 20 20 72 65 74 75 72 6e 20 66 61 63 65 5f 69 return face_i
133c0 64 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 d;.. error:.
133d0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 sqlite3_reset (
133e0 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 stmt);. retur
133f0 6e 20 2d 32 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c n -2;.}..int.cal
13400 6c 62 61 63 6b 5f 64 65 6c 65 74 65 45 64 67 65 lback_deleteEdge
13410 73 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f s (const RTT_BE_
13420 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 TOPOLOGY * rtt_t
13430 6f 70 6f 2c 0a 09 09 20 20 20 20 20 20 63 6f 6e opo,... con
13440 73 74 20 52 54 54 5f 49 53 4f 5f 45 44 47 45 20 st RTT_ISO_EDGE
13450 2a 20 73 65 6c 5f 65 64 67 65 2c 20 69 6e 74 20 * sel_edge, int
13460 73 65 6c 5f 66 69 65 6c 64 73 29 0a 7b 0a 2f 2a sel_fields).{./*
13470 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 callback functi
13480 6f 6e 3a 20 64 65 6c 65 74 65 45 64 67 65 73 74 on: deleteEdgest
13490 20 2a 2f 0a 20 20 20 20 47 61 69 61 54 6f 70 6f */. GaiaTopo
134a0 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 logyAccessorPtr
134b0 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f topo = (GaiaTopo
134c0 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 logyAccessorPtr)
134d0 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 rtt_topo;. s
134e0 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c truct gaia_topol
134f0 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 ogy *accessor =
13500 28 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 (struct gaia_top
13510 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 ology *) topo;.
13520 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 sqlite3_stmt
13530 2a 73 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *stmt = NULL;.
13540 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 int ret;. c
13550 68 61 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 har *sql;. ch
13560 61 72 20 2a 70 72 65 76 3b 0a 20 20 20 20 69 6e ar *prev;. in
13570 74 20 63 6f 6d 6d 61 20 3d 20 30 3b 0a 20 20 20 t comma = 0;.
13580 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20 char *table;.
13590 20 20 63 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a char *xtable;.
135a0 20 20 20 20 69 6e 74 20 69 63 6f 6c 20 3d 20 31 int icol = 1
135b0 3b 0a 20 20 20 20 69 6e 74 20 63 68 61 6e 67 65 ;. int change
135c0 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 61 d = 0;. if (a
135d0 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 ccessor == NULL)
135e0 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 2f 2a ..return -1;../*
135f0 20 63 6f 6d 70 6f 73 69 6e 67 20 74 68 65 20 53 composing the S
13600 51 4c 20 70 72 65 70 61 72 65 64 20 73 74 61 74 QL prepared stat
13610 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 74 61 62 ement */. tab
13620 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 le = sqlite3_mpr
13630 69 6e 74 66 20 28 22 25 73 5f 65 64 67 65 22 2c intf ("%s_edge",
13640 20 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c accessor->topol
13650 6f 67 79 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 78 ogy_name);. x
13660 74 61 62 6c 65 20 3d 20 67 61 69 61 44 6f 75 62 table = gaiaDoub
13670 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 74 61 62 leQuotedSql (tab
13680 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 le);. sqlite3
13690 5f 66 72 65 65 20 28 74 61 62 6c 65 29 3b 0a 20 _free (table);.
136a0 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
136b0 5f 6d 70 72 69 6e 74 66 20 28 22 44 45 4c 45 54 _mprintf ("DELET
136c0 45 20 46 52 4f 4d 20 4d 41 49 4e 2e 5c 22 25 73 E FROM MAIN.\"%s
136d0 5c 22 20 57 48 45 52 45 22 2c 20 78 74 61 62 6c \" WHERE", xtabl
136e0 65 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78 74 e);. free (xt
136f0 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 76 20 able);. prev
13700 3d 20 73 71 6c 3b 0a 20 20 20 20 69 66 20 28 73 = sql;. if (s
13710 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f el_fields & RTT_
13720 43 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f 49 44 COL_EDGE_EDGE_ID
13730 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
13740 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 (comma).. s
13750 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
13760 69 6e 74 66 20 28 22 25 73 20 41 4e 44 20 65 64 intf ("%s AND ed
13770 67 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 65 76 ge_id = ?", prev
13780 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 );.. else..
13790 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
137a0 6d 70 72 69 6e 74 66 20 28 22 25 73 20 65 64 67 mprintf ("%s edg
137b0 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 65 76 29 e_id = ?", prev)
137c0 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
137d0 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
137e0 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
137f0 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
13800 20 20 20 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 if (sel_field
13810 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
13820 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a 20 20 20 _START_NODE).
13830 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d {.. if (comm
13840 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 a).. sql =
13850 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
13860 28 22 25 73 20 41 4e 44 20 73 74 61 72 74 5f 6e ("%s AND start_n
13870 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b ode = ?", prev);
13880 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 .. else..
13890 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
138a0 72 69 6e 74 66 20 28 22 25 73 20 73 74 61 72 74 rintf ("%s start
138b0 5f 6e 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 _node = ?", prev
138c0 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b );.. comma = 1;
138d0 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
138e0 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 (prev);.. prev
138f0 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a = sql;. }.
13900 20 20 20 20 69 66 20 28 73 65 6c 5f 66 69 65 6c if (sel_fiel
13910 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
13920 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 20 20 20 20 E_END_NODE).
13930 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 {.. if (comma
13940 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 ).. sql = s
13950 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
13960 22 25 73 20 41 4e 44 20 65 6e 64 5f 6e 6f 64 65 "%s AND end_node
13970 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 = ?", prev);..
13980 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c else.. sql
13990 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
139a0 74 66 20 28 22 25 73 20 65 6e 64 5f 6e 6f 64 65 tf ("%s end_node
139b0 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 = ?", prev);..
139c0 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
139d0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
139e0 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
139f0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 l;. }. i
13a00 66 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 f (sel_fields &
13a10 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 RTT_COL_EDGE_FAC
13a20 45 5f 4c 45 46 54 29 0a 20 20 20 20 20 20 7b 0a E_LEFT). {.
13a30 09 20 20 69 66 20 28 73 65 6c 5f 65 64 67 65 2d . if (sel_edge-
13a40 3e 66 61 63 65 5f 6c 65 66 74 20 3c 20 30 29 0a >face_left < 0).
13a50 09 20 20 20 20 7b 0a 09 09 69 66 20 28 63 6f 6d . {...if (com
13a60 6d 61 29 0a 09 09 20 20 20 20 73 71 6c 20 3d 20 ma)... sql =
13a70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
13a80 28 22 25 73 20 41 4e 44 20 6c 65 66 74 5f 66 61 ("%s AND left_fa
13a90 63 65 20 49 53 20 4e 55 4c 4c 22 2c 20 70 72 65 ce IS NULL", pre
13aa0 76 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 v);...else...
13ab0 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
13ac0 70 72 69 6e 74 66 20 28 22 25 73 20 6c 65 66 74 printf ("%s left
13ad0 5f 66 61 63 65 20 49 53 20 4e 55 4c 4c 22 2c 20 _face IS NULL",
13ae0 70 72 65 76 29 3b 0a 09 20 20 20 20 7d 0a 09 20 prev);.. }..
13af0 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 else.. {...i
13b00 66 20 28 63 6f 6d 6d 61 29 0a 09 09 20 20 20 20 f (comma)...
13b10 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
13b20 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 20 6c rintf ("%s AND l
13b30 65 66 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 eft_face = ?", p
13b40 72 65 76 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 rev);...else...
13b50 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
13b60 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6c 65 _mprintf ("%s le
13b70 66 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 ft_face = ?", pr
13b80 65 76 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 63 ev);.. }.. c
13b90 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c omma = 1;.. sql
13ba0 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 ite3_free (prev)
13bb0 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b ;.. prev = sql;
13bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 . }. if
13bd0 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 (sel_fields & RT
13be0 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f T_COL_EDGE_FACE_
13bf0 52 49 47 48 54 29 0a 20 20 20 20 20 20 7b 0a 09 RIGHT). {..
13c00 20 20 69 66 20 28 73 65 6c 5f 65 64 67 65 2d 3e if (sel_edge->
13c10 66 61 63 65 5f 72 69 67 68 74 20 3c 20 30 29 0a face_right < 0).
13c20 09 20 20 20 20 7b 0a 09 09 69 66 20 28 63 6f 6d . {...if (com
13c30 6d 61 29 0a 09 09 20 20 20 20 73 71 6c 20 3d 20 ma)... sql =
13c40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
13c50 28 22 25 73 20 41 4e 44 20 72 69 67 68 74 5f 66 ("%s AND right_f
13c60 61 63 65 20 49 53 20 4e 55 4c 4c 22 2c 20 70 72 ace IS NULL", pr
13c70 65 76 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 ev);...else...
13c80 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
13c90 6d 70 72 69 6e 74 66 20 28 22 25 73 20 72 69 67 mprintf ("%s rig
13ca0 68 74 5f 66 61 63 65 20 49 53 20 4e 55 4c 4c 22 ht_face IS NULL"
13cb0 2c 20 70 72 65 76 29 3b 0a 09 20 20 20 20 7d 0a , prev);.. }.
13cc0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 . else.. {..
13cd0 09 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 20 20 .if (comma)...
13ce0 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
13cf0 6d 70 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 mprintf ("%s AND
13d00 20 72 69 67 68 74 5f 66 61 63 65 20 3d 20 3f 22 right_face = ?"
13d10 2c 20 70 72 65 76 29 3b 0a 09 09 65 6c 73 65 0a , prev);...else.
13d20 09 09 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 .. sql = sqli
13d30 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
13d40 20 72 69 67 68 74 5f 66 61 63 65 20 3d 20 3f 22 right_face = ?"
13d50 2c 20 70 72 65 76 29 3b 0a 09 20 20 20 20 7d 0a , prev);.. }.
13d60 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 . comma = 1;..
13d70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 sqlite3_free (p
13d80 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 rev);.. prev =
13d90 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 sql;. }.
13da0 20 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 if (sel_fields
13db0 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e & RTT_COL_EDGE_N
13dc0 45 58 54 5f 4c 45 46 54 29 0a 20 20 20 20 20 20 EXT_LEFT).
13dd0 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a {.. if (comma).
13de0 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c . sql = sql
13df0 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
13e00 73 20 41 4e 44 20 6e 65 78 74 5f 6c 65 66 74 5f s AND next_left_
13e10 65 64 67 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 edge = ?", prev)
13e20 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
13e30 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
13e40 70 72 69 6e 74 66 20 28 22 25 73 20 6e 65 78 74 printf ("%s next
13e50 5f 6c 65 66 74 5f 65 64 67 65 20 3d 20 3f 22 2c _left_edge = ?",
13e60 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 prev);.. comma
13e70 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 = 1;.. sqlite3
13e80 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 _free (prev);..
13e90 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
13ea0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 65 6c }. if (sel
13eb0 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f _fields & RTT_CO
13ec0 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 47 48 L_EDGE_NEXT_RIGH
13ed0 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 T). {.. if
13ee0 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 (comma)..
13ef0 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
13f00 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 20 6e rintf ("%s AND n
13f10 65 78 74 5f 72 69 67 68 74 5f 65 64 67 65 20 3d ext_right_edge =
13f20 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 ?", prev);.. e
13f30 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d lse.. sql =
13f40 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
13f50 20 28 22 25 73 20 6e 65 78 74 5f 72 69 67 68 74 ("%s next_right
13f60 5f 65 64 67 65 20 3d 20 3f 22 2c 20 70 72 65 76 _edge = ?", prev
13f70 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b );.. comma = 1;
13f80 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
13f90 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 (prev);.. prev
13fa0 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a = sql;. }.
13fb0 20 20 20 20 69 66 20 28 73 65 6c 5f 66 69 65 6c if (sel_fiel
13fc0 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
13fd0 45 5f 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b 0a E_GEOM). {.
13fe0 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 . if (comma)..
13ff0 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
14000 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
14010 41 4e 44 20 67 65 6f 6d 20 3d 20 3f 22 2c 20 70 AND geom = ?", p
14020 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 rev);.. else..
14030 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
14040 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
14050 67 65 6f 6d 20 3d 20 3f 22 2c 20 70 72 65 76 29 geom = ?", prev)
14060 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
14070 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
14080 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
14090 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
140a0 20 20 20 72 65 74 20 3d 0a 09 73 71 6c 69 74 65 ret =..sqlite
140b0 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28 61 63 3_prepare_v2 (ac
140c0 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c cessor->db_handl
140d0 65 2c 20 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28 e, sql, strlen (
140e0 73 71 6c 29 2c 20 26 73 74 6d 74 2c 0a 09 09 09 sql), &stmt,....
140f0 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 NULL);. s
14100 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c qlite3_free (sql
14110 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 );. if (ret !
14120 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 = SQLITE_OK).
14130 20 20 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d 73 {.. char *ms
14140 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 g = sqlite3_mpri
14150 6e 74 66 20 28 22 50 72 65 70 61 72 65 5f 64 65 ntf ("Prepare_de
14160 6c 65 74 65 45 64 67 65 73 20 65 72 72 6f 72 3a leteEdges error:
14170 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 20 20 \"%s\"",.....
14180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 sqlite3_err
14190 6d 73 67 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 msg (accessor->d
141a0 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 20 20 67 b_handle));.. g
141b0 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 aiatopo_set_last
141c0 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f _error_msg (topo
141d0 2c 20 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 , msg);.. sqlit
141e0 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 e3_free (msg);..
141f0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 return -1;.
14200 20 20 20 7d 0a 0a 2f 2a 20 70 61 72 61 6d 65 74 }../* paramet
14210 65 72 20 62 69 6e 64 69 6e 67 20 2a 2f 0a 20 20 er binding */.
14220 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 sqlite3_reset
14230 28 73 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 (stmt);. sqli
14240 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e te3_clear_bindin
14250 67 73 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 gs (stmt);. i
14260 66 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 f (sel_fields &
14270 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 44 47 RTT_COL_EDGE_EDG
14280 45 5f 49 44 29 0a 20 20 20 20 20 20 7b 0a 09 20 E_ID). {..
14290 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
142a0 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c t64 (stmt, icol,
142b0 20 73 65 6c 5f 65 64 67 65 2d 3e 65 64 67 65 5f sel_edge->edge_
142c0 69 64 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b 0a id);.. icol++;.
142d0 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. if (
142e0 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 sel_fields & RTT
142f0 5f 43 4f 4c 5f 45 44 47 45 5f 53 54 41 52 54 5f _COL_EDGE_START_
14300 4e 4f 44 45 29 0a 20 20 20 20 20 20 7b 0a 09 20 NODE). {..
14310 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
14320 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c t64 (stmt, icol,
14330 20 73 65 6c 5f 65 64 67 65 2d 3e 73 74 61 72 74 sel_edge->start
14340 5f 6e 6f 64 65 29 3b 0a 09 20 20 69 63 6f 6c 2b _node);.. icol+
14350 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 +;. }. i
14360 66 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 f (sel_fields &
14370 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 4e 44 RTT_COL_EDGE_END
14380 5f 4e 4f 44 45 29 0a 20 20 20 20 20 20 7b 0a 09 _NODE). {..
14390 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
143a0 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c nt64 (stmt, icol
143b0 2c 20 73 65 6c 5f 65 64 67 65 2d 3e 65 6e 64 5f , sel_edge->end_
143c0 6e 6f 64 65 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b node);.. icol++
143d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 ;. }. if
143e0 20 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 (sel_fields & R
143f0 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 TT_COL_EDGE_FACE
14400 5f 4c 45 46 54 29 0a 20 20 20 20 20 20 7b 0a 09 _LEFT). {..
14410 20 20 69 66 20 28 73 65 6c 5f 65 64 67 65 2d 3e if (sel_edge->
14420 66 61 63 65 5f 6c 65 66 74 20 3c 20 30 29 0a 09 face_left < 0)..
14430 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 sqlite3_bi
14440 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 69 nd_null (stmt, i
14450 63 6f 6c 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 col);.. else..
14460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
14470 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 d_int64 (stmt, i
14480 63 6f 6c 2c 20 73 65 6c 5f 65 64 67 65 2d 3e 66 col, sel_edge->f
14490 61 63 65 5f 6c 65 66 74 29 3b 0a 09 20 20 69 63 ace_left);.. ic
144a0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ol++;. }.
144b0 20 20 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 73 if (sel_fields
144c0 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
144d0 46 41 43 45 5f 52 49 47 48 54 29 0a 20 20 20 20 FACE_RIGHT).
144e0 20 20 7b 0a 09 20 20 69 66 20 28 73 65 6c 5f 65 {.. if (sel_e
144f0 64 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 74 20 dge->face_right
14500 3c 20 30 29 0a 09 20 20 20 20 20 20 73 71 6c 69 < 0).. sqli
14510 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 te3_bind_null (s
14520 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 20 20 65 tmt, icol);.. e
14530 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 69 74 lse.. sqlit
14540 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 e3_bind_int64 (s
14550 74 6d 74 2c 20 69 63 6f 6c 2c 20 73 65 6c 5f 65 tmt, icol, sel_e
14560 64 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 74 29 dge->face_right)
14570 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 ;.. icol++;.
14580 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 65 6c }. if (sel
14590 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f _fields & RTT_CO
145a0 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 4c 45 46 54 L_EDGE_NEXT_LEFT
145b0 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c ). {.. sql
145c0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
145d0 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 73 65 6c (stmt, icol, sel
145e0 5f 65 64 67 65 2d 3e 6e 65 78 74 5f 6c 65 66 74 _edge->next_left
145f0 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 );.. icol++;.
14600 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 65 }. if (se
14610 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 l_fields & RTT_C
14620 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 47 OL_EDGE_NEXT_RIG
14630 48 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 73 HT). {.. s
14640 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 qlite3_bind_int6
14650 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 73 4 (stmt, icol, s
14660 65 6c 5f 65 64 67 65 2d 3e 6e 65 78 74 5f 72 69 el_edge->next_ri
14670 67 68 74 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b ght);.. icol++;
14680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 . }. ret
14690 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 = sqlite3_step
146a0 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 (stmt);. if (
146b0 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f ret == SQLITE_DO
146c0 4e 45 20 7c 7c 20 72 65 74 20 3d 3d 20 53 51 4c NE || ret == SQL
146d0 49 54 45 5f 52 4f 57 29 0a 09 63 68 61 6e 67 65 ITE_ROW)..change
146e0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 68 61 6e d = sqlite3_chan
146f0 67 65 73 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 ges (accessor->d
14700 62 5f 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 65 b_handle);. e
14710 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 lse. {.. c
14720 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c 69 74 har *msg = sqlit
14730 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 63 61 6c e3_mprintf ("cal
14740 6c 62 61 63 6b 5f 64 65 6c 65 74 65 45 64 67 65 lback_deleteEdge
14750 73 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 s: \"%s\"",.....
14760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 sqlite3_e
14770 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f 72 2d rrmsg (accessor-
14780 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 20 >db_handle));..
14790 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 gaiatopo_set_la
147a0 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f st_error_msg (to
147b0 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 73 71 6c po, msg);.. sql
147c0 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b ite3_free (msg);
147d0 0a 09 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a .. goto error;.
147e0 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 }. sqli
147f0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 te3_finalize (st
14800 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 mt);. return
14810 63 68 61 6e 67 65 64 3b 0a 0a 20 20 65 72 72 6f changed;.. erro
14820 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 r:. sqlite3_f
14830 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a inalize (stmt);.
14840 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d return -1;.}
14850 0a 0a 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a ..RTT_ISO_NODE *
14860 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 .callback_getNod
14870 65 57 69 74 68 69 6e 42 6f 78 32 44 20 28 63 6f eWithinBox2D (co
14880 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c nst RTT_BE_TOPOL
14890 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 0a OGY * rtt_topo,.
148a0 09 09 09 20 20 20 20 20 63 6f 6e 73 74 20 52 54 ... const RT
148b0 47 42 4f 58 20 2a 20 62 6f 78 2c 20 69 6e 74 20 GBOX * box, int
148c0 2a 6e 75 6d 65 6c 65 6d 73 2c 0a 09 09 09 20 20 *numelems,....
148d0 20 20 20 69 6e 74 20 66 69 65 6c 64 73 2c 20 69 int fields, i
148e0 6e 74 20 6c 69 6d 69 74 29 0a 7b 0a 2f 2a 20 63 nt limit).{./* c
148f0 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e allback function
14900 3a 20 67 65 74 4e 6f 64 65 57 69 74 68 69 6e 42 : getNodeWithinB
14910 6f 78 32 44 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 ox2D */. cons
14920 74 20 52 54 43 54 58 20 2a 63 74 78 20 3d 20 4e t RTCTX *ctx = N
14930 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 ULL;. struct
14940 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f splite_internal_
14950 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 4e cache *cache = N
14960 55 4c 4c 3b 0a 20 20 20 20 47 61 69 61 54 6f 70 ULL;. GaiaTop
14970 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 ologyAccessorPtr
14980 20 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 topo = (GaiaTop
14990 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 ologyAccessorPtr
149a0 29 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 ) rtt_topo;.
149b0 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f struct gaia_topo
149c0 6c 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d logy *accessor =
149d0 20 28 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f (struct gaia_to
149e0 70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a pology *) topo;.
149f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
14a00 20 2a 73 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 *stmt;. int
14a10 72 65 74 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 ret;. RTPOINT
14a20 41 52 52 41 59 20 2a 70 61 3b 0a 20 20 20 20 52 ARRAY *pa;. R
14a30 54 50 4f 49 4e 54 34 44 20 70 74 34 64 3b 0a 20 TPOINT4D pt4d;.
14a40 20 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 int count = 0
14a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 ;. sqlite3_st
14a60 6d 74 20 2a 73 74 6d 74 5f 61 75 78 20 3d 20 4e mt *stmt_aux = N
14a70 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 ULL;. char *s
14a80 71 6c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 ql;. struct t
14a90 6f 70 6f 5f 6e 6f 64 65 73 5f 6c 69 73 74 20 2a opo_nodes_list *
14aa0 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 list = NULL;.
14ab0 20 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a 72 RTT_ISO_NODE *r
14ac0 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 esult = NULL;.
14ad0 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 20 3d if (accessor =
14ae0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a = NULL). {.
14af0 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d . *numelems = -
14b00 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 1;.. return NUL
14b10 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 L;. }..
14b20 73 74 6d 74 20 3d 20 61 63 63 65 73 73 6f 72 2d stmt = accessor-
14b30 3e 73 74 6d 74 5f 67 65 74 4e 6f 64 65 57 69 74 >stmt_getNodeWit
14b40 68 69 6e 42 6f 78 32 44 3b 0a 20 20 20 20 69 66 hinBox2D;. if
14b50 20 28 73 74 6d 74 20 3d 3d 20 4e 55 4c 4c 29 0a (stmt == NULL).
14b60 20 20 20 20 20 20 7b 0a 09 20 20 2a 6e 75 6d 65 {.. *nume
14b70 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 20 72 65 lems = -1;.. re
14b80 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 turn NULL;.
14b90 20 7d 0a 0a 20 20 20 20 63 61 63 68 65 20 3d 20 }.. cache =
14ba0 28 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 (struct splite_i
14bb0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 29 nternal_cache *)
14bc0 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 68 65 accessor->cache
14bd0 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 20 ;. if (cache
14be0 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e == NULL)..return
14bf0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
14c00 61 63 68 65 2d 3e 6d 61 67 69 63 31 20 21 3d 20 ache->magic1 !=
14c10 53 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 SPATIALITE_CACHE
14c20 5f 4d 41 47 49 43 31 0a 09 7c 7c 20 63 61 63 68 _MAGIC1..|| cach
14c30 65 2d 3e 6d 61 67 69 63 32 20 21 3d 20 53 50 41 e->magic2 != SPA
14c40 54 49 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 TIALITE_CACHE_MA
14c50 47 49 43 32 29 0a 09 72 65 74 75 72 6e 20 4e 55 GIC2)..return NU
14c60 4c 4c 3b 0a 20 20 20 20 63 74 78 20 3d 20 63 61 LL;. ctx = ca
14c70 63 68 65 2d 3e 52 54 54 4f 50 4f 5f 68 61 6e 64 che->RTTOPO_hand
14c80 6c 65 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 le;. if (ctx
14c90 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e == NULL)..return
14ca0 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 NULL;.. if (
14cb0 6c 69 6d 69 74 20 3e 3d 20 30 29 0a 20 20 20 20 limit >= 0).
14cc0 20 20 7b 0a 09 20 20 2f 2a 20 70 72 65 70 61 72 {.. /* prepar
14cd0 69 6e 67 20 74 68 65 20 61 75 78 69 6c 69 61 72 ing the auxiliar
14ce0 79 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 y SQL statement
14cf0 2a 2f 0a 09 20 20 73 71 6c 20 3d 0a 09 20 20 20 */.. sql =..
14d00 20 20 20 64 6f 5f 70 72 65 70 61 72 65 5f 72 65 do_prepare_re
14d10 61 64 5f 6e 6f 64 65 20 28 61 63 63 65 73 73 6f ad_node (accesso
14d20 72 2d 3e 74 6f 70 6f 6c 6f 67 79 5f 6e 61 6d 65 r->topology_name
14d30 2c 20 66 69 65 6c 64 73 2c 0a 09 09 09 09 20 20 , fields,.....
14d40 20 20 61 63 63 65 73 73 6f 72 2d 3e 68 61 73 5f accessor->has_
14d50 7a 29 3b 0a 09 20 20 72 65 74 20 3d 0a 09 20 20 z);.. ret =..
14d60 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 sqlite3_prep
14d70 61 72 65 5f 76 32 20 28 61 63 63 65 73 73 6f 72 are_v2 (accessor
14d80 2d 3e 64 62 5f 68 61 6e 64 6c 65 2c 20 73 71 6c ->db_handle, sql
14d90 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 0a , strlen (sql),.
14da0 09 09 09 09 20 20 26 73 74 6d 74 5f 61 75 78 2c .... &stmt_aux,
14db0 20 4e 55 4c 4c 29 3b 0a 09 20 20 73 71 6c 69 74 NULL);.. sqlit
14dc0 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 09 e3_free (sql);..
14dd0 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 4c if (ret != SQL
14de0 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 7b 0a 09 ITE_OK).. {..
14df0 09 63 68 61 72 20 2a 6d 73 67 20 3d 0a 09 09 20 .char *msg =...
14e00 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e sqlite3_mprin
14e10 74 66 0a 09 09 20 20 20 20 28 22 50 72 65 70 61 tf... ("Prepa
14e20 72 65 5f 67 65 74 4e 6f 64 65 57 69 74 68 69 6e re_getNodeWithin
14e30 42 6f 78 32 44 20 41 55 58 20 65 72 72 6f 72 3a Box2D AUX error:
14e40 20 5c 22 25 73 5c 22 22 2c 0a 09 09 20 20 20 20 \"%s\"",...
14e50 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 sqlite3_errmsg
14e60 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 (accessor->db_ha
14e70 6e 64 6c 65 29 29 3b 0a 09 09 67 61 69 61 74 6f ndle));...gaiato
14e80 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f po_set_last_erro
14e90 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 r_msg (topo, msg
14ea0 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 );...sqlite3_fre
14eb0 65 20 28 6d 73 67 29 3b 0a 09 09 2a 6e 75 6d 65 e (msg);...*nume
14ec0 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 09 72 65 74 lems = -1;...ret
14ed0 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d urn NULL;.. }
14ee0 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 73 65 74 . }../* set
14ef0 74 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 70 ting up the prep
14f00 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a ared statement *
14f10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 /. sqlite3_re
14f20 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 set (stmt);.
14f30 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 sqlite3_clear_bi
14f40 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a 20 ndings (stmt);.
14f50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
14f60 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 31 2c double (stmt, 1,
14f70 20 62 6f 78 2d 3e 78 6d 69 6e 29 3b 0a 20 20 20 box->xmin);.
14f80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f sqlite3_bind_do
14f90 75 62 6c 65 20 28 73 74 6d 74 2c 20 32 2c 20 62 uble (stmt, 2, b
14fa0 6f 78 2d 3e 79 6d 69 6e 29 3b 0a 20 20 20 20 73 ox->ymin);. s
14fb0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 qlite3_bind_doub
14fc0 6c 65 20 28 73 74 6d 74 2c 20 33 2c 20 62 6f 78 le (stmt, 3, box
14fd0 2d 3e 78 6d 61 78 29 3b 0a 20 20 20 20 73 71 6c ->xmax);. sql
14fe0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 ite3_bind_double
14ff0 20 28 73 74 6d 74 2c 20 34 2c 20 62 6f 78 2d 3e (stmt, 4, box->
15000 79 6d 61 78 29 3b 0a 20 20 20 20 6c 69 73 74 20 ymax);. list
15010 3d 20 63 72 65 61 74 65 5f 6e 6f 64 65 73 5f 6c = create_nodes_l
15020 69 73 74 20 28 29 3b 0a 0a 20 20 20 20 77 68 69 ist ();.. whi
15030 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 le (1). {..
15040 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 74 /* scrolling t
15050 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 6f he result set ro
15060 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 73 ws */.. ret = s
15070 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 6d qlite3_step (stm
15080 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 3d t);.. if (ret =
15090 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a 09 = SQLITE_DONE)..
150a0 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f 2a break;../*
150b0 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 73 end of result s
150c0 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 74 et */.. if (ret
150d0 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a == SQLITE_ROW).
150e0 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 . {...sqlite3
150f0 5f 69 6e 74 36 34 20 6e 6f 64 65 5f 69 64 20 3d _int64 node_id =
15100 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
15110 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 30 29 3b int64 (stmt, 0);
15120 0a 09 09 69 66 20 28 73 74 6d 74 5f 61 75 78 20 ...if (stmt_aux
15130 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 != NULL)... {..
15140 09 20 20 20 20 20 20 63 68 61 72 20 2a 6d 73 67 . char *msg
15150 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 21 64 ;... if (!d
15160 6f 5f 72 65 61 64 5f 6e 6f 64 65 0a 09 09 09 20 o_read_node....
15170 20 28 73 74 6d 74 5f 61 75 78 2c 20 6c 69 73 74 (stmt_aux, list
15180 2c 20 6e 6f 64 65 5f 69 64 2c 20 66 69 65 6c 64 , node_id, field
15190 73 2c 20 61 63 63 65 73 73 6f 72 2d 3e 68 61 73 s, accessor->has
151a0 5f 7a 2c 0a 09 09 09 20 20 20 22 63 61 6c 6c 62 _z,.... "callb
151b0 61 63 6b 5f 67 65 74 4e 6f 64 65 57 69 74 68 69 ack_getNodeWithi
151c0 6e 42 6f 78 32 44 22 2c 20 26 6d 73 67 29 29 0a nBox2D", &msg)).
151d0 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 69 61 ...{.... gaia
151e0 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 topo_set_last_er
151f0 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d ror_msg (topo, m
15200 73 67 29 3b 0a 09 09 09 20 20 20 20 73 71 6c 69 sg);.... sqli
15210 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a te3_free (msg);.
15220 09 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f ... goto erro
15230 72 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 r;....}... }...
15240 63 6f 75 6e 74 2b 2b 3b 0a 09 09 69 66 20 28 6c count++;...if (l
15250 69 6d 69 74 20 3e 20 30 29 0a 09 09 20 20 7b 0a imit > 0)... {.
15260 09 09 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e .. if (coun
15270 74 20 3e 20 6c 69 6d 69 74 29 0a 09 09 09 20 20 t > limit)....
15280 62 72 65 61 6b 3b 0a 09 09 20 20 7d 0a 09 09 69 break;... }...i
15290 66 20 28 6c 69 6d 69 74 20 3c 20 30 29 0a 09 09 f (limit < 0)...
152a0 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 20 20 break;..
152b0 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b }.. else.. {
152c0 0a 09 09 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 ...char *msg = s
152d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
152e0 22 63 61 6c 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 "callback_getNod
152f0 65 57 69 74 68 69 6e 42 6f 78 32 44 3a 20 25 73 eWithinBox2D: %s
15300 22 2c 0a 09 09 09 09 09 20 20 20 20 20 73 71 6c ",...... sql
15310 69 74 65 33 5f 65 72 72 6d 73 67 0a 09 09 09 09 ite3_errmsg.....
15320 09 20 20 20 20 20 28 61 63 63 65 73 73 6f 72 2d . (accessor-
15330 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 >db_handle));...
15340 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 gaiatopo_set_las
15350 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 t_error_msg (top
15360 6f 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 o, msg);...sqlit
15370 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 e3_free (msg);..
15380 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 .goto error;..
15390 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 }. }..
153a0 20 69 66 20 28 6c 69 6d 69 74 20 3c 20 30 29 0a if (limit < 0).
153b0 20 20 20 20 20 20 7b 0a 09 20 20 72 65 73 75 6c {.. resul
153c0 74 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 2a 6e 75 t = NULL;.. *nu
153d0 6d 65 6c 65 6d 73 20 3d 20 63 6f 75 6e 74 3b 0a melems = count;.
153e0 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 }. else
153f0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
15400 6c 69 73 74 2d 3e 63 6f 75 6e 74 20 3c 3d 20 30 list->count <= 0
15410 29 0a 09 20 20 20 20 7b 0a 09 09 72 65 73 75 6c ).. {...resul
15420 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 2a 6e 75 6d t = NULL;...*num
15430 65 6c 65 6d 73 20 3d 20 30 3b 0a 09 20 20 20 20 elems = 0;..
15440 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b }.. else.. {
15450 0a 09 09 69 6e 74 20 69 20 3d 20 30 3b 0a 09 09 ...int i = 0;...
15460 73 74 72 75 63 74 20 74 6f 70 6f 5f 6e 6f 64 65 struct topo_node
15470 20 2a 70 5f 6e 64 3b 0a 09 09 72 65 73 75 6c 74 *p_nd;...result
15480 20 3d 20 72 74 61 6c 6c 6f 63 20 28 63 74 78 2c = rtalloc (ctx,
15490 20 73 69 7a 65 6f 66 20 28 52 54 54 5f 49 53 4f sizeof (RTT_ISO
154a0 5f 4e 4f 44 45 29 20 2a 20 6c 69 73 74 2d 3e 63 _NODE) * list->c
154b0 6f 75 6e 74 29 3b 0a 09 09 70 5f 6e 64 20 3d 20 ount);...p_nd =
154c0 6c 69 73 74 2d 3e 66 69 72 73 74 3b 0a 09 09 77 list->first;...w
154d0 68 69 6c 65 20 28 70 5f 6e 64 20 21 3d 20 4e 55 hile (p_nd != NU
154e0 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 LL)... {...
154f0 20 20 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a RTT_ISO_NODE *
15500 6e 64 20 3d 20 72 65 73 75 6c 74 20 2b 20 69 3b nd = result + i;
15510 0a 09 09 20 20 20 20 20 20 69 66 20 28 66 69 65 ... if (fie
15520 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f lds & RTT_COL_NO
15530 44 45 5f 4e 4f 44 45 5f 49 44 29 0a 09 09 09 20 DE_NODE_ID)....
15540 20 6e 64 2d 3e 6e 6f 64 65 5f 69 64 20 3d 20 70 nd->node_id = p
15550 5f 6e 64 2d 3e 6e 6f 64 65 5f 69 64 3b 0a 09 09 _nd->node_id;...
15560 20 20 20 20 20 20 69 66 20 28 66 69 65 6c 64 73 if (fields
15570 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f & RTT_COL_NODE_
15580 43 4f 4e 54 41 49 4e 49 4e 47 5f 46 41 43 45 29 CONTAINING_FACE)
15590 0a 09 09 09 20 20 6e 64 2d 3e 63 6f 6e 74 61 69 .... nd->contai
155a0 6e 69 6e 67 5f 66 61 63 65 20 3d 20 70 5f 6e 64 ning_face = p_nd
155b0 2d 3e 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 ->containing_fac
155c0 65 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 66 e;... if (f
155d0 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
155e0 4e 4f 44 45 5f 47 45 4f 4d 29 0a 09 09 09 7b 0a NODE_GEOM)....{.
155f0 09 09 09 20 20 20 20 70 61 20 3d 20 70 74 61 72 ... pa = ptar
15600 72 61 79 5f 63 6f 6e 73 74 72 75 63 74 20 28 63 ray_construct (c
15610 74 78 2c 20 61 63 63 65 73 73 6f 72 2d 3e 68 61 tx, accessor->ha
15620 73 5f 7a 2c 20 30 2c 20 31 29 3b 0a 09 09 09 20 s_z, 0, 1);....
15630 20 20 20 70 74 34 64 2e 78 20 3d 20 70 5f 6e 64 pt4d.x = p_nd
15640 2d 3e 78 3b 0a 09 09 09 20 20 20 20 70 74 34 64 ->x;.... pt4d
15650 2e 79 20 3d 20 70 5f 6e 64 2d 3e 79 3b 0a 09 09 .y = p_nd->y;...
15660 09 20 20 20 20 69 66 20 28 61 63 63 65 73 73 6f . if (accesso
15670 72 2d 3e 68 61 73 5f 7a 29 0a 09 09 09 09 70 74 r->has_z).....pt
15680 34 64 2e 7a 20 3d 20 70 5f 6e 64 2d 3e 7a 3b 0a 4d.z = p_nd->z;.
15690 09 09 09 20 20 20 20 70 74 61 72 72 61 79 5f 73 ... ptarray_s
156a0 65 74 5f 70 6f 69 6e 74 34 64 20 28 63 74 78 2c et_point4d (ctx,
156b0 20 70 61 2c 20 30 2c 20 26 70 74 34 64 29 3b 0a pa, 0, &pt4d);.
156c0 09 09 09 20 20 20 20 6e 64 2d 3e 67 65 6f 6d 20 ... nd->geom
156d0 3d 0a 09 09 09 09 72 74 70 6f 69 6e 74 5f 63 6f =.....rtpoint_co
156e0 6e 73 74 72 75 63 74 20 28 63 74 78 2c 20 61 63 nstruct (ctx, ac
156f0 63 65 73 73 6f 72 2d 3e 73 72 69 64 2c 20 4e 55 cessor->srid, NU
15700 4c 4c 2c 0a 09 09 09 09 09 09 20 20 20 70 61 29 LL,....... pa)
15710 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 69 ;....}... i
15720 2b 2b 3b 0a 09 09 20 20 20 20 20 20 70 5f 6e 64 ++;... p_nd
15730 20 3d 20 70 5f 6e 64 2d 3e 6e 65 78 74 3b 0a 09 = p_nd->next;..
15740 09 20 20 7d 0a 09 09 2a 6e 75 6d 65 6c 65 6d 73 . }...*numelems
15750 20 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a = list->count;.
15760 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a . }. }..
15770 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 sqlite3_rese
15780 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 t (stmt);. if
15790 20 28 73 74 6d 74 5f 61 75 78 20 21 3d 20 4e 55 (stmt_aux != NU
157a0 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 66 69 6e LL)..sqlite3_fin
157b0 61 6c 69 7a 65 20 28 73 74 6d 74 5f 61 75 78 29 alize (stmt_aux)
157c0 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 5f 6e 6f ;. destroy_no
157d0 64 65 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b des_list (list);
157e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 . return resu
157f0 6c 74 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 lt;.. error:.
15800 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 sqlite3_reset
15810 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 (stmt);. if (
15820 73 74 6d 74 5f 61 75 78 20 21 3d 20 4e 55 4c 4c stmt_aux != NULL
15830 29 0a 09 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c )..sqlite3_final
15840 69 7a 65 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a ize (stmt_aux);.
15850 20 20 20 20 69 66 20 28 6c 69 73 74 20 21 3d 20 if (list !=
15860 4e 55 4c 4c 29 0a 09 64 65 73 74 72 6f 79 5f 6e NULL)..destroy_n
15870 6f 64 65 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 odes_list (list)
15880 3b 0a 20 20 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 ;. *numelems
15890 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 = 1;. return
158a0 4e 55 4c 4c 3b 0a 7d 0a 0a 52 54 54 5f 49 53 4f NULL;.}..RTT_ISO
158b0 5f 45 44 47 45 20 2a 0a 63 61 6c 6c 62 61 63 6b _EDGE *.callback
158c0 5f 67 65 74 45 64 67 65 57 69 74 68 69 6e 42 6f _getEdgeWithinBo
158d0 78 32 44 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 x2D (const RTT_B
158e0 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 E_TOPOLOGY * rtt
158f0 5f 74 6f 70 6f 2c 0a 09 09 09 20 20 20 20 20 63 _topo,.... c
15900 6f 6e 73 74 20 52 54 47 42 4f 58 20 2a 20 62 6f onst RTGBOX * bo
15910 78 2c 20 69 6e 74 20 2a 6e 75 6d 65 6c 65 6d 73 x, int *numelems
15920 2c 0a 09 09 09 20 20 20 20 20 69 6e 74 20 66 69 ,.... int fi
15930 65 6c 64 73 2c 20 69 6e 74 20 6c 69 6d 69 74 29 elds, int limit)
15940 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 .{./* callback f
15950 75 6e 63 74 69 6f 6e 3a 20 67 65 74 45 64 67 65 unction: getEdge
15960 57 69 74 68 69 6e 42 6f 78 32 44 20 2a 2f 0a 20 WithinBox2D */.
15970 20 20 20 63 6f 6e 73 74 20 52 54 43 54 58 20 2a const RTCTX *
15980 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ctx = NULL;.
15990 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e struct splite_in
159a0 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 ternal_cache *ca
159b0 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 che = NULL;.
159c0 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 GaiaTopologyAcce
159d0 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 ssorPtr topo = (
159e0 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 GaiaTopologyAcce
159f0 73 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f 70 ssorPtr) rtt_top
15a00 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 o;. struct ga
15a10 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 ia_topology *acc
15a20 65 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 20 essor = (struct
15a30 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 gaia_topology *)
15a40 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 74 topo;. sqlit
15a50 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b 0a 20 e3_stmt *stmt;.
15a60 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 int ret;.
15a70 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 int count = 0;.
15a80 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 sqlite3_stmt
15a90 2a 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 4c 4c *stmt_aux = NULL
15aa0 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b ;. char *sql;
15ab0 0a 20 20 20 20 73 74 72 75 63 74 20 74 6f 70 6f . struct topo
15ac0 5f 65 64 67 65 73 5f 6c 69 73 74 20 2a 6c 69 73 _edges_list *lis
15ad0 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 52 54 t = NULL;. RT
15ae0 54 5f 49 53 4f 5f 45 44 47 45 20 2a 72 65 73 75 T_ISO_EDGE *resu
15af0 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 lt = NULL;..
15b00 69 66 20 28 62 6f 78 20 3d 3d 20 4e 55 4c 4c 29 if (box == NULL)
15b10 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 73 . {.. /* s
15b20 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20 69 67 pecial case - ig
15b30 6e 6f 72 69 6e 67 20 74 68 65 20 53 70 61 74 69 noring the Spati
15b40 61 6c 20 49 6e 64 65 78 20 61 6e 64 20 72 65 74 al Index and ret
15b50 75 72 6e 69 6e 67 20 41 4c 4c 20 65 64 67 65 73 urning ALL edges
15b60 20 2a 2f 0a 09 20 20 72 65 74 75 72 6e 20 63 61 */.. return ca
15b70 6c 6c 62 61 63 6b 5f 67 65 74 41 6c 6c 45 64 67 llback_getAllEdg
15b80 65 73 20 28 72 74 74 5f 74 6f 70 6f 2c 20 6e 75 es (rtt_topo, nu
15b90 6d 65 6c 65 6d 73 2c 20 66 69 65 6c 64 73 2c 20 melems, fields,
15ba0 6c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a limit);. }.
15bb0 0a 20 20 20 20 69 66 20 28 61 63 63 65 73 73 6f . if (accesso
15bc0 72 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 r == NULL).
15bd0 20 7b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 {.. *numelems
15be0 3d 20 2d 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 = -1;.. return
15bf0 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 NULL;. }..
15c00 20 20 20 73 74 6d 74 20 3d 20 61 63 63 65 73 73 stmt = access
15c10 6f 72 2d 3e 73 74 6d 74 5f 67 65 74 45 64 67 65 or->stmt_getEdge
15c20 57 69 74 68 69 6e 42 6f 78 32 44 3b 0a 20 20 20 WithinBox2D;.
15c30 20 69 66 20 28 73 74 6d 74 20 3d 3d 20 4e 55 4c if (stmt == NUL
15c40 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 6e L). {.. *n
15c50 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 umelems = -1;..
15c60 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
15c70 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 63 68 65 }.. cache
15c80 20 3d 20 28 73 74 72 75 63 74 20 73 70 6c 69 74 = (struct split
15c90 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 e_internal_cache
15ca0 20 2a 29 20 61 63 63 65 73 73 6f 72 2d 3e 63 61 *) accessor->ca
15cb0 63 68 65 3b 0a 20 20 20 20 69 66 20 28 63 61 63 che;. if (cac
15cc0 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 he == NULL)..ret
15cd0 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 urn NULL;. if
15ce0 20 28 63 61 63 68 65 2d 3e 6d 61 67 69 63 31 20 (cache->magic1
15cf0 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 != SPATIALITE_CA
15d00 43 48 45 5f 4d 41 47 49 43 31 0a 09 7c 7c 20 63 CHE_MAGIC1..|| c
15d10 61 63 68 65 2d 3e 6d 61 67 69 63 32 20 21 3d 20 ache->magic2 !=
15d20 53 50 41 54 49 41 4c 49 54 45 5f 43 41 43 48 45 SPATIALITE_CACHE
15d30 5f 4d 41 47 49 43 32 29 0a 09 72 65 74 75 72 6e _MAGIC2)..return
15d40 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 74 78 20 3d NULL;. ctx =
15d50 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 4f 5f 68 cache->RTTOPO_h
15d60 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 63 andle;. if (c
15d70 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 tx == NULL)..ret
15d80 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 urn NULL;.. i
15d90 66 20 28 6c 69 6d 69 74 20 3e 3d 20 30 29 0a 20 f (limit >= 0).
15da0 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 70 72 65 {.. /* pre
15db0 70 61 72 69 6e 67 20 74 68 65 20 61 75 78 69 6c paring the auxil
15dc0 69 61 72 79 20 53 51 4c 20 73 74 61 74 65 6d 65 iary SQL stateme
15dd0 6e 74 20 2a 2f 0a 09 20 20 73 71 6c 20 3d 20 64 nt */.. sql = d
15de0 6f 5f 70 72 65 70 61 72 65 5f 72 65 61 64 5f 65 o_prepare_read_e
15df0 64 67 65 20 28 61 63 63 65 73 73 6f 72 2d 3e 74 dge (accessor->t
15e00 6f 70 6f 6c 6f 67 79 5f 6e 61 6d 65 2c 20 66 69 opology_name, fi
15e10 65 6c 64 73 29 3b 0a 09 20 20 72 65 74 20 3d 0a elds);.. ret =.
15e20 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 . sqlite3_p
15e30 72 65 70 61 72 65 5f 76 32 20 28 61 63 63 65 73 repare_v2 (acces
15e40 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 2c 20 sor->db_handle,
15e50 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c sql, strlen (sql
15e60 29 2c 0a 09 09 09 09 20 20 26 73 74 6d 74 5f 61 ),..... &stmt_a
15e70 75 78 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 73 71 ux, NULL);.. sq
15e80 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29 lite3_free (sql)
15e90 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d 20 ;.. if (ret !=
15ea0 53 51 4c 49 54 45 5f 4f 4b 29 0a 09 20 20 20 20 SQLITE_OK)..
15eb0 7b 0a 09 09 63 68 61 72 20 2a 6d 73 67 20 3d 0a {...char *msg =.
15ec0 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 .. sqlite3_mp
15ed0 72 69 6e 74 66 0a 09 09 20 20 20 20 28 22 50 72 rintf... ("Pr
15ee0 65 70 61 72 65 5f 67 65 74 45 64 67 65 57 69 74 epare_getEdgeWit
15ef0 68 69 6e 42 6f 78 32 44 20 41 55 58 20 65 72 72 hinBox2D AUX err
15f00 6f 72 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 20 or: \"%s\"",...
15f10 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d sqlite3_errm
15f20 73 67 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 sg (accessor->db
15f30 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 61 69 _handle));...gai
15f40 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 atopo_set_last_e
15f50 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 rror_msg (topo,
15f60 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 33 5f msg);...sqlite3_
15f70 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 2a 6e free (msg);...*n
15f80 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 09 umelems = -1;...
15f90 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 return NULL;..
15fa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 }. }../*
15fb0 73 65 74 74 69 6e 67 20 75 70 20 74 68 65 20 70 setting up the p
15fc0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
15fd0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 t */. sqlite3
15fe0 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 _reset (stmt);.
15ff0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 sqlite3_clear
16000 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 _bindings (stmt)
16010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 ;. sqlite3_bi
16020 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c nd_double (stmt,
16030 20 31 2c 20 62 6f 78 2d 3e 78 6d 69 6e 29 3b 0a 1, box->xmin);.
16040 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
16050 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 32 _double (stmt, 2
16060 2c 20 62 6f 78 2d 3e 79 6d 69 6e 29 3b 0a 20 20 , box->ymin);.
16070 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 sqlite3_bind_d
16080 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 33 2c 20 ouble (stmt, 3,
16090 62 6f 78 2d 3e 78 6d 61 78 29 3b 0a 20 20 20 20 box->xmax);.
160a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 sqlite3_bind_dou
160b0 62 6c 65 20 28 73 74 6d 74 2c 20 34 2c 20 62 6f ble (stmt, 4, bo
160c0 78 2d 3e 79 6d 61 78 29 3b 0a 20 20 20 20 6c 69 x->ymax);. li
160d0 73 74 20 3d 20 63 72 65 61 74 65 5f 65 64 67 65 st = create_edge
160e0 73 5f 6c 69 73 74 20 28 29 3b 0a 0a 20 20 20 20 s_list ();..
160f0 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 while (1).
16100 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e {.. /* scrollin
16110 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 g the result set
16120 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 rows */.. ret
16130 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 = sqlite3_step (
16140 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 stmt);.. if (re
16150 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 t == SQLITE_DONE
16160 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 ).. break;.
16170 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c ./* end of resul
16180 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 t set */.. if (
16190 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f ret == SQLITE_RO
161a0 57 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 W).. {...sqli
161b0 74 65 33 5f 69 6e 74 36 34 20 65 64 67 65 5f 69 te3_int64 edge_i
161c0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 d = sqlite3_colu
161d0 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 mn_int64 (stmt,
161e0 30 29 3b 0a 09 09 69 66 20 28 73 74 6d 74 5f 61 0);...if (stmt_a
161f0 75 78 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 ux != NULL)...
16200 7b 0a 09 09 20 20 20 20 20 20 63 68 61 72 20 2a {... char *
16210 6d 73 67 3b 0a 09 09 20 20 20 20 20 20 69 66 20 msg;... if
16220 28 21 64 6f 5f 72 65 61 64 5f 65 64 67 65 0a 09 (!do_read_edge..
16230 09 09 20 20 28 73 74 6d 74 5f 61 75 78 2c 20 6c .. (stmt_aux, l
16240 69 73 74 2c 20 65 64 67 65 5f 69 64 2c 20 66 69 ist, edge_id, fi
16250 65 6c 64 73 2c 0a 09 09 09 20 20 20 22 63 61 6c elds,.... "cal
16260 6c 62 61 63 6b 5f 67 65 74 45 64 67 65 57 69 74 lback_getEdgeWit
16270 68 69 6e 42 6f 78 32 44 22 2c 20 26 6d 73 67 29 hinBox2D", &msg)
16280 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 67 61 )....{.... ga
16290 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f iatopo_set_last_
162a0 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c error_msg (topo,
162b0 20 6d 73 67 29 3b 0a 09 09 09 20 20 20 20 73 71 msg);.... sq
162c0 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 lite3_free (msg)
162d0 3b 0a 09 09 09 20 20 20 20 67 6f 74 6f 20 65 72 ;.... goto er
162e0 72 6f 72 3b 0a 09 09 09 7d 0a 09 09 20 20 7d 0a ror;....}... }.
162f0 09 09 63 6f 75 6e 74 2b 2b 3b 0a 09 09 69 66 20 ..count++;...if
16300 28 6c 69 6d 69 74 20 3e 20 30 29 0a 09 09 20 20 (limit > 0)...
16310 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 63 6f {... if (co
16320 75 6e 74 20 3e 20 6c 69 6d 69 74 29 0a 09 09 09 unt > limit)....
16330 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 7d 0a 09 break;... }..
16340 09 69 66 20 28 6c 69 6d 69 74 20 3c 20 30 29 0a .if (limit < 0).
16350 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 .. break;..
16360 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 }.. else..
16370 20 7b 0a 09 09 63 68 61 72 20 2a 6d 73 67 20 3d {...char *msg =
16380 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
16390 20 28 22 63 61 6c 6c 62 61 63 6b 5f 67 65 74 45 ("callback_getE
163a0 64 67 65 57 69 74 68 69 6e 42 6f 78 32 44 3a 20 dgeWithinBox2D:
163b0 25 73 22 2c 0a 09 09 09 09 09 20 20 20 20 20 73 %s",...... s
163c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 0a 09 09 qlite3_errmsg...
163d0 09 09 09 20 20 20 20 20 28 61 63 63 65 73 73 6f ... (accesso
163e0 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a r->db_handle));.
163f0 09 09 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c ..gaiatopo_set_l
16400 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 ast_error_msg (t
16410 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c opo, msg);...sql
16420 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b ite3_free (msg);
16430 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 ...goto error;..
16440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 }. }..
16450 20 20 20 69 66 20 28 6c 69 6d 69 74 20 3c 20 30 if (limit < 0
16460 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 72 65 73 ). {.. res
16470 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 2a ult = NULL;.. *
16480 6e 75 6d 65 6c 65 6d 73 20 3d 20 63 6f 75 6e 74 numelems = count
16490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c ;. }. el
164a0 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 se. {.. if
164b0 20 28 6c 69 73 74 2d 3e 63 6f 75 6e 74 20 3c 3d (list->count <=
164c0 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 72 65 73 0).. {...res
164d0 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 2a 6e ult = NULL;...*n
164e0 75 6d 65 6c 65 6d 73 20 3d 20 30 3b 0a 09 20 20 umelems = 0;..
164f0 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 }.. else..
16500 20 7b 0a 09 09 69 6e 74 20 69 20 3d 20 30 3b 0a {...int i = 0;.
16510 09 09 73 74 72 75 63 74 20 74 6f 70 6f 5f 65 64 ..struct topo_ed
16520 67 65 20 2a 70 5f 65 64 3b 0a 09 09 72 65 73 75 ge *p_ed;...resu
16530 6c 74 20 3d 20 72 74 61 6c 6c 6f 63 20 28 63 74 lt = rtalloc (ct
16540 78 2c 20 73 69 7a 65 6f 66 20 28 52 54 54 5f 49 x, sizeof (RTT_I
16550 53 4f 5f 45 44 47 45 29 20 2a 20 6c 69 73 74 2d SO_EDGE) * list-
16560 3e 63 6f 75 6e 74 29 3b 0a 09 09 70 5f 65 64 20 >count);...p_ed
16570 3d 20 6c 69 73 74 2d 3e 66 69 72 73 74 3b 0a 09 = list->first;..
16580 09 77 68 69 6c 65 20 28 70 5f 65 64 20 21 3d 20 .while (p_ed !=
16590 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 20 NULL)... {...
165a0 20 20 20 20 52 54 54 5f 49 53 4f 5f 45 44 47 45 RTT_ISO_EDGE
165b0 20 2a 65 64 20 3d 20 72 65 73 75 6c 74 20 2b 20 *ed = result +
165c0 69 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 66 i;... if (f
165d0 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
165e0 45 44 47 45 5f 45 44 47 45 5f 49 44 29 0a 09 09 EDGE_EDGE_ID)...
165f0 09 20 20 65 64 2d 3e 65 64 67 65 5f 69 64 20 3d . ed->edge_id =
16600 20 70 5f 65 64 2d 3e 65 64 67 65 5f 69 64 3b 0a p_ed->edge_id;.
16610 09 09 20 20 20 20 20 20 69 66 20 28 66 69 65 6c .. if (fiel
16620 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
16630 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 09 E_START_NODE)...
16640 09 20 20 65 64 2d 3e 73 74 61 72 74 5f 6e 6f 64 . ed->start_nod
16650 65 20 3d 20 70 5f 65 64 2d 3e 73 74 61 72 74 5f e = p_ed->start_
16660 6e 6f 64 65 3b 0a 09 09 20 20 20 20 20 20 69 66 node;... if
16670 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
16680 4f 4c 5f 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 OL_EDGE_END_NODE
16690 29 0a 09 09 09 20 20 65 64 2d 3e 65 6e 64 5f 6e ).... ed->end_n
166a0 6f 64 65 20 3d 20 70 5f 65 64 2d 3e 65 6e 64 5f ode = p_ed->end_
166b0 6e 6f 64 65 3b 0a 09 09 20 20 20 20 20 20 69 66 node;... if
166c0 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
166d0 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f 4c 45 46 OL_EDGE_FACE_LEF
166e0 54 29 0a 09 09 09 20 20 65 64 2d 3e 66 61 63 65 T).... ed->face
166f0 5f 6c 65 66 74 20 3d 20 70 5f 65 64 2d 3e 66 61 _left = p_ed->fa
16700 63 65 5f 6c 65 66 74 3b 0a 09 09 20 20 20 20 20 ce_left;...
16710 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 if (fields & RT
16720 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f T_COL_EDGE_FACE_
16730 52 49 47 48 54 29 0a 09 09 09 20 20 65 64 2d 3e RIGHT).... ed->
16740 66 61 63 65 5f 72 69 67 68 74 20 3d 20 70 5f 65 face_right = p_e
16750 64 2d 3e 66 61 63 65 5f 72 69 67 68 74 3b 0a 09 d->face_right;..
16760 09 20 20 20 20 20 20 69 66 20 28 66 69 65 6c 64 . if (field
16770 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
16780 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 09 09 09 20 _NEXT_LEFT)....
16790 20 65 64 2d 3e 6e 65 78 74 5f 6c 65 66 74 20 3d ed->next_left =
167a0 20 70 5f 65 64 2d 3e 6e 65 78 74 5f 6c 65 66 74 p_ed->next_left
167b0 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 66 69 ;... if (fi
167c0 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
167d0 44 47 45 5f 4e 45 58 54 5f 52 49 47 48 54 29 0a DGE_NEXT_RIGHT).
167e0 09 09 09 20 20 65 64 2d 3e 6e 65 78 74 5f 72 69 ... ed->next_ri
167f0 67 68 74 20 3d 20 70 5f 65 64 2d 3e 6e 65 78 74 ght = p_ed->next
16800 5f 72 69 67 68 74 3b 0a 09 09 20 20 20 20 20 20 _right;...
16810 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 if (fields & RTT
16820 5f 43 4f 4c 5f 45 44 47 45 5f 47 45 4f 4d 29 0a _COL_EDGE_GEOM).
16830 09 09 09 20 20 65 64 2d 3e 67 65 6f 6d 20 3d 0a ... ed->geom =.
16840 09 09 09 20 20 20 20 20 20 67 61 69 61 5f 63 6f ... gaia_co
16850 6e 76 65 72 74 5f 6c 69 6e 65 73 74 72 69 6e 67 nvert_linestring
16860 5f 74 6f 5f 72 74 6c 69 6e 65 20 28 63 74 78 2c _to_rtline (ctx,
16870 0a 09 09 09 09 09 09 09 09 20 70 5f 65 64 2d 3e ......... p_ed->
16880 67 65 6f 6d 2c 0a 09 09 09 09 09 09 09 09 20 61 geom,......... a
16890 63 63 65 73 73 6f 72 2d 3e 73 72 69 64 2c 0a 09 ccessor->srid,..
168a0 09 09 09 09 09 09 09 20 61 63 63 65 73 73 6f 72 ....... accessor
168b0 2d 3e 0a 09 09 09 09 09 09 09 09 20 68 61 73 5f ->......... has_
168c0 7a 29 3b 0a 09 09 20 20 20 20 20 20 69 2b 2b 3b z);... i++;
168d0 0a 09 09 20 20 20 20 20 20 70 5f 65 64 20 3d 20 ... p_ed =
168e0 70 5f 65 64 2d 3e 6e 65 78 74 3b 0a 09 09 20 20 p_ed->next;...
168f0 7d 0a 09 09 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 }...*numelems =
16900 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a 09 20 20 list->count;..
16910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
16920 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 sqlite3_reset (s
16930 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 28 73 74 tmt);. if (st
16940 6d 74 5f 61 75 78 20 21 3d 20 4e 55 4c 4c 29 0a mt_aux != NULL).
16950 09 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a .sqlite3_finaliz
16960 65 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a 20 20 e (stmt_aux);.
16970 20 20 64 65 73 74 72 6f 79 5f 65 64 67 65 73 5f destroy_edges_
16980 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 20 20 list (list);.
16990 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a return result;.
169a0 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 . error:. sq
169b0 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d lite3_reset (stm
169c0 74 29 3b 0a 20 20 20 20 69 66 20 28 73 74 6d 74 t);. if (stmt
169d0 5f 61 75 78 20 21 3d 20 4e 55 4c 4c 29 0a 09 73 _aux != NULL)..s
169e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 qlite3_finalize
169f0 28 73 74 6d 74 5f 61 75 78 29 3b 0a 20 20 20 20 (stmt_aux);.
16a00 69 66 20 28 6c 69 73 74 20 21 3d 20 4e 55 4c 4c if (list != NULL
16a10 29 0a 09 64 65 73 74 72 6f 79 5f 65 64 67 65 73 )..destroy_edges
16a20 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 20 _list (list);.
16a30 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 *numelems = -1
16a40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c ;. return NUL
16a50 4c 3b 0a 7d 0a 0a 52 54 54 5f 49 53 4f 5f 45 44 L;.}..RTT_ISO_ED
16a60 47 45 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 GE *.callback_ge
16a70 74 41 6c 6c 45 64 67 65 73 20 28 63 6f 6e 73 74 tAllEdges (const
16a80 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 RTT_BE_TOPOLOGY
16a90 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 20 69 6e 74 * rtt_topo, int
16aa0 20 2a 6e 75 6d 65 6c 65 6d 73 2c 0a 09 09 20 20 *numelems,...
16ab0 20 20 20 20 69 6e 74 20 66 69 65 6c 64 73 2c 20 int fields,
16ac0 69 6e 74 20 6c 69 6d 69 74 29 0a 7b 0a 2f 2a 20 int limit).{./*
16ad0 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f callback functio
16ae0 6e 3a 20 67 65 74 41 6c 6c 45 64 67 65 73 20 2a n: getAllEdges *
16af0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 52 54 43 54 /. const RTCT
16b00 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 X *ctx = NULL;.
16b10 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 struct splite
16b20 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 _internal_cache
16b30 2a 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 *cache = NULL;.
16b40 20 20 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 GaiaTopologyA
16b50 63 63 65 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 ccessorPtr topo
16b60 3d 20 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 = (GaiaTopologyA
16b70 63 63 65 73 73 6f 72 50 74 72 29 20 72 74 74 5f ccessorPtr) rtt_
16b80 74 6f 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 topo;. struct
16b90 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a gaia_topology *
16ba0 61 63 63 65 73 73 6f 72 20 3d 20 28 73 74 72 75 accessor = (stru
16bb0 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 ct gaia_topology
16bc0 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 *) topo;. sq
16bd0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 lite3_stmt *stmt
16be0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 ;. int ret;.
16bf0 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65 3b 0a char *table;.
16c00 20 20 20 20 63 68 61 72 20 2a 78 74 61 62 6c 65 char *xtable
16c10 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b ;. char *sql;
16c20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
16c30 63 68 61 72 20 2a 2a 72 65 73 75 6c 74 73 3b 0a char **results;.
16c40 20 20 20 20 69 6e 74 20 72 6f 77 73 3b 0a 20 20 int rows;.
16c50 20 20 69 6e 74 20 63 6f 6c 75 6d 6e 73 3b 0a 20 int columns;.
16c60 20 20 20 63 68 61 72 20 2a 65 72 72 4d 73 67 20 char *errMsg
16c70 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 = NULL;. int
16c80 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 52 count = 0;. R
16c90 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 72 65 73 TT_ISO_EDGE *res
16ca0 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ult = NULL;.
16cb0 69 66 20 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 if (accessor ==
16cc0 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 NULL). {..
16cd0 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b *numelems = -1;
16ce0 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b .. return NULL;
16cf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 . }.. st
16d00 6d 74 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e 73 mt = accessor->s
16d10 74 6d 74 5f 67 65 74 41 6c 6c 45 64 67 65 73 3b tmt_getAllEdges;
16d20 0a 20 20 20 20 69 66 20 28 73 74 6d 74 20 3d 3d . if (stmt ==
16d30 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 NULL). {..
16d40 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 *numelems = -1
16d50 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c ;.. return NULL
16d60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 63 ;. }.. c
16d70 61 63 68 65 20 3d 20 28 73 74 72 75 63 74 20 73 ache = (struct s
16d80 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 plite_internal_c
16d90 61 63 68 65 20 2a 29 20 61 63 63 65 73 73 6f 72 ache *) accessor
16da0 2d 3e 63 61 63 68 65 3b 0a 20 20 20 20 69 66 20 ->cache;. if
16db0 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a (cache == NULL).
16dc0 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
16dd0 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 67 if (cache->mag
16de0 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 54 ic1 != SPATIALIT
16df0 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a 09 E_CACHE_MAGIC1..
16e00 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 32 || cache->magic2
16e10 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 != SPATIALITE_C
16e20 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 65 ACHE_MAGIC2)..re
16e30 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 turn NULL;. c
16e40 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f tx = cache->RTTO
16e50 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 PO_handle;. i
16e60 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a f (ctx == NULL).
16e70 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 2f .return NULL;../
16e80 2a 20 63 6f 75 6e 74 69 6e 67 20 68 6f 77 20 6d * counting how m
16e90 61 6e 79 20 45 44 47 45 73 20 61 72 65 20 74 68 any EDGEs are th
16ea0 65 72 65 20 2a 2f 0a 20 20 20 20 74 61 62 6c 65 ere */. table
16eb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
16ec0 74 66 20 28 22 25 73 5f 65 64 67 65 22 2c 20 61 tf ("%s_edge", a
16ed0 63 63 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 ccessor->topolog
16ee0 79 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 78 74 61 y_name);. xta
16ef0 62 6c 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 ble = gaiaDouble
16f00 51 75 6f 74 65 64 53 71 6c 20 28 74 61 62 6c 65 QuotedSql (table
16f10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 );. sqlite3_f
16f20 72 65 65 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 ree (table);.
16f30 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
16f40 70 72 69 6e 74 66 20 28 22 53 45 4c 45 43 54 20 printf ("SELECT
16f50 43 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 4d 41 Count(*) FROM MA
16f60 49 4e 2e 5c 22 25 73 5c 22 22 2c 20 78 74 61 62 IN.\"%s\"", xtab
16f70 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 20 28 78 le);. free (x
16f80 74 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 20 table);. ret
16f90 3d 0a 09 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 =..sqlite3_get_t
16fa0 61 62 6c 65 20 28 61 63 63 65 73 73 6f 72 2d 3e able (accessor->
16fb0 64 62 5f 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 db_handle, sql,
16fc0 26 72 65 73 75 6c 74 73 2c 20 26 72 6f 77 73 2c &results, &rows,
16fd0 20 26 63 6f 6c 75 6d 6e 73 2c 0a 09 09 09 20 20 &columns,....
16fe0 20 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 &errMsg);. s
16ff0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c qlite3_free (sql
17000 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 );. if (ret !
17010 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 = SQLITE_OK).
17020 20 20 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f {.. sqlite3_
17030 66 72 65 65 20 28 65 72 72 4d 73 67 29 3b 0a 09 free (errMsg);..
17040 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 return NULL;.
17050 20 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 }. for (
17060 69 20 3d 20 31 3b 20 69 20 3c 3d 20 72 6f 77 73 i = 1; i <= rows
17070 3b 20 69 2b 2b 29 0a 09 63 6f 75 6e 74 20 3d 20 ; i++)..count =
17080 61 74 6f 69 20 28 72 65 73 75 6c 74 73 5b 28 69 atoi (results[(i
17090 20 2a 20 63 6f 6c 75 6d 6e 73 29 20 2b 20 30 5d * columns) + 0]
170a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 );. sqlite3_f
170b0 72 65 65 5f 74 61 62 6c 65 20 28 72 65 73 75 6c ree_table (resul
170c0 74 73 29 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 ts);.. if (li
170d0 6d 69 74 20 3c 20 30 29 0a 20 20 20 20 20 20 7b mit < 0). {
170e0 0a 09 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 3d .. if (count <=
170f0 20 30 29 0a 09 20 20 20 20 20 20 2a 6e 75 6d 65 0).. *nume
17100 6c 65 6d 73 20 3d 20 30 3b 0a 09 20 20 65 6c 73 lems = 0;.. els
17110 65 0a 09 20 20 20 20 20 20 2a 6e 75 6d 65 6c 65 e.. *numele
17120 6d 73 20 3d 20 31 3b 0a 09 20 20 72 65 74 75 72 ms = 1;.. retur
17130 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a n NULL;. }.
17140 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 3d if (count <=
17150 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 0). {.. *
17160 6e 75 6d 65 6c 65 6d 73 20 3d 20 30 3b 0a 09 20 numelems = 0;..
17170 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
17180 20 20 20 20 7d 0a 0a 2f 2a 20 61 6c 6c 6f 63 61 }../* alloca
17190 74 69 6e 67 20 61 6e 20 45 64 67 65 27 73 20 61 ting an Edge's a
171a0 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 rray */. if (
171b0 6c 69 6d 69 74 20 3e 20 30 29 0a 20 20 20 20 20 limit > 0).
171c0 20 7b 0a 09 20 20 69 66 20 28 6c 69 6d 69 74 20 {.. if (limit
171d0 3e 20 63 6f 75 6e 74 29 0a 09 20 20 20 20 20 20 > count)..
171e0 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 63 6f 75 6e *numelems = coun
171f0 74 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 t;.. else..
17200 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 6c 69 *numelems = li
17210 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 mit;. }.
17220 20 65 6c 73 65 0a 09 2a 6e 75 6d 65 6c 65 6d 73 else..*numelems
17230 20 3d 20 63 6f 75 6e 74 3b 0a 20 20 20 20 72 65 = count;. re
17240 73 75 6c 74 20 3d 20 72 74 61 6c 6c 6f 63 20 28 sult = rtalloc (
17250 63 74 78 2c 20 73 69 7a 65 6f 66 20 28 52 54 54 ctx, sizeof (RTT
17260 5f 49 53 4f 5f 45 44 47 45 29 20 2a 20 2a 6e 75 _ISO_EDGE) * *nu
17270 6d 65 6c 65 6d 73 29 3b 0a 0a 20 20 20 20 73 71 melems);.. sq
17280 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d lite3_reset (stm
17290 74 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 t);. i = 0;.
172a0 20 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 while (1).
172b0 20 20 20 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c {.. /* scrol
172c0 6c 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 ling the result
172d0 73 65 74 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 set rows */.. r
172e0 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 et = sqlite3_ste
172f0 70 20 28 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 p (stmt);.. if
17300 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 (ret == SQLITE_D
17310 4f 4e 45 29 0a 09 20 20 20 20 20 20 62 72 65 61 ONE).. brea
17320 6b 3b 09 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 k;../* end of re
17330 73 75 6c 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 sult set */.. i
17340 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 f (ret == SQLITE
17350 5f 52 4f 57 29 0a 09 20 20 20 20 7b 0a 09 09 52 _ROW).. {...R
17360 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 65 64 20 TT_ISO_EDGE *ed
17370 3d 20 72 65 73 75 6c 74 20 2b 20 69 3b 0a 09 09 = result + i;...
17380 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 if (fields & RTT
17390 5f 43 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f 49 _COL_EDGE_EDGE_I
173a0 44 29 0a 09 09 20 20 20 20 65 64 2d 3e 65 64 67 D)... ed->edg
173b0 65 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 e_id = sqlite3_c
173c0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d olumn_int64 (stm
173d0 74 2c 20 30 29 3b 0a 09 09 69 66 20 28 66 69 65 t, 0);...if (fie
173e0 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
173f0 47 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 GE_START_NODE)..
17400 09 20 20 20 20 65 64 2d 3e 73 74 61 72 74 5f 6e . ed->start_n
17410 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f ode = sqlite3_co
17420 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 lumn_int64 (stmt
17430 2c 20 31 29 3b 0a 09 09 69 66 20 28 66 69 65 6c , 1);...if (fiel
17440 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
17450 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 09 09 20 20 E_END_NODE)...
17460 20 20 65 64 2d 3e 65 6e 64 5f 6e 6f 64 65 20 3d ed->end_node =
17470 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
17480 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 32 29 3b int64 (stmt, 2);
17490 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
174a0 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 RTT_COL_EDGE_FAC
174b0 45 5f 4c 45 46 54 29 0a 09 09 20 20 7b 0a 09 09 E_LEFT)... {...
174c0 20 20 20 20 20 20 69 66 20 28 73 71 6c 69 74 65 if (sqlite
174d0 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 28 73 3_column_type (s
174e0 74 6d 74 2c 20 33 29 20 3d 3d 20 53 51 4c 49 54 tmt, 3) == SQLIT
174f0 45 5f 4e 55 4c 4c 29 0a 09 09 09 20 20 65 64 2d E_NULL).... ed-
17500 3e 66 61 63 65 5f 6c 65 66 74 20 3d 20 2d 31 3b >face_left = -1;
17510 0a 09 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 ... else...
17520 09 20 20 65 64 2d 3e 66 61 63 65 5f 6c 65 66 74 . ed->face_left
17530 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d = sqlite3_colum
17540 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 33 n_int64 (stmt, 3
17550 29 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 66 );... }...if (f
17560 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
17570 45 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 29 EDGE_FACE_RIGHT)
17580 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 ... {... i
17590 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d f (sqlite3_colum
175a0 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 34 29 n_type (stmt, 4)
175b0 20 3d 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 == SQLITE_NULL)
175c0 0a 09 09 09 20 20 65 64 2d 3e 66 61 63 65 5f 72 .... ed->face_r
175d0 69 67 68 74 20 3d 20 2d 31 3b 0a 09 09 20 20 20 ight = -1;...
175e0 20 20 20 65 6c 73 65 0a 09 09 09 20 20 65 64 2d else.... ed-
175f0 3e 66 61 63 65 5f 72 69 67 68 74 20 3d 20 73 71 >face_right = sq
17600 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 lite3_column_int
17610 36 34 20 28 73 74 6d 74 2c 20 34 29 3b 0a 09 09 64 (stmt, 4);...
17620 20 20 7d 0a 09 09 69 66 20 28 66 69 65 6c 64 73 }...if (fields
17630 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
17640 4e 45 58 54 5f 4c 45 46 54 29 0a 09 09 20 20 20 NEXT_LEFT)...
17650 20 65 64 2d 3e 6e 65 78 74 5f 6c 65 66 74 20 3d ed->next_left =
17660 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
17670 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 35 29 3b int64 (stmt, 5);
17680 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
17690 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 RTT_COL_EDGE_NEX
176a0 54 5f 52 49 47 48 54 29 0a 09 09 20 20 20 20 65 T_RIGHT)... e
176b0 64 2d 3e 6e 65 78 74 5f 72 69 67 68 74 20 3d 20 d->next_right =
176c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 sqlite3_column_i
176d0 6e 74 36 34 20 28 73 74 6d 74 2c 20 36 29 3b 0a nt64 (stmt, 6);.
176e0 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 ..if (fields & R
176f0 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 47 45 4f 4d TT_COL_EDGE_GEOM
17700 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
17710 69 66 20 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 if (sqlite3_colu
17720 6d 6e 5f 74 79 70 65 20 28 73 74 6d 74 2c 20 37 mn_type (stmt, 7
17730 29 20 3d 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 ) == SQLITE_BLOB
17740 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 63 6f )....{.... co
17750 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
17760 72 20 2a 62 6c 6f 62 20 3d 0a 09 09 09 09 73 71 r *blob =.....sq
17770 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f lite3_column_blo
17780 62 20 28 73 74 6d 74 2c 20 37 29 3b 0a 09 09 09 b (stmt, 7);....
17790 20 20 20 20 69 6e 74 20 62 6c 6f 62 5f 73 7a 20 int blob_sz
177a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e = sqlite3_column
177b0 5f 62 79 74 65 73 20 28 73 74 6d 74 2c 20 37 29 _bytes (stmt, 7)
177c0 3b 0a 09 09 09 20 20 20 20 67 61 69 61 47 65 6f ;.... gaiaGeo
177d0 6d 43 6f 6c 6c 50 74 72 20 67 65 6f 6d 20 3d 0a mCollPtr geom =.
177e0 09 09 09 09 67 61 69 61 46 72 6f 6d 53 70 61 74 ....gaiaFromSpat
177f0 69 61 4c 69 74 65 42 6c 6f 62 57 6b 62 20 28 62 iaLiteBlobWkb (b
17800 6c 6f 62 2c 20 62 6c 6f 62 5f 73 7a 29 3b 0a 09 lob, blob_sz);..
17810 09 09 20 20 20 20 69 66 20 28 67 65 6f 6d 20 21 .. if (geom !
17820 3d 20 4e 55 4c 4c 29 0a 09 09 09 20 20 20 20 20 = NULL)....
17830 20 7b 0a 09 09 09 09 20 20 69 66 20 28 67 65 6f {..... if (geo
17840 6d 2d 3e 46 69 72 73 74 50 6f 69 6e 74 20 3d 3d m->FirstPoint ==
17850 20 4e 55 4c 4c 0a 09 09 09 09 20 20 20 20 20 20 NULL.....
17860 26 26 20 67 65 6f 6d 2d 3e 46 69 72 73 74 50 6f && geom->FirstPo
17870 6c 79 67 6f 6e 20 3d 3d 20 4e 55 4c 4c 0a 09 09 lygon == NULL...
17880 09 09 20 20 20 20 20 20 26 26 20 67 65 6f 6d 2d .. && geom-
17890 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 69 6e 67 >FirstLinestring
178a0 20 3d 3d 0a 09 09 09 09 20 20 20 20 20 20 67 65 ==..... ge
178b0 6f 6d 2d 3e 4c 61 73 74 4c 69 6e 65 73 74 72 69 om->LastLinestri
178c0 6e 67 0a 09 09 09 09 20 20 20 20 20 20 26 26 20 ng..... &&
178d0 67 65 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 geom->FirstLines
178e0 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 tring != NULL)..
178f0 09 09 09 20 20 20 20 7b 0a 09 09 09 09 09 67 61 ... {......ga
17900 69 61 4c 69 6e 65 73 74 72 69 6e 67 50 74 72 20 iaLinestringPtr
17910 6c 6e 20 3d 0a 09 09 09 09 09 20 20 20 20 67 65 ln =...... ge
17920 6f 6d 2d 3e 46 69 72 73 74 4c 69 6e 65 73 74 72 om->FirstLinestr
17930 69 6e 67 3b 0a 09 09 09 09 09 65 64 2d 3e 67 65 ing;......ed->ge
17940 6f 6d 20 3d 0a 09 09 09 09 09 20 20 20 20 67 61 om =...... ga
17950 69 61 5f 63 6f 6e 76 65 72 74 5f 6c 69 6e 65 73 ia_convert_lines
17960 74 72 69 6e 67 5f 74 6f 5f 72 74 6c 69 6e 65 0a tring_to_rtline.
17970 09 09 09 09 09 20 20 20 20 28 63 74 78 2c 20 6c ..... (ctx, l
17980 6e 2c 20 61 63 63 65 73 73 6f 72 2d 3e 73 72 69 n, accessor->sri
17990 64 2c 0a 09 09 09 09 09 20 20 20 20 20 61 63 63 d,...... acc
179a0 65 73 73 6f 72 2d 3e 68 61 73 5f 7a 29 3b 0a 09 essor->has_z);..
179b0 09 09 09 20 20 20 20 7d 0a 09 09 09 09 20 20 67 ... }..... g
179c0 61 69 61 46 72 65 65 47 65 6f 6d 43 6f 6c 6c 20 aiaFreeGeomColl
179d0 28 67 65 6f 6d 29 3b 0a 09 09 09 20 20 20 20 20 (geom);....
179e0 20 7d 0a 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 }....}... }...
179f0 69 2b 2b 3b 0a 09 09 69 66 20 28 6c 69 6d 69 74 i++;...if (limit
17a00 20 3e 20 30 20 26 26 20 69 20 3e 3d 20 6c 69 6d > 0 && i >= lim
17a10 69 74 29 0a 09 09 20 20 20 20 62 72 65 61 6b 3b it)... break;
17a20 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a .. }.. else.
17a30 09 20 20 20 20 7b 0a 09 09 63 68 61 72 20 2a 6d . {...char *m
17a40 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 sg = sqlite3_mpr
17a50 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 6b 5f intf ("callback_
17a60 67 65 74 41 6c 6c 45 64 67 65 73 3a 20 25 73 22 getAllEdges: %s"
17a70 2c 0a 09 09 09 09 09 20 20 20 20 20 73 71 6c 69 ,...... sqli
17a80 74 65 33 5f 65 72 72 6d 73 67 0a 09 09 09 09 09 te3_errmsg......
17a90 20 20 20 20 20 28 61 63 63 65 73 73 6f 72 2d 3e (accessor->
17aa0 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 db_handle));...g
17ab0 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 aiatopo_set_last
17ac0 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f _error_msg (topo
17ad0 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 , msg);...sqlite
17ae0 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 3_free (msg);...
17af0 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 goto error;..
17b00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 }. }. s
17b10 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
17b20 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 mt);. return
17b30 72 65 73 75 6c 74 3b 0a 0a 20 20 65 72 72 6f 72 result;.. error
17b40 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 :. sqlite3_re
17b50 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 set (stmt);.
17b60 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a *numelems = -1;.
17b70 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
17b80 0a 7d 0a 0a 52 54 54 5f 49 53 4f 5f 45 44 47 45 .}..RTT_ISO_EDGE
17b90 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 45 *.callback_getE
17ba0 64 67 65 42 79 4e 6f 64 65 20 28 63 6f 6e 73 74 dgeByNode (const
17bb0 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 RTT_BE_TOPOLOGY
17bc0 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 0a 09 09 09 * rtt_topo,....
17bd0 63 6f 6e 73 74 20 52 54 54 5f 45 4c 45 4d 49 44 const RTT_ELEMID
17be0 20 2a 20 69 64 73 2c 20 69 6e 74 20 2a 6e 75 6d * ids, int *num
17bf0 65 6c 65 6d 73 2c 20 69 6e 74 20 66 69 65 6c 64 elems, int field
17c00 73 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b s).{./* callback
17c10 20 66 75 6e 63 74 69 6f 6e 3a 20 67 65 74 45 64 function: getEd
17c20 67 65 42 79 4e 6f 64 65 20 2a 2f 0a 20 20 20 20 geByNode */.
17c30 63 6f 6e 73 74 20 52 54 43 54 58 20 2a 63 74 78 const RTCTX *ctx
17c40 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 72 = NULL;. str
17c50 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 uct splite_inter
17c60 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 nal_cache *cache
17c70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 61 69 = NULL;. Gai
17c80 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f aTopologyAccesso
17c90 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 69 rPtr topo = (Gai
17ca0 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f aTopologyAccesso
17cb0 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b 0a rPtr) rtt_topo;.
17cc0 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f struct gaia_
17cd0 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 73 topology *access
17ce0 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 61 69 or = (struct gai
17cf0 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 6f a_topology *) to
17d00 70 6f 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b po;. int ret;
17d10 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a . char *sql;.
17d20 20 20 20 20 63 68 61 72 20 2a 70 72 65 76 3b 0a char *prev;.
17d30 20 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65 3b char *table;
17d40 0a 20 20 20 20 63 68 61 72 20 2a 78 74 61 62 6c . char *xtabl
17d50 65 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6d 6d 61 e;. int comma
17d60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b = 0;. int i;
17d70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d . sqlite3_stm
17d80 74 20 2a 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 t *stmt_aux = NU
17d90 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 LL;. struct t
17da0 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 74 20 2a opo_edges_list *
17db0 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 list = NULL;.
17dc0 20 52 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 72 RTT_ISO_EDGE *r
17dd0 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 esult = NULL;.
17de0 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 20 3d if (accessor =
17df0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a = NULL). {.
17e00 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d . *numelems = -
17e10 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 1;.. return NUL
17e20 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 L;. }..
17e30 63 61 63 68 65 20 3d 20 28 73 74 72 75 63 74 20 cache = (struct
17e40 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f splite_internal_
17e50 63 61 63 68 65 20 2a 29 20 61 63 63 65 73 73 6f cache *) accesso
17e60 72 2d 3e 63 61 63 68 65 3b 0a 20 20 20 20 69 66 r->cache;. if
17e70 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 (cache == NULL)
17e80 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
17e90 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 if (cache->ma
17ea0 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 gic1 != SPATIALI
17eb0 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a TE_CACHE_MAGIC1.
17ec0 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 .|| cache->magic
17ed0 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 2 != SPATIALITE_
17ee0 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 CACHE_MAGIC2)..r
17ef0 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
17f00 63 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 ctx = cache->RTT
17f10 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 OPO_handle;.
17f20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
17f30 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a ..return NULL;..
17f40 20 20 20 20 2f 2a 20 70 72 65 70 61 72 69 6e 67 /* preparing
17f50 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 the SQL stateme
17f60 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d 20 nt */. sql =
17f70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
17f80 28 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 20 ("SELECT ");.
17f90 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
17fa0 20 2f 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 /* unconditiona
17fb0 6c 6c 79 20 71 75 65 72 79 69 6e 67 20 74 68 65 lly querying the
17fc0 20 45 64 67 65 20 49 44 20 2a 2f 0a 20 20 20 20 Edge ID */.
17fd0 69 66 20 28 63 6f 6d 6d 61 29 0a 09 73 71 6c 20 if (comma)..sql
17fe0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
17ff0 66 20 28 22 25 73 2c 20 65 64 67 65 5f 69 64 22 f ("%s, edge_id"
18000 2c 20 70 72 65 76 29 3b 0a 20 20 20 20 65 6c 73 , prev);. els
18010 65 0a 09 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 e..sql = sqlite3
18020 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 65 64 _mprintf ("%s ed
18030 67 65 5f 69 64 22 2c 20 70 72 65 76 29 3b 0a 20 ge_id", prev);.
18040 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 20 20 comma = 1;.
18050 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
18060 70 72 65 76 29 3b 0a 20 20 20 20 70 72 65 76 20 prev);. prev
18070 3d 20 73 71 6c 3b 0a 20 20 20 20 69 66 20 28 66 = sql;. if (f
18080 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
18090 45 44 47 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 EDGE_START_NODE)
180a0 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
180b0 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 comma).. sq
180c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
180d0 6e 74 66 20 28 22 25 73 2c 20 73 74 61 72 74 5f ntf ("%s, start_
180e0 6e 6f 64 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 node", prev);..
180f0 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c else.. sql
18100 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
18110 74 66 20 28 22 25 73 20 73 74 61 72 74 5f 6e 6f tf ("%s start_no
18120 64 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 de", prev);.. c
18130 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c omma = 1;.. sql
18140 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 ite3_free (prev)
18150 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b ;.. prev = sql;
18160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 . }. if
18170 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f (fields & RTT_CO
18180 4c 5f 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 L_EDGE_END_NODE)
18190 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
181a0 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 comma).. sq
181b0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
181c0 6e 74 66 20 28 22 25 73 2c 20 65 6e 64 5f 6e 6f ntf ("%s, end_no
181d0 64 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 de", prev);.. e
181e0 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d lse.. sql =
181f0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
18200 20 28 22 25 73 20 65 6e 64 5f 6e 6f 64 65 22 2c ("%s end_node",
18210 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 prev);.. comma
18220 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 = 1;.. sqlite3
18230 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 _free (prev);..
18240 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
18250 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 }. if (fie
18260 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
18270 47 45 5f 46 41 43 45 5f 4c 45 46 54 29 0a 20 20 GE_FACE_LEFT).
18280 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d {.. if (com
18290 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d ma).. sql =
182a0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
182b0 20 28 22 25 73 2c 20 6c 65 66 74 5f 66 61 63 65 ("%s, left_face
182c0 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 ", prev);.. els
182d0 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 e.. sql = s
182e0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
182f0 22 25 73 20 6c 65 66 74 5f 66 61 63 65 22 2c 20 "%s left_face",
18300 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
18310 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
18320 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
18330 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
18340 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 6c }. if (fiel
18350 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
18360 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a 20 20 E_FACE_RIGHT).
18370 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d {.. if (com
18380 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d ma).. sql =
18390 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
183a0 20 28 22 25 73 2c 20 72 69 67 68 74 5f 66 61 63 ("%s, right_fac
183b0 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c e", prev);.. el
183c0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
183d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
183e0 28 22 25 73 20 72 69 67 68 74 5f 66 61 63 65 22 ("%s right_face"
183f0 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d , prev);.. comm
18400 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 a = 1;.. sqlite
18410 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 3_free (prev);..
18420 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 prev = sql;.
18430 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 }. if (fi
18440 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
18450 44 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 20 DGE_NEXT_LEFT).
18460 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f {.. if (co
18470 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 mma).. sql
18480 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
18490 66 20 28 22 25 73 2c 20 6e 65 78 74 5f 6c 65 66 f ("%s, next_lef
184a0 74 5f 65 64 67 65 22 2c 20 70 72 65 76 29 3b 0a t_edge", prev);.
184b0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 . else.. s
184c0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
184d0 69 6e 74 66 20 28 22 25 73 20 6e 65 78 74 5f 6c intf ("%s next_l
184e0 65 66 74 5f 65 64 67 65 22 2c 20 70 72 65 76 29 eft_edge", prev)
184f0 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
18500 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
18510 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
18520 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
18530 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 if (fields &
18540 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 RTT_COL_EDGE_NEX
18550 54 5f 52 49 47 48 54 29 0a 20 20 20 20 20 20 7b T_RIGHT). {
18560 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 .. if (comma)..
18570 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
18580 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
18590 2c 20 6e 65 78 74 5f 72 69 67 68 74 5f 65 64 67 , next_right_edg
185a0 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c e", prev);.. el
185b0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
185c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
185d0 28 22 25 73 20 6e 65 78 74 5f 72 69 67 68 74 5f ("%s next_right_
185e0 65 64 67 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 edge", prev);..
185f0 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
18600 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
18610 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
18620 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 l;. }. i
18630 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
18640 43 4f 4c 5f 45 44 47 45 5f 47 45 4f 4d 29 0a 20 COL_EDGE_GEOM).
18650 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f {.. if (co
18660 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 mma).. sql
18670 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
18680 66 20 28 22 25 73 2c 20 67 65 6f 6d 22 2c 20 70 f ("%s, geom", p
18690 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 rev);.. else..
186a0 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
186b0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
186c0 67 65 6f 6d 22 2c 20 70 72 65 76 29 3b 0a 09 20 geom", prev);..
186d0 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
186e0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
186f0 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
18700 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 l;. }. t
18710 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d able = sqlite3_m
18720 70 72 69 6e 74 66 20 28 22 25 73 5f 65 64 67 65 printf ("%s_edge
18730 22 2c 20 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 ", accessor->top
18740 6f 6c 6f 67 79 5f 6e 61 6d 65 29 3b 0a 20 20 20 ology_name);.
18750 20 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44 6f xtable = gaiaDo
18760 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 74 ubleQuotedSql (t
18770 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 able);. sqlit
18780 65 33 5f 66 72 65 65 20 28 74 61 62 6c 65 29 3b e3_free (table);
18790 0a 20 20 20 20 73 71 6c 20 3d 0a 09 73 71 6c 69 . sql =..sqli
187a0 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 28 22 25 te3_mprintf..("%
187b0 73 20 46 52 4f 4d 20 4d 41 49 4e 2e 5c 22 25 73 s FROM MAIN.\"%s
187c0 5c 22 20 57 48 45 52 45 20 73 74 61 72 74 5f 6e \" WHERE start_n
187d0 6f 64 65 20 3d 20 3f 20 4f 52 20 65 6e 64 5f 6e ode = ? OR end_n
187e0 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 2c 0a ode = ?", prev,.
187f0 09 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 . xtable);. f
18800 72 65 65 20 28 78 74 61 62 6c 65 29 3b 0a 20 20 ree (xtable);.
18810 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
18820 70 72 65 76 29 3b 0a 20 20 20 20 72 65 74 20 3d prev);. ret =
18830 0a 09 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 ..sqlite3_prepar
18840 65 5f 76 32 20 28 61 63 63 65 73 73 6f 72 2d 3e e_v2 (accessor->
18850 64 62 5f 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 db_handle, sql,
18860 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 0a 09 09 strlen (sql),...
18870 09 20 20 20 20 26 73 74 6d 74 5f 61 75 78 2c 20 . &stmt_aux,
18880 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 NULL);. sqlit
18890 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b 0a 20 e3_free (sql);.
188a0 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 53 51 if (ret != SQ
188b0 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20 7b LITE_OK). {
188c0 0a 09 20 20 63 68 61 72 20 2a 6d 73 67 20 3d 0a .. char *msg =.
188d0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d . sqlite3_m
188e0 70 72 69 6e 74 66 20 28 22 50 72 65 70 61 72 65 printf ("Prepare
188f0 5f 67 65 74 45 64 67 65 42 79 4e 6f 64 65 20 41 _getEdgeByNode A
18900 55 58 20 65 72 72 6f 72 3a 20 5c 22 25 73 5c 22 UX error: \"%s\"
18910 22 2c 0a 09 09 09 20 20 20 20 20 20 20 73 71 6c ",.... sql
18920 69 74 65 33 5f 65 72 72 6d 73 67 20 28 61 63 63 ite3_errmsg (acc
18930 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 essor->db_handle
18940 29 29 3b 0a 09 20 20 67 61 69 61 74 6f 70 6f 5f ));.. gaiatopo_
18950 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d set_last_error_m
18960 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a sg (topo, msg);.
18970 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
18980 28 6d 73 67 29 3b 0a 09 20 20 2a 6e 75 6d 65 6c (msg);.. *numel
18990 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 20 72 65 74 ems = -1;.. ret
189a0 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 urn NULL;.
189b0 7d 0a 0a 20 20 20 20 6c 69 73 74 20 3d 20 63 72 }.. list = cr
189c0 65 61 74 65 5f 65 64 67 65 73 5f 6c 69 73 74 20 eate_edges_list
189d0 28 29 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d ();. for (i =
189e0 20 30 3b 20 69 20 3c 20 2a 6e 75 6d 65 6c 65 6d 0; i < *numelem
189f0 73 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a s; i++). {.
18a00 09 20 20 63 68 61 72 20 2a 6d 73 67 3b 0a 09 20 . char *msg;..
18a10 20 69 66 20 28 21 64 6f 5f 72 65 61 64 5f 65 64 if (!do_read_ed
18a20 67 65 5f 62 79 5f 6e 6f 64 65 0a 09 20 20 20 20 ge_by_node..
18a30 20 20 28 73 74 6d 74 5f 61 75 78 2c 20 6c 69 73 (stmt_aux, lis
18a40 74 2c 20 2a 28 69 64 73 20 2b 20 69 29 2c 20 66 t, *(ids + i), f
18a50 69 65 6c 64 73 2c 20 22 63 61 6c 6c 62 61 63 6b ields, "callback
18a60 5f 67 65 74 45 64 67 65 42 79 4e 6f 64 65 22 2c _getEdgeByNode",
18a70 0a 09 20 20 20 20 20 20 20 26 6d 73 67 29 29 0a .. &msg)).
18a80 09 20 20 20 20 7b 0a 09 09 67 61 69 61 74 6f 70 . {...gaiatop
18a90 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 o_set_last_error
18aa0 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 _msg (topo, msg)
18ab0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 ;...sqlite3_free
18ac0 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 (msg);...goto e
18ad0 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 rror;.. }.
18ae0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c 69 }.. if (li
18af0 73 74 2d 3e 63 6f 75 6e 74 20 3d 3d 20 30 29 0a st->count == 0).
18b00 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6e 6f {.. /* no
18b10 20 65 64 67 65 20 77 61 73 20 66 6f 75 6e 64 20 edge was found
18b20 2a 2f 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 */.. *numelems
18b30 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a 20 = list->count;.
18b40 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a }. else.
18b50 20 20 20 20 20 20 7b 0a 09 20 20 73 74 72 75 63 {.. struc
18b60 74 20 74 6f 70 6f 5f 65 64 67 65 20 2a 70 5f 65 t topo_edge *p_e
18b70 64 3b 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 72 d;.. result = r
18b80 74 61 6c 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a talloc (ctx, siz
18b90 65 6f 66 20 28 52 54 54 5f 49 53 4f 5f 45 44 47 eof (RTT_ISO_EDG
18ba0 45 29 20 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 E) * list->count
18bb0 29 3b 0a 09 20 20 70 5f 65 64 20 3d 20 6c 69 73 );.. p_ed = lis
18bc0 74 2d 3e 66 69 72 73 74 3b 0a 09 20 20 69 20 3d t->first;.. i =
18bd0 20 30 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 5f 0;.. while (p_
18be0 65 64 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 ed != NULL)..
18bf0 20 7b 0a 09 09 52 54 54 5f 49 53 4f 5f 45 44 47 {...RTT_ISO_EDG
18c00 45 20 2a 65 64 20 3d 20 72 65 73 75 6c 74 20 2b E *ed = result +
18c10 20 69 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 73 i;...if (fields
18c20 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
18c30 45 44 47 45 5f 49 44 29 0a 09 09 20 20 20 20 65 EDGE_ID)... e
18c40 64 2d 3e 65 64 67 65 5f 69 64 20 3d 20 70 5f 65 d->edge_id = p_e
18c50 64 2d 3e 65 64 67 65 5f 69 64 3b 0a 09 09 69 66 d->edge_id;...if
18c60 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
18c70 4f 4c 5f 45 44 47 45 5f 53 54 41 52 54 5f 4e 4f OL_EDGE_START_NO
18c80 44 45 29 0a 09 09 20 20 20 20 65 64 2d 3e 73 74 DE)... ed->st
18c90 61 72 74 5f 6e 6f 64 65 20 3d 20 70 5f 65 64 2d art_node = p_ed-
18ca0 3e 73 74 61 72 74 5f 6e 6f 64 65 3b 0a 09 09 69 >start_node;...i
18cb0 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
18cc0 43 4f 4c 5f 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 COL_EDGE_END_NOD
18cd0 45 29 0a 09 09 20 20 20 20 65 64 2d 3e 65 6e 64 E)... ed->end
18ce0 5f 6e 6f 64 65 20 3d 20 70 5f 65 64 2d 3e 65 6e _node = p_ed->en
18cf0 64 5f 6e 6f 64 65 3b 0a 09 09 69 66 20 28 66 69 d_node;...if (fi
18d00 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
18d10 44 47 45 5f 46 41 43 45 5f 4c 45 46 54 29 0a 09 DGE_FACE_LEFT)..
18d20 09 20 20 20 20 65 64 2d 3e 66 61 63 65 5f 6c 65 . ed->face_le
18d30 66 74 20 3d 20 70 5f 65 64 2d 3e 66 61 63 65 5f ft = p_ed->face_
18d40 6c 65 66 74 3b 0a 09 09 69 66 20 28 66 69 65 6c left;...if (fiel
18d50 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
18d60 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a 09 09 E_FACE_RIGHT)...
18d70 20 20 20 20 65 64 2d 3e 66 61 63 65 5f 72 69 67 ed->face_rig
18d80 68 74 20 3d 20 70 5f 65 64 2d 3e 66 61 63 65 5f ht = p_ed->face_
18d90 72 69 67 68 74 3b 0a 09 09 69 66 20 28 66 69 65 right;...if (fie
18da0 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
18db0 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 09 09 GE_NEXT_LEFT)...
18dc0 20 20 20 20 65 64 2d 3e 6e 65 78 74 5f 6c 65 66 ed->next_lef
18dd0 74 20 3d 20 70 5f 65 64 2d 3e 6e 65 78 74 5f 6c t = p_ed->next_l
18de0 65 66 74 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 eft;...if (field
18df0 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
18e00 5f 4e 45 58 54 5f 52 49 47 48 54 29 0a 09 09 20 _NEXT_RIGHT)...
18e10 20 20 20 65 64 2d 3e 6e 65 78 74 5f 72 69 67 68 ed->next_righ
18e20 74 20 3d 20 70 5f 65 64 2d 3e 6e 65 78 74 5f 72 t = p_ed->next_r
18e30 69 67 68 74 3b 0a 09 09 69 66 20 28 66 69 65 6c ight;...if (fiel
18e40 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
18e50 45 5f 47 45 4f 4d 29 0a 09 09 20 20 20 20 65 64 E_GEOM)... ed
18e60 2d 3e 67 65 6f 6d 20 3d 0a 09 09 09 67 61 69 61 ->geom =....gaia
18e70 5f 63 6f 6e 76 65 72 74 5f 6c 69 6e 65 73 74 72 _convert_linestr
18e80 69 6e 67 5f 74 6f 5f 72 74 6c 69 6e 65 20 28 63 ing_to_rtline (c
18e90 74 78 2c 20 70 5f 65 64 2d 3e 67 65 6f 6d 2c 0a tx, p_ed->geom,.
18ea0 09 09 09 09 09 09 09 20 20 20 61 63 63 65 73 73 ....... access
18eb0 6f 72 2d 3e 73 72 69 64 2c 0a 09 09 09 09 09 09 or->srid,.......
18ec0 09 20 20 20 61 63 63 65 73 73 6f 72 2d 3e 68 61 . accessor->ha
18ed0 73 5f 7a 29 3b 0a 09 09 69 2b 2b 3b 0a 09 09 70 s_z);...i++;...p
18ee0 5f 65 64 20 3d 20 70 5f 65 64 2d 3e 6e 65 78 74 _ed = p_ed->next
18ef0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 2a 6e 75 6d ;.. }.. *num
18f00 65 6c 65 6d 73 20 3d 20 6c 69 73 74 2d 3e 63 6f elems = list->co
18f10 75 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 unt;. }.
18f20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a sqlite3_finaliz
18f30 65 20 28 73 74 6d 74 5f 61 75 78 29 3b 0a 20 20 e (stmt_aux);.
18f40 20 20 64 65 73 74 72 6f 79 5f 65 64 67 65 73 5f destroy_edges_
18f50 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 20 20 list (list);.
18f60 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a return result;.
18f70 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 69 66 . error:. if
18f80 20 28 73 74 6d 74 5f 61 75 78 20 21 3d 20 4e 55 (stmt_aux != NU
18f90 4c 4c 29 0a 09 73 71 6c 69 74 65 33 5f 66 69 6e LL)..sqlite3_fin
18fa0 61 6c 69 7a 65 20 28 73 74 6d 74 5f 61 75 78 29 alize (stmt_aux)
18fb0 3b 0a 20 20 20 20 69 66 20 28 6c 69 73 74 20 21 ;. if (list !
18fc0 3d 20 4e 55 4c 4c 29 0a 09 64 65 73 74 72 6f 79 = NULL)..destroy
18fd0 5f 65 64 67 65 73 5f 6c 69 73 74 20 28 6c 69 73 _edges_list (lis
18fe0 74 29 3b 0a 20 20 20 20 2a 6e 75 6d 65 6c 65 6d t);. *numelem
18ff0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 s = -1;. retu
19000 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 69 6e 74 0a rn NULL;.}..int.
19010 63 61 6c 6c 62 61 63 6b 5f 75 70 64 61 74 65 4e callback_updateN
19020 6f 64 65 73 20 28 63 6f 6e 73 74 20 52 54 54 5f odes (const RTT_
19030 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 BE_TOPOLOGY * rt
19040 74 5f 74 6f 70 6f 2c 0a 09 09 20 20 20 20 20 20 t_topo,...
19050 63 6f 6e 73 74 20 52 54 54 5f 49 53 4f 5f 4e 4f const RTT_ISO_NO
19060 44 45 20 2a 20 73 65 6c 5f 6e 6f 64 65 2c 20 69 DE * sel_node, i
19070 6e 74 20 73 65 6c 5f 66 69 65 6c 64 73 2c 0a 09 nt sel_fields,..
19080 09 20 20 20 20 20 20 63 6f 6e 73 74 20 52 54 54 . const RTT
19090 5f 49 53 4f 5f 4e 4f 44 45 20 2a 20 75 70 64 5f _ISO_NODE * upd_
190a0 6e 6f 64 65 2c 20 69 6e 74 20 75 70 64 5f 66 69 node, int upd_fi
190b0 65 6c 64 73 2c 0a 09 09 20 20 20 20 20 20 63 6f elds,... co
190c0 6e 73 74 20 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 nst RTT_ISO_NODE
190d0 20 2a 20 65 78 63 5f 6e 6f 64 65 2c 20 69 6e 74 * exc_node, int
190e0 20 65 78 63 5f 66 69 65 6c 64 73 29 0a 7b 0a 2f exc_fields).{./
190f0 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 * callback funct
19100 69 6f 6e 3a 20 75 70 64 61 74 65 4e 6f 64 65 73 ion: updateNodes
19110 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 52 54 */. const RT
19120 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b CTX *ctx = NULL;
19130 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c 69 . struct spli
19140 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 te_internal_cach
19150 65 20 2a 63 61 63 68 65 20 3d 20 4e 55 4c 4c 3b e *cache = NULL;
19160 0a 20 20 20 20 47 61 69 61 54 6f 70 6f 6c 6f 67 . GaiaTopolog
19170 79 41 63 63 65 73 73 6f 72 50 74 72 20 74 6f 70 yAccessorPtr top
19180 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f 6c 6f 67 o = (GaiaTopolog
19190 79 41 63 63 65 73 73 6f 72 50 74 72 29 20 72 74 yAccessorPtr) rt
191a0 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 74 72 75 t_topo;. stru
191b0 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 ct gaia_topology
191c0 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 28 73 74 *accessor = (st
191d0 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f ruct gaia_topolo
191e0 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 20 20 gy *) topo;.
191f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 sqlite3_stmt *st
19200 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 mt = NULL;. i
19210 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 68 61 72 nt ret;. char
19220 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 61 72 20 *sql;. char
19230 2a 70 72 65 76 3b 0a 20 20 20 20 69 6e 74 20 63 *prev;. int c
19240 6f 6d 6d 61 20 3d 20 30 3b 0a 20 20 20 20 63 68 omma = 0;. ch
19250 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 ar *table;. c
19260 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20 20 har *xtable;.
19270 20 69 6e 74 20 69 63 6f 6c 20 3d 20 31 3b 0a 20 int icol = 1;.
19280 20 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d int changed =
19290 20 30 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 41 0;. RTPOINTA
192a0 52 52 41 59 20 2a 70 61 3b 0a 20 20 20 20 52 54 RRAY *pa;. RT
192b0 50 4f 49 4e 54 34 44 20 70 74 34 64 3b 0a 20 20 POINT4D pt4d;.
192c0 20 20 64 6f 75 62 6c 65 20 78 3b 0a 20 20 20 20 double x;.
192d0 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 64 6f double y;. do
192e0 75 62 6c 65 20 7a 3b 0a 20 20 20 20 69 66 20 28 uble z;. if (
192f0 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c accessor == NULL
19300 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 )..return -1;..
19310 20 20 20 63 61 63 68 65 20 3d 20 28 73 74 72 75 cache = (stru
19320 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e ct splite_intern
19330 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 63 63 65 al_cache *) acce
19340 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 20 20 ssor->cache;.
19350 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 if (cache == NU
19360 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 LL)..return 0;.
19370 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 if (cache->ma
19380 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 gic1 != SPATIALI
19390 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a TE_CACHE_MAGIC1.
193a0 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 .|| cache->magic
193b0 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 2 != SPATIALITE_
193c0 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 CACHE_MAGIC2)..r
193d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 74 78 eturn 0;. ctx
193e0 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 4f = cache->RTTOPO
193f0 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 _handle;. if
19400 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 (ctx == NULL)..r
19410 65 74 75 72 6e 20 30 3b 0a 0a 2f 2a 20 63 6f 6d eturn 0;../* com
19420 70 6f 73 69 6e 67 20 74 68 65 20 53 51 4c 20 70 posing the SQL p
19430 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
19440 74 20 2a 2f 0a 20 20 20 20 74 61 62 6c 65 20 3d t */. table =
19450 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
19460 20 28 22 25 73 5f 6e 6f 64 65 22 2c 20 61 63 63 ("%s_node", acc
19470 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 79 5f essor->topology_
19480 6e 61 6d 65 29 3b 0a 20 20 20 20 78 74 61 62 6c name);. xtabl
19490 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 75 e = gaiaDoubleQu
194a0 6f 74 65 64 53 71 6c 20 28 74 61 62 6c 65 29 3b otedSql (table);
194b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
194c0 65 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 20 73 e (table);. s
194d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
194e0 69 6e 74 66 20 28 22 55 50 44 41 54 45 20 4d 41 intf ("UPDATE MA
194f0 49 4e 2e 5c 22 25 73 5c 22 20 53 45 54 20 22 2c IN.\"%s\" SET ",
19500 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 xtable);. fr
19510 65 65 20 28 78 74 61 62 6c 65 29 3b 0a 20 20 20 ee (xtable);.
19520 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
19530 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 if (upd_fields
19540 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e & RTT_COL_NODE_N
19550 4f 44 45 5f 49 44 29 0a 20 20 20 20 20 20 7b 0a ODE_ID). {.
19560 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 . if (comma)..
19570 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
19580 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
19590 20 6e 6f 64 65 5f 69 64 20 3d 20 3f 22 2c 20 70 node_id = ?", p
195a0 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 rev);.. else..
195b0 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
195c0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
195d0 6e 6f 64 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 node_id = ?", pr
195e0 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 ev);.. comma =
195f0 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 1;.. sqlite3_fr
19600 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 ee (prev);.. pr
19610 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 ev = sql;.
19620 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 }. if (upd_fi
19630 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e elds & RTT_COL_N
19640 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 5f 46 ODE_CONTAINING_F
19650 41 43 45 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 ACE). {..
19660 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 if (comma)..
19670 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
19680 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 63 6f mprintf ("%s, co
19690 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 3d 20 ntaining_face =
196a0 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c ?", prev);.. el
196b0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
196c0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
196d0 28 22 25 73 20 63 6f 6e 74 61 69 6e 69 6e 67 5f ("%s containing_
196e0 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 face = ?", prev)
196f0 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
19700 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
19710 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
19720 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
19730 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 if (upd_field
19740 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 s & RTT_COL_NODE
19750 5f 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 _GEOM). {..
19760 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 2d 3e if (accessor->
19770 68 61 73 5f 7a 29 0a 09 20 20 20 20 7b 0a 09 09 has_z).. {...
19780 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 20 20 20 if (comma)...
19790 20 73 71 6c 20 3d 0a 09 09 09 73 71 6c 69 74 65 sql =....sqlite
197a0 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 3_mprintf ("%s,
197b0 67 65 6f 6d 20 3d 20 4d 61 6b 65 50 6f 69 6e 74 geom = MakePoint
197c0 5a 28 3f 2c 20 3f 2c 20 3f 2c 20 25 64 29 22 2c Z(?, ?, ?, %d)",
197d0 0a 09 09 09 09 09 20 70 72 65 76 2c 20 61 63 63 ...... prev, acc
197e0 65 73 73 6f 72 2d 3e 73 72 69 64 29 3b 0a 09 09 essor->srid);...
197f0 65 6c 73 65 0a 09 09 20 20 20 20 73 71 6c 20 3d else... sql =
19800 0a 09 09 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 ....sqlite3_mpri
19810 6e 74 66 20 28 22 25 73 20 67 65 6f 6d 20 3d 20 ntf ("%s geom =
19820 4d 61 6b 65 50 6f 69 6e 74 5a 28 3f 2c 20 3f 2c MakePointZ(?, ?,
19830 20 3f 2c 20 25 64 29 22 2c 0a 09 09 09 09 09 20 ?, %d)",......
19840 70 72 65 76 2c 20 61 63 63 65 73 73 6f 72 2d 3e prev, accessor->
19850 73 72 69 64 29 3b 0a 09 20 20 20 20 7d 0a 09 20 srid);.. }..
19860 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 else.. {...i
19870 66 20 28 63 6f 6d 6d 61 29 0a 09 09 20 20 20 20 f (comma)...
19880 73 71 6c 20 3d 0a 09 09 09 73 71 6c 69 74 65 33 sql =....sqlite3
19890 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 67 _mprintf ("%s, g
198a0 65 6f 6d 20 3d 20 4d 61 6b 65 50 6f 69 6e 74 28 eom = MakePoint(
198b0 3f 2c 20 3f 2c 20 25 64 29 22 2c 20 70 72 65 76 ?, ?, %d)", prev
198c0 2c 0a 09 09 09 09 09 20 61 63 63 65 73 73 6f 72 ,...... accessor
198d0 2d 3e 73 72 69 64 29 3b 0a 09 09 65 6c 73 65 0a ->srid);...else.
198e0 09 09 20 20 20 20 73 71 6c 20 3d 0a 09 09 09 73 .. sql =....s
198f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
19900 22 25 73 20 67 65 6f 6d 20 3d 20 4d 61 6b 65 50 "%s geom = MakeP
19910 6f 69 6e 74 28 3f 2c 20 3f 2c 20 25 64 29 22 2c oint(?, ?, %d)",
19920 20 70 72 65 76 2c 0a 09 09 09 09 09 20 61 63 63 prev,...... acc
19930 65 73 73 6f 72 2d 3e 73 72 69 64 29 3b 0a 09 20 essor->srid);..
19940 20 20 20 7d 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 }.. comma =
19950 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 1;.. sqlite3_fr
19960 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 ee (prev);.. pr
19970 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 ev = sql;.
19980 7d 0a 20 20 20 20 69 66 20 28 65 78 63 5f 6e 6f }. if (exc_no
19990 64 65 20 7c 7c 20 73 65 6c 5f 6e 6f 64 65 29 0a de || sel_node).
199a0 20 20 20 20 20 20 7b 0a 09 20 20 73 71 6c 20 3d {.. sql =
199b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
199c0 20 28 22 25 73 20 57 48 45 52 45 22 2c 20 70 72 ("%s WHERE", pr
199d0 65 76 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f ev);.. sqlite3_
199e0 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
199f0 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 20 20 69 prev = sql;.. i
19a00 66 20 28 73 65 6c 5f 6e 6f 64 65 29 0a 09 20 20 f (sel_node)..
19a10 20 20 7b 0a 09 09 63 6f 6d 6d 61 20 3d 20 30 3b {...comma = 0;
19a20 0a 09 09 69 66 20 28 73 65 6c 5f 66 69 65 6c 64 ...if (sel_field
19a30 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 s & RTT_COL_NODE
19a40 5f 4e 4f 44 45 5f 49 44 29 0a 09 09 20 20 7b 0a _NODE_ID)... {.
19a50 09 09 20 20 20 20 20 20 69 66 20 28 63 6f 6d 6d .. if (comm
19a60 61 29 0a 09 09 09 20 20 73 71 6c 20 3d 20 73 71 a).... sql = sq
19a70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
19a80 25 73 20 41 4e 44 20 6e 6f 64 65 5f 69 64 20 3d %s AND node_id =
19a90 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 ?", prev);...
19aa0 20 20 20 20 65 6c 73 65 0a 09 09 09 20 20 73 71 else.... sq
19ab0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
19ac0 6e 74 66 20 28 22 25 73 20 6e 6f 64 65 5f 69 64 ntf ("%s node_id
19ad0 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 = ?", prev);...
19ae0 20 20 20 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b comma = 1;
19af0 0a 09 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 ... sqlite3
19b00 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 09 _free (prev);...
19b10 20 20 20 20 20 20 70 72 65 76 20 3d 20 73 71 6c prev = sql
19b20 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 73 65 ;... }...if (se
19b30 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 l_fields & RTT_C
19b40 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 OL_NODE_CONTAINI
19b50 4e 47 5f 46 41 43 45 29 0a 09 09 20 20 7b 0a 09 NG_FACE)... {..
19b60 09 20 20 20 20 20 20 69 66 20 28 73 65 6c 5f 6e . if (sel_n
19b70 6f 64 65 2d 3e 63 6f 6e 74 61 69 6e 69 6e 67 5f ode->containing_
19b80 66 61 63 65 20 3c 20 30 29 0a 09 09 09 7b 0a 09 face < 0)....{..
19b90 09 09 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 .. if (comma)
19ba0 0a 09 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 .....sql =.....
19bb0 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e sqlite3_mprin
19bc0 74 66 0a 09 09 09 09 20 20 20 20 28 22 25 73 20 tf..... ("%s
19bd0 41 4e 44 20 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 AND containing_f
19be0 61 63 65 20 49 53 20 4e 55 4c 4c 22 2c 20 70 72 ace IS NULL", pr
19bf0 65 76 29 3b 0a 09 09 09 20 20 20 20 65 6c 73 65 ev);.... else
19c00 0a 09 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 .....sql =.....
19c10 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e sqlite3_mprin
19c20 74 66 0a 09 09 09 09 20 20 20 20 28 22 25 73 20 tf..... ("%s
19c30 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 containing_face
19c40 49 53 20 4e 55 4c 4c 22 2c 20 70 72 65 76 29 3b IS NULL", prev);
19c50 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c ....}... el
19c60 73 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 69 se....{.... i
19c70 66 20 28 63 6f 6d 6d 61 29 0a 09 09 09 09 73 71 f (comma).....sq
19c80 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 6c 69 l =..... sqli
19c90 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 09 09 te3_mprintf.....
19ca0 20 20 20 20 28 22 25 73 20 41 4e 44 20 63 6f 6e ("%s AND con
19cb0 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 3d 20 3f taining_face = ?
19cc0 22 2c 20 70 72 65 76 29 3b 0a 09 09 09 20 20 20 ", prev);....
19cd0 20 65 6c 73 65 0a 09 09 09 09 73 71 6c 20 3d 0a else.....sql =.
19ce0 09 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f .... sqlite3_
19cf0 6d 70 72 69 6e 74 66 20 28 22 25 73 20 63 6f 6e mprintf ("%s con
19d00 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 3d 20 3f taining_face = ?
19d10 22 2c 0a 09 09 09 09 09 09 20 20 20 20 20 70 72 ",....... pr
19d20 65 76 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 ev);....}...
19d30 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 20 comma = 1;...
19d40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
19d50 65 20 28 70 72 65 76 29 3b 0a 09 09 20 20 20 20 e (prev);...
19d60 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 09 prev = sql;...
19d70 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 }.. }.. if
19d80 20 28 65 78 63 5f 6e 6f 64 65 29 0a 09 20 20 20 (exc_node)..
19d90 20 7b 0a 09 09 69 66 20 28 73 65 6c 5f 6e 6f 64 {...if (sel_nod
19da0 65 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 e)... {...
19db0 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
19dc0 70 72 69 6e 74 66 20 28 22 25 73 20 41 4e 44 22 printf ("%s AND"
19dd0 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 , prev);...
19de0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 sqlite3_free (p
19df0 72 65 76 29 3b 0a 09 09 20 20 20 20 20 20 70 72 rev);... pr
19e00 65 76 20 3d 20 73 71 6c 3b 0a 09 09 20 20 7d 0a ev = sql;... }.
19e10 09 09 63 6f 6d 6d 61 20 3d 20 30 3b 0a 09 09 69 ..comma = 0;...i
19e20 66 20 28 65 78 63 5f 66 69 65 6c 64 73 20 26 20 f (exc_fields &
19e30 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 RTT_COL_NODE_NOD
19e40 45 5f 49 44 29 0a 09 09 20 20 7b 0a 09 09 20 20 E_ID)... {...
19e50 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 if (comma)..
19e60 09 09 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 .. sql = sqlite
19e70 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 41 3_mprintf ("%s A
19e80 4e 44 20 6e 6f 64 65 5f 69 64 20 3c 3e 20 3f 22 ND node_id <> ?"
19e90 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 20 20 20 , prev);...
19ea0 20 65 6c 73 65 0a 09 09 09 20 20 73 71 6c 20 3d else.... sql =
19eb0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
19ec0 20 28 22 25 73 20 6e 6f 64 65 5f 69 64 20 3c 3e ("%s node_id <>
19ed0 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 09 20 20 ?", prev);...
19ee0 20 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 comma = 1;..
19ef0 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 . sqlite3_f
19f00 72 65 65 20 28 70 72 65 76 29 3b 0a 09 09 20 20 ree (prev);...
19f10 20 20 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a prev = sql;.
19f20 09 09 20 20 7d 0a 09 09 69 66 20 28 65 78 63 5f .. }...if (exc_
19f30 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c fields & RTT_COL
19f40 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 _NODE_CONTAINING
19f50 5f 46 41 43 45 29 0a 09 09 20 20 7b 0a 09 09 20 _FACE)... {...
19f60 20 20 20 20 20 69 66 20 28 65 78 63 5f 6e 6f 64 if (exc_nod
19f70 65 2d 3e 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 e->containing_fa
19f80 63 65 20 3c 20 30 29 0a 09 09 09 7b 0a 09 09 09 ce < 0)....{....
19f90 20 20 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 if (comma)..
19fa0 09 09 09 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 ...sql =.....
19fb0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
19fc0 0a 09 09 09 09 20 20 20 20 28 22 25 73 20 41 4e ..... ("%s AN
19fd0 44 20 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 D containing_fac
19fe0 65 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 2c 0a e IS NOT NULL",.
19ff0 09 09 09 09 20 20 20 20 20 70 72 65 76 29 3b 0a .... prev);.
1a000 09 09 09 20 20 20 20 65 6c 73 65 0a 09 09 09 09 ... else.....
1a010 73 71 6c 20 3d 0a 09 09 09 09 20 20 20 20 73 71 sql =..... sq
1a020 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 lite3_mprintf...
1a030 09 09 20 20 20 20 28 22 25 73 20 63 6f 6e 74 61 .. ("%s conta
1a040 69 6e 69 6e 67 5f 66 61 63 65 20 49 53 20 4e 4f ining_face IS NO
1a050 54 20 4e 55 4c 4c 22 2c 20 70 72 65 76 29 3b 0a T NULL", prev);.
1a060 09 09 09 7d 0a 09 09 20 20 20 20 20 20 65 6c 73 ...}... els
1a070 65 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 69 66 e....{.... if
1a080 20 28 63 6f 6d 6d 61 29 0a 09 09 09 09 73 71 6c (comma).....sql
1a090 20 3d 0a 09 09 09 09 20 20 20 20 73 71 6c 69 74 =..... sqlit
1a0a0 65 33 5f 6d 70 72 69 6e 74 66 0a 09 09 09 09 20 e3_mprintf.....
1a0b0 20 20 20 28 22 25 73 20 41 4e 44 20 63 6f 6e 74 ("%s AND cont
1a0c0 61 69 6e 69 6e 67 5f 66 61 63 65 20 3c 3e 20 3f aining_face <> ?
1a0d0 22 2c 20 70 72 65 76 29 3b 0a 09 09 09 20 20 20 ", prev);....
1a0e0 20 65 6c 73 65 0a 09 09 09 09 73 71 6c 20 3d 0a else.....sql =.
1a0f0 09 09 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f .... sqlite3_
1a100 6d 70 72 69 6e 74 66 20 28 22 25 73 20 63 6f 6e mprintf ("%s con
1a110 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 3c 3e 20 taining_face <>
1a120 3f 22 2c 0a 09 09 09 09 09 09 20 20 20 20 20 70 ?",....... p
1a130 72 65 76 29 3b 0a 09 09 09 7d 0a 09 09 20 20 20 rev);....}...
1a140 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 09 comma = 1;...
1a150 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 sqlite3_fr
1a160 65 65 20 28 70 72 65 76 29 3b 0a 09 09 20 20 20 ee (prev);...
1a170 20 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 prev = sql;..
1a180 09 20 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20 20 . }.. }.
1a190 20 20 7d 0a 20 20 20 20 72 65 74 20 3d 0a 09 73 }. ret =..s
1a1a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 qlite3_prepare_v
1a1b0 32 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 2 (accessor->db_
1a1c0 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 73 74 72 handle, sql, str
1a1d0 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 74 6d 74 len (sql), &stmt
1a1e0 2c 0a 09 09 09 20 20 20 20 4e 55 4c 4c 29 3b 0a ,.... NULL);.
1a1f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
1a200 20 28 73 71 6c 29 3b 0a 20 20 20 20 69 66 20 28 (sql);. if (
1a210 72 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b ret != SQLITE_OK
1a220 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 68 61 ). {.. cha
1a230 72 20 2a 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 r *msg = sqlite3
1a240 5f 6d 70 72 69 6e 74 66 20 28 22 50 72 65 70 61 _mprintf ("Prepa
1a250 72 65 5f 75 70 64 61 74 65 4e 6f 64 65 73 20 65 re_updateNodes e
1a260 72 72 6f 72 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 rror: \"%s\"",..
1a270 09 09 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 ... sqlite
1a280 33 5f 65 72 72 6d 73 67 20 28 61 63 63 65 73 73 3_errmsg (access
1a290 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b or->db_handle));
1a2a0 0a 09 20 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 .. gaiatopo_set
1a2b0 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 _last_error_msg
1a2c0 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 (topo, msg);..
1a2d0 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 sqlite3_free (ms
1a2e0 67 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 2d 31 g);.. return -1
1a2f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 70 61 ;. }../* pa
1a300 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 20 rameter binding
1a310 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 */. sqlite3_r
1a320 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 eset (stmt);.
1a330 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 sqlite3_clear_b
1a340 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b 0a indings (stmt);.
1a350 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c if (upd_fiel
1a360 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 ds & RTT_COL_NOD
1a370 45 5f 4e 4f 44 45 5f 49 44 29 0a 20 20 20 20 20 E_NODE_ID).
1a380 20 7b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 {.. sqlite3_bi
1a390 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 nd_int64 (stmt,
1a3a0 69 63 6f 6c 2c 20 75 70 64 5f 6e 6f 64 65 2d 3e icol, upd_node->
1a3b0 6e 6f 64 65 5f 69 64 29 3b 0a 09 20 20 69 63 6f node_id);.. ico
1a3c0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 l++;. }.
1a3d0 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 if (upd_fields
1a3e0 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 43 & RTT_COL_NODE_C
1a3f0 4f 4e 54 41 49 4e 49 4e 47 5f 46 41 43 45 29 0a ONTAINING_FACE).
1a400 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 75 {.. if (u
1a410 70 64 5f 6e 6f 64 65 2d 3e 63 6f 6e 74 61 69 6e pd_node->contain
1a420 69 6e 67 5f 66 61 63 65 20 3c 20 30 29 0a 09 20 ing_face < 0)..
1a430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
1a440 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 69 63 d_null (stmt, ic
1a450 6f 6c 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 ol);.. else..
1a460 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
1a470 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 _int64 (stmt, ic
1a480 6f 6c 2c 20 75 70 64 5f 6e 6f 64 65 2d 3e 63 6f ol, upd_node->co
1a490 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 29 3b 0a ntaining_face);.
1a4a0 09 20 20 69 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20 . icol++;.
1a4b0 20 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 }. if (upd_f
1a4c0 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
1a4d0 4e 4f 44 45 5f 47 45 4f 4d 29 0a 20 20 20 20 20 NODE_GEOM).
1a4e0 20 7b 0a 09 20 20 2f 2a 20 65 78 74 72 61 63 74 {.. /* extract
1a4f0 69 6e 67 20 58 20 61 6e 64 20 59 20 66 72 6f 6d ing X and Y from
1a500 20 52 54 54 4f 50 4f 20 2a 2f 0a 09 20 20 70 61 RTTOPO */.. pa
1a510 20 3d 20 75 70 64 5f 6e 6f 64 65 2d 3e 67 65 6f = upd_node->geo
1a520 6d 2d 3e 70 6f 69 6e 74 3b 0a 09 20 20 72 74 5f m->point;.. rt_
1a530 67 65 74 50 6f 69 6e 74 34 64 5f 70 20 28 63 74 getPoint4d_p (ct
1a540 78 2c 20 70 61 2c 20 30 2c 20 26 70 74 34 64 29 x, pa, 0, &pt4d)
1a550 3b 0a 09 20 20 78 20 3d 20 70 74 34 64 2e 78 3b ;.. x = pt4d.x;
1a560 0a 09 20 20 79 20 3d 20 70 74 34 64 2e 79 3b 0a .. y = pt4d.y;.
1a570 09 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 2d . if (accessor-
1a580 3e 68 61 73 5f 7a 29 0a 09 20 20 20 20 20 20 7a >has_z).. z
1a590 20 3d 20 70 74 34 64 2e 7a 3b 0a 09 20 20 73 71 = pt4d.z;.. sq
1a5a0 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c lite3_bind_doubl
1a5b0 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 78 e (stmt, icol, x
1a5c0 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b 0a 09 20 );.. icol++;..
1a5d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f sqlite3_bind_do
1a5e0 75 62 6c 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c uble (stmt, icol
1a5f0 2c 20 79 29 3b 0a 09 20 20 69 63 6f 6c 2b 2b 3b , y);.. icol++;
1a600 0a 09 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 .. if (accessor
1a610 2d 3e 68 61 73 5f 7a 29 0a 09 20 20 20 20 7b 0a ->has_z).. {.
1a620 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 ..sqlite3_bind_d
1a630 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 69 63 6f ouble (stmt, ico
1a640 6c 2c 20 7a 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b l, z);...icol++;
1a650 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a .. }. }.
1a660 20 20 20 20 69 66 20 28 73 65 6c 5f 6e 6f 64 65 if (sel_node
1a670 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 ). {.. if
1a680 28 73 65 6c 5f 66 69 65 6c 64 73 20 26 20 52 54 (sel_fields & RT
1a690 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 45 5f T_COL_NODE_NODE_
1a6a0 49 44 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c ID).. {...sql
1a6b0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
1a6c0 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 73 65 6c (stmt, icol, sel
1a6d0 5f 6e 6f 64 65 2d 3e 6e 6f 64 65 5f 69 64 29 3b _node->node_id);
1a6e0 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 ...icol++;..
1a6f0 7d 0a 09 20 20 69 66 20 28 73 65 6c 5f 66 69 65 }.. if (sel_fie
1a700 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f lds & RTT_COL_NO
1a710 44 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 5f 46 41 DE_CONTAINING_FA
1a720 43 45 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 CE).. {...if
1a730 28 73 65 6c 5f 6e 6f 64 65 2d 3e 63 6f 6e 74 61 (sel_node->conta
1a740 69 6e 69 6e 67 5f 66 61 63 65 20 3c 20 30 29 0a ining_face < 0).
1a750 09 09 20 20 20 20 3b 0a 09 09 65 6c 73 65 0a 09 .. ;...else..
1a760 09 20 20 7b 0a 09 09 20 20 20 20 20 20 73 71 6c . {... sql
1a770 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
1a780 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 0a 09 09 09 (stmt, icol,....
1a790 09 09 20 20 73 65 6c 5f 6e 6f 64 65 2d 3e 63 6f .. sel_node->co
1a7a0 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 29 3b 0a ntaining_face);.
1a7b0 09 09 20 20 20 20 20 20 69 63 6f 6c 2b 2b 3b 0a .. icol++;.
1a7c0 09 09 20 20 7d 0a 09 20 20 20 20 7d 0a 20 20 20 .. }.. }.
1a7d0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 65 78 63 }. if (exc
1a7e0 5f 6e 6f 64 65 29 0a 20 20 20 20 20 20 7b 0a 09 _node). {..
1a7f0 20 20 69 66 20 28 65 78 63 5f 66 69 65 6c 64 73 if (exc_fields
1a800 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f & RTT_COL_NODE_
1a810 4e 4f 44 45 5f 49 44 29 0a 09 20 20 20 20 7b 0a NODE_ID).. {.
1a820 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 ..sqlite3_bind_i
1a830 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c nt64 (stmt, icol
1a840 2c 20 65 78 63 5f 6e 6f 64 65 2d 3e 6e 6f 64 65 , exc_node->node
1a850 5f 69 64 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a _id);...icol++;.
1a860 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 65 78 . }.. if (ex
1a870 63 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 c_fields & RTT_C
1a880 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 OL_NODE_CONTAINI
1a890 4e 47 5f 46 41 43 45 29 0a 09 20 20 20 20 7b 0a NG_FACE).. {.
1a8a0 09 09 69 66 20 28 65 78 63 5f 6e 6f 64 65 2d 3e ..if (exc_node->
1a8b0 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 containing_face
1a8c0 3c 20 30 29 0a 09 09 20 20 20 20 3b 0a 09 09 65 < 0)... ;...e
1a8d0 6c 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 lse... {...
1a8e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
1a8f0 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c nt64 (stmt, icol
1a900 2c 0a 09 09 09 09 09 20 20 65 78 63 5f 6e 6f 64 ,...... exc_nod
1a910 65 2d 3e 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 e->containing_fa
1a920 63 65 29 3b 0a 09 09 20 20 20 20 20 20 69 63 6f ce);... ico
1a930 6c 2b 2b 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 l++;... }..
1a940 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 }. }. re
1a950 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 t = sqlite3_step
1a960 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 69 66 20 (stmt);. if
1a970 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 (ret == SQLITE_D
1a980 4f 4e 45 20 7c 7c 20 72 65 74 20 3d 3d 20 53 51 ONE || ret == SQ
1a990 4c 49 54 45 5f 52 4f 57 29 0a 09 63 68 61 6e 67 LITE_ROW)..chang
1a9a0 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 68 61 ed = sqlite3_cha
1a9b0 6e 67 65 73 20 28 61 63 63 65 73 73 6f 72 2d 3e nges (accessor->
1a9c0 64 62 5f 68 61 6e 64 6c 65 29 3b 0a 20 20 20 20 db_handle);.
1a9d0 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 else. {..
1a9e0 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c 69 char *msg = sqli
1a9f0 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 63 61 te3_mprintf ("ca
1aa00 6c 6c 62 61 63 6b 5f 75 70 64 61 74 65 4e 6f 64 llback_updateNod
1aa10 65 73 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 es: \"%s\"",....
1aa20 09 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f . sqlite3_
1aa30 65 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f 72 errmsg (accessor
1aa40 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 ->db_handle));..
1aa50 20 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c gaiatopo_set_l
1aa60 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 ast_error_msg (t
1aa70 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 73 71 opo, msg);.. sq
1aa80 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 lite3_free (msg)
1aa90 3b 0a 09 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b ;.. goto error;
1aaa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c . }. sql
1aab0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 ite3_finalize (s
1aac0 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e tmt);. return
1aad0 20 63 68 61 6e 67 65 64 3b 0a 0a 20 20 65 72 72 changed;.. err
1aae0 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f or:. sqlite3_
1aaf0 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b finalize (stmt);
1ab00 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
1ab10 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b 5f }..int.callback_
1ab20 69 6e 73 65 72 74 46 61 63 65 73 20 28 63 6f 6e insertFaces (con
1ab30 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f st RTT_BE_TOPOLO
1ab40 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 20 52 GY * rtt_topo, R
1ab50 54 54 5f 49 53 4f 5f 46 41 43 45 20 2a 20 66 61 TT_ISO_FACE * fa
1ab60 63 65 73 2c 0a 09 09 20 20 20 20 20 20 69 6e 74 ces,... int
1ab70 20 6e 75 6d 65 6c 65 6d 73 29 0a 7b 0a 2f 2a 20 numelems).{./*
1ab80 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f callback functio
1ab90 6e 3a 20 69 6e 73 65 72 74 46 61 63 65 73 20 2a n: insertFaces *
1aba0 2f 0a 20 20 20 20 47 61 69 61 54 6f 70 6f 6c 6f /. GaiaTopolo
1abb0 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 74 6f gyAccessorPtr to
1abc0 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f 6c 6f po = (GaiaTopolo
1abd0 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 20 72 gyAccessorPtr) r
1abe0 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 74 72 tt_topo;. str
1abf0 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 uct gaia_topolog
1ac00 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 28 73 y *accessor = (s
1ac10 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c truct gaia_topol
1ac20 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 20 ogy *) topo;.
1ac30 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e int ret;. in
1ac40 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 t i;. int cou
1ac50 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 nt = 0;. sqli
1ac60 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 3b 0a te3_stmt *stmt;.
1ac70 20 20 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 if (accessor
1ac80 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 == NULL)..retur
1ac90 6e 20 2d 31 3b 0a 0a 20 20 20 20 73 74 6d 74 20 n -1;.. stmt
1aca0 3d 20 61 63 63 65 73 73 6f 72 2d 3e 73 74 6d 74 = accessor->stmt
1acb0 5f 69 6e 73 65 72 74 46 61 63 65 73 3b 0a 20 20 _insertFaces;.
1acc0 20 20 69 66 20 28 73 74 6d 74 20 3d 3d 20 4e 55 if (stmt == NU
1acd0 4c 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a LL)..return -1;.
1ace0 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b . for (i = 0;
1acf0 20 69 20 3c 20 6e 75 6d 65 6c 65 6d 73 3b 20 69 i < numelems; i
1ad00 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 52 ++). {.. R
1ad10 54 54 5f 49 53 4f 5f 46 41 43 45 20 2a 66 63 20 TT_ISO_FACE *fc
1ad20 3d 20 66 61 63 65 73 20 2b 20 69 3b 0a 09 20 20 = faces + i;..
1ad30 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 sqlite3_reset (s
1ad40 74 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 tmt);.. sqlite3
1ad50 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 _clear_bindings
1ad60 28 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 66 (stmt);.. if (f
1ad70 63 2d 3e 66 61 63 65 5f 69 64 20 3c 3d 20 30 29 c->face_id <= 0)
1ad80 0a 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f .. sqlite3_
1ad90 62 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c bind_null (stmt,
1ada0 20 31 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 1);.. else..
1adb0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
1adc0 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 31 2c _int64 (stmt, 1,
1add0 20 66 63 2d 3e 66 61 63 65 5f 69 64 29 3b 0a 09 fc->face_id);..
1ade0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 sqlite3_bind_d
1adf0 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 32 2c 20 ouble (stmt, 2,
1ae00 66 63 2d 3e 6d 62 72 2d 3e 78 6d 69 6e 29 3b 0a fc->mbr->xmin);.
1ae10 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f . sqlite3_bind_
1ae20 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 33 2c double (stmt, 3,
1ae30 20 66 63 2d 3e 6d 62 72 2d 3e 79 6d 69 6e 29 3b fc->mbr->ymin);
1ae40 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 .. sqlite3_bind
1ae50 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 34 _double (stmt, 4
1ae60 2c 20 66 63 2d 3e 6d 62 72 2d 3e 78 6d 61 78 29 , fc->mbr->xmax)
1ae70 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ;.. sqlite3_bin
1ae80 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 d_double (stmt,
1ae90 35 2c 20 66 63 2d 3e 6d 62 72 2d 3e 79 6d 61 78 5, fc->mbr->ymax
1aea0 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 );.. ret = sqli
1aeb0 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b te3_step (stmt);
1aec0 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 .. if (ret == S
1aed0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 QLITE_DONE || re
1aee0 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 t == SQLITE_ROW)
1aef0 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 66 63 .. {...if (fc
1af00 2d 3e 66 61 63 65 5f 69 64 20 3c 3d 20 30 29 0a ->face_id <= 0).
1af10 09 09 20 20 20 20 66 63 2d 3e 66 61 63 65 5f 69 .. fc->face_i
1af20 64 20 3d 0a 09 09 09 73 71 6c 69 74 65 33 5f 6c d =....sqlite3_l
1af30 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 ast_insert_rowid
1af40 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
1af50 61 6e 64 6c 65 29 3b 0a 09 09 63 6f 75 6e 74 2b andle);...count+
1af60 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 +;.. }.. els
1af70 65 0a 09 20 20 20 20 7b 0a 09 09 63 68 61 72 20 e.. {...char
1af80 2a 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d *msg = sqlite3_m
1af90 70 72 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 printf ("callbac
1afa0 6b 5f 69 6e 73 65 72 74 46 61 63 65 73 3a 20 5c k_insertFaces: \
1afb0 22 25 73 5c 22 22 2c 0a 09 09 09 09 09 20 20 20 "%s\"",......
1afc0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 sqlite3_errmsg
1afd0 0a 09 09 09 09 09 20 20 20 20 20 28 61 63 63 65 ...... (acce
1afe0 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 ssor->db_handle)
1aff0 29 3b 0a 09 09 67 61 69 61 74 6f 70 6f 5f 73 65 );...gaiatopo_se
1b000 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 t_last_error_msg
1b010 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 (topo, msg);...
1b020 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 6d 73 sqlite3_free (ms
1b030 67 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 g);...goto error
1b040 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d ;.. }. }
1b050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 . sqlite3_res
1b060 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 et (stmt);. r
1b070 65 74 75 72 6e 20 63 6f 75 6e 74 3b 0a 0a 20 20 eturn count;..
1b080 65 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 error:. sqlit
1b090 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b e3_reset (stmt);
1b0a0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
1b0b0 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b 5f }..int.callback_
1b0c0 75 70 64 61 74 65 46 61 63 65 73 42 79 49 64 20 updateFacesById
1b0d0 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f (const RTT_BE_TO
1b0e0 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 POLOGY * rtt_top
1b0f0 6f 2c 0a 09 09 09 20 20 63 6f 6e 73 74 20 52 54 o,.... const RT
1b100 54 5f 49 53 4f 5f 46 41 43 45 20 2a 20 66 61 63 T_ISO_FACE * fac
1b110 65 73 2c 20 69 6e 74 20 6e 75 6d 66 61 63 65 73 es, int numfaces
1b120 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 ).{./* callback
1b130 66 75 6e 63 74 69 6f 6e 3a 20 75 70 64 61 74 65 function: update
1b140 46 61 63 65 73 42 79 49 64 20 2a 2f 0a 20 20 20 FacesById */.
1b150 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 GaiaTopologyAcc
1b160 65 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 essorPtr topo =
1b170 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 (GaiaTopologyAcc
1b180 65 73 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f essorPtr) rtt_to
1b190 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 po;. struct g
1b1a0 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 aia_topology *ac
1b1b0 63 65 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 cessor = (struct
1b1c0 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a gaia_topology *
1b1d0 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 ) topo;. sqli
1b1e0 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 20 3d te3_stmt *stmt =
1b1f0 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 NULL;. int r
1b200 65 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 et;. int i;.
1b210 20 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d int changed =
1b220 20 30 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 0;. if (acce
1b230 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 ssor == NULL)..r
1b240 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 20 20 73 eturn -1;.. s
1b250 74 6d 74 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e tmt = accessor->
1b260 73 74 6d 74 5f 75 70 64 61 74 65 46 61 63 65 73 stmt_updateFaces
1b270 42 79 49 64 3b 0a 20 20 20 20 69 66 20 28 73 74 ById;. if (st
1b280 6d 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 mt == NULL)..ret
1b290 75 72 6e 20 2d 31 3b 0a 0a 20 20 20 20 66 6f 72 urn -1;.. for
1b2a0 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 6e 75 6d (i = 0; i < num
1b2b0 66 61 63 65 73 3b 20 69 2b 2b 29 0a 20 20 20 20 faces; i++).
1b2c0 20 20 7b 0a 09 20 20 2f 2a 20 70 61 72 61 6d 65 {.. /* parame
1b2d0 74 65 72 20 62 69 6e 64 69 6e 67 20 2a 2f 0a 09 ter binding */..
1b2e0 20 20 63 6f 6e 73 74 20 52 54 54 5f 49 53 4f 5f const RTT_ISO_
1b2f0 46 41 43 45 20 2a 66 63 20 3d 20 66 61 63 65 73 FACE *fc = faces
1b300 20 2b 20 69 3b 0a 09 20 20 73 71 6c 69 74 65 33 + i;.. sqlite3
1b310 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 09 _reset (stmt);..
1b320 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f sqlite3_clear_
1b330 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 29 3b bindings (stmt);
1b340 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 .. sqlite3_bind
1b350 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 31 _double (stmt, 1
1b360 2c 20 66 63 2d 3e 6d 62 72 2d 3e 78 6d 69 6e 29 , fc->mbr->xmin)
1b370 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 6e ;.. sqlite3_bin
1b380 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 d_double (stmt,
1b390 32 2c 20 66 63 2d 3e 6d 62 72 2d 3e 79 6d 69 6e 2, fc->mbr->ymin
1b3a0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 );.. sqlite3_bi
1b3b0 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c nd_double (stmt,
1b3c0 20 33 2c 20 66 63 2d 3e 6d 62 72 2d 3e 78 6d 61 3, fc->mbr->xma
1b3d0 78 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 x);.. sqlite3_b
1b3e0 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 ind_double (stmt
1b3f0 2c 20 34 2c 20 66 63 2d 3e 6d 62 72 2d 3e 79 6d , 4, fc->mbr->ym
1b400 61 78 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f ax);.. sqlite3_
1b410 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 bind_int64 (stmt
1b420 2c 20 35 2c 20 66 63 2d 3e 66 61 63 65 5f 69 64 , 5, fc->face_id
1b430 29 3b 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 );.. ret = sqli
1b440 74 65 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b te3_step (stmt);
1b450 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 .. if (ret == S
1b460 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 QLITE_DONE || re
1b470 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 t == SQLITE_ROW)
1b480 0a 09 20 20 20 20 20 20 63 68 61 6e 67 65 64 20 .. changed
1b490 2b 3d 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 += sqlite3_chang
1b4a0 65 73 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 es (accessor->db
1b4b0 5f 68 61 6e 64 6c 65 29 3b 0a 09 20 20 65 6c 73 _handle);.. els
1b4c0 65 0a 09 20 20 20 20 7b 0a 09 09 63 68 61 72 20 e.. {...char
1b4d0 2a 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d *msg = sqlite3_m
1b4e0 70 72 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 printf ("callbac
1b4f0 6b 5f 75 70 64 61 74 65 46 61 63 65 73 42 79 49 k_updateFacesByI
1b500 64 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 d: \"%s\"",.....
1b510 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 . sqlite3_er
1b520 72 6d 73 67 0a 09 09 09 09 09 20 20 20 20 20 28 rmsg...... (
1b530 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e accessor->db_han
1b540 64 6c 65 29 29 3b 0a 09 09 67 61 69 61 74 6f 70 dle));...gaiatop
1b550 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 o_set_last_error
1b560 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 _msg (topo, msg)
1b570 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 ;...sqlite3_free
1b580 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 (msg);...goto e
1b590 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 rror;.. }.
1b5a0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
1b5b0 63 68 61 6e 67 65 64 3b 0a 0a 20 20 65 72 72 6f changed;.. erro
1b5c0 72 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 r:. return -1
1b5d0 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 ;.}..int.callbac
1b5e0 6b 5f 64 65 6c 65 74 65 46 61 63 65 73 42 79 49 k_deleteFacesByI
1b5f0 64 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f d (const RTT_BE_
1b600 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 TOPOLOGY * rtt_t
1b610 6f 70 6f 2c 0a 09 09 09 20 20 63 6f 6e 73 74 20 opo,.... const
1b620 52 54 54 5f 45 4c 45 4d 49 44 20 2a 20 69 64 73 RTT_ELEMID * ids
1b630 2c 20 69 6e 74 20 6e 75 6d 65 6c 65 6d 73 29 0a , int numelems).
1b640 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 {./* callback fu
1b650 6e 63 74 69 6f 6e 3a 20 64 65 6c 65 74 65 46 61 nction: deleteFa
1b660 63 65 73 42 79 49 64 20 2a 2f 0a 20 20 20 20 47 cesById */. G
1b670 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 aiaTopologyAcces
1b680 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 sorPtr topo = (G
1b690 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 aiaTopologyAcces
1b6a0 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f sorPtr) rtt_topo
1b6b0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 69 ;. struct gai
1b6c0 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 a_topology *acce
1b6d0 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 ssor = (struct g
1b6e0 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 aia_topology *)
1b6f0 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 topo;. sqlite
1b700 33 5f 73 74 6d 74 20 2a 73 74 6d 74 20 3d 20 4e 3_stmt *stmt = N
1b710 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 ULL;. int ret
1b720 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 ;. int i;.
1b730 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 int changed = 0
1b740 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 73 73 ;. if (access
1b750 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 or == NULL)..ret
1b760 75 72 6e 20 2d 31 3b 0a 0a 20 20 20 20 73 74 6d urn -1;.. stm
1b770 74 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e 73 74 t = accessor->st
1b780 6d 74 5f 64 65 6c 65 74 65 46 61 63 65 73 42 79 mt_deleteFacesBy
1b790 49 64 3b 0a 20 20 20 20 69 66 20 28 73 74 6d 74 Id;. if (stmt
1b7a0 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 == NULL)..retur
1b7b0 6e 20 2d 31 3b 0a 0a 20 20 20 20 66 6f 72 20 28 n -1;.. for (
1b7c0 69 20 3d 20 30 3b 20 69 20 3c 20 6e 75 6d 65 6c i = 0; i < numel
1b7d0 65 6d 73 3b 20 69 2b 2b 29 0a 20 20 20 20 20 20 ems; i++).
1b7e0 7b 0a 09 20 20 2f 2a 20 70 61 72 61 6d 65 74 65 {.. /* paramete
1b7f0 72 20 62 69 6e 64 69 6e 67 20 2a 2f 0a 09 20 20 r binding */..
1b800 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 64 sqlite3_int64 id
1b810 20 3d 20 2a 28 69 64 73 20 2b 20 69 29 3b 0a 09 = *(ids + i);..
1b820 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 sqlite3_reset
1b830 28 73 74 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 (stmt);.. sqlit
1b840 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 e3_clear_binding
1b850 73 20 28 73 74 6d 74 29 3b 0a 09 20 20 73 71 6c s (stmt);.. sql
1b860 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
1b870 28 73 74 6d 74 2c 20 31 2c 20 69 64 29 3b 0a 09 (stmt, 1, id);..
1b880 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 5f ret = sqlite3_
1b890 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 20 20 step (stmt);..
1b8a0 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 if (ret == SQLIT
1b8b0 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 20 3d 3d E_DONE || ret ==
1b8c0 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 20 20 SQLITE_ROW)..
1b8d0 20 20 7b 0a 09 09 63 68 61 6e 67 65 64 20 2b 3d {...changed +=
1b8e0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 sqlite3_changes
1b8f0 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
1b900 61 6e 64 6c 65 29 3b 0a 09 20 20 20 20 7d 0a 09 andle);.. }..
1b910 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 else.. {...
1b920 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c 69 char *msg = sqli
1b930 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 63 61 te3_mprintf ("ca
1b940 6c 6c 62 61 63 6b 5f 64 65 6c 65 74 65 46 61 63 llback_deleteFac
1b950 65 73 42 79 49 64 3a 20 5c 22 25 73 5c 22 22 2c esById: \"%s\"",
1b960 0a 09 09 09 09 09 20 20 20 20 20 73 71 6c 69 74 ...... sqlit
1b970 65 33 5f 65 72 72 6d 73 67 0a 09 09 09 09 09 20 e3_errmsg......
1b980 20 20 20 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 (accessor->d
1b990 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 61 b_handle));...ga
1b9a0 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f iatopo_set_last_
1b9b0 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c error_msg (topo,
1b9c0 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 33 msg);...sqlite3
1b9d0 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 67 _free (msg);...g
1b9e0 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 20 oto error;..
1b9f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 }. }. sq
1ba00 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d lite3_reset (stm
1ba10 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 t);. return c
1ba20 68 61 6e 67 65 64 3b 0a 0a 20 20 65 72 72 6f 72 hanged;.. error
1ba30 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 :. sqlite3_re
1ba40 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 set (stmt);.
1ba50 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69 6e return -1;.}..in
1ba60 74 0a 63 61 6c 6c 62 61 63 6b 5f 64 65 6c 65 74 t.callback_delet
1ba70 65 4e 6f 64 65 73 42 79 49 64 20 28 63 6f 6e 73 eNodesById (cons
1ba80 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 t RTT_BE_TOPOLOG
1ba90 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 0a 09 09 Y * rtt_topo,...
1baa0 09 20 20 63 6f 6e 73 74 20 52 54 54 5f 45 4c 45 . const RTT_ELE
1bab0 4d 49 44 20 2a 20 69 64 73 2c 20 69 6e 74 20 6e MID * ids, int n
1bac0 75 6d 65 6c 65 6d 73 29 0a 7b 0a 2f 2a 20 63 61 umelems).{./* ca
1bad0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 3a llback function:
1bae0 20 64 65 6c 65 74 65 4e 6f 64 65 73 42 79 49 64 deleteNodesById
1baf0 20 2a 2f 0a 20 20 20 20 47 61 69 61 54 6f 70 6f */. GaiaTopo
1bb00 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 logyAccessorPtr
1bb10 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f topo = (GaiaTopo
1bb20 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 logyAccessorPtr)
1bb30 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 rtt_topo;. s
1bb40 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c truct gaia_topol
1bb50 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 ogy *accessor =
1bb60 28 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 (struct gaia_top
1bb70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 ology *) topo;.
1bb80 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 sqlite3_stmt
1bb90 2a 73 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *stmt = NULL;.
1bba0 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 int ret;. i
1bbb0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 63 68 nt i;. int ch
1bbc0 61 6e 67 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 anged = 0;. i
1bbd0 66 20 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e f (accessor == N
1bbe0 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b ULL)..return -1;
1bbf0 0a 0a 20 20 20 20 73 74 6d 74 20 3d 20 61 63 63 .. stmt = acc
1bc00 65 73 73 6f 72 2d 3e 73 74 6d 74 5f 64 65 6c 65 essor->stmt_dele
1bc10 74 65 4e 6f 64 65 73 42 79 49 64 3b 0a 20 20 20 teNodesById;.
1bc20 20 69 66 20 28 73 74 6d 74 20 3d 3d 20 4e 55 4c if (stmt == NUL
1bc30 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 0a L)..return -1;..
1bc40 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 for (i = 0;
1bc50 69 20 3c 20 6e 75 6d 65 6c 65 6d 73 3b 20 69 2b i < numelems; i+
1bc60 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a +). {.. /*
1bc70 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 parameter bindi
1bc80 6e 67 20 2a 2f 0a 09 20 20 73 71 6c 69 74 65 33 ng */.. sqlite3
1bc90 5f 69 6e 74 36 34 20 69 64 20 3d 20 2a 28 69 64 _int64 id = *(id
1bca0 73 20 2b 20 69 29 3b 0a 09 20 20 73 71 6c 69 74 s + i);.. sqlit
1bcb0 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b e3_reset (stmt);
1bcc0 0a 09 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 .. sqlite3_clea
1bcd0 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d 74 r_bindings (stmt
1bce0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 62 69 );.. sqlite3_bi
1bcf0 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 nd_int64 (stmt,
1bd00 31 2c 20 69 64 29 3b 0a 09 20 20 72 65 74 20 3d 1, id);.. ret =
1bd10 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 sqlite3_step (s
1bd20 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 tmt);.. if (ret
1bd30 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 == SQLITE_DONE
1bd40 7c 7c 20 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 || ret == SQLITE
1bd50 5f 52 4f 57 29 0a 09 20 20 20 20 7b 0a 09 09 63 _ROW).. {...c
1bd60 68 61 6e 67 65 64 20 2b 3d 20 73 71 6c 69 74 65 hanged += sqlite
1bd70 33 5f 63 68 61 6e 67 65 73 20 28 61 63 63 65 73 3_changes (acces
1bd80 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 3b sor->db_handle);
1bd90 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a .. }.. else.
1bda0 09 20 20 20 20 7b 0a 09 09 63 68 61 72 20 2a 6d . {...char *m
1bdb0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 sg = sqlite3_mpr
1bdc0 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 6b 5f intf ("callback_
1bdd0 64 65 6c 65 74 65 4e 6f 64 65 73 42 79 49 64 3a deleteNodesById:
1bde0 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 09 20 \"%s\"",......
1bdf0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d sqlite3_errm
1be00 73 67 0a 09 09 09 09 09 20 20 20 20 20 28 61 63 sg...... (ac
1be10 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c cessor->db_handl
1be20 65 29 29 3b 0a 09 09 67 61 69 61 74 6f 70 6f 5f e));...gaiatopo_
1be30 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d set_last_error_m
1be40 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a sg (topo, msg);.
1be50 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 ..sqlite3_free (
1be60 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 msg);...goto err
1be70 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 or;.. }.
1be80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 }. sqlite3_r
1be90 65 73 65 74 20 28 73 74 6d 74 29 3b 0a 20 20 20 eset (stmt);.
1bea0 20 72 65 74 75 72 6e 20 63 68 61 6e 67 65 64 3b return changed;
1beb0 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 73 .. error:. s
1bec0 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
1bed0 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 mt);. return
1bee0 2d 31 3b 0a 7d 0a 0a 52 54 54 5f 45 4c 45 4d 49 -1;.}..RTT_ELEMI
1bef0 44 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 D *.callback_get
1bf00 52 69 6e 67 45 64 67 65 73 20 28 63 6f 6e 73 74 RingEdges (const
1bf10 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 RTT_BE_TOPOLOGY
1bf20 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 0a 09 09 20 * rtt_topo,...
1bf30 20 20 20 20 20 20 52 54 54 5f 45 4c 45 4d 49 44 RTT_ELEMID
1bf40 20 65 64 67 65 2c 20 69 6e 74 20 2a 6e 75 6d 65 edge, int *nume
1bf50 64 67 65 73 2c 20 69 6e 74 20 6c 69 6d 69 74 29 dges, int limit)
1bf60 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 .{./* callback f
1bf70 75 6e 63 74 69 6f 6e 3a 20 67 65 74 52 69 6e 67 unction: getRing
1bf80 45 64 67 65 73 20 2a 2f 0a 20 20 20 20 63 6f 6e Edges */. con
1bf90 73 74 20 52 54 43 54 58 20 2a 63 74 78 20 3d 20 st RTCTX *ctx =
1bfa0 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 NULL;. struct
1bfb0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c splite_internal
1bfc0 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 3d 20 _cache *cache =
1bfd0 4e 55 4c 4c 3b 0a 20 20 20 20 47 61 69 61 54 6f NULL;. GaiaTo
1bfe0 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 pologyAccessorPt
1bff0 72 20 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f r topo = (GaiaTo
1c000 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 74 pologyAccessorPt
1c010 72 29 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 r) rtt_topo;.
1c020 20 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 struct gaia_top
1c030 6f 6c 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 20 ology *accessor
1c040 3d 20 28 73 74 72 75 63 74 20 67 61 69 61 5f 74 = (struct gaia_t
1c050 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b opology *) topo;
1c060 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 . int ret;.
1c070 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 int i;. int
1c080 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 count = 0;.
1c090 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 74 sqlite3_stmt *st
1c0a0 6d 74 3b 0a 0a 20 20 20 20 73 74 72 75 63 74 20 mt;.. struct
1c0b0 74 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 74 20 topo_edges_list
1c0c0 2a 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *list = NULL;.
1c0d0 20 20 52 54 54 5f 45 4c 45 4d 49 44 20 2a 72 65 RTT_ELEMID *re
1c0e0 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 sult = NULL;.
1c0f0 20 69 66 20 28 61 63 63 65 73 73 6f 72 20 3d 3d if (accessor ==
1c100 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 NULL). {..
1c110 20 20 2a 6e 75 6d 65 64 67 65 73 20 3d 20 2d 31 *numedges = -1
1c120 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c ;.. return NULL
1c130 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 73 ;. }.. s
1c140 74 6d 74 20 3d 20 61 63 63 65 73 73 6f 72 2d 3e tmt = accessor->
1c150 73 74 6d 74 5f 67 65 74 52 69 6e 67 45 64 67 65 stmt_getRingEdge
1c160 73 3b 0a 20 20 20 20 69 66 20 28 73 74 6d 74 20 s;. if (stmt
1c170 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b == NULL). {
1c180 0a 09 20 20 2a 6e 75 6d 65 64 67 65 73 20 3d 20 .. *numedges =
1c190 2d 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 -1;.. return NU
1c1a0 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 LL;. }..
1c1b0 20 63 61 63 68 65 20 3d 20 28 73 74 72 75 63 74 cache = (struct
1c1c0 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c splite_internal
1c1d0 5f 63 61 63 68 65 20 2a 29 20 61 63 63 65 73 73 _cache *) access
1c1e0 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 20 20 20 69 or->cache;. i
1c1f0 66 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c f (cache == NULL
1c200 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a )..return NULL;.
1c210 20 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d if (cache->m
1c220 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c agic1 != SPATIAL
1c230 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 ITE_CACHE_MAGIC1
1c240 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 ..|| cache->magi
1c250 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 c2 != SPATIALITE
1c260 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 _CACHE_MAGIC2)..
1c270 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
1c280 20 63 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 ctx = cache->RT
1c290 54 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 TOPO_handle;.
1c2a0 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c if (ctx == NULL
1c2b0 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a )..return NULL;.
1c2c0 0a 2f 2a 20 73 65 74 74 69 6e 67 20 75 70 20 74 ./* setting up t
1c2d0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 he prepared stat
1c2e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c ement */. sql
1c2f0 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 ite3_reset (stmt
1c300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 );. sqlite3_c
1c310 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 lear_bindings (s
1c320 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 tmt);. sqlite
1c330 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 3_bind_double (s
1c340 74 6d 74 2c 20 31 2c 20 65 64 67 65 29 3b 0a 20 tmt, 1, edge);.
1c350 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
1c360 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 32 2c double (stmt, 2,
1c370 20 65 64 67 65 29 3b 0a 20 20 20 20 6c 69 73 74 edge);. list
1c380 20 3d 20 63 72 65 61 74 65 5f 65 64 67 65 73 5f = create_edges_
1c390 6c 69 73 74 20 28 29 3b 0a 0a 20 20 20 20 77 68 list ();.. wh
1c3a0 69 6c 65 20 28 31 29 0a 20 20 20 20 20 20 7b 0a ile (1). {.
1c3b0 09 20 20 2f 2a 20 73 63 72 6f 6c 6c 69 6e 67 20 . /* scrolling
1c3c0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 72 the result set r
1c3d0 6f 77 73 20 2a 2f 0a 09 20 20 72 65 74 20 3d 20 ows */.. ret =
1c3e0 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 73 74 sqlite3_step (st
1c3f0 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 mt);.. if (ret
1c400 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 29 0a == SQLITE_DONE).
1c410 09 20 20 20 20 20 20 62 72 65 61 6b 3b 09 09 2f . break;../
1c420 2a 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 20 * end of result
1c430 73 65 74 20 2a 2f 0a 09 20 20 69 66 20 28 72 65 set */.. if (re
1c440 74 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 t == SQLITE_ROW)
1c450 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 .. {...sqlite
1c460 33 5f 69 6e 74 36 34 20 65 64 67 65 5f 69 64 20 3_int64 edge_id
1c470 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e = sqlite3_column
1c480 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 30 29 _int64 (stmt, 0)
1c490 3b 0a 09 09 61 64 64 5f 65 64 67 65 20 28 6c 69 ;...add_edge (li
1c4a0 73 74 2c 20 65 64 67 65 5f 69 64 2c 20 2d 31 2c st, edge_id, -1,
1c4b0 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c 20 2d 31 2c -1, -1, -1, -1,
1c4c0 20 2d 31 2c 20 4e 55 4c 4c 29 3b 0a 09 09 63 6f -1, NULL);...co
1c4d0 75 6e 74 2b 2b 3b 0a 09 09 69 66 20 28 6c 69 6d unt++;...if (lim
1c4e0 69 74 20 3e 20 30 29 0a 09 09 20 20 7b 0a 09 09 it > 0)... {...
1c4f0 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20 if (count
1c500 3e 20 6c 69 6d 69 74 29 0a 09 09 09 20 20 62 72 > limit).... br
1c510 65 61 6b 3b 0a 09 09 20 20 7d 0a 09 20 20 20 20 eak;... }..
1c520 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b }.. else.. {
1c530 0a 09 09 63 68 61 72 20 2a 6d 73 67 20 3d 0a 09 ...char *msg =..
1c540 09 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 . sqlite3_mpr
1c550 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 6b 5f intf ("callback_
1c560 67 65 74 4e 6f 64 65 57 69 74 68 69 6e 44 69 73 getNodeWithinDis
1c570 74 61 6e 63 65 32 44 3a 20 25 73 22 2c 0a 09 09 tance2D: %s",...
1c580 09 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 .. sqlite3_e
1c590 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f 72 2d rrmsg (accessor-
1c5a0 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 >db_handle));...
1c5b0 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 gaiatopo_set_las
1c5c0 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 t_error_msg (top
1c5d0 6f 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 o, msg);...sqlit
1c5e0 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 e3_free (msg);..
1c5f0 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 .goto error;..
1c600 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 }. }..
1c610 20 69 66 20 28 6c 69 6d 69 74 20 3c 20 30 29 0a if (limit < 0).
1c620 20 20 20 20 20 20 7b 0a 09 20 20 72 65 73 75 6c {.. resul
1c630 74 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 2a 6e 75 t = NULL;.. *nu
1c640 6d 65 64 67 65 73 20 3d 20 63 6f 75 6e 74 3b 0a medges = count;.
1c650 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 }. else
1c660 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
1c670 6c 69 73 74 2d 3e 63 6f 75 6e 74 20 3d 3d 20 30 list->count == 0
1c680 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6e 6f ).. {.../* no
1c690 20 65 64 67 65 20 77 61 73 20 66 6f 75 6e 64 20 edge was found
1c6a0 2a 2f 0a 09 09 2a 6e 75 6d 65 64 67 65 73 20 3d */...*numedges =
1c6b0 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 0;.. }.. el
1c6c0 73 65 0a 09 20 20 20 20 7b 0a 09 09 73 74 72 75 se.. {...stru
1c6d0 63 74 20 74 6f 70 6f 5f 65 64 67 65 20 2a 70 5f ct topo_edge *p_
1c6e0 65 64 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20 72 ed;...result = r
1c6f0 74 61 6c 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a talloc (ctx, siz
1c700 65 6f 66 20 28 52 54 54 5f 45 4c 45 4d 49 44 29 eof (RTT_ELEMID)
1c710 20 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 29 3b * list->count);
1c720 0a 09 09 70 5f 65 64 20 3d 20 6c 69 73 74 2d 3e ...p_ed = list->
1c730 66 69 72 73 74 3b 0a 09 09 69 20 3d 20 30 3b 0a first;...i = 0;.
1c740 09 09 77 68 69 6c 65 20 28 70 5f 65 64 20 21 3d ..while (p_ed !=
1c750 20 4e 55 4c 4c 29 0a 09 09 20 20 7b 0a 09 09 20 NULL)... {...
1c760 20 20 20 20 20 2a 28 72 65 73 75 6c 74 20 2b 20 *(result +
1c770 69 29 20 3d 20 70 5f 65 64 2d 3e 65 64 67 65 5f i) = p_ed->edge_
1c780 69 64 3b 0a 09 09 20 20 20 20 20 20 69 2b 2b 3b id;... i++;
1c790 0a 09 09 20 20 20 20 20 20 70 5f 65 64 20 3d 20 ... p_ed =
1c7a0 70 5f 65 64 2d 3e 6e 65 78 74 3b 0a 09 09 20 20 p_ed->next;...
1c7b0 7d 0a 09 09 2a 6e 75 6d 65 64 67 65 73 20 3d 20 }...*numedges =
1c7c0 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a 09 20 20 list->count;..
1c7d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
1c7e0 64 65 73 74 72 6f 79 5f 65 64 67 65 73 5f 6c 69 destroy_edges_li
1c7f0 73 74 20 28 6c 69 73 74 29 3b 0a 20 20 20 20 73 st (list);. s
1c800 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
1c810 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 mt);. return
1c820 72 65 73 75 6c 74 3b 0a 0a 20 20 65 72 72 6f 72 result;.. error
1c830 3a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 20 21 :. if (list !
1c840 3d 20 4e 55 4c 4c 29 0a 09 64 65 73 74 72 6f 79 = NULL)..destroy
1c850 5f 65 64 67 65 73 5f 6c 69 73 74 20 28 6c 69 73 _edges_list (lis
1c860 74 29 3b 0a 20 20 20 20 2a 6e 75 6d 65 64 67 65 t);. *numedge
1c870 73 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 s = -1;. sqli
1c880 74 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 te3_reset (stmt)
1c890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c ;. return NUL
1c8a0 4c 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 L;.}..int.callba
1c8b0 63 6b 5f 75 70 64 61 74 65 45 64 67 65 73 42 79 ck_updateEdgesBy
1c8c0 49 64 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 Id (const RTT_BE
1c8d0 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f _TOPOLOGY * rtt_
1c8e0 74 6f 70 6f 2c 0a 09 09 09 20 20 63 6f 6e 73 74 topo,.... const
1c8f0 20 52 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 20 RTT_ISO_EDGE *
1c900 65 64 67 65 73 2c 20 69 6e 74 20 6e 75 6d 65 64 edges, int numed
1c910 67 65 73 2c 0a 09 09 09 20 20 69 6e 74 20 75 70 ges,.... int up
1c920 64 5f 66 69 65 6c 64 73 29 0a 7b 0a 2f 2a 20 63 d_fields).{./* c
1c930 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e allback function
1c940 3a 20 75 70 64 61 74 65 45 64 67 65 73 42 79 49 : updateEdgesByI
1c950 64 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 52 d */. const R
1c960 54 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c TCTX *ctx = NULL
1c970 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 6c ;. struct spl
1c980 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 ite_internal_cac
1c990 68 65 20 2a 63 61 63 68 65 20 3d 20 4e 55 4c 4c he *cache = NULL
1c9a0 3b 0a 20 20 20 20 47 61 69 61 54 6f 70 6f 6c 6f ;. GaiaTopolo
1c9b0 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 74 6f gyAccessorPtr to
1c9c0 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f 6c 6f po = (GaiaTopolo
1c9d0 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 20 72 gyAccessorPtr) r
1c9e0 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 74 72 tt_topo;. str
1c9f0 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 uct gaia_topolog
1ca00 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 28 73 y *accessor = (s
1ca10 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c truct gaia_topol
1ca20 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 20 ogy *) topo;.
1ca30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 73 sqlite3_stmt *s
1ca40 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 tmt = NULL;.
1ca50 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 63 68 61 int ret;. cha
1ca60 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 61 72 r *sql;. char
1ca70 20 2a 70 72 65 76 3b 0a 20 20 20 20 69 6e 74 20 *prev;. int
1ca80 63 6f 6d 6d 61 20 3d 20 30 3b 0a 20 20 20 20 63 comma = 0;. c
1ca90 68 61 72 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 har *table;.
1caa0 63 68 61 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20 char *xtable;.
1cab0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 int i;. int
1cac0 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 20 20 changed = 0;.
1cad0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
1cae0 2a 70 5f 62 6c 6f 62 3b 0a 20 20 20 20 69 6e 74 *p_blob;. int
1caf0 20 6e 5f 62 79 74 65 73 3b 0a 20 20 20 20 69 6e n_bytes;. in
1cb00 74 20 67 70 6b 67 5f 6d 6f 64 65 20 3d 20 30 3b t gpkg_mode = 0;
1cb10 0a 20 20 20 20 69 6e 74 20 74 69 6e 79 5f 70 6f . int tiny_po
1cb20 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 int = 0;. if
1cb30 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e 55 4c (accessor == NUL
1cb40 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 0a L)..return -1;..
1cb50 20 20 20 20 63 61 63 68 65 20 3d 20 28 73 74 72 cache = (str
1cb60 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 uct splite_inter
1cb70 6e 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 63 63 nal_cache *) acc
1cb80 65 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 20 essor->cache;.
1cb90 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e if (cache == N
1cba0 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a ULL)..return 0;.
1cbb0 20 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d if (cache->m
1cbc0 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c agic1 != SPATIAL
1cbd0 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 ITE_CACHE_MAGIC1
1cbe0 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 ..|| cache->magi
1cbf0 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 c2 != SPATIALITE
1cc00 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 _CACHE_MAGIC2)..
1cc10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 74 return 0;. ct
1cc20 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f 50 x = cache->RTTOP
1cc30 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 O_handle;. if
1cc40 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a 09 (ctx == NULL)..
1cc50 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 69 return 0;.. i
1cc60 66 20 28 61 63 63 65 73 73 6f 72 2d 3e 63 61 63 f (accessor->cac
1cc70 68 65 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 he != NULL).
1cc80 20 20 7b 0a 09 20 20 73 74 72 75 63 74 20 73 70 {.. struct sp
1cc90 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 lite_internal_ca
1cca0 63 68 65 20 2a 63 61 63 68 65 20 3d 0a 09 20 20 che *cache =..
1ccb0 20 20 20 20 28 73 74 72 75 63 74 20 73 70 6c 69 (struct spli
1ccc0 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 63 68 te_internal_cach
1ccd0 65 20 2a 29 20 28 61 63 63 65 73 73 6f 72 2d 3e e *) (accessor->
1cce0 63 61 63 68 65 29 3b 0a 09 20 20 67 70 6b 67 5f cache);.. gpkg_
1ccf0 6d 6f 64 65 20 3d 20 63 61 63 68 65 2d 3e 67 70 mode = cache->gp
1cd00 6b 67 5f 6d 6f 64 65 3b 0a 09 20 20 74 69 6e 79 kg_mode;.. tiny
1cd10 5f 70 6f 69 6e 74 20 3d 20 63 61 63 68 65 2d 3e _point = cache->
1cd20 74 69 6e 79 50 6f 69 6e 74 45 6e 61 62 6c 65 64 tinyPointEnabled
1cd30 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f 2a 20 63 6f ;. }../* co
1cd40 6d 70 6f 73 69 6e 67 20 74 68 65 20 53 51 4c 20 mposing the SQL
1cd50 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
1cd60 6e 74 20 2a 2f 0a 20 20 20 20 74 61 62 6c 65 20 nt */. table
1cd70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1cd80 66 20 28 22 25 73 5f 65 64 67 65 22 2c 20 61 63 f ("%s_edge", ac
1cd90 63 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 79 cessor->topology
1cda0 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 78 74 61 62 _name);. xtab
1cdb0 6c 65 20 3d 20 67 61 69 61 44 6f 75 62 6c 65 51 le = gaiaDoubleQ
1cdc0 75 6f 74 65 64 53 71 6c 20 28 74 61 62 6c 65 29 uotedSql (table)
1cdd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
1cde0 65 65 20 28 74 61 62 6c 65 29 3b 0a 20 20 20 20 ee (table);.
1cdf0 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
1ce00 72 69 6e 74 66 20 28 22 55 50 44 41 54 45 20 4d rintf ("UPDATE M
1ce10 41 49 4e 2e 5c 22 25 73 5c 22 20 53 45 54 22 2c AIN.\"%s\" SET",
1ce20 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 xtable);. fr
1ce30 65 65 20 28 78 74 61 62 6c 65 29 3b 0a 20 20 20 ee (xtable);.
1ce40 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
1ce50 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 if (upd_fields
1ce60 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 & RTT_COL_EDGE_E
1ce70 44 47 45 5f 49 44 29 0a 20 20 20 20 20 20 7b 0a DGE_ID). {.
1ce80 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 . if (comma)..
1ce90 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
1cea0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
1ceb0 20 65 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 70 edge_id = ?", p
1cec0 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 rev);.. else..
1ced0 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
1cee0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
1cef0 65 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 edge_id = ?", pr
1cf00 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 ev);.. comma =
1cf10 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 1;.. sqlite3_fr
1cf20 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 ee (prev);.. pr
1cf30 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 ev = sql;.
1cf40 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 }. if (upd_fi
1cf50 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
1cf60 44 47 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a DGE_START_NODE).
1cf70 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 {.. if (c
1cf80 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c omma).. sql
1cf90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
1cfa0 74 66 20 28 22 25 73 2c 20 73 74 61 72 74 5f 6e tf ("%s, start_n
1cfb0 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b ode = ?", prev);
1cfc0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 .. else..
1cfd0 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
1cfe0 72 69 6e 74 66 20 28 22 25 73 20 73 74 61 72 74 rintf ("%s start
1cff0 5f 6e 6f 64 65 20 3d 20 3f 22 2c 20 70 72 65 76 _node = ?", prev
1d000 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b );.. comma = 1;
1d010 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 .. sqlite3_free
1d020 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 (prev);.. prev
1d030 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a = sql;. }.
1d040 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c if (upd_fiel
1d050 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
1d060 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 20 20 20 20 E_END_NODE).
1d070 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 {.. if (comma
1d080 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 ).. sql = s
1d090 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
1d0a0 22 25 73 2c 20 65 6e 64 5f 6e 6f 64 65 20 3d 20 "%s, end_node =
1d0b0 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c ?", prev);.. el
1d0c0 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
1d0d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
1d0e0 28 22 25 73 20 65 6e 64 5f 6e 6f 64 65 20 3d 20 ("%s end_node =
1d0f0 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f ?", prev);.. co
1d100 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 mma = 1;.. sqli
1d110 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b te3_free (prev);
1d120 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a .. prev = sql;.
1d130 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. if (
1d140 75 70 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 upd_fields & RTT
1d150 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f 4c _COL_EDGE_FACE_L
1d160 45 46 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 EFT). {..
1d170 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 if (comma)..
1d180 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
1d190 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 6c 65 mprintf ("%s, le
1d1a0 66 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 ft_face = ?", pr
1d1b0 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 ev);.. else..
1d1c0 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
1d1d0 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6c 3_mprintf ("%s l
1d1e0 65 66 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 eft_face = ?", p
1d1f0 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d rev);.. comma =
1d200 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 1;.. sqlite3_f
1d210 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 ree (prev);.. p
1d220 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 rev = sql;.
1d230 20 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 }. if (upd_f
1d240 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
1d250 45 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 29 EDGE_FACE_RIGHT)
1d260 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
1d270 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 comma).. sq
1d280 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
1d290 6e 74 66 20 28 22 25 73 2c 20 72 69 67 68 74 5f ntf ("%s, right_
1d2a0 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 face = ?", prev)
1d2b0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
1d2c0 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
1d2d0 70 72 69 6e 74 66 20 28 22 25 73 20 72 69 67 68 printf ("%s righ
1d2e0 74 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 65 t_face = ?", pre
1d2f0 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 v);.. comma = 1
1d300 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 ;.. sqlite3_fre
1d310 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 e (prev);.. pre
1d320 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d v = sql;. }
1d330 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 . if (upd_fie
1d340 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
1d350 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 20 20 GE_NEXT_LEFT).
1d360 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d {.. if (com
1d370 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d ma).. sql =
1d380 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
1d390 20 28 22 25 73 2c 20 6e 65 78 74 5f 6c 65 66 74 ("%s, next_left
1d3a0 5f 65 64 67 65 20 3d 20 3f 22 2c 20 70 72 65 76 _edge = ?", prev
1d3b0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 );.. else..
1d3c0 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
1d3d0 6d 70 72 69 6e 74 66 20 28 22 25 73 20 6e 65 78 mprintf ("%s nex
1d3e0 74 5f 6c 65 66 74 5f 65 64 67 65 20 3d 20 3f 22 t_left_edge = ?"
1d3f0 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d , prev);.. comm
1d400 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 a = 1;.. sqlite
1d410 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 3_free (prev);..
1d420 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 prev = sql;.
1d430 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 75 70 }. if (up
1d440 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 d_fields & RTT_C
1d450 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 52 49 47 OL_EDGE_NEXT_RIG
1d460 48 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 HT). {.. i
1d470 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 f (comma)..
1d480 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
1d490 70 72 69 6e 74 66 20 28 22 25 73 2c 20 6e 65 78 printf ("%s, nex
1d4a0 74 5f 72 69 67 68 74 5f 65 64 67 65 20 3d 20 3f t_right_edge = ?
1d4b0 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 ", prev);.. els
1d4c0 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 e.. sql = s
1d4d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
1d4e0 22 25 73 20 6e 65 78 74 5f 72 69 67 68 74 5f 65 "%s next_right_e
1d4f0 64 67 65 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b dge = ?", prev);
1d500 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 .. comma = 1;..
1d510 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
1d520 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 3d prev);.. prev =
1d530 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 sql;. }.
1d540 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 if (upd_fields
1d550 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
1d560 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b 0a 09 20 GEOM). {..
1d570 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 20 if (comma)..
1d580 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 sql = sqlite3
1d590 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 67 _mprintf ("%s, g
1d5a0 65 6f 6d 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b eom = ?", prev);
1d5b0 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 .. else..
1d5c0 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 sql = sqlite3_mp
1d5d0 72 69 6e 74 66 20 28 22 25 73 20 67 65 6f 6d 20 rintf ("%s geom
1d5e0 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 = ?", prev);..
1d5f0 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 comma = 1;.. sq
1d600 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 lite3_free (prev
1d610 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c );.. prev = sql
1d620 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 71 ;. }. sq
1d630 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
1d640 6e 74 66 20 28 22 25 73 20 57 48 45 52 45 20 65 ntf ("%s WHERE e
1d650 64 67 65 5f 69 64 20 3d 20 3f 22 2c 20 70 72 65 dge_id = ?", pre
1d660 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f v);. sqlite3_
1d670 66 72 65 65 20 28 70 72 65 76 29 3b 0a 20 20 20 free (prev);.
1d680 20 72 65 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f ret =..sqlite3_
1d690 70 72 65 70 61 72 65 5f 76 32 20 28 61 63 63 65 prepare_v2 (acce
1d6a0 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 2c ssor->db_handle,
1d6b0 20 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 sql, strlen (sq
1d6c0 6c 29 2c 20 26 73 74 6d 74 2c 0a 09 09 09 20 20 l), &stmt,....
1d6d0 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c NULL);. sql
1d6e0 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c 29 3b ite3_free (sql);
1d6f0 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 . if (ret !=
1d700 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 SQLITE_OK).
1d710 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d 73 67 20 {.. char *msg
1d720 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1d730 66 20 28 22 50 72 65 70 61 72 65 5f 75 70 64 61 f ("Prepare_upda
1d740 74 65 45 64 67 65 73 42 79 49 64 20 65 72 72 6f teEdgesById erro
1d750 72 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 r: \"%s\"",.....
1d760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 sqlite3_e
1d770 72 72 6d 73 67 20 28 61 63 63 65 73 73 6f 72 2d rrmsg (accessor-
1d780 3e 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 20 >db_handle));..
1d790 20 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 gaiatopo_set_la
1d7a0 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f st_error_msg (to
1d7b0 70 6f 2c 20 6d 73 67 29 3b 0a 09 20 20 73 71 6c po, msg);.. sql
1d7c0 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b ite3_free (msg);
1d7d0 0a 09 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 .. return -1;.
1d7e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 }.. for
1d7f0 28 69 20 3d 20 30 3b 20 69 20 3c 20 6e 75 6d 65 (i = 0; i < nume
1d800 64 67 65 73 3b 20 69 2b 2b 29 0a 20 20 20 20 20 dges; i++).
1d810 20 7b 0a 09 20 20 2f 2a 20 70 61 72 61 6d 65 74 {.. /* paramet
1d820 65 72 20 62 69 6e 64 69 6e 67 20 2a 2f 0a 09 20 er binding */..
1d830 20 69 6e 74 20 69 63 6f 6c 20 3d 20 31 3b 0a 09 int icol = 1;..
1d840 20 20 63 6f 6e 73 74 20 52 54 54 5f 49 53 4f 5f const RTT_ISO_
1d850 45 44 47 45 20 2a 75 70 64 5f 65 64 67 65 20 3d EDGE *upd_edge =
1d860 20 65 64 67 65 73 20 2b 20 69 3b 0a 09 20 20 73 edges + i;.. s
1d870 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
1d880 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f mt);.. sqlite3_
1d890 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 clear_bindings (
1d8a0 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 75 70 stmt);.. if (up
1d8b0 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 d_fields & RTT_C
1d8c0 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f 49 44 29 OL_EDGE_EDGE_ID)
1d8d0 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 .. {...sqlite
1d8e0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
1d8f0 6d 74 2c 20 69 63 6f 6c 2c 20 75 70 64 5f 65 64 mt, icol, upd_ed
1d900 67 65 2d 3e 65 64 67 65 5f 69 64 29 3b 0a 09 09 ge->edge_id);...
1d910 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 icol++;.. }..
1d920 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 if (upd_fields
1d930 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f & RTT_COL_EDGE_
1d940 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 20 20 20 START_NODE)..
1d950 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 62 69 6e {...sqlite3_bin
1d960 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 d_int64 (stmt, i
1d970 63 6f 6c 2c 20 75 70 64 5f 65 64 67 65 2d 3e 73 col, upd_edge->s
1d980 74 61 72 74 5f 6e 6f 64 65 29 3b 0a 09 09 69 63 tart_node);...ic
1d990 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 ol++;.. }..
1d9a0 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 26 if (upd_fields &
1d9b0 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 45 4e RTT_COL_EDGE_EN
1d9c0 44 5f 4e 4f 44 45 29 0a 09 20 20 20 20 7b 0a 09 D_NODE).. {..
1d9d0 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e .sqlite3_bind_in
1d9e0 74 36 34 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c t64 (stmt, icol,
1d9f0 20 75 70 64 5f 65 64 67 65 2d 3e 65 6e 64 5f 6e upd_edge->end_n
1da00 6f 64 65 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a ode);...icol++;.
1da10 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 75 70 . }.. if (up
1da20 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 d_fields & RTT_C
1da30 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f 4c 45 46 OL_EDGE_FACE_LEF
1da40 54 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 T).. {...if (
1da50 75 70 64 5f 65 64 67 65 2d 3e 66 61 63 65 5f 6c upd_edge->face_l
1da60 65 66 74 20 3c 20 30 29 0a 09 09 20 20 20 20 73 eft < 0)... s
1da70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c qlite3_bind_null
1da80 20 28 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 (stmt, icol);..
1da90 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71 6c 69 .else... sqli
1daa0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 te3_bind_int64 (
1dab0 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 75 70 64 5f stmt, icol, upd_
1dac0 65 64 67 65 2d 3e 66 61 63 65 5f 6c 65 66 74 29 edge->face_left)
1dad0 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 ;...icol++;..
1dae0 20 7d 0a 09 20 20 69 66 20 28 75 70 64 5f 66 69 }.. if (upd_fi
1daf0 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
1db00 44 47 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a DGE_FACE_RIGHT).
1db10 09 20 20 20 20 7b 0a 09 09 69 66 20 28 75 70 64 . {...if (upd
1db20 5f 65 64 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 _edge->face_righ
1db30 74 20 3c 20 30 29 0a 09 09 20 20 20 20 73 71 6c t < 0)... sql
1db40 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 28 ite3_bind_null (
1db50 73 74 6d 74 2c 20 69 63 6f 6c 29 3b 0a 09 09 65 stmt, icol);...e
1db60 6c 73 65 0a 09 09 20 20 20 20 73 71 6c 69 74 65 lse... sqlite
1db70 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
1db80 6d 74 2c 20 69 63 6f 6c 2c 20 75 70 64 5f 65 64 mt, icol, upd_ed
1db90 67 65 2d 3e 66 61 63 65 5f 72 69 67 68 74 29 3b ge->face_right);
1dba0 0a 09 09 69 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 ...icol++;..
1dbb0 7d 0a 09 20 20 69 66 20 28 75 70 64 5f 66 69 65 }.. if (upd_fie
1dbc0 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
1dbd0 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 09 20 GE_NEXT_LEFT)..
1dbe0 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 33 5f 62 {...sqlite3_b
1dbf0 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c ind_int64 (stmt,
1dc00 20 69 63 6f 6c 2c 20 75 70 64 5f 65 64 67 65 2d icol, upd_edge-
1dc10 3e 6e 65 78 74 5f 6c 65 66 74 29 3b 0a 09 09 69 >next_left);...i
1dc20 63 6f 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 col++;.. }..
1dc30 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 if (upd_fields
1dc40 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e & RTT_COL_EDGE_N
1dc50 45 58 54 5f 52 49 47 48 54 29 0a 09 20 20 20 20 EXT_RIGHT)..
1dc60 7b 0a 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 {...sqlite3_bind
1dc70 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 _int64 (stmt, ic
1dc80 6f 6c 2c 20 75 70 64 5f 65 64 67 65 2d 3e 6e 65 ol, upd_edge->ne
1dc90 78 74 5f 72 69 67 68 74 29 3b 0a 09 09 69 63 6f xt_right);...ico
1dca0 6c 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 l++;.. }.. i
1dcb0 66 20 28 75 70 64 5f 66 69 65 6c 64 73 20 26 20 f (upd_fields &
1dcc0 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 47 45 4f RTT_COL_EDGE_GEO
1dcd0 4d 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 74 M).. {.../* t
1dce0 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 ransforming the
1dcf0 52 54 4c 49 4e 45 20 69 6e 74 6f 20 61 20 47 65 RTLINE into a Ge
1dd00 6f 6d 65 74 72 79 2d 4c 69 6e 65 73 74 72 69 6e ometry-Linestrin
1dd10 67 20 2a 2f 0a 09 09 67 61 69 61 47 65 6f 6d 43 g */...gaiaGeomC
1dd20 6f 6c 6c 50 74 72 20 67 65 6f 6d 20 3d 0a 09 09 ollPtr geom =...
1dd30 20 20 20 20 64 6f 5f 72 74 6c 69 6e 65 5f 74 6f do_rtline_to
1dd40 5f 67 65 6f 6d 20 28 63 74 78 2c 20 75 70 64 5f _geom (ctx, upd_
1dd50 65 64 67 65 2d 3e 67 65 6f 6d 2c 20 61 63 63 65 edge->geom, acce
1dd60 73 73 6f 72 2d 3e 73 72 69 64 29 3b 0a 09 09 67 ssor->srid);...g
1dd70 61 69 61 54 6f 53 70 61 74 69 61 4c 69 74 65 42 aiaToSpatiaLiteB
1dd80 6c 6f 62 57 6b 62 45 78 32 20 28 67 65 6f 6d 2c lobWkbEx2 (geom,
1dd90 20 26 70 5f 62 6c 6f 62 2c 20 26 6e 5f 62 79 74 &p_blob, &n_byt
1dda0 65 73 2c 20 67 70 6b 67 5f 6d 6f 64 65 2c 0a 09 es, gpkg_mode,..
1ddb0 09 09 09 09 20 20 20 20 74 69 6e 79 5f 70 6f 69 .... tiny_poi
1ddc0 6e 74 29 3b 0a 09 09 67 61 69 61 46 72 65 65 47 nt);...gaiaFreeG
1ddd0 65 6f 6d 43 6f 6c 6c 20 28 67 65 6f 6d 29 3b 0a eomColl (geom);.
1dde0 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 ..sqlite3_bind_b
1ddf0 6c 6f 62 20 28 73 74 6d 74 2c 20 69 63 6f 6c 2c lob (stmt, icol,
1de00 20 70 5f 62 6c 6f 62 2c 20 6e 5f 62 79 74 65 73 p_blob, n_bytes
1de10 2c 20 66 72 65 65 29 3b 0a 09 09 69 63 6f 6c 2b , free);...icol+
1de20 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c +;.. }.. sql
1de30 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 ite3_bind_int64
1de40 28 73 74 6d 74 2c 20 69 63 6f 6c 2c 20 75 70 64 (stmt, icol, upd
1de50 5f 65 64 67 65 2d 3e 65 64 67 65 5f 69 64 29 3b _edge->edge_id);
1de60 0a 09 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 .. ret = sqlite
1de70 33 5f 73 74 65 70 20 28 73 74 6d 74 29 3b 0a 09 3_step (stmt);..
1de80 20 20 69 66 20 28 72 65 74 20 3d 3d 20 53 51 4c if (ret == SQL
1de90 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 65 74 20 ITE_DONE || ret
1dea0 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 0a 09 == SQLITE_ROW)..
1deb0 20 20 20 20 20 20 63 68 61 6e 67 65 64 20 2b 3d changed +=
1dec0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 sqlite3_changes
1ded0 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 (accessor->db_h
1dee0 61 6e 64 6c 65 29 3b 0a 09 20 20 65 6c 73 65 0a andle);.. else.
1def0 09 20 20 20 20 7b 0a 09 09 63 68 61 72 20 2a 6d . {...char *m
1df00 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 sg = sqlite3_mpr
1df10 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 63 6b 5f intf ("callback_
1df20 75 70 64 61 74 65 45 64 67 65 73 42 79 49 64 3a updateEdgesById:
1df30 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 09 09 20 \"%s\"",......
1df40 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d sqlite3_errm
1df50 73 67 0a 09 09 09 09 09 20 20 20 20 20 28 61 63 sg...... (ac
1df60 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c cessor->db_handl
1df70 65 29 29 3b 0a 09 09 67 61 69 61 74 6f 70 6f 5f e));...gaiatopo_
1df80 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 5f 6d set_last_error_m
1df90 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 3b 0a sg (topo, msg);.
1dfa0 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 ..sqlite3_free (
1dfb0 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 72 72 msg);...goto err
1dfc0 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 or;.. }.
1dfd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 }. sqlite3_f
1dfe0 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 29 3b 0a inalize (stmt);.
1dff0 20 20 20 20 72 65 74 75 72 6e 20 63 68 61 6e 67 return chang
1e000 65 64 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 20 ed;.. error:.
1e010 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 sqlite3_finali
1e020 7a 65 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 ze (stmt);. r
1e030 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 52 54 54 eturn -1;.}..RTT
1e040 5f 49 53 4f 5f 45 44 47 45 20 2a 0a 63 61 6c 6c _ISO_EDGE *.call
1e050 62 61 63 6b 5f 67 65 74 45 64 67 65 42 79 46 61 back_getEdgeByFa
1e060 63 65 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 ce (const RTT_BE
1e070 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f _TOPOLOGY * rtt_
1e080 74 6f 70 6f 2c 0a 09 09 09 63 6f 6e 73 74 20 52 topo,....const R
1e090 54 54 5f 45 4c 45 4d 49 44 20 2a 20 69 64 73 2c TT_ELEMID * ids,
1e0a0 20 69 6e 74 20 2a 6e 75 6d 65 6c 65 6d 73 2c 20 int *numelems,
1e0b0 69 6e 74 20 66 69 65 6c 64 73 2c 0a 09 09 09 63 int fields,....c
1e0c0 6f 6e 73 74 20 52 54 47 42 4f 58 20 2a 20 62 6f onst RTGBOX * bo
1e0d0 78 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b x).{./* callback
1e0e0 20 66 75 6e 63 74 69 6f 6e 3a 20 67 65 74 45 64 function: getEd
1e0f0 67 65 42 79 46 61 63 65 20 2a 2f 0a 20 20 20 20 geByFace */.
1e100 63 6f 6e 73 74 20 52 54 43 54 58 20 2a 63 74 78 const RTCTX *ctx
1e110 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 72 = NULL;. str
1e120 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 uct splite_inter
1e130 6e 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 nal_cache *cache
1e140 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 61 69 = NULL;. Gai
1e150 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f aTopologyAccesso
1e160 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 69 rPtr topo = (Gai
1e170 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f aTopologyAccesso
1e180 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b 0a rPtr) rtt_topo;.
1e190 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f struct gaia_
1e1a0 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 73 topology *access
1e1b0 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 61 69 or = (struct gai
1e1c0 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 6f a_topology *) to
1e1d0 70 6f 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 3b po;. int ret;
1e1e0 0a 20 20 20 20 63 68 61 72 20 2a 73 71 6c 3b 0a . char *sql;.
1e1f0 20 20 20 20 63 68 61 72 20 2a 70 72 65 76 3b 0a char *prev;.
1e200 20 20 20 20 63 68 61 72 20 2a 74 61 62 6c 65 3b char *table;
1e210 0a 20 20 20 20 63 68 61 72 20 2a 78 74 61 62 6c . char *xtabl
1e220 65 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6d 6d 61 e;. int comma
1e230 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b = 0;. int i;
1e240 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d . sqlite3_stm
1e250 74 20 2a 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 t *stmt_aux = NU
1e260 4c 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 LL;. struct t
1e270 6f 70 6f 5f 65 64 67 65 73 5f 6c 69 73 74 20 2a opo_edges_list *
1e280 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 list = NULL;.
1e290 20 52 54 54 5f 49 53 4f 5f 45 44 47 45 20 2a 72 RTT_ISO_EDGE *r
1e2a0 65 73 75 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 esult = NULL;.
1e2b0 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 20 3d if (accessor =
1e2c0 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a = NULL). {.
1e2d0 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d . *numelems = -
1e2e0 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 1;.. return NUL
1e2f0 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 L;. }..
1e300 63 61 63 68 65 20 3d 20 28 73 74 72 75 63 74 20 cache = (struct
1e310 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f splite_internal_
1e320 63 61 63 68 65 20 2a 29 20 61 63 63 65 73 73 6f cache *) accesso
1e330 72 2d 3e 63 61 63 68 65 3b 0a 20 20 20 20 69 66 r->cache;. if
1e340 20 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 (cache == NULL)
1e350 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
1e360 20 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 if (cache->ma
1e370 67 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 gic1 != SPATIALI
1e380 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a TE_CACHE_MAGIC1.
1e390 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 .|| cache->magic
1e3a0 32 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 2 != SPATIALITE_
1e3b0 43 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 CACHE_MAGIC2)..r
1e3c0 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
1e3d0 63 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 ctx = cache->RTT
1e3e0 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 OPO_handle;.
1e3f0 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
1e400 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a ..return NULL;..
1e410 20 20 20 20 2f 2a 20 70 72 65 70 61 72 69 6e 67 /* preparing
1e420 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 the SQL stateme
1e430 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 20 3d 20 nt */. sql =
1e440 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
1e450 28 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 20 ("SELECT ");.
1e460 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
1e470 20 2f 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 /* unconditiona
1e480 6c 6c 79 20 71 75 65 72 79 69 6e 67 20 74 68 65 lly querying the
1e490 20 45 64 67 65 20 49 44 20 2a 2f 0a 20 20 20 20 Edge ID */.
1e4a0 69 66 20 28 63 6f 6d 6d 61 29 0a 09 73 71 6c 20 if (comma)..sql
1e4b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1e4c0 66 20 28 22 25 73 2c 20 65 64 67 65 5f 69 64 22 f ("%s, edge_id"
1e4d0 2c 20 70 72 65 76 29 3b 0a 20 20 20 20 65 6c 73 , prev);. els
1e4e0 65 0a 09 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 e..sql = sqlite3
1e4f0 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 65 64 _mprintf ("%s ed
1e500 67 65 5f 69 64 22 2c 20 70 72 65 76 29 3b 0a 20 ge_id", prev);.
1e510 20 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 20 20 comma = 1;.
1e520 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
1e530 70 72 65 76 29 3b 0a 20 20 20 20 70 72 65 76 20 prev);. prev
1e540 3d 20 73 71 6c 3b 0a 20 20 20 20 69 66 20 28 66 = sql;. if (f
1e550 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f ields & RTT_COL_
1e560 45 44 47 45 5f 53 54 41 52 54 5f 4e 4f 44 45 29 EDGE_START_NODE)
1e570 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
1e580 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 comma).. sq
1e590 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
1e5a0 6e 74 66 20 28 22 25 73 2c 20 73 74 61 72 74 5f ntf ("%s, start_
1e5b0 6e 6f 64 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 node", prev);..
1e5c0 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c else.. sql
1e5d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
1e5e0 74 66 20 28 22 25 73 20 73 74 61 72 74 5f 6e 6f tf ("%s start_no
1e5f0 64 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 de", prev);.. c
1e600 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c omma = 1;.. sql
1e610 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 29 ite3_free (prev)
1e620 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c 3b ;.. prev = sql;
1e630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 . }. if
1e640 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f (fields & RTT_CO
1e650 4c 5f 45 44 47 45 5f 45 4e 44 5f 4e 4f 44 45 29 L_EDGE_END_NODE)
1e660 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 . {.. if (
1e670 63 6f 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 comma).. sq
1e680 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
1e690 6e 74 66 20 28 22 25 73 2c 20 65 6e 64 5f 6e 6f ntf ("%s, end_no
1e6a0 64 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 de", prev);.. e
1e6b0 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d lse.. sql =
1e6c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
1e6d0 20 28 22 25 73 20 65 6e 64 5f 6e 6f 64 65 22 2c ("%s end_node",
1e6e0 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 prev);.. comma
1e6f0 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 = 1;.. sqlite3
1e700 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 _free (prev);..
1e710 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 prev = sql;.
1e720 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 }. if (fie
1e730 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 lds & RTT_COL_ED
1e740 47 45 5f 46 41 43 45 5f 4c 45 46 54 29 0a 20 20 GE_FACE_LEFT).
1e750 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d {.. if (com
1e760 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d ma).. sql =
1e770 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
1e780 20 28 22 25 73 2c 20 6c 65 66 74 5f 66 61 63 65 ("%s, left_face
1e790 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 ", prev);.. els
1e7a0 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 e.. sql = s
1e7b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
1e7c0 22 25 73 20 6c 65 66 74 5f 66 61 63 65 22 2c 20 "%s left_face",
1e7d0 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
1e7e0 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
1e7f0 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
1e800 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
1e810 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 65 6c }. if (fiel
1e820 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
1e830 45 5f 46 41 43 45 5f 52 49 47 48 54 29 0a 20 20 E_FACE_RIGHT).
1e840 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f 6d {.. if (com
1e850 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 3d ma).. sql =
1e860 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
1e870 20 28 22 25 73 2c 20 72 69 67 68 74 5f 66 61 63 ("%s, right_fac
1e880 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c e", prev);.. el
1e890 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
1e8a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
1e8b0 28 22 25 73 20 72 69 67 68 74 5f 66 61 63 65 22 ("%s right_face"
1e8c0 2c 20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d , prev);.. comm
1e8d0 61 20 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 a = 1;.. sqlite
1e8e0 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 3_free (prev);..
1e8f0 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 prev = sql;.
1e900 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 66 69 }. if (fi
1e910 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 elds & RTT_COL_E
1e920 44 47 45 5f 4e 45 58 54 5f 4c 45 46 54 29 0a 20 DGE_NEXT_LEFT).
1e930 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f {.. if (co
1e940 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 mma).. sql
1e950 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1e960 66 20 28 22 25 73 2c 20 6e 65 78 74 5f 6c 65 66 f ("%s, next_lef
1e970 74 5f 65 64 67 65 22 2c 20 70 72 65 76 29 3b 0a t_edge", prev);.
1e980 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 73 . else.. s
1e990 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ql = sqlite3_mpr
1e9a0 69 6e 74 66 20 28 22 25 73 20 6e 65 78 74 5f 6c intf ("%s next_l
1e9b0 65 66 74 5f 65 64 67 65 22 2c 20 70 72 65 76 29 eft_edge", prev)
1e9c0 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
1e9d0 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
1e9e0 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
1e9f0 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 = sql;. }.
1ea00 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 if (fields &
1ea10 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 RTT_COL_EDGE_NEX
1ea20 54 5f 52 49 47 48 54 29 0a 20 20 20 20 20 20 7b T_RIGHT). {
1ea30 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 .. if (comma)..
1ea40 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
1ea50 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
1ea60 2c 20 6e 65 78 74 5f 72 69 67 68 74 5f 65 64 67 , next_right_edg
1ea70 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c e", prev);.. el
1ea80 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
1ea90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
1eaa0 28 22 25 73 20 6e 65 78 74 5f 72 69 67 68 74 5f ("%s next_right_
1eab0 65 64 67 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 edge", prev);..
1eac0 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
1ead0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
1eae0 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
1eaf0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 l;. }. i
1eb00 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
1eb10 43 4f 4c 5f 45 44 47 45 5f 47 45 4f 4d 29 0a 20 COL_EDGE_GEOM).
1eb20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f {.. if (co
1eb30 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 mma).. sql
1eb40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1eb50 66 20 28 22 25 73 2c 20 67 65 6f 6d 22 2c 20 70 f ("%s, geom", p
1eb60 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 rev);.. else..
1eb70 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
1eb80 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 20 e3_mprintf ("%s
1eb90 67 65 6f 6d 22 2c 20 70 72 65 76 29 3b 0a 09 20 geom", prev);..
1eba0 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
1ebb0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
1ebc0 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
1ebd0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 74 l;. }. t
1ebe0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d able = sqlite3_m
1ebf0 70 72 69 6e 74 66 20 28 22 25 73 5f 65 64 67 65 printf ("%s_edge
1ec00 22 2c 20 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 ", accessor->top
1ec10 6f 6c 6f 67 79 5f 6e 61 6d 65 29 3b 0a 20 20 20 ology_name);.
1ec20 20 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44 6f xtable = gaiaDo
1ec30 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 74 ubleQuotedSql (t
1ec40 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 able);. sqlit
1ec50 65 33 5f 66 72 65 65 20 28 74 61 62 6c 65 29 3b e3_free (table);
1ec60 0a 20 20 20 20 73 71 6c 20 3d 0a 09 73 71 6c 69 . sql =..sqli
1ec70 74 65 33 5f 6d 70 72 69 6e 74 66 0a 09 28 22 25 te3_mprintf..("%
1ec80 73 20 46 52 4f 4d 20 4d 41 49 4e 2e 5c 22 25 73 s FROM MAIN.\"%s
1ec90 5c 22 20 57 48 45 52 45 20 28 6c 65 66 74 5f 66 \" WHERE (left_f
1eca0 61 63 65 20 3d 20 3f 20 4f 52 20 72 69 67 68 74 ace = ? OR right
1ecb0 5f 66 61 63 65 20 3d 20 3f 29 22 2c 20 70 72 65 _face = ?)", pre
1ecc0 76 2c 0a 09 20 78 74 61 62 6c 65 29 3b 0a 20 20 v,.. xtable);.
1ecd0 20 20 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b free (xtable);
1ece0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
1ecf0 65 20 28 70 72 65 76 29 3b 0a 20 20 20 20 69 66 e (prev);. if
1ed00 20 28 62 6f 78 20 21 3d 20 4e 55 4c 4c 29 0a 20 (box != NULL).
1ed10 20 20 20 20 20 7b 0a 09 20 20 74 61 62 6c 65 20 {.. table
1ed20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1ed30 66 20 28 22 25 73 5f 65 64 67 65 22 2c 20 61 63 f ("%s_edge", ac
1ed40 63 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f 67 79 cessor->topology
1ed50 5f 6e 61 6d 65 29 3b 0a 09 20 20 70 72 65 76 20 _name);.. prev
1ed60 3d 20 73 71 6c 3b 0a 09 20 20 73 71 6c 20 3d 0a = sql;.. sql =.
1ed70 09 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d . sqlite3_m
1ed80 70 72 69 6e 74 66 0a 09 20 20 20 20 20 20 28 22 printf.. ("
1ed90 25 73 20 41 4e 44 20 52 4f 57 49 44 20 49 4e 20 %s AND ROWID IN
1eda0 28 53 45 4c 45 43 54 20 52 4f 57 49 44 20 46 52 (SELECT ROWID FR
1edb0 4f 4d 20 53 70 61 74 69 61 6c 49 6e 64 65 78 20 OM SpatialIndex
1edc0 57 48 45 52 45 20 22 0a 09 20 20 20 20 20 20 20 WHERE "..
1edd0 22 66 5f 74 61 62 6c 65 5f 6e 61 6d 65 20 3d 20 "f_table_name =
1ede0 25 51 20 41 4e 44 20 66 5f 67 65 6f 6d 65 74 72 %Q AND f_geometr
1edf0 79 5f 63 6f 6c 75 6d 6e 20 3d 20 27 67 65 6f 6d y_column = 'geom
1ee00 27 20 41 4e 44 20 73 65 61 72 63 68 5f 66 72 61 ' AND search_fra
1ee10 6d 65 20 3d 20 42 75 69 6c 64 4d 42 52 28 3f 2c me = BuildMBR(?,
1ee20 20 3f 2c 20 3f 2c 20 3f 29 29 22 2c 0a 09 20 20 ?, ?, ?))",..
1ee30 20 20 20 20 20 73 71 6c 2c 20 74 61 62 6c 65 29 sql, table)
1ee40 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 ;.. sqlite3_fre
1ee50 65 20 28 74 61 62 6c 65 29 3b 0a 09 20 20 73 71 e (table);.. sq
1ee60 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 lite3_free (prev
1ee70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 );. }. r
1ee80 65 74 20 3d 0a 09 73 71 6c 69 74 65 33 5f 70 72 et =..sqlite3_pr
1ee90 65 70 61 72 65 5f 76 32 20 28 61 63 63 65 73 73 epare_v2 (access
1eea0 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 2c 20 73 or->db_handle, s
1eeb0 71 6c 2c 20 73 74 72 6c 65 6e 20 28 73 71 6c 29 ql, strlen (sql)
1eec0 2c 0a 09 09 09 20 20 20 20 26 73 74 6d 74 5f 61 ,.... &stmt_a
1eed0 75 78 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 ux, NULL);. s
1eee0 71 6c 69 74 65 33 5f 66 72 65 65 20 28 73 71 6c qlite3_free (sql
1eef0 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 );. if (ret !
1ef00 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 = SQLITE_OK).
1ef10 20 20 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d 73 {.. char *ms
1ef20 67 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 g =.. sqlit
1ef30 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 50 72 65 e3_mprintf ("Pre
1ef40 70 61 72 65 5f 67 65 74 45 64 67 65 42 79 46 61 pare_getEdgeByFa
1ef50 63 65 20 41 55 58 20 65 72 72 6f 72 3a 20 5c 22 ce AUX error: \"
1ef60 25 73 5c 22 22 2c 0a 09 09 09 20 20 20 20 20 20 %s\"",....
1ef70 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 sqlite3_errmsg
1ef80 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 (accessor->db_ha
1ef90 6e 64 6c 65 29 29 3b 0a 09 20 20 67 61 69 61 74 ndle));.. gaiat
1efa0 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 opo_set_last_err
1efb0 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 or_msg (topo, ms
1efc0 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 g);.. sqlite3_f
1efd0 72 65 65 20 28 6d 73 67 29 3b 0a 09 20 20 2a 6e ree (msg);.. *n
1efe0 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 umelems = -1;..
1eff0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
1f000 20 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73 74 20 }.. list
1f010 3d 20 63 72 65 61 74 65 5f 65 64 67 65 73 5f 6c = create_edges_l
1f020 69 73 74 20 28 29 3b 0a 20 20 20 20 66 6f 72 20 ist ();. for
1f030 28 69 20 3d 20 30 3b 20 69 20 3c 20 2a 6e 75 6d (i = 0; i < *num
1f040 65 6c 65 6d 73 3b 20 69 2b 2b 29 0a 20 20 20 20 elems; i++).
1f050 20 20 7b 0a 09 20 20 63 68 61 72 20 2a 6d 73 67 {.. char *msg
1f060 3b 0a 09 20 20 69 66 20 28 21 64 6f 5f 72 65 61 ;.. if (!do_rea
1f070 64 5f 65 64 67 65 5f 62 79 5f 66 61 63 65 0a 09 d_edge_by_face..
1f080 20 20 20 20 20 20 28 73 74 6d 74 5f 61 75 78 2c (stmt_aux,
1f090 20 6c 69 73 74 2c 20 2a 28 69 64 73 20 2b 20 69 list, *(ids + i
1f0a0 29 2c 20 66 69 65 6c 64 73 2c 20 62 6f 78 2c 0a ), fields, box,.
1f0b0 09 20 20 20 20 20 20 20 22 63 61 6c 6c 62 61 63 . "callbac
1f0c0 6b 5f 67 65 74 45 64 67 65 42 79 46 61 63 65 22 k_getEdgeByFace"
1f0d0 2c 20 26 6d 73 67 29 29 0a 09 20 20 20 20 7b 0a , &msg)).. {.
1f0e0 09 09 67 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c ..gaiatopo_set_l
1f0f0 61 73 74 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 ast_error_msg (t
1f100 6f 70 6f 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c opo, msg);...sql
1f110 69 74 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b ite3_free (msg);
1f120 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 ...goto error;..
1f130 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 }. }..
1f140 20 20 20 69 66 20 28 6c 69 73 74 2d 3e 63 6f 75 if (list->cou
1f150 6e 74 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b nt == 0). {
1f160 0a 09 20 20 2f 2a 20 6e 6f 20 65 64 67 65 20 77 .. /* no edge w
1f170 61 73 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 20 2a as found */.. *
1f180 6e 75 6d 65 6c 65 6d 73 20 3d 20 6c 69 73 74 2d numelems = list-
1f190 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 7d 0a >count;. }.
1f1a0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b else. {
1f1b0 0a 09 20 20 73 74 72 75 63 74 20 74 6f 70 6f 5f .. struct topo_
1f1c0 65 64 67 65 20 2a 70 5f 65 64 3b 0a 09 20 20 72 edge *p_ed;.. r
1f1d0 65 73 75 6c 74 20 3d 20 72 74 61 6c 6c 6f 63 20 esult = rtalloc
1f1e0 28 63 74 78 2c 20 73 69 7a 65 6f 66 20 28 52 54 (ctx, sizeof (RT
1f1f0 54 5f 49 53 4f 5f 45 44 47 45 29 20 2a 20 6c 69 T_ISO_EDGE) * li
1f200 73 74 2d 3e 63 6f 75 6e 74 29 3b 0a 09 20 20 70 st->count);.. p
1f210 5f 65 64 20 3d 20 6c 69 73 74 2d 3e 66 69 72 73 _ed = list->firs
1f220 74 3b 0a 09 20 20 69 20 3d 20 30 3b 0a 09 20 20 t;.. i = 0;..
1f230 77 68 69 6c 65 20 28 70 5f 65 64 20 21 3d 20 4e while (p_ed != N
1f240 55 4c 4c 29 0a 09 20 20 20 20 7b 0a 09 09 52 54 ULL).. {...RT
1f250 54 5f 49 53 4f 5f 45 44 47 45 20 2a 65 64 20 3d T_ISO_EDGE *ed =
1f260 20 72 65 73 75 6c 74 20 2b 20 69 3b 0a 09 09 69 result + i;...i
1f270 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
1f280 43 4f 4c 5f 45 44 47 45 5f 45 44 47 45 5f 49 44 COL_EDGE_EDGE_ID
1f290 29 0a 09 09 20 20 20 20 65 64 2d 3e 65 64 67 65 )... ed->edge
1f2a0 5f 69 64 20 3d 20 70 5f 65 64 2d 3e 65 64 67 65 _id = p_ed->edge
1f2b0 5f 69 64 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 _id;...if (field
1f2c0 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 45 s & RTT_COL_EDGE
1f2d0 5f 53 54 41 52 54 5f 4e 4f 44 45 29 0a 09 09 20 _START_NODE)...
1f2e0 20 20 20 65 64 2d 3e 73 74 61 72 74 5f 6e 6f 64 ed->start_nod
1f2f0 65 20 3d 20 70 5f 65 64 2d 3e 73 74 61 72 74 5f e = p_ed->start_
1f300 6e 6f 64 65 3b 0a 09 09 69 66 20 28 66 69 65 6c node;...if (fiel
1f310 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 45 44 47 ds & RTT_COL_EDG
1f320 45 5f 45 4e 44 5f 4e 4f 44 45 29 0a 09 09 20 20 E_END_NODE)...
1f330 20 20 65 64 2d 3e 65 6e 64 5f 6e 6f 64 65 20 3d ed->end_node =
1f340 20 70 5f 65 64 2d 3e 65 6e 64 5f 6e 6f 64 65 3b p_ed->end_node;
1f350 0a 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 ...if (fields &
1f360 52 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 RTT_COL_EDGE_FAC
1f370 45 5f 4c 45 46 54 29 0a 09 09 20 20 20 20 65 64 E_LEFT)... ed
1f380 2d 3e 66 61 63 65 5f 6c 65 66 74 20 3d 20 70 5f ->face_left = p_
1f390 65 64 2d 3e 66 61 63 65 5f 6c 65 66 74 3b 0a 09 ed->face_left;..
1f3a0 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 .if (fields & RT
1f3b0 54 5f 43 4f 4c 5f 45 44 47 45 5f 46 41 43 45 5f T_COL_EDGE_FACE_
1f3c0 52 49 47 48 54 29 0a 09 09 20 20 20 20 65 64 2d RIGHT)... ed-
1f3d0 3e 66 61 63 65 5f 72 69 67 68 74 20 3d 20 70 5f >face_right = p_
1f3e0 65 64 2d 3e 66 61 63 65 5f 72 69 67 68 74 3b 0a ed->face_right;.
1f3f0 09 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 ..if (fields & R
1f400 54 54 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 TT_COL_EDGE_NEXT
1f410 5f 4c 45 46 54 29 0a 09 09 20 20 20 20 65 64 2d _LEFT)... ed-
1f420 3e 6e 65 78 74 5f 6c 65 66 74 20 3d 20 70 5f 65 >next_left = p_e
1f430 64 2d 3e 6e 65 78 74 5f 6c 65 66 74 3b 0a 09 09 d->next_left;...
1f440 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 if (fields & RTT
1f450 5f 43 4f 4c 5f 45 44 47 45 5f 4e 45 58 54 5f 52 _COL_EDGE_NEXT_R
1f460 49 47 48 54 29 0a 09 09 20 20 20 20 65 64 2d 3e IGHT)... ed->
1f470 6e 65 78 74 5f 72 69 67 68 74 20 3d 20 70 5f 65 next_right = p_e
1f480 64 2d 3e 6e 65 78 74 5f 72 69 67 68 74 3b 0a 09 d->next_right;..
1f490 09 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 .if (fields & RT
1f4a0 54 5f 43 4f 4c 5f 45 44 47 45 5f 47 45 4f 4d 29 T_COL_EDGE_GEOM)
1f4b0 0a 09 09 20 20 20 20 65 64 2d 3e 67 65 6f 6d 20 ... ed->geom
1f4c0 3d 0a 09 09 09 67 61 69 61 5f 63 6f 6e 76 65 72 =....gaia_conver
1f4d0 74 5f 6c 69 6e 65 73 74 72 69 6e 67 5f 74 6f 5f t_linestring_to_
1f4e0 72 74 6c 69 6e 65 20 28 63 74 78 2c 20 70 5f 65 rtline (ctx, p_e
1f4f0 64 2d 3e 67 65 6f 6d 2c 0a 09 09 09 09 09 09 09 d->geom,........
1f500 20 20 20 61 63 63 65 73 73 6f 72 2d 3e 73 72 69 accessor->sri
1f510 64 2c 0a 09 09 09 09 09 09 09 20 20 20 61 63 63 d,........ acc
1f520 65 73 73 6f 72 2d 3e 68 61 73 5f 7a 29 3b 0a 09 essor->has_z);..
1f530 09 69 2b 2b 3b 0a 09 09 70 5f 65 64 20 3d 20 70 .i++;...p_ed = p
1f540 5f 65 64 2d 3e 6e 65 78 74 3b 0a 09 20 20 20 20 _ed->next;..
1f550 7d 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d }.. *numelems =
1f560 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a 20 20 list->count;.
1f570 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
1f580 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 3_finalize (stmt
1f590 5f 61 75 78 29 3b 0a 20 20 20 20 64 65 73 74 72 _aux);. destr
1f5a0 6f 79 5f 65 64 67 65 73 5f 6c 69 73 74 20 28 6c oy_edges_list (l
1f5b0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ist);. return
1f5c0 20 72 65 73 75 6c 74 3b 0a 0a 20 20 65 72 72 6f result;.. erro
1f5d0 72 3a 0a 20 20 20 20 69 66 20 28 73 74 6d 74 5f r:. if (stmt_
1f5e0 61 75 78 20 21 3d 20 4e 55 4c 4c 29 0a 09 73 71 aux != NULL)..sq
1f5f0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 28 lite3_finalize (
1f600 73 74 6d 74 5f 61 75 78 29 3b 0a 20 20 20 20 69 stmt_aux);. i
1f610 66 20 28 6c 69 73 74 20 21 3d 20 4e 55 4c 4c 29 f (list != NULL)
1f620 0a 09 64 65 73 74 72 6f 79 5f 65 64 67 65 73 5f ..destroy_edges_
1f630 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 20 20 list (list);.
1f640 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b *numelems = -1;
1f650 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c . return NULL
1f660 3b 0a 7d 0a 0a 52 54 54 5f 49 53 4f 5f 4e 4f 44 ;.}..RTT_ISO_NOD
1f670 45 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 E *.callback_get
1f680 4e 6f 64 65 42 79 46 61 63 65 20 28 63 6f 6e 73 NodeByFace (cons
1f690 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 t RTT_BE_TOPOLOG
1f6a0 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c 0a 09 09 Y * rtt_topo,...
1f6b0 09 63 6f 6e 73 74 20 52 54 54 5f 45 4c 45 4d 49 .const RTT_ELEMI
1f6c0 44 20 2a 20 66 61 63 65 73 2c 20 69 6e 74 20 2a D * faces, int *
1f6d0 6e 75 6d 65 6c 65 6d 73 2c 20 69 6e 74 20 66 69 numelems, int fi
1f6e0 65 6c 64 73 2c 0a 09 09 09 63 6f 6e 73 74 20 52 elds,....const R
1f6f0 54 47 42 4f 58 20 2a 20 62 6f 78 29 0a 7b 0a 2f TGBOX * box).{./
1f700 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 * callback funct
1f710 69 6f 6e 3a 20 67 65 74 4e 6f 64 65 42 79 46 61 ion: getNodeByFa
1f720 63 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 ce */. const
1f730 52 54 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c RTCTX *ctx = NUL
1f740 4c 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 70 L;. struct sp
1f750 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 61 lite_internal_ca
1f760 63 68 65 20 2a 63 61 63 68 65 20 3d 20 4e 55 4c che *cache = NUL
1f770 4c 3b 0a 20 20 20 20 47 61 69 61 54 6f 70 6f 6c L;. GaiaTopol
1f780 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 20 74 ogyAccessorPtr t
1f790 6f 70 6f 20 3d 20 28 47 61 69 61 54 6f 70 6f 6c opo = (GaiaTopol
1f7a0 6f 67 79 41 63 63 65 73 73 6f 72 50 74 72 29 20 ogyAccessorPtr)
1f7b0 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 20 20 73 74 rtt_topo;. st
1f7c0 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f 6c 6f ruct gaia_topolo
1f7d0 67 79 20 2a 61 63 63 65 73 73 6f 72 20 3d 20 28 gy *accessor = (
1f7e0 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f 70 6f struct gaia_topo
1f7f0 6c 6f 67 79 20 2a 29 20 74 6f 70 6f 3b 0a 20 20 logy *) topo;.
1f800 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a sqlite3_stmt *
1f810 73 74 6d 74 5f 61 75 78 20 3d 20 4e 55 4c 4c 3b stmt_aux = NULL;
1f820 0a 20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 . int ret;.
1f830 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 int i;. cha
1f840 72 20 2a 73 71 6c 3b 0a 20 20 20 20 63 68 61 72 r *sql;. char
1f850 20 2a 70 72 65 76 3b 0a 20 20 20 20 63 68 61 72 *prev;. char
1f860 20 2a 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 *table;. cha
1f870 72 20 2a 78 74 61 62 6c 65 3b 0a 20 20 20 20 69 r *xtable;. i
1f880 6e 74 20 63 6f 6d 6d 61 20 3d 20 30 3b 0a 20 20 nt comma = 0;.
1f890 20 20 52 54 50 4f 49 4e 54 41 52 52 41 59 20 2a RTPOINTARRAY *
1f8a0 70 61 3b 0a 20 20 20 20 52 54 50 4f 49 4e 54 34 pa;. RTPOINT4
1f8b0 44 20 70 74 34 64 3b 0a 20 20 20 20 73 74 72 75 D pt4d;. stru
1f8c0 63 74 20 74 6f 70 6f 5f 6e 6f 64 65 73 5f 6c 69 ct topo_nodes_li
1f8d0 73 74 20 2a 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b st *list = NULL;
1f8e0 0a 20 20 20 20 52 54 54 5f 49 53 4f 5f 4e 4f 44 . RTT_ISO_NOD
1f8f0 45 20 2a 72 65 73 75 6c 74 20 3d 20 4e 55 4c 4c E *result = NULL
1f900 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 73 73 ;. if (access
1f910 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 or == NULL).
1f920 20 20 7b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 {.. *numelems
1f930 20 3d 20 2d 31 3b 0a 09 20 20 72 65 74 75 72 6e = -1;.. return
1f940 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a NULL;. }..
1f950 20 20 20 20 63 61 63 68 65 20 3d 20 28 73 74 72 cache = (str
1f960 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 uct splite_inter
1f970 6e 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 63 63 nal_cache *) acc
1f980 65 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a 20 20 essor->cache;.
1f990 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d 20 4e if (cache == N
1f9a0 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c ULL)..return NUL
1f9b0 4c 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 L;. if (cache
1f9c0 2d 3e 6d 61 67 69 63 31 20 21 3d 20 53 50 41 54 ->magic1 != SPAT
1f9d0 49 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 IALITE_CACHE_MAG
1f9e0 49 43 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d IC1..|| cache->m
1f9f0 61 67 69 63 32 20 21 3d 20 53 50 41 54 49 41 4c agic2 != SPATIAL
1fa00 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 ITE_CACHE_MAGIC2
1fa10 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a )..return NULL;.
1fa20 20 20 20 20 63 74 78 20 3d 20 63 61 63 68 65 2d ctx = cache-
1fa30 3e 52 54 54 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a >RTTOPO_handle;.
1fa40 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e if (ctx == N
1fa50 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 4e 55 4c ULL)..return NUL
1fa60 4c 3b 0a 0a 20 20 20 20 2f 2a 20 70 72 65 70 61 L;.. /* prepa
1fa70 72 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 61 ring the SQL sta
1fa80 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 tement */. sq
1fa90 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
1faa0 6e 74 66 20 28 22 53 45 4c 45 43 54 20 22 29 3b ntf ("SELECT ");
1fab0 0a 20 20 20 20 70 72 65 76 20 3d 20 73 71 6c 3b . prev = sql;
1fac0 0a 20 20 20 20 69 66 20 28 66 69 65 6c 64 73 20 . if (fields
1fad0 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 4e & RTT_COL_NODE_N
1fae0 4f 44 45 5f 49 44 29 0a 20 20 20 20 20 20 7b 0a ODE_ID). {.
1faf0 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 . if (comma)..
1fb00 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 sql = sqlit
1fb10 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
1fb20 20 6e 6f 64 65 5f 69 64 22 2c 20 70 72 65 76 29 node_id", prev)
1fb30 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
1fb40 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d sql = sqlite3_m
1fb50 70 72 69 6e 74 66 20 28 22 25 73 20 6e 6f 64 65 printf ("%s node
1fb60 5f 69 64 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 _id", prev);..
1fb70 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 71 comma = 1;.. sq
1fb80 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 76 lite3_free (prev
1fb90 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 6c );.. prev = sql
1fba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 ;. }. if
1fbb0 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
1fbc0 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 OL_NODE_CONTAINI
1fbd0 4e 47 5f 46 41 43 45 29 0a 20 20 20 20 20 20 7b NG_FACE). {
1fbe0 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 .. if (comma)..
1fbf0 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 sql = sqli
1fc00 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
1fc10 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 , containing_fac
1fc20 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 65 6c e", prev);.. el
1fc30 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 3d 20 se.. sql =
1fc40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 sqlite3_mprintf
1fc50 28 22 25 73 20 63 6f 6e 74 61 69 6e 69 6e 67 5f ("%s containing_
1fc60 66 61 63 65 22 2c 20 70 72 65 76 29 3b 0a 09 20 face", prev);..
1fc70 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a 09 20 20 73 comma = 1;.. s
1fc80 71 6c 69 74 65 33 5f 66 72 65 65 20 28 70 72 65 qlite3_free (pre
1fc90 76 29 3b 0a 09 20 20 70 72 65 76 20 3d 20 73 71 v);.. prev = sq
1fca0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 l;. }. i
1fcb0 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
1fcc0 43 4f 4c 5f 4e 4f 44 45 5f 47 45 4f 4d 29 0a 20 COL_NODE_GEOM).
1fcd0 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 6f {.. if (co
1fce0 6d 6d 61 29 0a 09 20 20 20 20 20 20 73 71 6c 20 mma).. sql
1fcf0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
1fd00 66 20 28 22 25 73 2c 20 53 54 5f 58 28 67 65 6f f ("%s, ST_X(geo
1fd10 6d 29 2c 20 53 54 5f 59 28 67 65 6f 6d 29 22 2c m), ST_Y(geom)",
1fd20 20 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a prev);.. else.
1fd30 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c . sql = sql
1fd40 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
1fd50 73 20 53 54 5f 58 28 67 65 6f 6d 29 2c 20 53 54 s ST_X(geom), ST
1fd60 5f 59 28 67 65 6f 6d 29 22 2c 20 70 72 65 76 29 _Y(geom)", prev)
1fd70 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 3b 0a ;.. comma = 1;.
1fd80 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 . sqlite3_free
1fd90 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 76 20 (prev);.. prev
1fda0 3d 20 73 71 6c 3b 0a 09 20 20 69 66 20 28 61 63 = sql;.. if (ac
1fdb0 63 65 73 73 6f 72 2d 3e 68 61 73 5f 7a 29 0a 09 cessor->has_z)..
1fdc0 20 20 20 20 7b 0a 09 09 73 71 6c 20 3d 20 73 71 {...sql = sq
1fdd0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
1fde0 25 73 2c 20 53 54 5f 5a 28 67 65 6f 6d 29 22 2c %s, ST_Z(geom)",
1fdf0 20 70 72 65 76 29 3b 0a 09 09 73 71 6c 69 74 65 prev);...sqlite
1fe00 33 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 3_free (prev);..
1fe10 09 70 72 65 76 20 3d 20 73 71 6c 3b 0a 09 20 20 .prev = sql;..
1fe20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
1fe30 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f table = sqlite3_
1fe40 6d 70 72 69 6e 74 66 20 28 22 25 73 5f 6e 6f 64 mprintf ("%s_nod
1fe50 65 22 2c 20 61 63 63 65 73 73 6f 72 2d 3e 74 6f e", accessor->to
1fe60 70 6f 6c 6f 67 79 5f 6e 61 6d 65 29 3b 0a 20 20 pology_name);.
1fe70 20 20 78 74 61 62 6c 65 20 3d 20 67 61 69 61 44 xtable = gaiaD
1fe80 6f 75 62 6c 65 51 75 6f 74 65 64 53 71 6c 20 28 oubleQuotedSql (
1fe90 74 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 table);. sqli
1fea0 74 65 33 5f 66 72 65 65 20 28 74 61 62 6c 65 29 te3_free (table)
1feb0 3b 0a 20 20 20 20 73 71 6c 20 3d 0a 09 73 71 6c ;. sql =..sql
1fec0 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
1fed0 73 20 46 52 4f 4d 20 4d 41 49 4e 2e 5c 22 25 73 s FROM MAIN.\"%s
1fee0 5c 22 20 57 48 45 52 45 20 63 6f 6e 74 61 69 6e \" WHERE contain
1fef0 69 6e 67 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 ing_face = ?", p
1ff00 72 65 76 2c 0a 09 09 09 20 78 74 61 62 6c 65 29 rev,.... xtable)
1ff10 3b 0a 20 20 20 20 66 72 65 65 20 28 78 74 61 62 ;. free (xtab
1ff20 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 le);. sqlite3
1ff30 5f 66 72 65 65 20 28 70 72 65 76 29 3b 0a 20 20 _free (prev);.
1ff40 20 20 69 66 20 28 62 6f 78 20 21 3d 20 4e 55 4c if (box != NUL
1ff50 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 74 61 L). {.. ta
1ff60 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 ble = sqlite3_mp
1ff70 72 69 6e 74 66 20 28 22 25 73 5f 6e 6f 64 65 22 rintf ("%s_node"
1ff80 2c 20 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 6f , accessor->topo
1ff90 6c 6f 67 79 5f 6e 61 6d 65 29 3b 0a 09 20 20 70 logy_name);.. p
1ffa0 72 65 76 20 3d 20 73 71 6c 3b 0a 09 20 20 73 71 rev = sql;.. sq
1ffb0 6c 20 3d 0a 09 20 20 20 20 20 20 73 71 6c 69 74 l =.. sqlit
1ffc0 65 33 5f 6d 70 72 69 6e 74 66 0a 09 20 20 20 20 e3_mprintf..
1ffd0 20 20 28 22 25 73 20 41 4e 44 20 52 4f 57 49 44 ("%s AND ROWID
1ffe0 20 49 4e 20 28 53 45 4c 45 43 54 20 52 4f 57 49 IN (SELECT ROWI
1fff0 44 20 46 52 4f 4d 20 53 70 61 74 69 61 6c 49 6e D FROM SpatialIn
20000 64 65 78 20 57 48 45 52 45 20 22 0a 09 20 20 20 dex WHERE "..
20010 20 20 20 20 22 66 5f 74 61 62 6c 65 5f 6e 61 6d "f_table_nam
20020 65 20 3d 20 25 51 20 41 4e 44 20 66 5f 67 65 6f e = %Q AND f_geo
20030 6d 65 74 72 79 5f 63 6f 6c 75 6d 6e 20 3d 20 27 metry_column = '
20040 67 65 6f 6d 27 20 41 4e 44 20 73 65 61 72 63 68 geom' AND search
20050 5f 66 72 61 6d 65 20 3d 20 42 75 69 6c 64 4d 42 _frame = BuildMB
20060 52 28 3f 2c 20 3f 2c 20 3f 2c 20 3f 29 29 22 2c R(?, ?, ?, ?))",
20070 0a 09 20 20 20 20 20 20 20 73 71 6c 2c 20 74 61 .. sql, ta
20080 62 6c 65 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 ble);.. sqlite3
20090 5f 66 72 65 65 20 28 74 61 62 6c 65 29 3b 0a 09 _free (table);..
200a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
200b0 70 72 65 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 prev);. }.
200c0 20 20 20 72 65 74 20 3d 0a 09 73 71 6c 69 74 65 ret =..sqlite
200d0 33 5f 70 72 65 70 61 72 65 5f 76 32 20 28 61 63 3_prepare_v2 (ac
200e0 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c cessor->db_handl
200f0 65 2c 20 73 71 6c 2c 20 73 74 72 6c 65 6e 20 28 e, sql, strlen (
20100 73 71 6c 29 2c 20 26 73 74 6d 74 5f 61 75 78 2c sql), &stmt_aux,
20110 0a 09 09 09 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 .... NULL);.
20120 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 sqlite3_free
20130 28 73 71 6c 29 3b 0a 20 20 20 20 69 66 20 28 72 (sql);. if (r
20140 65 74 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 et != SQLITE_OK)
20150 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 68 61 72 . {.. char
20160 20 2a 6d 73 67 20 3d 0a 09 20 20 20 20 20 20 73 *msg =.. s
20170 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 qlite3_mprintf (
20180 22 50 72 65 70 61 72 65 5f 67 65 74 4e 6f 64 65 "Prepare_getNode
20190 42 79 46 61 63 65 20 41 55 58 20 65 72 72 6f 72 ByFace AUX error
201a0 3a 20 5c 22 25 73 5c 22 22 2c 0a 09 09 09 20 20 : \"%s\"",....
201b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 sqlite3_err
201c0 6d 73 67 20 28 61 63 63 65 73 73 6f 72 2d 3e 64 msg (accessor->d
201d0 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 20 20 67 b_handle));.. g
201e0 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 aiatopo_set_last
201f0 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f _error_msg (topo
20200 2c 20 6d 73 67 29 3b 0a 09 20 20 73 71 6c 69 74 , msg);.. sqlit
20210 65 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 e3_free (msg);..
20220 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 *numelems = -1
20230 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c ;.. return NULL
20240 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 6c ;. }.. l
20250 69 73 74 20 3d 20 63 72 65 61 74 65 5f 6e 6f 64 ist = create_nod
20260 65 73 5f 6c 69 73 74 20 28 29 3b 0a 20 20 20 20 es_list ();.
20270 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
20280 2a 6e 75 6d 65 6c 65 6d 73 3b 20 69 2b 2b 29 0a *numelems; i++).
20290 20 20 20 20 20 20 7b 0a 09 20 20 63 68 61 72 20 {.. char
202a0 2a 6d 73 67 3b 0a 09 20 20 69 66 20 28 21 64 6f *msg;.. if (!do
202b0 5f 72 65 61 64 5f 6e 6f 64 65 5f 62 79 5f 66 61 _read_node_by_fa
202c0 63 65 0a 09 20 20 20 20 20 20 28 73 74 6d 74 5f ce.. (stmt_
202d0 61 75 78 2c 20 6c 69 73 74 2c 20 2a 28 66 61 63 aux, list, *(fac
202e0 65 73 20 2b 20 69 29 2c 20 66 69 65 6c 64 73 2c es + i), fields,
202f0 20 62 6f 78 2c 20 61 63 63 65 73 73 6f 72 2d 3e box, accessor->
20300 68 61 73 5f 7a 2c 0a 09 20 20 20 20 20 20 20 22 has_z,.. "
20310 63 61 6c 6c 62 61 63 6b 5f 67 65 74 4e 6f 64 65 callback_getNode
20320 42 79 46 61 63 65 22 2c 20 26 6d 73 67 29 29 0a ByFace", &msg)).
20330 09 20 20 20 20 7b 0a 09 09 67 61 69 61 74 6f 70 . {...gaiatop
20340 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 o_set_last_error
20350 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 _msg (topo, msg)
20360 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 ;...sqlite3_free
20370 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 (msg);...goto e
20380 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 rror;.. }.
20390 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c 69 }.. if (li
203a0 73 74 2d 3e 63 6f 75 6e 74 20 3d 3d 20 30 29 0a st->count == 0).
203b0 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6e 6f {.. /* no
203c0 20 6e 6f 64 65 20 77 61 73 20 66 6f 75 6e 64 20 node was found
203d0 2a 2f 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 */.. *numelems
203e0 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b 0a 20 = list->count;.
203f0 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a }. else.
20400 20 20 20 20 20 20 7b 0a 09 20 20 73 74 72 75 63 {.. struc
20410 74 20 74 6f 70 6f 5f 6e 6f 64 65 20 2a 70 5f 6e t topo_node *p_n
20420 64 3b 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 72 d;.. result = r
20430 74 61 6c 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a talloc (ctx, siz
20440 65 6f 66 20 28 52 54 54 5f 49 53 4f 5f 4e 4f 44 eof (RTT_ISO_NOD
20450 45 29 20 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 E) * list->count
20460 29 3b 0a 09 20 20 70 5f 6e 64 20 3d 20 6c 69 73 );.. p_nd = lis
20470 74 2d 3e 66 69 72 73 74 3b 0a 09 20 20 69 20 3d t->first;.. i =
20480 20 30 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 5f 0;.. while (p_
20490 6e 64 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 nd != NULL)..
204a0 20 7b 0a 09 09 52 54 54 5f 49 53 4f 5f 4e 4f 44 {...RTT_ISO_NOD
204b0 45 20 2a 6e 64 20 3d 20 72 65 73 75 6c 74 20 2b E *nd = result +
204c0 20 69 3b 0a 09 09 69 66 20 28 66 69 65 6c 64 73 i;...if (fields
204d0 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f & RTT_COL_NODE_
204e0 4e 4f 44 45 5f 49 44 29 0a 09 09 20 20 20 20 6e NODE_ID)... n
204f0 64 2d 3e 6e 6f 64 65 5f 69 64 20 3d 20 70 5f 6e d->node_id = p_n
20500 64 2d 3e 6e 6f 64 65 5f 69 64 3b 0a 09 09 69 66 d->node_id;...if
20510 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
20520 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 OL_NODE_CONTAINI
20530 4e 47 5f 46 41 43 45 29 0a 09 09 20 20 20 20 6e NG_FACE)... n
20540 64 2d 3e 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 d->containing_fa
20550 63 65 20 3d 20 70 5f 6e 64 2d 3e 63 6f 6e 74 61 ce = p_nd->conta
20560 69 6e 69 6e 67 5f 66 61 63 65 3b 0a 09 09 69 66 ining_face;...if
20570 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 (fields & RTT_C
20580 4f 4c 5f 4e 4f 44 45 5f 47 45 4f 4d 29 0a 09 09 OL_NODE_GEOM)...
20590 20 20 7b 0a 09 09 20 20 20 20 20 20 70 61 20 3d {... pa =
205a0 20 70 74 61 72 72 61 79 5f 63 6f 6e 73 74 72 75 ptarray_constru
205b0 63 74 20 28 63 74 78 2c 20 61 63 63 65 73 73 6f ct (ctx, accesso
205c0 72 2d 3e 68 61 73 5f 7a 2c 20 30 2c 20 31 29 3b r->has_z, 0, 1);
205d0 0a 09 09 20 20 20 20 20 20 70 74 34 64 2e 78 20 ... pt4d.x
205e0 3d 20 70 5f 6e 64 2d 3e 78 3b 0a 09 09 20 20 20 = p_nd->x;...
205f0 20 20 20 70 74 34 64 2e 79 20 3d 20 70 5f 6e 64 pt4d.y = p_nd
20600 2d 3e 79 3b 0a 09 09 20 20 20 20 20 20 69 66 20 ->y;... if
20610 28 61 63 63 65 73 73 6f 72 2d 3e 68 61 73 5f 7a (accessor->has_z
20620 29 0a 09 09 09 20 20 70 74 34 64 2e 7a 20 3d 20 ).... pt4d.z =
20630 70 5f 6e 64 2d 3e 7a 3b 0a 09 09 20 20 20 20 20 p_nd->z;...
20640 20 70 74 61 72 72 61 79 5f 73 65 74 5f 70 6f 69 ptarray_set_poi
20650 6e 74 34 64 20 28 63 74 78 2c 20 70 61 2c 20 30 nt4d (ctx, pa, 0
20660 2c 20 26 70 74 34 64 29 3b 0a 09 09 20 20 20 20 , &pt4d);...
20670 20 20 6e 64 2d 3e 67 65 6f 6d 20 3d 0a 09 09 09 nd->geom =....
20680 20 20 72 74 70 6f 69 6e 74 5f 63 6f 6e 73 74 72 rtpoint_constr
20690 75 63 74 20 28 63 74 78 2c 20 61 63 63 65 73 73 uct (ctx, access
206a0 6f 72 2d 3e 73 72 69 64 2c 20 4e 55 4c 4c 2c 20 or->srid, NULL,
206b0 70 61 29 3b 0a 09 09 20 20 7d 0a 09 09 69 2b 2b pa);... }...i++
206c0 3b 0a 09 09 70 5f 6e 64 20 3d 20 70 5f 6e 64 2d ;...p_nd = p_nd-
206d0 3e 6e 65 78 74 3b 0a 09 20 20 20 20 7d 0a 09 20 >next;.. }..
206e0 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 6c 69 73 *numelems = lis
206f0 74 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 t->count;.
20700 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 }. sqlite3_fi
20710 6e 61 6c 69 7a 65 20 28 73 74 6d 74 5f 61 75 78 nalize (stmt_aux
20720 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 5f 6e );. destroy_n
20730 6f 64 65 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 odes_list (list)
20740 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 ;. return res
20750 75 6c 74 3b 0a 0a 20 20 65 72 72 6f 72 3a 0a 20 ult;.. error:.
20760 20 20 20 69 66 20 28 73 74 6d 74 5f 61 75 78 20 if (stmt_aux
20770 21 3d 20 4e 55 4c 4c 29 0a 09 73 71 6c 69 74 65 != NULL)..sqlite
20780 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 3_finalize (stmt
20790 5f 61 75 78 29 3b 0a 20 20 20 20 69 66 20 28 6c _aux);. if (l
207a0 69 73 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 64 65 ist != NULL)..de
207b0 73 74 72 6f 79 5f 6e 6f 64 65 73 5f 6c 69 73 74 stroy_nodes_list
207c0 20 28 6c 69 73 74 29 3b 0a 20 20 20 20 2a 6e 75 (list);. *nu
207d0 6d 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 20 20 20 melems = -1;.
207e0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a return NULL;.}.
207f0 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b 5f 75 70 .int.callback_up
20800 64 61 74 65 4e 6f 64 65 73 42 79 49 64 20 28 63 dateNodesById (c
20810 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f onst RTT_BE_TOPO
20820 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 2c LOGY * rtt_topo,
20830 0a 09 09 09 20 20 63 6f 6e 73 74 20 52 54 54 5f .... const RTT_
20840 49 53 4f 5f 4e 4f 44 45 20 2a 20 6e 6f 64 65 73 ISO_NODE * nodes
20850 2c 20 69 6e 74 20 6e 75 6d 6e 6f 64 65 73 2c 0a , int numnodes,.
20860 09 09 09 20 20 69 6e 74 20 75 70 64 5f 66 69 65 ... int upd_fie
20870 6c 64 73 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 61 lds).{./* callba
20880 63 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 75 70 64 ck function: upd
20890 61 74 65 4e 6f 64 65 73 42 79 49 64 20 2a 2f 0a ateNodesById */.
208a0 20 20 20 20 63 6f 6e 73 74 20 52 54 43 54 58 20 const RTCTX
208b0 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *ctx = NULL;.
208c0 20 73 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 struct splite_i
208d0 6e 74 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 63 nternal_cache *c
208e0 61 63 68 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 ache = NULL;.
208f0 20 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 GaiaTopologyAcc
20900 65 73 73 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 essorPtr topo =
20910 28 47 61 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 (GaiaTopologyAcc
20920 65 73 73 6f 72 50 74 72 29 20 72 74 74 5f 74 6f essorPtr) rtt_to
20930 70 6f 3b 0a 20 20 20 20 73 74 72 75 63 74 20 67 po;. struct g
20940 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 aia_topology *ac
20950 63 65 73 73 6f 72 20 3d 20 28 73 74 72 75 63 74 cessor = (struct
20960 20 67 61 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a gaia_topology *
20970 29 20 74 6f 70 6f 3b 0a 20 20 20 20 73 71 6c 69 ) topo;. sqli
20980 74 65 33 5f 73 74 6d 74 20 2a 73 74 6d 74 20 3d te3_stmt *stmt =
20990 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 NULL;. int r
209a0 65 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 71 et;. char *sq
209b0 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 72 65 l;. char *pre
209c0 76 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6d 6d 61 v;. int comma
209d0 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a = 0;. char *
209e0 74 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 table;. char
209f0 2a 78 74 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 *xtable;. int
20a00 20 69 63 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 69 icol = 1;. i
20a10 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 63 68 nt i;. int ch
20a20 61 6e 67 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 anged = 0;. i
20a30 66 20 28 61 63 63 65 73 73 6f 72 20 3d 3d 20 4e f (accessor == N
20a40 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 2d 31 3b ULL)..return -1;
20a50 0a 0a 20 20 20 20 63 61 63 68 65 20 3d 20 28 73 .. cache = (s
20a60 74 72 75 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 truct splite_int
20a70 65 72 6e 61 6c 5f 63 61 63 68 65 20 2a 29 20 61 ernal_cache *) a
20a80 63 63 65 73 73 6f 72 2d 3e 63 61 63 68 65 3b 0a ccessor->cache;.
20a90 20 20 20 20 69 66 20 28 63 61 63 68 65 20 3d 3d if (cache ==
20aa0 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 30 NULL)..return 0
20ab0 3b 0a 20 20 20 20 69 66 20 28 63 61 63 68 65 2d ;. if (cache-
20ac0 3e 6d 61 67 69 63 31 20 21 3d 20 53 50 41 54 49 >magic1 != SPATI
20ad0 41 4c 49 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 ALITE_CACHE_MAGI
20ae0 43 31 0a 09 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 C1..|| cache->ma
20af0 67 69 63 32 20 21 3d 20 53 50 41 54 49 41 4c 49 gic2 != SPATIALI
20b00 54 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 32 29 TE_CACHE_MAGIC2)
20b10 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
20b20 63 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 ctx = cache->RTT
20b30 4f 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 OPO_handle;.
20b40 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 if (ctx == NULL)
20b50 0a 09 72 65 74 75 72 6e 20 30 3b 0a 0a 2f 2a 20 ..return 0;../*
20b60 63 6f 6d 70 6f 73 69 6e 67 20 74 68 65 20 53 51 composing the SQ
20b70 4c 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 L prepared state
20b80 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 74 61 62 6c ment */. tabl
20b90 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 e = sqlite3_mpri
20ba0 6e 74 66 20 28 22 25 73 5f 6e 6f 64 65 22 2c 20 ntf ("%s_node",
20bb0 61 63 63 65 73 73 6f 72 2d 3e 74 6f 70 6f 6c 6f accessor->topolo
20bc0 67 79 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 78 74 gy_name);. xt
20bd0 61 62 6c 65 20 3d 20 67 61 69 61 44 6f 75 62 6c able = gaiaDoubl
20be0 65 51 75 6f 74 65 64 53 71 6c 20 28 74 61 62 6c eQuotedSql (tabl
20bf0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f e);. sqlite3_
20c00 66 72 65 65 20 28 74 61 62 6c 65 29 3b 0a 20 20 free (table);.
20c10 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f sql = sqlite3_
20c20 6d 70 72 69 6e 74 66 20 28 22 55 50 44 41 54 45 mprintf ("UPDATE
20c30 20 4d 41 49 4e 2e 5c 22 25 73 5c 22 20 53 45 54 MAIN.\"%s\" SET
20c40 22 2c 20 78 74 61 62 6c 65 29 3b 0a 20 20 20 20 ", xtable);.
20c50 66 72 65 65 20 28 78 74 61 62 6c 65 29 3b 0a 20 free (xtable);.
20c60 20 20 20 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 prev = sql;.
20c70 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 6c 64 if (upd_field
20c80 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f 44 45 s & RTT_COL_NODE
20c90 5f 4e 4f 44 45 5f 49 44 29 0a 20 20 20 20 20 20 _NODE_ID).
20ca0 7b 0a 09 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a {.. if (comma).
20cb0 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c . sql = sql
20cc0 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
20cd0 73 2c 20 6e 6f 64 65 5f 69 64 20 3d 20 3f 22 2c s, node_id = ?",
20ce0 20 70 72 65 76 29 3b 0a 09 20 20 65 6c 73 65 0a prev);.. else.
20cf0 09 20 20 20 20 20 20 73 71 6c 20 3d 20 73 71 6c . sql = sql
20d00 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 ite3_mprintf ("%
20d10 73 20 6e 6f 64 65 5f 69 64 20 3d 20 3f 22 2c 20 s node_id = ?",
20d20 70 72 65 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 prev);.. comma
20d30 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
20d40 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
20d50 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
20d60 20 20 7d 0a 20 20 20 20 69 66 20 28 75 70 64 5f }. if (upd_
20d70 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c fields & RTT_COL
20d80 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 4e 49 4e 47 _NODE_CONTAINING
20d90 5f 46 41 43 45 29 0a 20 20 20 20 20 20 7b 0a 09 _FACE). {..
20da0 20 20 69 66 20 28 63 6f 6d 6d 61 29 0a 09 20 20 if (comma)..
20db0 20 20 20 20 73 71 6c 20 3d 20 73 71 6c 69 74 65 sql = sqlite
20dc0 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c 20 3_mprintf ("%s,
20dd0 63 6f 6e 74 61 69 6e 69 6e 67 5f 66 61 63 65 20 containing_face
20de0 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 09 20 20 = ?", prev);..
20df0 65 6c 73 65 0a 09 20 20 20 20 20 20 73 71 6c 20 else.. sql
20e00 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 = sqlite3_mprint
20e10 66 20 28 22 25 73 20 63 6f 6e 74 61 69 6e 69 6e f ("%s containin
20e20 67 5f 66 61 63 65 20 3d 20 3f 22 2c 20 70 72 65 g_face = ?", pre
20e30 76 29 3b 0a 09 20 20 63 6f 6d 6d 61 20 3d 20 31 v);.. comma = 1
20e40 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 72 65 ;.. sqlite3_fre
20e50 65 20 28 70 72 65 76 29 3b 0a 09 20 20 70 72 65 e (prev);.. pre
20e60 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20 20 7d v = sql;. }
20e70 0a 20 20 20 20 69 66 20 28 75 70 64 5f 66 69 65 . if (upd_fie
20e80 6c 64 73 20 26 20 52 54 54 5f 43 4f 4c 5f 4e 4f lds & RTT_COL_NO
20e90 44 45 5f 47 45 4f 4d 29 0a 20 20 20 20 20 20 7b DE_GEOM). {
20ea0 0a 09 20 20 69 66 20 28 61 63 63 65 73 73 6f 72 .. if (accessor
20eb0 2d 3e 68 61 73 5f 7a 29 0a 09 20 20 20 20 7b 0a ->has_z).. {.
20ec0 09 09 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 20 ..if (comma)...
20ed0 20 20 20 73 71 6c 20 3d 0a 09 09 09 73 71 6c 69 sql =....sqli
20ee0 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 te3_mprintf ("%s
20ef0 2c 20 67 65 6f 6d 20 3d 20 4d 61 6b 65 50 6f 69 , geom = MakePoi
20f00 6e 74 5a 28 3f 2c 20 3f 2e 20 3f 2c 20 25 64 29 ntZ(?, ?. ?, %d)
20f10 22 2c 0a 09 09 09 09 09 20 70 72 65 76 2c 20 61 ",...... prev, a
20f20 63 63 65 73 73 6f 72 2d 3e 73 72 69 64 29 3b 0a ccessor->srid);.
20f30 09 09 65 6c 73 65 0a 09 09 20 20 20 20 73 71 6c ..else... sql
20f40 20 3d 0a 09 09 09 73 71 6c 69 74 65 33 5f 6d 70 =....sqlite3_mp
20f50 72 69 6e 74 66 20 28 22 25 73 20 67 65 6f 6d 20 rintf ("%s geom
20f60 3d 20 4d 61 6b 65 50 6f 69 6e 74 5a 28 3f 2c 20 = MakePointZ(?,
20f70 3f 2c 20 3f 2c 20 25 64 29 22 2c 0a 09 09 09 09 ?, ?, %d)",.....
20f80 09 20 70 72 65 76 2c 20 61 63 63 65 73 73 6f 72 . prev, accessor
20f90 2d 3e 73 72 69 64 29 3b 0a 09 20 20 20 20 7d 0a ->srid);.. }.
20fa0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 . else.. {..
20fb0 09 69 66 20 28 63 6f 6d 6d 61 29 0a 09 09 20 20 .if (comma)...
20fc0 20 20 73 71 6c 20 3d 0a 09 09 09 73 71 6c 69 74 sql =....sqlit
20fd0 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 25 73 2c e3_mprintf ("%s,
20fe0 20 67 65 6f 6d 20 3d 20 4d 61 6b 65 50 6f 69 6e geom = MakePoin
20ff0 74 28 3f 2c 20 3f 2c 20 25 64 29 22 2c 20 70 72 t(?, ?, %d)", pr
21000 65 76 2c 0a 09 09 09 09 09 20 61 63 63 65 73 73 ev,...... access
21010 6f 72 2d 3e 73 72 69 64 29 3b 0a 09 09 65 6c 73 or->srid);...els
21020 65 0a 09 09 20 20 20 20 73 71 6c 20 3d 0a 09 09 e... sql =...
21030 09 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 .sqlite3_mprintf
21040 20 28 22 25 73 20 67 65 6f 6d 20 3d 20 4d 61 6b ("%s geom = Mak
21050 65 50 6f 69 6e 74 28 3f 2c 20 3f 2c 20 25 64 29 ePoint(?, ?, %d)
21060 22 2c 20 70 72 65 76 2c 0a 09 09 09 09 09 20 61 ", prev,...... a
21070 63 63 65 73 73 6f 72 2d 3e 73 72 69 64 29 3b 0a ccessor->srid);.
21080 09 20 20 20 20 7d 0a 09 20 20 63 6f 6d 6d 61 20 . }.. comma
21090 3d 20 31 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f = 1;.. sqlite3_
210a0 66 72 65 65 20 28 70 72 65 76 29 3b 0a 09 20 20 free (prev);..
210b0 70 72 65 76 20 3d 20 73 71 6c 3b 0a 20 20 20 20 prev = sql;.
210c0 20 20 7d 0a 20 20 20 20 73 71 6c 20 3d 20 73 71 }. sql = sq
210d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 lite3_mprintf ("
210e0 25 73 20 57 48 45 52 45 20 6e 6f 64 65 5f 69 64 %s WHERE node_id
210f0 20 3d 20 3f 22 2c 20 70 72 65 76 29 3b 0a 20 20 = ?", prev);.
21100 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 20 28 sqlite3_free (
21110 70 72 65 76 29 3b 0a 20 20 20 20 72 65 74 20 3d prev);. ret =
21120 0a 09 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 ..sqlite3_prepar
21130 65 5f 76 32 20 28 61 63 63 65 73 73 6f 72 2d 3e e_v2 (accessor->
21140 64 62 5f 68 61 6e 64 6c 65 2c 20 73 71 6c 2c 20 db_handle, sql,
21150 73 74 72 6c 65 6e 20 28 73 71 6c 29 2c 20 26 73 strlen (sql), &s
21160 74 6d 74 2c 0a 09 09 09 20 20 20 20 4e 55 4c 4c tmt,.... NULL
21170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 );. sqlite3_f
21180 72 65 65 20 28 73 71 6c 29 3b 0a 20 20 20 20 69 ree (sql);. i
21190 66 20 28 72 65 74 20 21 3d 20 53 51 4c 49 54 45 f (ret != SQLITE
211a0 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 _OK). {..
211b0 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c 69 char *msg = sqli
211c0 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 50 72 te3_mprintf ("Pr
211d0 65 70 61 72 65 5f 75 70 64 61 74 65 4e 6f 64 65 epare_updateNode
211e0 73 42 79 49 64 20 65 72 72 6f 72 3a 20 5c 22 25 sById error: \"%
211f0 73 5c 22 22 2c 0a 09 09 09 09 20 20 20 20 20 20 s\"",.....
21200 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 sqlite3_errmsg
21210 28 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 (accessor->db_ha
21220 6e 64 6c 65 29 29 3b 0a 09 20 20 67 61 69 61 74 ndle));.. gaiat
21230 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 opo_set_last_err
21240 6f 72 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 or_msg (topo, ms
21250 67 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f 66 g);.. sqlite3_f
21260 72 65 65 20 28 6d 73 67 29 3b 0a 09 20 20 72 65 ree (msg);.. re
21270 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d turn -1;. }
21280 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 .. for (i = 0
21290 3b 20 69 20 3c 20 6e 75 6d 6e 6f 64 65 73 3b 20 ; i < numnodes;
212a0 69 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 i++). {..
212b0 2f 2a 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e /* parameter bin
212c0 64 69 6e 67 20 2a 2f 0a 09 20 20 63 6f 6e 73 74 ding */.. const
212d0 20 52 54 54 5f 49 53 4f 5f 4e 4f 44 45 20 2a 6e RTT_ISO_NODE *n
212e0 64 20 3d 20 6e 6f 64 65 73 20 2b 20 69 3b 0a 09 d = nodes + i;..
212f0 20 20 69 63 6f 6c 20 3d 20 31 3b 0a 09 20 20 73 icol = 1;.. s
21300 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 74 qlite3_reset (st
21310 6d 74 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 5f mt);.. sqlite3_
21320 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 clear_bindings (
21330 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 75 70 stmt);.. if (up
21340 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 5f 43 d_fields & RTT_C
21350 4f 4c 5f 4e 4f 44 45 5f 4e 4f 44 45 5f 49 44 29 OL_NODE_NODE_ID)
21360 0a 09 20 20 20 20 7b 0a 09 09 73 71 6c 69 74 65 .. {...sqlite
21370 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 74 3_bind_int64 (st
21380 6d 74 2c 20 69 63 6f 6c 2c 20 6e 64 2d 3e 6e 6f mt, icol, nd->no
21390 64 65 5f 69 64 29 3b 0a 09 09 69 63 6f 6c 2b 2b de_id);...icol++
213a0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 ;.. }.. if (
213b0 75 70 64 5f 66 69 65 6c 64 73 20 26 20 52 54 54 upd_fields & RTT
213c0 5f 43 4f 4c 5f 4e 4f 44 45 5f 43 4f 4e 54 41 49 _COL_NODE_CONTAI
213d0 4e 49 4e 47 5f 46 41 43 45 29 0a 09 20 20 20 20 NING_FACE)..
213e0 7b 0a 09 09 69 66 20 28 6e 64 2d 3e 63 6f 6e 74 {...if (nd->cont
213f0 61 69 6e 69 6e 67 5f 66 61 63 65 20 3c 20 30 29 aining_face < 0)
21400 0a 09 09 20 20 20 20 73 71 6c 69 74 65 33 5f 62 ... sqlite3_b
21410 69 6e 64 5f 6e 75 6c 6c 20 28 73 74 6d 74 2c 20 ind_null (stmt,
21420 69 63 6f 6c 29 3b 0a 09 09 65 6c 73 65 0a 09 09 icol);...else...
21430 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
21440 5f 69 6e 74 36 34 20 28 73 74 6d 74 2c 20 69 63 _int64 (stmt, ic
21450 6f 6c 2c 20 6e 64 2d 3e 63 6f 6e 74 61 69 6e 69 ol, nd->containi
21460 6e 67 5f 66 61 63 65 29 3b 0a 09 09 69 63 6f 6c ng_face);...icol
21470 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 ++;.. }.. if
21480 20 28 75 70 64 5f 66 69 65 6c 64 73 20 26 20 52 (upd_fields & R
21490 54 54 5f 43 4f 4c 5f 4e 4f 44 45 5f 47 45 4f 4d TT_COL_NODE_GEOM
214a0 29 0a 09 20 20 20 20 7b 0a 09 09 52 54 50 4f 49 ).. {...RTPOI
214b0 4e 54 41 52 52 41 59 20 2a 70 61 3b 0a 09 09 52 NTARRAY *pa;...R
214c0 54 50 4f 49 4e 54 34 44 20 70 74 34 64 3b 0a 09 TPOINT4D pt4d;..
214d0 09 64 6f 75 62 6c 65 20 78 3b 0a 09 09 64 6f 75 .double x;...dou
214e0 62 6c 65 20 79 3b 0a 09 09 64 6f 75 62 6c 65 20 ble y;...double
214f0 7a 3b 0a 09 09 2f 2a 20 65 78 74 72 61 63 74 69 z;.../* extracti
21500 6e 67 20 58 20 61 6e 64 20 59 20 66 72 6f 6d 20 ng X and Y from
21510 52 54 50 4f 49 4e 54 20 2a 2f 0a 09 09 70 61 20 RTPOINT */...pa
21520 3d 20 6e 64 2d 3e 67 65 6f 6d 2d 3e 70 6f 69 6e = nd->geom->poin
21530 74 3b 0a 09 09 72 74 5f 67 65 74 50 6f 69 6e 74 t;...rt_getPoint
21540 34 64 5f 70 20 28 63 74 78 2c 20 70 61 2c 20 30 4d_p (ctx, pa, 0
21550 2c 20 26 70 74 34 64 29 3b 0a 09 09 78 20 3d 20 , &pt4d);...x =
21560 70 74 34 64 2e 78 3b 0a 09 09 79 20 3d 20 70 74 pt4d.x;...y = pt
21570 34 64 2e 79 3b 0a 09 09 69 66 20 28 61 63 63 65 4d.y;...if (acce
21580 73 73 6f 72 2d 3e 68 61 73 5f 7a 29 0a 09 09 20 ssor->has_z)...
21590 20 20 20 7a 20 3d 20 70 74 34 64 2e 7a 3b 0a 09 z = pt4d.z;..
215a0 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f .sqlite3_bind_do
215b0 75 62 6c 65 20 28 73 74 6d 74 2c 20 69 63 6f 6c uble (stmt, icol
215c0 2c 20 78 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b 0a , x);...icol++;.
215d0 09 09 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 ..sqlite3_bind_d
215e0 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 69 63 6f ouble (stmt, ico
215f0 6c 2c 20 79 29 3b 0a 09 09 69 63 6f 6c 2b 2b 3b l, y);...icol++;
21600 0a 09 09 69 66 20 28 61 63 63 65 73 73 6f 72 2d ...if (accessor-
21610 3e 68 61 73 5f 7a 29 0a 09 09 20 20 7b 0a 09 09 >has_z)... {...
21620 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 sqlite3_bi
21630 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c nd_double (stmt,
21640 20 69 63 6f 6c 2c 20 7a 29 3b 0a 09 09 20 20 20 icol, z);...
21650 20 20 20 69 63 6f 6c 2b 2b 3b 0a 09 09 20 20 7d icol++;... }
21660 0a 09 20 20 20 20 7d 0a 09 20 20 73 71 6c 69 74 .. }.. sqlit
21670 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 28 73 e3_bind_int64 (s
21680 74 6d 74 2c 20 69 63 6f 6c 2c 20 6e 64 2d 3e 6e tmt, icol, nd->n
21690 6f 64 65 5f 69 64 29 3b 0a 09 20 20 72 65 74 20 ode_id);.. ret
216a0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 28 = sqlite3_step (
216b0 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 72 65 stmt);.. if (re
216c0 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 t == SQLITE_DONE
216d0 20 7c 7c 20 72 65 74 20 3d 3d 20 53 51 4c 49 54 || ret == SQLIT
216e0 45 5f 52 4f 57 29 0a 09 20 20 20 20 20 20 63 68 E_ROW).. ch
216f0 61 6e 67 65 64 20 2b 3d 20 73 71 6c 69 74 65 33 anged += sqlite3
21700 5f 63 68 61 6e 67 65 73 20 28 61 63 63 65 73 73 _changes (access
21710 6f 72 2d 3e 64 62 5f 68 61 6e 64 6c 65 29 3b 0a or->db_handle);.
21720 09 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 . else.. {..
21730 09 63 68 61 72 20 2a 6d 73 67 20 3d 20 73 71 6c .char *msg = sql
21740 69 74 65 33 5f 6d 70 72 69 6e 74 66 20 28 22 63 ite3_mprintf ("c
21750 61 6c 6c 62 61 63 6b 5f 75 70 64 61 74 65 4e 6f allback_updateNo
21760 64 65 73 42 79 49 64 3a 20 5c 22 25 73 5c 22 22 desById: \"%s\""
21770 2c 0a 09 09 09 09 09 20 20 20 20 20 73 71 6c 69 ,...... sqli
21780 74 65 33 5f 65 72 72 6d 73 67 0a 09 09 09 09 09 te3_errmsg......
21790 20 20 20 20 20 28 61 63 63 65 73 73 6f 72 2d 3e (accessor->
217a0 64 62 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 67 db_handle));...g
217b0 61 69 61 74 6f 70 6f 5f 73 65 74 5f 6c 61 73 74 aiatopo_set_last
217c0 5f 65 72 72 6f 72 5f 6d 73 67 20 28 74 6f 70 6f _error_msg (topo
217d0 2c 20 6d 73 67 29 3b 0a 09 09 73 71 6c 69 74 65 , msg);...sqlite
217e0 33 5f 66 72 65 65 20 28 6d 73 67 29 3b 0a 09 09 3_free (msg);...
217f0 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 20 20 20 goto error;..
21800 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 }. }. s
21810 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 qlite3_finalize
21820 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 (stmt);. retu
21830 72 6e 20 63 68 61 6e 67 65 64 3b 0a 0a 20 20 65 rn changed;.. e
21840 72 72 6f 72 3a 0a 20 20 20 20 73 71 6c 69 74 65 rror:. sqlite
21850 33 5f 66 69 6e 61 6c 69 7a 65 20 28 73 74 6d 74 3_finalize (stmt
21860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 );. return -1
21870 3b 0a 7d 0a 0a 52 54 54 5f 49 53 4f 5f 46 41 43 ;.}..RTT_ISO_FAC
21880 45 20 2a 0a 63 61 6c 6c 62 61 63 6b 5f 67 65 74 E *.callback_get
21890 46 61 63 65 57 69 74 68 69 6e 42 6f 78 32 44 20 FaceWithinBox2D
218a0 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f (const RTT_BE_TO
218b0 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 POLOGY * rtt_top
218c0 6f 2c 0a 09 09 09 20 20 20 20 20 63 6f 6e 73 74 o,.... const
218d0 20 52 54 47 42 4f 58 20 2a 20 62 6f 78 2c 20 69 RTGBOX * box, i
218e0 6e 74 20 2a 6e 75 6d 65 6c 65 6d 73 2c 20 69 6e nt *numelems, in
218f0 74 20 66 69 65 6c 64 73 2c 0a 09 09 09 20 20 20 t fields,....
21900 20 20 69 6e 74 20 6c 69 6d 69 74 29 0a 7b 0a 2f int limit).{./
21910 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 * callback funct
21920 69 6f 6e 3a 20 67 65 74 46 61 63 65 57 69 74 68 ion: getFaceWith
21930 69 6e 42 6f 78 32 44 20 2a 2f 0a 20 20 20 20 63 inBox2D */. c
21940 6f 6e 73 74 20 52 54 43 54 58 20 2a 63 74 78 20 onst RTCTX *ctx
21950 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 72 75 = NULL;. stru
21960 63 74 20 73 70 6c 69 74 65 5f 69 6e 74 65 72 6e ct splite_intern
21970 61 6c 5f 63 61 63 68 65 20 2a 63 61 63 68 65 20 al_cache *cache
21980 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 47 61 69 61 = NULL;. Gaia
21990 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 TopologyAccessor
219a0 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 69 61 Ptr topo = (Gaia
219b0 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 TopologyAccessor
219c0 50 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 Ptr) rtt_topo;.
219d0 20 20 20 73 74 72 75 63 74 20 67 61 69 61 5f 74 struct gaia_t
219e0 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 73 6f opology *accesso
219f0 72 20 3d 20 28 73 74 72 75 63 74 20 67 61 69 61 r = (struct gaia
21a00 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 _topology *) top
21a10 6f 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 o;. sqlite3_s
21a20 74 6d 74 20 2a 73 74 6d 74 3b 0a 20 20 20 20 69 tmt *stmt;. i
21a30 6e 74 20 72 65 74 3b 0a 20 20 20 20 69 6e 74 20 nt ret;. int
21a40 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 count = 0;. s
21a50 74 72 75 63 74 20 74 6f 70 6f 5f 66 61 63 65 73 truct topo_faces
21a60 5f 6c 69 73 74 20 2a 6c 69 73 74 20 3d 20 4e 55 _list *list = NU
21a70 4c 4c 3b 0a 20 20 20 20 52 54 54 5f 49 53 4f 5f LL;. RTT_ISO_
21a80 46 41 43 45 20 2a 72 65 73 75 6c 74 20 3d 20 4e FACE *result = N
21a90 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 61 63 63 ULL;. if (acc
21aa0 65 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 20 essor == NULL).
21ab0 20 20 20 20 20 7b 0a 09 20 20 2a 6e 75 6d 65 6c {.. *numel
21ac0 65 6d 73 20 3d 20 2d 31 3b 0a 09 20 20 72 65 74 ems = -1;.. ret
21ad0 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 urn NULL;.
21ae0 7d 0a 0a 20 20 20 20 73 74 6d 74 20 3d 20 61 63 }.. stmt = ac
21af0 63 65 73 73 6f 72 2d 3e 73 74 6d 74 5f 67 65 74 cessor->stmt_get
21b00 46 61 63 65 57 69 74 68 69 6e 42 6f 78 32 44 3b FaceWithinBox2D;
21b10 0a 20 20 20 20 69 66 20 28 73 74 6d 74 20 3d 3d . if (stmt ==
21b20 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 7b 0a 09 NULL). {..
21b30 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 3d 20 2d 31 *numelems = -1
21b40 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c ;.. return NULL
21b50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 63 ;. }.. c
21b60 61 63 68 65 20 3d 20 28 73 74 72 75 63 74 20 73 ache = (struct s
21b70 70 6c 69 74 65 5f 69 6e 74 65 72 6e 61 6c 5f 63 plite_internal_c
21b80 61 63 68 65 20 2a 29 20 61 63 63 65 73 73 6f 72 ache *) accessor
21b90 2d 3e 63 61 63 68 65 3b 0a 20 20 20 20 69 66 20 ->cache;. if
21ba0 28 63 61 63 68 65 20 3d 3d 20 4e 55 4c 4c 29 0a (cache == NULL).
21bb0 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
21bc0 20 20 69 66 20 28 63 61 63 68 65 2d 3e 6d 61 67 if (cache->mag
21bd0 69 63 31 20 21 3d 20 53 50 41 54 49 41 4c 49 54 ic1 != SPATIALIT
21be0 45 5f 43 41 43 48 45 5f 4d 41 47 49 43 31 0a 09 E_CACHE_MAGIC1..
21bf0 7c 7c 20 63 61 63 68 65 2d 3e 6d 61 67 69 63 32 || cache->magic2
21c00 20 21 3d 20 53 50 41 54 49 41 4c 49 54 45 5f 43 != SPATIALITE_C
21c10 41 43 48 45 5f 4d 41 47 49 43 32 29 0a 09 72 65 ACHE_MAGIC2)..re
21c20 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 turn NULL;. c
21c30 74 78 20 3d 20 63 61 63 68 65 2d 3e 52 54 54 4f tx = cache->RTTO
21c40 50 4f 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 PO_handle;. i
21c50 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 0a f (ctx == NULL).
21c60 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 2f .return NULL;../
21c70 2a 20 73 65 74 74 69 6e 67 20 75 70 20 74 68 65 * setting up the
21c80 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d prepared statem
21c90 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 ent */. sqlit
21ca0 65 33 5f 72 65 73 65 74 20 28 73 74 6d 74 29 3b e3_reset (stmt);
21cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 . sqlite3_cle
21cc0 61 72 5f 62 69 6e 64 69 6e 67 73 20 28 73 74 6d ar_bindings (stm
21cd0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f t);. sqlite3_
21ce0 62 69 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d bind_double (stm
21cf0 74 2c 20 31 2c 20 62 6f 78 2d 3e 78 6d 61 78 29 t, 1, box->xmax)
21d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 ;. sqlite3_bi
21d10 6e 64 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c nd_double (stmt,
21d20 20 32 2c 20 62 6f 78 2d 3e 78 6d 69 6e 29 3b 0a 2, box->xmin);.
21d30 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
21d40 5f 64 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 33 _double (stmt, 3
21d50 2c 20 62 6f 78 2d 3e 79 6d 61 78 29 3b 0a 20 20 , box->ymax);.
21d60 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 sqlite3_bind_d
21d70 6f 75 62 6c 65 20 28 73 74 6d 74 2c 20 34 2c 20 ouble (stmt, 4,
21d80 62 6f 78 2d 3e 79 6d 69 6e 29 3b 0a 20 20 20 20 box->ymin);.
21d90 6c 69 73 74 20 3d 20 63 72 65 61 74 65 5f 66 61 list = create_fa
21da0 63 65 73 5f 6c 69 73 74 20 28 29 3b 0a 0a 20 20 ces_list ();..
21db0 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 while (1).
21dc0 20 20 7b 0a 09 20 20 2f 2a 20 73 63 72 6f 6c 6c {.. /* scroll
21dd0 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 ing the result s
21de0 65 74 20 72 6f 77 73 20 2a 2f 0a 09 20 20 72 65 et rows */.. re
21df0 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 t = sqlite3_step
21e00 20 28 73 74 6d 74 29 3b 0a 09 20 20 69 66 20 28 (stmt);.. if (
21e10 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f 44 4f ret == SQLITE_DO
21e20 4e 45 29 0a 09 20 20 20 20 20 20 62 72 65 61 6b NE).. break
21e30 3b 09 09 2f 2a 20 65 6e 64 20 6f 66 20 72 65 73 ;../* end of res
21e40 75 6c 74 20 73 65 74 20 2a 2f 0a 09 20 20 69 66 ult set */.. if
21e50 20 28 72 65 74 20 3d 3d 20 53 51 4c 49 54 45 5f (ret == SQLITE_
21e60 52 4f 57 29 0a 09 20 20 20 20 7b 0a 09 09 73 71 ROW).. {...sq
21e70 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 61 63 65 lite3_int64 face
21e80 5f 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f _id = sqlite3_co
21e90 6c 75 6d 6e 5f 69 6e 74 36 34 20 28 73 74 6d 74 lumn_int64 (stmt
21ea0 2c 20 30 29 3b 0a 09 09 64 6f 75 62 6c 65 20 6d , 0);...double m
21eb0 69 6e 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f inx = sqlite3_co
21ec0 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 28 73 74 6d lumn_double (stm
21ed0 74 2c 20 31 29 3b 0a 09 09 64 6f 75 62 6c 65 20 t, 1);...double
21ee0 6d 69 6e 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 miny = sqlite3_c
21ef0 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 28 73 74 olumn_double (st
21f00 6d 74 2c 20 32 29 3b 0a 09 09 64 6f 75 62 6c 65 mt, 2);...double
21f10 20 6d 61 78 78 20 3d 20 73 71 6c 69 74 65 33 5f maxx = sqlite3_
21f20 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 28 73 column_double (s
21f30 74 6d 74 2c 20 33 29 3b 0a 09 09 64 6f 75 62 6c tmt, 3);...doubl
21f40 65 20 6d 61 78 79 20 3d 20 73 71 6c 69 74 65 33 e maxy = sqlite3
21f50 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 28 _column_double (
21f60 73 74 6d 74 2c 20 34 29 3b 0a 09 09 61 64 64 5f stmt, 4);...add_
21f70 66 61 63 65 20 28 6c 69 73 74 2c 20 66 61 63 65 face (list, face
21f80 5f 69 64 2c 20 66 61 63 65 5f 69 64 2c 20 6d 69 _id, face_id, mi
21f90 6e 78 2c 20 6d 69 6e 79 2c 20 6d 61 78 78 2c 20 nx, miny, maxx,
21fa0 6d 61 78 79 29 3b 0a 09 09 63 6f 75 6e 74 2b 2b maxy);...count++
21fb0 3b 0a 09 09 69 66 20 28 6c 69 6d 69 74 20 3e 20 ;...if (limit >
21fc0 30 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 0)... {...
21fd0 20 69 66 20 28 63 6f 75 6e 74 20 3e 20 6c 69 6d if (count > lim
21fe0 69 74 29 0a 09 09 09 20 20 62 72 65 61 6b 3b 0a it).... break;.
21ff0 09 09 20 20 7d 0a 09 09 69 66 20 28 6c 69 6d 69 .. }...if (limi
22000 74 20 3c 20 30 29 0a 09 09 20 20 20 20 62 72 65 t < 0)... bre
22010 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c ak;.. }.. el
22020 73 65 0a 09 20 20 20 20 7b 0a 09 09 63 68 61 72 se.. {...char
22030 20 2a 6d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f *msg = sqlite3_
22040 6d 70 72 69 6e 74 66 20 28 22 63 61 6c 6c 62 61 mprintf ("callba
22050 63 6b 5f 67 65 74 46 61 63 65 57 69 74 68 69 6e ck_getFaceWithin
22060 42 6f 78 32 44 3a 20 25 73 22 2c 0a 09 09 09 09 Box2D: %s",.....
22070 09 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 . sqlite3_er
22080 72 6d 73 67 0a 09 09 09 09 09 20 20 20 20 20 28 rmsg...... (
22090 61 63 63 65 73 73 6f 72 2d 3e 64 62 5f 68 61 6e accessor->db_han
220a0 64 6c 65 29 29 3b 0a 09 09 67 61 69 61 74 6f 70 dle));...gaiatop
220b0 6f 5f 73 65 74 5f 6c 61 73 74 5f 65 72 72 6f 72 o_set_last_error
220c0 5f 6d 73 67 20 28 74 6f 70 6f 2c 20 6d 73 67 29 _msg (topo, msg)
220d0 3b 0a 09 09 73 71 6c 69 74 65 33 5f 66 72 65 65 ;...sqlite3_free
220e0 20 28 6d 73 67 29 3b 0a 09 09 67 6f 74 6f 20 65 (msg);...goto e
220f0 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 20 20 20 rror;.. }.
22100 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6c 69 }.. if (li
22110 6d 69 74 20 3c 20 30 29 0a 20 20 20 20 20 20 7b mit < 0). {
22120 0a 09 20 20 72 65 73 75 6c 74 20 3d 20 4e 55 4c .. result = NUL
22130 4c 3b 0a 09 20 20 2a 6e 75 6d 65 6c 65 6d 73 20 L;.. *numelems
22140 3d 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 7d = count;. }
22150 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 . else.
22160 7b 0a 09 20 20 69 66 20 28 6c 69 73 74 2d 3e 63 {.. if (list->c
22170 6f 75 6e 74 20 3c 3d 20 30 29 0a 09 20 20 20 20 ount <= 0)..
22180 7b 0a 09 09 72 65 73 75 6c 74 20 3d 20 4e 55 4c {...result = NUL
22190 4c 3b 0a 09 09 2a 6e 75 6d 65 6c 65 6d 73 20 3d L;...*numelems =
221a0 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 0;.. }.. el
221b0 73 65 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 se.. {...int
221c0 69 20 3d 20 30 3b 0a 09 09 73 74 72 75 63 74 20 i = 0;...struct
221d0 74 6f 70 6f 5f 66 61 63 65 20 2a 70 5f 66 63 3b topo_face *p_fc;
221e0 0a 09 09 72 65 73 75 6c 74 20 3d 20 72 74 61 6c ...result = rtal
221f0 6c 6f 63 20 28 63 74 78 2c 20 73 69 7a 65 6f 66 loc (ctx, sizeof
22200 20 28 52 54 54 5f 49 53 4f 5f 46 41 43 45 29 20 (RTT_ISO_FACE)
22210 2a 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 29 3b 0a * list->count);.
22220 09 09 70 5f 66 63 20 3d 20 6c 69 73 74 2d 3e 66 ..p_fc = list->f
22230 69 72 73 74 3b 0a 09 09 77 68 69 6c 65 20 28 70 irst;...while (p
22240 5f 66 63 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 20 _fc != NULL)...
22250 20 7b 0a 09 09 20 20 20 20 20 20 52 54 54 5f 49 {... RTT_I
22260 53 4f 5f 46 41 43 45 20 2a 66 63 20 3d 20 72 65 SO_FACE *fc = re
22270 73 75 6c 74 20 2b 20 69 3b 0a 09 09 20 20 20 20 sult + i;...
22280 20 20 69 66 20 28 66 69 65 6c 64 73 20 26 20 52 if (fields & R
22290 54 54 5f 43 4f 4c 5f 46 41 43 45 5f 46 41 43 45 TT_COL_FACE_FACE
222a0 5f 49 44 29 0a 09 09 09 20 20 66 63 2d 3e 66 61 _ID).... fc->fa
222b0 63 65 5f 69 64 20 3d 20 70 5f 66 63 2d 3e 66 61 ce_id = p_fc->fa
222c0 63 65 5f 69 64 3b 0a 09 09 20 20 20 20 20 20 69 ce_id;... i
222d0 66 20 28 66 69 65 6c 64 73 20 26 20 52 54 54 5f f (fields & RTT_
222e0 43 4f 4c 5f 46 41 43 45 5f 4d 42 52 29 0a 09 09 COL_FACE_MBR)...
222f0 09 7b 0a 09 09 09 20 20 20 20 66 63 2d 3e 6d 62 .{.... fc->mb
22300 72 20 3d 20 67 62 6f 78 5f 6e 65 77 20 28 63 74 r = gbox_new (ct
22310 78 2c 20 30 29 3b 0a 09 09 09 20 20 20 20 66 63 x, 0);.... fc
22320 2d 3e 6d 62 72 2d 3e 78 6d 69 6e 20 3d 20 70 5f ->mbr->xmin = p_
22330 66 63 2d 3e 6d 69 6e 78 3b 0a 09 09 09 20 20 20 fc->minx;....
22340 20 66 63 2d 3e 6d 62 72 2d 3e 79 6d 69 6e 20 3d fc->mbr->ymin =
22350 20 70 5f 66 63 2d 3e 6d 69 6e 79 3b 0a 09 09 09 p_fc->miny;....
22360 20 20 20 20 66 63 2d 3e 6d 62 72 2d 3e 78 6d 61 fc->mbr->xma
22370 78 20 3d 20 70 5f 66 63 2d 3e 6d 61 78 78 3b 0a x = p_fc->maxx;.
22380 09 09 09 20 20 20 20 66 63 2d 3e 6d 62 72 2d 3e ... fc->mbr->
22390 79 6d 61 78 20 3d 20 70 5f 66 63 2d 3e 6d 61 78 ymax = p_fc->max
223a0 79 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 y;....}...
223b0 69 2b 2b 3b 0a 09 09 20 20 20 20 20 20 70 5f 66 i++;... p_f
223c0 63 20 3d 20 70 5f 66 63 2d 3e 6e 65 78 74 3b 0a c = p_fc->next;.
223d0 09 09 20 20 7d 0a 09 09 2a 6e 75 6d 65 6c 65 6d .. }...*numelem
223e0 73 20 3d 20 6c 69 73 74 2d 3e 63 6f 75 6e 74 3b s = list->count;
223f0 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a .. }. }.
22400 20 20 20 20 64 65 73 74 72 6f 79 5f 66 61 63 65 destroy_face
22410 73 5f 6c 69 73 74 20 28 6c 69 73 74 29 3b 0a 20 s_list (list);.
22420 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 sqlite3_reset
22430 20 28 73 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 (stmt);. ret
22440 75 72 6e 20 72 65 73 75 6c 74 3b 0a 0a 20 20 65 urn result;.. e
22450 72 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 6c 69 rror:. if (li
22460 73 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 64 65 73 st != NULL)..des
22470 74 72 6f 79 5f 66 61 63 65 73 5f 6c 69 73 74 20 troy_faces_list
22480 28 6c 69 73 74 29 3b 0a 20 20 20 20 2a 6e 75 6d (list);. *num
22490 65 6c 65 6d 73 20 3d 20 2d 31 3b 0a 20 20 20 20 elems = -1;.
224a0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 28 73 sqlite3_reset (s
224b0 74 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e tmt);. return
224c0 20 4e 55 4c 4c 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 NULL;.}..int.ca
224d0 6c 6c 62 61 63 6b 5f 75 70 64 61 74 65 54 6f 70 llback_updateTop
224e0 6f 47 65 6f 6d 45 64 67 65 53 70 6c 69 74 20 28 oGeomEdgeSplit (
224f0 63 6f 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 const RTT_BE_TOP
22500 4f 4c 4f 47 59 20 2a 20 74 6f 70 6f 2c 0a 09 09 OLOGY * topo,...
22510 09 09 20 20 52 54 54 5f 45 4c 45 4d 49 44 20 73 .. RTT_ELEMID s
22520 70 6c 69 74 5f 65 64 67 65 2c 20 52 54 54 5f 45 plit_edge, RTT_E
22530 4c 45 4d 49 44 20 6e 65 77 5f 65 64 67 65 31 2c LEMID new_edge1,
22540 0a 09 09 09 09 20 20 52 54 54 5f 45 4c 45 4d 49 ..... RTT_ELEMI
22550 44 20 6e 65 77 5f 65 64 67 65 32 29 0a 7b 0a 2f D new_edge2).{./
22560 2a 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 2a * does nothing *
22570 2f 0a 20 20 20 20 69 66 20 28 74 6f 70 6f 20 21 /. if (topo !
22580 3d 20 4e 55 4c 4c 20 26 26 20 73 70 6c 69 74 5f = NULL && split_
22590 65 64 67 65 20 3d 3d 20 30 20 26 26 20 6e 65 77 edge == 0 && new
225a0 5f 65 64 67 65 31 20 3d 3d 20 30 20 26 26 20 6e _edge1 == 0 && n
225b0 65 77 5f 65 64 67 65 32 20 3d 3d 20 30 29 0a 09 ew_edge2 == 0)..
225c0 74 6f 70 6f 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a topo = NULL;../*
225d0 20 73 69 6c 65 6e 63 69 6e 67 20 73 74 75 70 69 silencing stupi
225e0 64 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 d compiler warni
225f0 6e 67 73 20 6f 6e 20 75 6e 75 73 65 64 20 61 72 ngs on unused ar
22600 67 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e gs */. return
22610 20 31 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 1;.}..int.callb
22620 61 63 6b 5f 75 70 64 61 74 65 54 6f 70 6f 47 65 ack_updateTopoGe
22630 6f 6d 46 61 63 65 53 70 6c 69 74 20 28 63 6f 6e omFaceSplit (con
22640 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f st RTT_BE_TOPOLO
22650 47 59 20 2a 20 74 6f 70 6f 2c 0a 09 09 09 09 20 GY * topo,.....
22660 20 52 54 54 5f 45 4c 45 4d 49 44 20 73 70 6c 69 RTT_ELEMID spli
22670 74 5f 66 61 63 65 2c 0a 09 09 09 09 20 20 52 54 t_face,..... RT
22680 54 5f 45 4c 45 4d 49 44 20 6e 65 77 5f 66 61 63 T_ELEMID new_fac
22690 65 31 2c 20 52 54 54 5f 45 4c 45 4d 49 44 20 6e e1, RTT_ELEMID n
226a0 65 77 5f 66 61 63 65 32 29 0a 7b 0a 2f 2a 20 64 ew_face2).{./* d
226b0 6f 65 73 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 oes nothing */.
226c0 20 20 20 69 66 20 28 74 6f 70 6f 20 21 3d 20 4e if (topo != N
226d0 55 4c 4c 20 26 26 20 73 70 6c 69 74 5f 66 61 63 ULL && split_fac
226e0 65 20 3d 3d 20 30 20 26 26 20 6e 65 77 5f 66 61 e == 0 && new_fa
226f0 63 65 31 20 3d 3d 20 30 20 26 26 20 6e 65 77 5f ce1 == 0 && new_
22700 66 61 63 65 32 20 3d 3d 20 30 29 0a 09 74 6f 70 face2 == 0)..top
22710 6f 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 73 69 o = NULL;../* si
22720 6c 65 6e 63 69 6e 67 20 73 74 75 70 69 64 20 63 lencing stupid c
22730 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 ompiler warnings
22740 20 6f 6e 20 75 6e 75 73 65 64 20 61 72 67 73 20 on unused args
22750 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b */. return 1;
22760 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b .}..int.callback
22770 5f 63 68 65 63 6b 54 6f 70 6f 47 65 6f 6d 52 65 _checkTopoGeomRe
22780 6d 45 64 67 65 20 28 63 6f 6e 73 74 20 52 54 54 mEdge (const RTT
22790 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 74 _BE_TOPOLOGY * t
227a0 6f 70 6f 2c 0a 09 09 09 20 20 20 20 20 20 20 52 opo,.... R
227b0 54 54 5f 45 4c 45 4d 49 44 20 72 65 6d 5f 65 64 TT_ELEMID rem_ed
227c0 67 65 2c 20 52 54 54 5f 45 4c 45 4d 49 44 20 66 ge, RTT_ELEMID f
227d0 61 63 65 5f 6c 65 66 74 2c 0a 09 09 09 20 20 20 ace_left,....
227e0 20 20 20 20 52 54 54 5f 45 4c 45 4d 49 44 20 66 RTT_ELEMID f
227f0 61 63 65 5f 72 69 67 68 74 29 0a 7b 0a 2f 2a 20 ace_right).{./*
22800 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a does nothing */.
22810 20 20 20 20 69 66 20 28 74 6f 70 6f 20 21 3d 20 if (topo !=
22820 4e 55 4c 4c 20 26 26 20 72 65 6d 5f 65 64 67 65 NULL && rem_edge
22830 20 3d 3d 20 30 20 26 26 20 66 61 63 65 5f 6c 65 == 0 && face_le
22840 66 74 20 3d 3d 20 30 20 26 26 20 66 61 63 65 5f ft == 0 && face_
22850 72 69 67 68 74 20 3d 3d 20 30 29 0a 09 74 6f 70 right == 0)..top
22860 6f 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 73 69 o = NULL;../* si
22870 6c 65 6e 63 69 6e 67 20 73 74 75 70 69 64 20 63 lencing stupid c
22880 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 ompiler warnings
22890 20 6f 6e 20 75 6e 75 73 65 64 20 61 72 67 73 20 on unused args
228a0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b */. return 1;
228b0 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b .}..int.callback
228c0 5f 75 70 64 61 74 65 54 6f 70 6f 47 65 6f 6d 46 _updateTopoGeomF
228d0 61 63 65 48 65 61 6c 20 28 63 6f 6e 73 74 20 52 aceHeal (const R
228e0 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a TT_BE_TOPOLOGY *
228f0 20 74 6f 70 6f 2c 20 52 54 54 5f 45 4c 45 4d 49 topo, RTT_ELEMI
22900 44 20 66 61 63 65 31 2c 0a 09 09 09 09 20 52 54 D face1,..... RT
22910 54 5f 45 4c 45 4d 49 44 20 66 61 63 65 32 2c 20 T_ELEMID face2,
22920 52 54 54 5f 45 4c 45 4d 49 44 20 6e 65 77 66 61 RTT_ELEMID newfa
22930 63 65 29 0a 7b 0a 2f 2a 20 64 6f 65 73 20 6e 6f ce).{./* does no
22940 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 thing */. if
22950 28 74 6f 70 6f 20 21 3d 20 4e 55 4c 4c 20 26 26 (topo != NULL &&
22960 20 66 61 63 65 31 20 3d 3d 20 30 20 26 26 20 66 face1 == 0 && f
22970 61 63 65 32 20 3d 3d 20 30 20 26 26 20 6e 65 77 ace2 == 0 && new
22980 66 61 63 65 20 3d 3d 20 30 29 0a 09 74 6f 70 6f face == 0)..topo
22990 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 73 69 6c = NULL;../* sil
229a0 65 6e 63 69 6e 67 20 73 74 75 70 69 64 20 63 6f encing stupid co
229b0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 mpiler warnings
229c0 6f 6e 20 75 6e 75 73 65 64 20 61 72 67 73 20 2a on unused args *
229d0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a /. return 1;.
229e0 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b 5f }..int.callback_
229f0 63 68 65 63 6b 54 6f 70 6f 47 65 6f 6d 52 65 6d checkTopoGeomRem
22a00 4e 6f 64 65 20 28 63 6f 6e 73 74 20 52 54 54 5f Node (const RTT_
22a10 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 74 6f BE_TOPOLOGY * to
22a20 70 6f 2c 0a 09 09 09 20 20 20 20 20 20 20 52 54 po,.... RT
22a30 54 5f 45 4c 45 4d 49 44 20 72 65 6d 5f 6e 6f 64 T_ELEMID rem_nod
22a40 65 2c 20 52 54 54 5f 45 4c 45 4d 49 44 20 65 31 e, RTT_ELEMID e1
22a50 2c 0a 09 09 09 20 20 20 20 20 20 20 52 54 54 5f ,.... RTT_
22a60 45 4c 45 4d 49 44 20 65 32 29 0a 7b 0a 2f 2a 20 ELEMID e2).{./*
22a70 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a does nothing */.
22a80 20 20 20 20 69 66 20 28 74 6f 70 6f 20 21 3d 20 if (topo !=
22a90 4e 55 4c 4c 20 26 26 20 72 65 6d 5f 6e 6f 64 65 NULL && rem_node
22aa0 20 3d 3d 20 30 20 26 26 20 65 31 20 3d 3d 20 30 == 0 && e1 == 0
22ab0 20 26 26 20 65 32 20 3d 3d 20 30 29 0a 09 74 6f && e2 == 0)..to
22ac0 70 6f 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 73 po = NULL;../* s
22ad0 69 6c 65 6e 63 69 6e 67 20 73 74 75 70 69 64 20 ilencing stupid
22ae0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 compiler warning
22af0 73 20 6f 6e 20 75 6e 75 73 65 64 20 61 72 67 73 s on unused args
22b00 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 */. return 1
22b10 3b 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 ;.}..int.callbac
22b20 6b 5f 75 70 64 61 74 65 54 6f 70 6f 47 65 6f 6d k_updateTopoGeom
22b30 45 64 67 65 48 65 61 6c 20 28 63 6f 6e 73 74 20 EdgeHeal (const
22b40 52 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 RTT_BE_TOPOLOGY
22b50 2a 20 74 6f 70 6f 2c 20 52 54 54 5f 45 4c 45 4d * topo, RTT_ELEM
22b60 49 44 20 65 64 67 65 31 2c 0a 09 09 09 09 20 52 ID edge1,..... R
22b70 54 54 5f 45 4c 45 4d 49 44 20 65 64 67 65 32 2c TT_ELEMID edge2,
22b80 20 52 54 54 5f 45 4c 45 4d 49 44 20 6e 65 77 65 RTT_ELEMID newe
22b90 64 67 65 29 0a 7b 0a 2f 2a 20 64 6f 65 73 20 6e dge).{./* does n
22ba0 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 othing */. if
22bb0 20 28 74 6f 70 6f 20 21 3d 20 4e 55 4c 4c 20 26 (topo != NULL &
22bc0 26 20 65 64 67 65 31 20 3d 3d 20 30 20 26 26 20 & edge1 == 0 &&
22bd0 65 64 67 65 32 20 3d 3d 20 30 20 26 26 20 6e 65 edge2 == 0 && ne
22be0 77 65 64 67 65 20 3d 3d 20 30 29 0a 09 74 6f 70 wedge == 0)..top
22bf0 6f 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 73 69 o = NULL;../* si
22c00 6c 65 6e 63 69 6e 67 20 73 74 75 70 69 64 20 63 lencing stupid c
22c10 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 ompiler warnings
22c20 20 6f 6e 20 75 6e 75 73 65 64 20 61 72 67 73 20 on unused args
22c30 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b */. return 1;
22c40 0a 7d 0a 0a 69 6e 74 0a 63 61 6c 6c 62 61 63 6b .}..int.callback
22c50 5f 74 6f 70 6f 47 65 74 53 52 49 44 20 28 63 6f _topoGetSRID (co
22c60 6e 73 74 20 52 54 54 5f 42 45 5f 54 4f 50 4f 4c nst RTT_BE_TOPOL
22c70 4f 47 59 20 2a 20 72 74 74 5f 74 6f 70 6f 29 0a OGY * rtt_topo).
22c80 7b 0a 2f 2a 20 63 61 6c 6c 62 61 63 6b 20 66 75 {./* callback fu
22c90 6e 63 74 69 6f 6e 3a 20 74 6f 70 6f 47 65 74 53 nction: topoGetS
22ca0 52 49 44 20 2a 2f 0a 20 20 20 20 47 61 69 61 54 RID */. GaiaT
22cb0 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 opologyAccessorP
22cc0 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 tr topo = (GaiaT
22cd0 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 opologyAccessorP
22ce0 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 tr) rtt_topo;.
22cf0 20 20 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f struct gaia_to
22d00 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 pology *accessor
22d10 20 3d 20 28 73 74 72 75 63 74 20 67 61 69 61 5f = (struct gaia_
22d20 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f topology *) topo
22d30 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 73 73 ;. if (access
22d40 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 or == NULL)..ret
22d50 75 72 6e 20 2d 31 3b 0a 0a 20 20 20 20 72 65 74 urn -1;.. ret
22d60 75 72 6e 20 61 63 63 65 73 73 6f 72 2d 3e 73 72 urn accessor->sr
22d70 69 64 3b 0a 7d 0a 0a 64 6f 75 62 6c 65 0a 63 61 id;.}..double.ca
22d80 6c 6c 62 61 63 6b 5f 74 6f 70 6f 47 65 74 50 72 llback_topoGetPr
22d90 65 63 69 73 69 6f 6e 20 28 63 6f 6e 73 74 20 52 ecision (const R
22da0 54 54 5f 42 45 5f 54 4f 50 4f 4c 4f 47 59 20 2a TT_BE_TOPOLOGY *
22db0 20 72 74 74 5f 74 6f 70 6f 29 0a 7b 0a 2f 2a 20 rtt_topo).{./*
22dc0 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f callback functio
22dd0 6e 3a 20 74 6f 70 6f 47 65 74 50 72 65 63 69 73 n: topoGetPrecis
22de0 69 6f 6e 20 2a 2f 0a 20 20 20 20 47 61 69 61 54 ion */. GaiaT
22df0 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 opologyAccessorP
22e00 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 69 61 54 tr topo = (GaiaT
22e10 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 6f 72 50 opologyAccessorP
22e20 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b 0a 20 20 tr) rtt_topo;.
22e30 20 20 73 74 72 75 63 74 20 67 61 69 61 5f 74 6f struct gaia_to
22e40 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 73 6f 72 pology *accessor
22e50 20 3d 20 28 73 74 72 75 63 74 20 67 61 69 61 5f = (struct gaia_
22e60 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 6f 70 6f topology *) topo
22e70 3b 0a 20 20 20 20 69 66 20 28 61 63 63 65 73 73 ;. if (access
22e80 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 or == NULL)..ret
22e90 75 72 6e 20 30 2e 30 3b 0a 0a 20 20 20 20 72 65 urn 0.0;.. re
22ea0 74 75 72 6e 20 61 63 63 65 73 73 6f 72 2d 3e 74 turn accessor->t
22eb0 6f 6c 65 72 61 6e 63 65 3b 0a 7d 0a 0a 69 6e 74 olerance;.}..int
22ec0 0a 63 61 6c 6c 62 61 63 6b 5f 74 6f 70 6f 48 61 .callback_topoHa
22ed0 73 5a 20 28 63 6f 6e 73 74 20 52 54 54 5f 42 45 sZ (const RTT_BE
22ee0 5f 54 4f 50 4f 4c 4f 47 59 20 2a 20 72 74 74 5f _TOPOLOGY * rtt_
22ef0 74 6f 70 6f 29 0a 7b 0a 2f 2a 20 63 61 6c 6c 62 topo).{./* callb
22f00 61 63 6b 20 66 75 6e 63 74 69 6f 6e 3a 20 74 6f ack function: to
22f10 70 6f 48 61 73 5a 20 2a 2f 0a 20 20 20 20 47 61 poHasZ */. Ga
22f20 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 iaTopologyAccess
22f30 6f 72 50 74 72 20 74 6f 70 6f 20 3d 20 28 47 61 orPtr topo = (Ga
22f40 69 61 54 6f 70 6f 6c 6f 67 79 41 63 63 65 73 73 iaTopologyAccess
22f50 6f 72 50 74 72 29 20 72 74 74 5f 74 6f 70 6f 3b orPtr) rtt_topo;
22f60 0a 20 20 20 20 73 74 72 75 63 74 20 67 61 69 61 . struct gaia
22f70 5f 74 6f 70 6f 6c 6f 67 79 20 2a 61 63 63 65 73 _topology *acces
22f80 73 6f 72 20 3d 20 28 73 74 72 75 63 74 20 67 61 sor = (struct ga
22f90 69 61 5f 74 6f 70 6f 6c 6f 67 79 20 2a 29 20 74 ia_topology *) t
22fa0 6f 70 6f 3b 0a 20 20 20 20 69 66 20 28 61 63 63 opo;. if (acc
22fb0 65 73 73 6f 72 20 3d 3d 20 4e 55 4c 4c 29 0a 09 essor == NULL)..
22fc0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 72 return 0;.. r
22fd0 65 74 75 72 6e 20 61 63 63 65 73 73 6f 72 2d 3e eturn accessor->
22fe0 68 61 73 5f 7a 3b 0a 7d 0a 0a 23 65 6e 64 69 66 has_z;.}..#endif
22ff0 20 2f 2a 20 65 6e 64 20 45 4e 41 42 4c 45 5f 52 /* end ENABLE_R
23000 54 54 4f 50 4f 20 63 6f 6e 64 69 74 69 6f 6e 61 TTOPO conditiona
23010 6c 73 20 2a 2f 0a ls */.