Hex Artifact Content
Not logged in

Artifact 071154ce5c1aa112868f9898a4cb43e76c8f0862:


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