SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact afd8e719c44fb86fc63ab97366e026d2e6f92e5e:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 32 30 31 31 20 54 68 65 20 41 6e 64  (C) 2011 The And
0020: 72 6f 69 64 20 4f 70 65 6e 20 53 6f 75 72 63 65  roid Open Source
0030: 20 50 72 6f 6a 65 63 74 0a 20 2a 0a 20 2a 20 4c   Project. *. * L
0040: 69 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68  icensed under th
0050: 65 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65  e Apache License
0060: 2c 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 28 74  , Version 2.0 (t
0070: 68 65 20 22 4c 69 63 65 6e 73 65 22 29 3b 0a 20  he "License");. 
0080: 2a 20 79 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73  * you may not us
0090: 65 20 74 68 69 73 20 66 69 6c 65 20 65 78 63 65  e this file exce
00a0: 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65  pt in compliance
00b0: 20 77 69 74 68 20 74 68 65 20 4c 69 63 65 6e 73   with the Licens
00c0: 65 2e 0a 20 2a 20 59 6f 75 20 6d 61 79 20 6f 62  e.. * You may ob
00d0: 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  tain a copy of t
00e0: 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20 2a  he License at. *
00f0: 0a 20 2a 20 20 20 20 20 20 68 74 74 70 3a 2f 2f  . *      http://
0100: 77 77 77 2e 61 70 61 63 68 65 2e 6f 72 67 2f 6c  www.apache.org/l
0110: 69 63 65 6e 73 65 73 2f 4c 49 43 45 4e 53 45 2d  icenses/LICENSE-
0120: 32 2e 30 0a 20 2a 0a 20 2a 20 55 6e 6c 65 73 73  2.0. *. * Unless
0130: 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70 70   required by app
0140: 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61  licable law or a
0150: 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74  greed to in writ
0160: 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a 20 2a  ing, software. *
0170: 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64   distributed und
0180: 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20 69  er the License i
0190: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 6e  s distributed on
01a0: 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 53 49   an "AS IS" BASI
01b0: 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 57 41  S,. * WITHOUT WA
01c0: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
01d0: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b 49  ITIONS OF ANY KI
01e0: 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 65  ND, either expre
01f0: 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a 20  ss or implied.. 
0200: 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73  * See the Licens
0210: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  e for the specif
0220: 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65  ic language gove
0230: 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e  rning permission
0240: 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 61 74  s and. * limitat
0250: 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 20 4c  ions under the L
0260: 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 2f 2a 0a 2a  icense.. */./*.*
0270: 2a 20 4d 6f 64 69 66 69 65 64 20 74 6f 20 73 75  * Modified to su
0280: 70 70 6f 72 74 20 53 51 4c 69 74 65 20 65 78 74  pport SQLite ext
0290: 65 6e 73 69 6f 6e 73 20 62 79 20 74 68 65 20 53  ensions by the S
02a0: 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
02b0: 3a 20 0a 2a 2a 20 73 71 6c 69 74 65 2d 64 65 76  : .** sqlite-dev
02c0: 40 73 71 6c 69 74 65 2e 6f 72 67 2e 0a 2a 2f 0a  @sqlite.org..*/.
02d0: 0a 23 64 65 66 69 6e 65 20 4c 4f 47 5f 54 41 47  .#define LOG_TAG
02e0: 20 22 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69   "SQLiteConnecti
02f0: 6f 6e 22 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 6a  on"..#include <j
0300: 6e 69 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ni.h>.#include <
0310: 4a 4e 49 48 65 6c 70 2e 68 3e 0a 23 69 6e 63 6c  JNIHelp.h>.#incl
0320: 75 64 65 20 22 41 4c 6f 67 2d 70 72 69 76 2e 68  ude "ALog-priv.h
0330: 22 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  "...#include <sy
0340: 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69 6e 63 6c 75  s/mman.h>.#inclu
0350: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0360: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0370: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
0380: 72 74 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20  rt.h>..#include 
0390: 3c 73 71 6c 69 74 65 33 2e 68 3e 0a 0a 23 69 6e  <sqlite3.h>..#in
03a0: 63 6c 75 64 65 20 22 61 6e 64 72 6f 69 64 5f 64  clude "android_d
03b0: 61 74 61 62 61 73 65 5f 53 51 4c 69 74 65 43 6f  atabase_SQLiteCo
03c0: 6d 6d 6f 6e 2e 68 22 0a 0a 23 69 6e 63 6c 75 64  mmon.h"..#includ
03d0: 65 20 3c 73 74 72 69 6e 67 3e 0a 0a 2f 2f 20 53  e <string>..// S
03e0: 65 74 20 74 6f 20 31 20 74 6f 20 75 73 65 20 55  et to 1 to use U
03f0: 54 46 31 36 20 73 74 6f 72 61 67 65 20 66 6f 72  TF16 storage for
0400: 20 6c 6f 63 61 6c 69 7a 65 64 20 69 6e 64 65 78   localized index
0410: 65 73 2e 0a 23 64 65 66 69 6e 65 20 55 54 46 31  es..#define UTF1
0420: 36 5f 53 54 4f 52 41 47 45 20 30 0a 0a 6e 61 6d  6_STORAGE 0..nam
0430: 65 73 70 61 63 65 20 61 6e 64 72 6f 69 64 20 7b  espace android {
0440: 0a 0a 2f 2a 20 42 75 73 79 20 74 69 6d 65 6f 75  ../* Busy timeou
0450: 74 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  t in millisecond
0460: 73 2e 0a 20 2a 20 49 66 20 61 6e 6f 74 68 65 72  s.. * If another
0470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 70 6f 73   connection (pos
0480: 73 69 62 6c 79 20 69 6e 20 61 6e 6f 74 68 65 72  sibly in another
0490: 20 70 72 6f 63 65 73 73 29 20 68 61 73 20 74 68   process) has th
04a0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 65  e database locke
04b0: 64 20 66 6f 72 0a 20 2a 20 6c 6f 6e 67 65 72 20  d for. * longer 
04c0: 74 68 61 6e 20 74 68 69 73 20 61 6d 6f 75 6e 74  than this amount
04d0: 20 6f 66 20 74 69 6d 65 20 74 68 65 6e 20 53 51   of time then SQ
04e0: 4c 69 74 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  Lite will genera
04f0: 74 65 20 61 20 53 51 4c 49 54 45 5f 42 55 53 59  te a SQLITE_BUSY
0500: 20 65 72 72 6f 72 2e 0a 20 2a 20 54 68 65 20 53   error.. * The S
0510: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
0520: 20 69 73 20 74 68 65 6e 20 72 61 69 73 65 64 20   is then raised 
0530: 61 73 20 61 20 53 51 4c 69 74 65 44 61 74 61 62  as a SQLiteDatab
0540: 61 73 65 4c 6f 63 6b 65 64 45 78 63 65 70 74 69  aseLockedExcepti
0550: 6f 6e 2e 0a 20 2a 0a 20 2a 20 49 6e 20 6f 72 64  on.. *. * In ord
0560: 69 6e 61 72 79 20 75 73 61 67 65 2c 20 62 75 73  inary usage, bus
0570: 79 20 74 69 6d 65 6f 75 74 73 20 61 72 65 20 71  y timeouts are q
0580: 75 69 74 65 20 72 61 72 65 2e 20 20 4d 6f 73 74  uite rare.  Most
0590: 20 64 61 74 61 62 61 73 65 73 20 6f 6e 6c 79 20   databases only 
05a0: 65 76 65 72 0a 20 2a 20 68 61 76 65 20 61 20 73  ever. * have a s
05b0: 69 6e 67 6c 65 20 6f 70 65 6e 20 63 6f 6e 6e 65  ingle open conne
05c0: 63 74 69 6f 6e 20 61 74 20 61 20 74 69 6d 65 20  ction at a time 
05d0: 75 6e 6c 65 73 73 20 74 68 65 79 20 61 72 65 20  unless they are 
05e0: 75 73 69 6e 67 20 57 41 4c 2e 20 20 57 68 65 6e  using WAL.  When
05f0: 20 75 73 69 6e 67 0a 20 2a 20 57 41 4c 2c 20 61   using. * WAL, a
0600: 20 74 69 6d 65 6f 75 74 20 63 6f 75 6c 64 20 6f   timeout could o
0610: 63 63 75 72 20 69 66 20 6f 6e 65 20 63 6f 6e 6e  ccur if one conn
0620: 65 63 74 69 6f 6e 20 69 73 20 62 75 73 79 20 70  ection is busy p
0630: 65 72 66 6f 72 6d 69 6e 67 20 61 6e 20 61 75 74  erforming an aut
0640: 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 0a 20 2a 20  o-checkpoint. * 
0650: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65 20  operation.  The 
0660: 62 75 73 79 20 74 69 6d 65 6f 75 74 20 6e 65 65  busy timeout nee
0670: 64 73 20 74 6f 20 62 65 20 6c 6f 6e 67 20 65 6e  ds to be long en
0680: 6f 75 67 68 20 74 6f 20 74 6f 6c 65 72 61 74 65  ough to tolerate
0690: 20 73 6c 6f 77 20 49 2f 4f 20 77 72 69 74 65 0a   slow I/O write.
06a0: 20 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 75   * operations bu
06b0: 74 20 6e 6f 74 20 73 6f 20 6c 6f 6e 67 20 61 73  t not so long as
06c0: 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 61 70   to cause the ap
06d0: 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 68 61 6e  plication to han
06e0: 67 20 69 6e 64 65 66 69 6e 69 74 65 6c 79 20 69  g indefinitely i
06f0: 66 0a 20 2a 20 74 68 65 72 65 20 69 73 20 61 20  f. * there is a 
0700: 70 72 6f 62 6c 65 6d 20 61 63 71 75 69 72 69 6e  problem acquirin
0710: 67 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  g a database loc
0720: 6b 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  k.. */.static co
0730: 6e 73 74 20 69 6e 74 20 42 55 53 59 5f 54 49 4d  nst int BUSY_TIM
0740: 45 4f 55 54 5f 4d 53 20 3d 20 32 35 30 30 3b 0a  EOUT_MS = 2500;.
0750: 0a 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  ./* The original
0760: 20 63 6f 64 65 20 75 73 65 73 20 41 6e 64 72 6f   code uses Andro
0770: 69 64 52 75 6e 74 69 6d 65 3a 3a 67 65 74 4a 4e  idRuntime::getJN
0780: 49 45 6e 76 28 29 20 74 6f 20 6f 62 74 61 69 6e  IEnv() to obtain
0790: 20 61 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74   a .** pointer t
07a0: 6f 20 74 68 65 20 56 4d 2e 20 54 68 69 73 20 69  o the VM. This i
07b0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
07c0: 69 6e 20 74 68 65 20 4e 44 4b 2c 20 73 6f 20 69  in the NDK, so i
07d0: 6e 73 74 65 61 64 0a 2a 2a 20 74 68 65 20 66 6f  nstead.** the fo
07e0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
07f0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 61  ariable is set a
0800: 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 6d  s part of this m
0810: 6f 64 75 6c 65 27 73 0a 2a 2a 20 4a 4e 49 5f 4f  odule's.** JNI_O
0820: 6e 4c 6f 61 64 20 6d 65 74 68 6f 64 2e 20 20 2a  nLoad method.  *
0830: 2f 0a 73 74 61 74 69 63 20 4a 61 76 61 56 4d 20  /.static JavaVM 
0840: 2a 67 70 4a 61 76 61 56 4d 20 3d 20 30 3b 0a 0a  *gpJavaVM = 0;..
0850: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
0860: 20 20 20 20 6a 66 69 65 6c 64 49 44 20 6e 61 6d      jfieldID nam
0870: 65 3b 0a 20 20 20 20 6a 66 69 65 6c 64 49 44 20  e;.    jfieldID 
0880: 6e 75 6d 41 72 67 73 3b 0a 20 20 20 20 6a 6d 65  numArgs;.    jme
0890: 74 68 6f 64 49 44 20 64 69 73 70 61 74 63 68 43  thodID dispatchC
08a0: 61 6c 6c 62 61 63 6b 3b 0a 7d 20 67 53 51 4c 69  allback;.} gSQLi
08b0: 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e  teCustomFunction
08c0: 43 6c 61 73 73 49 6e 66 6f 3b 0a 0a 73 74 61 74  ClassInfo;..stat
08d0: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
08e0: 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 3b 0a 7d 20  jclass clazz;.} 
08f0: 67 53 74 72 69 6e 67 43 6c 61 73 73 49 6e 66 6f  gStringClassInfo
0900: 3b 0a 0a 73 74 72 75 63 74 20 53 51 4c 69 74 65  ;..struct SQLite
0910: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 0a 20 20 20  Connection {.   
0920: 20 2f 2f 20 4f 70 65 6e 20 66 6c 61 67 73 2e 0a   // Open flags..
0930: 20 20 20 20 2f 2f 20 4d 75 73 74 20 62 65 20 6b      // Must be k
0940: 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
0950: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 64   the constants d
0960: 65 66 69 6e 65 64 20 69 6e 20 53 51 4c 69 74 65  efined in SQLite
0970: 44 61 74 61 62 61 73 65 2e 6a 61 76 61 2e 0a 20  Database.java.. 
0980: 20 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 20 20     enum {.      
0990: 20 20 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45    OPEN_READWRITE
09a0: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 30 30            = 0x00
09b0: 30 30 30 30 30 30 2c 0a 20 20 20 20 20 20 20 20  000000,.        
09c0: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 20  OPEN_READONLY   
09d0: 20 20 20 20 20 20 20 20 3d 20 30 78 30 30 30 30          = 0x0000
09e0: 30 30 30 31 2c 0a 20 20 20 20 20 20 20 20 4f 50  0001,.        OP
09f0: 45 4e 5f 52 45 41 44 5f 4d 41 53 4b 20 20 20 20  EN_READ_MASK    
0a00: 20 20 20 20 20 20 3d 20 30 78 30 30 30 30 30 30        = 0x000000
0a10: 30 31 2c 0a 20 20 20 20 20 20 20 20 4e 4f 5f 4c  01,.        NO_L
0a20: 4f 43 41 4c 49 5a 45 44 5f 43 4f 4c 4c 41 54 4f  OCALIZED_COLLATO
0a30: 52 53 20 20 3d 20 30 78 30 30 30 30 30 30 31 30  RS  = 0x00000010
0a40: 2c 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ,.        CREATE
0a50: 5f 49 46 5f 4e 45 43 45 53 53 41 52 59 20 20 20  _IF_NECESSARY   
0a60: 20 20 3d 20 30 78 31 30 30 30 30 30 30 30 2c 0a    = 0x10000000,.
0a70: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 73 71 6c 69      };..    sqli
0a80: 74 65 33 2a 20 63 6f 6e 73 74 20 64 62 3b 0a 20  te3* const db;. 
0a90: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70 65     const int ope
0aa0: 6e 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 64 3a  nFlags;.    std:
0ab0: 3a 73 74 72 69 6e 67 20 70 61 74 68 3b 0a 20 20  :string path;.  
0ac0: 20 20 73 74 64 3a 3a 73 74 72 69 6e 67 20 6c 61    std::string la
0ad0: 62 65 6c 3b 0a 0a 20 20 20 20 76 6f 6c 61 74 69  bel;..    volati
0ae0: 6c 65 20 62 6f 6f 6c 20 63 61 6e 63 65 6c 65 64  le bool canceled
0af0: 3b 0a 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e  ;..    SQLiteCon
0b00: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 2a  nection(sqlite3*
0b10: 20 64 62 2c 20 69 6e 74 20 6f 70 65 6e 46 6c 61   db, int openFla
0b20: 67 73 2c 20 63 6f 6e 73 74 20 73 74 64 3a 3a 73  gs, const std::s
0b30: 74 72 69 6e 67 26 20 70 61 74 68 2c 20 63 6f 6e  tring& path, con
0b40: 73 74 20 73 74 64 3a 3a 73 74 72 69 6e 67 26 20  st std::string& 
0b50: 6c 61 62 65 6c 29 20 3a 0a 20 20 20 20 20 20 20  label) :.       
0b60: 20 64 62 28 64 62 29 2c 20 6f 70 65 6e 46 6c 61   db(db), openFla
0b70: 67 73 28 6f 70 65 6e 46 6c 61 67 73 29 2c 20 70  gs(openFlags), p
0b80: 61 74 68 28 70 61 74 68 29 2c 20 6c 61 62 65 6c  ath(path), label
0b90: 28 6c 61 62 65 6c 29 2c 20 63 61 6e 63 65 6c 65  (label), cancele
0ba0: 64 28 66 61 6c 73 65 29 20 7b 20 7d 0a 7d 3b 0a  d(false) { }.};.
0bb0: 0a 2f 2f 20 43 61 6c 6c 65 64 20 65 61 63 68 20  .// Called each 
0bc0: 74 69 6d 65 20 61 20 73 74 61 74 65 6d 65 6e 74  time a statement
0bd0: 20 62 65 67 69 6e 73 20 65 78 65 63 75 74 69 6f   begins executio
0be0: 6e 2c 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20  n, when tracing 
0bf0: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 73 74 61 74  is enabled..stat
0c00: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 54 72  ic void sqliteTr
0c10: 61 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  aceCallback(void
0c20: 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68   *data, const ch
0c30: 61 72 20 2a 73 71 6c 29 20 7b 0a 20 20 20 20 53  ar *sql) {.    S
0c40: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
0c50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 73 74   connection = st
0c60: 61 74 69 63 5f 63 61 73 74 3c 53 51 4c 69 74 65  atic_cast<SQLite
0c70: 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 64 61 74  Connection*>(dat
0c80: 61 29 3b 0a 20 20 20 20 41 4c 4f 47 28 4c 4f 47  a);.    ALOG(LOG
0c90: 5f 56 45 52 42 4f 53 45 2c 20 53 51 4c 49 54 45  _VERBOSE, SQLITE
0ca0: 5f 54 52 41 43 45 5f 54 41 47 2c 20 22 25 73 3a  _TRACE_TAG, "%s:
0cb0: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
0cc0: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
0cd0: 6f 6e 2d 3e 6c 61 62 65 6c 2e 63 5f 73 74 72 28  on->label.c_str(
0ce0: 29 2c 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2f 20 43  ), sql);.}..// C
0cf0: 61 6c 6c 65 64 20 65 61 63 68 20 74 69 6d 65 20  alled each time 
0d00: 61 20 73 74 61 74 65 6d 65 6e 74 20 66 69 6e 69  a statement fini
0d10: 73 68 65 73 20 65 78 65 63 75 74 69 6f 6e 2c 20  shes execution, 
0d20: 77 68 65 6e 20 70 72 6f 66 69 6c 69 6e 67 20 69  when profiling i
0d30: 73 20 65 6e 61 62 6c 65 64 2e 0a 73 74 61 74 69  s enabled..stati
0d40: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 50 72 6f  c void sqlitePro
0d50: 66 69 6c 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69  fileCallback(voi
0d60: 64 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63  d *data, const c
0d70: 68 61 72 20 2a 73 71 6c 2c 20 73 71 6c 69 74 65  har *sql, sqlite
0d80: 33 5f 75 69 6e 74 36 34 20 74 6d 29 20 7b 0a 20  3_uint64 tm) {. 
0d90: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
0da0: 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ion* connection 
0db0: 3d 20 73 74 61 74 69 63 5f 63 61 73 74 3c 53 51  = static_cast<SQ
0dc0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e  LiteConnection*>
0dd0: 28 64 61 74 61 29 3b 0a 20 20 20 20 41 4c 4f 47  (data);.    ALOG
0de0: 28 4c 4f 47 5f 56 45 52 42 4f 53 45 2c 20 53 51  (LOG_VERBOSE, SQ
0df0: 4c 49 54 45 5f 50 52 4f 46 49 4c 45 5f 54 41 47  LITE_PROFILE_TAG
0e00: 2c 20 22 25 73 3a 20 5c 22 25 73 5c 22 20 74 6f  , "%s: \"%s\" to
0e10: 6f 6b 20 25 30 2e 33 66 20 6d 73 5c 6e 22 2c 0a  ok %0.3f ms\n",.
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e              conn
0e30: 65 63 74 69 6f 6e 2d 3e 6c 61 62 65 6c 2e 63 5f  ection->label.c_
0e40: 73 74 72 28 29 2c 20 73 71 6c 2c 20 74 6d 20 2a  str(), sql, tm *
0e50: 20 30 2e 30 30 30 30 30 31 66 29 3b 0a 7d 0a 0a   0.000001f);.}..
0e60: 2f 2f 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  // Called after 
0e70: 65 61 63 68 20 53 51 4c 69 74 65 20 56 4d 20 69  each SQLite VM i
0e80: 6e 73 74 72 75 63 74 69 6f 6e 20 77 68 65 6e 20  nstruction when 
0e90: 63 61 6e 63 65 6c 61 74 69 6f 6e 20 69 73 20 65  cancelation is e
0ea0: 6e 61 62 6c 65 64 2e 0a 73 74 61 74 69 63 20 69  nabled..static i
0eb0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 67 72 65 73  nt sqliteProgres
0ec0: 73 48 61 6e 64 6c 65 72 43 61 6c 6c 62 61 63 6b  sHandlerCallback
0ed0: 28 76 6f 69 64 2a 20 64 61 74 61 29 20 7b 0a 20  (void* data) {. 
0ee0: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
0ef0: 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ion* connection 
0f00: 3d 20 73 74 61 74 69 63 5f 63 61 73 74 3c 53 51  = static_cast<SQ
0f10: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e  LiteConnection*>
0f20: 28 64 61 74 61 29 3b 0a 20 20 20 20 72 65 74 75  (data);.    retu
0f30: 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 63  rn connection->c
0f40: 61 6e 63 65 6c 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  anceled;.}../*.*
0f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
0f60: 69 73 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  is a collation s
0f70: 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b  equence callback
0f80: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
0f90: 68 65 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a 20 42  he built-in.** B
0fa0: 49 4e 41 52 59 20 73 65 71 75 65 6e 63 65 2e 20  INARY sequence. 
0fb0: 0a 2a 2a 0a 2a 2a 20 53 74 6f 63 6b 20 41 6e 64  .**.** Stock And
0fc0: 72 6f 69 64 20 75 73 65 73 20 61 20 6d 6f 64 69  roid uses a modi
0fd0: 66 69 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  fied version of 
0fe0: 73 71 6c 69 74 65 33 2e 63 20 74 68 61 74 20 63  sqlite3.c that c
0ff0: 61 6c 6c 73 20 6f 75 74 20 74 6f 20 61 20 6d 6f  alls out to a mo
1000: 64 75 6c 65 0a 2a 2a 20 6e 61 6d 65 64 20 22 73  dule.** named "s
1010: 71 6c 69 74 65 33 5f 61 6e 64 72 6f 69 64 22 20  qlite3_android" 
1020: 74 6f 20 61 64 64 20 65 78 74 72 61 20 62 75 69  to add extra bui
1030: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6f 6e 73  lt-in collations
1040: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 73 20 74   and functions t
1050: 6f 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61 73  o.** all databas
1060: 65 20 68 61 6e 64 6c 65 73 2e 20 53 70 65 63 69  e handles. Speci
1070: 66 69 63 61 6c 6c 79 2c 20 63 6f 6c 6c 61 74 69  fically, collati
1080: 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 4c 4f 43  on sequence "LOC
1090: 41 4c 49 5a 45 44 22 2e 20 46 6f 72 20 6e 6f 77  ALIZED". For now
10a0: 2c 0a 2a 2a 20 74 68 69 73 20 6d 6f 64 75 6c 65  ,.** this module
10b0: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
10c0: 65 20 73 71 6c 69 74 65 33 5f 61 6e 64 72 6f 69  e sqlite3_androi
10d0: 64 20 28 73 69 6e 63 65 20 69 74 20 69 73 20 64  d (since it is d
10e0: 69 66 66 69 63 75 6c 74 20 74 6f 20 62 75 69 6c  ifficult to buil
10f0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 4e 44  d.** with the ND
1100: 4b 20 6f 6e 6c 79 29 2e 20 49 6e 73 74 65 61 64  K only). Instead
1110: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1120: 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 73  is registered as
1130: 20 22 4c 4f 43 41 4c 49 5a 45 44 22 20 66 6f 72   "LOCALIZED" for
1140: 20 61 6c 6c 0a 2a 2a 20 6e 65 77 20 64 61 74 61   all.** new data
1150: 62 61 73 65 20 68 61 6e 64 6c 65 73 2e 20 0a 2a  base handles. .*
1160: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1170: 6c 5f 6c 6f 63 61 6c 69 7a 65 64 28 0a 20 20 76  l_localized(.  v
1180: 6f 69 64 20 2a 6e 6f 74 5f 75 73 65 64 2c 0a 20  oid *not_used,. 
1190: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
11a0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
11b0: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
11c0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
11d0: 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
11e0: 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20  n = nKey1<nKey2 
11f0: 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b  ? nKey1 : nKey2;
1200: 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
1210: 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
1220: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
1230: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
1240: 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
1250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
1260: 69 63 20 6a 6c 6f 6e 67 20 6e 61 74 69 76 65 4f  ic jlong nativeO
1270: 70 65 6e 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  pen(JNIEnv* env,
1280: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a   jclass clazz, j
1290: 73 74 72 69 6e 67 20 70 61 74 68 53 74 72 2c 20  string pathStr, 
12a0: 6a 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a  jint openFlags,.
12b0: 20 20 20 20 20 20 20 20 6a 73 74 72 69 6e 67 20          jstring 
12c0: 6c 61 62 65 6c 53 74 72 2c 20 6a 62 6f 6f 6c 65  labelStr, jboole
12d0: 61 6e 20 65 6e 61 62 6c 65 54 72 61 63 65 2c 20  an enableTrace, 
12e0: 6a 62 6f 6f 6c 65 61 6e 20 65 6e 61 62 6c 65 50  jboolean enableP
12f0: 72 6f 66 69 6c 65 29 20 7b 0a 20 20 20 20 69 6e  rofile) {.    in
1300: 74 20 73 71 6c 69 74 65 46 6c 61 67 73 3b 0a 20  t sqliteFlags;. 
1310: 20 20 20 69 66 20 28 6f 70 65 6e 46 6c 61 67 73     if (openFlags
1320: 20 26 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74   & SQLiteConnect
1330: 69 6f 6e 3a 3a 43 52 45 41 54 45 5f 49 46 5f 4e  ion::CREATE_IF_N
1340: 45 43 45 53 53 41 52 59 29 20 7b 0a 20 20 20 20  ECESSARY) {.    
1350: 20 20 20 20 73 71 6c 69 74 65 46 6c 61 67 73 20      sqliteFlags 
1360: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1370: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1380: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
1390: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 65    } else if (ope
13a0: 6e 46 6c 61 67 73 20 26 20 53 51 4c 69 74 65 43  nFlags & SQLiteC
13b0: 6f 6e 6e 65 63 74 69 6f 6e 3a 3a 4f 50 45 4e 5f  onnection::OPEN_
13c0: 52 45 41 44 4f 4e 4c 59 29 20 7b 0a 20 20 20 20  READONLY) {.    
13d0: 20 20 20 20 73 71 6c 69 74 65 46 6c 61 67 73 20      sqliteFlags 
13e0: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
13f0: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 20 65 6c  ADONLY;.    } el
1400: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  se {.        sql
1410: 69 74 65 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  iteFlags = SQLIT
1420: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1430: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e  ;.    }..    con
1440: 73 74 20 63 68 61 72 2a 20 70 61 74 68 43 68 61  st char* pathCha
1450: 72 73 20 3d 20 65 6e 76 2d 3e 47 65 74 53 74 72  rs = env->GetStr
1460: 69 6e 67 55 54 46 43 68 61 72 73 28 70 61 74 68  ingUTFChars(path
1470: 53 74 72 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  Str, NULL);.    
1480: 73 74 64 3a 3a 73 74 72 69 6e 67 20 70 61 74 68  std::string path
1490: 28 70 61 74 68 43 68 61 72 73 29 3b 0a 20 20 20  (pathChars);.   
14a0: 20 65 6e 76 2d 3e 52 65 6c 65 61 73 65 53 74 72   env->ReleaseStr
14b0: 69 6e 67 55 54 46 43 68 61 72 73 28 70 61 74 68  ingUTFChars(path
14c0: 53 74 72 2c 20 70 61 74 68 43 68 61 72 73 29 3b  Str, pathChars);
14d0: 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ..    const char
14e0: 2a 20 6c 61 62 65 6c 43 68 61 72 73 20 3d 20 65  * labelChars = e
14f0: 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67 55 54 46  nv->GetStringUTF
1500: 43 68 61 72 73 28 6c 61 62 65 6c 53 74 72 2c 20  Chars(labelStr, 
1510: 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 74 64 3a 3a  NULL);.    std::
1520: 73 74 72 69 6e 67 20 6c 61 62 65 6c 28 6c 61 62  string label(lab
1530: 65 6c 43 68 61 72 73 29 3b 0a 20 20 20 20 65 6e  elChars);.    en
1540: 76 2d 3e 52 65 6c 65 61 73 65 53 74 72 69 6e 67  v->ReleaseString
1550: 55 54 46 43 68 61 72 73 28 6c 61 62 65 6c 53 74  UTFChars(labelSt
1560: 72 2c 20 6c 61 62 65 6c 43 68 61 72 73 29 3b 0a  r, labelChars);.
1570: 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64 62  .    sqlite3* db
1580: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20  ;.    int err = 
1590: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
15a0: 70 61 74 68 2e 63 5f 73 74 72 28 29 2c 20 26 64  path.c_str(), &d
15b0: 62 2c 20 73 71 6c 69 74 65 46 6c 61 67 73 2c 20  b, sqliteFlags, 
15c0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 65  NULL);.    if (e
15d0: 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29  rr != SQLITE_OK)
15e0: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77   {.        throw
15f0: 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74 69  _sqlite3_excepti
1600: 6f 6e 5f 65 72 72 63 6f 64 65 28 65 6e 76 2c 20  on_errcode(env, 
1610: 65 72 72 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  err, "Could not 
1620: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 22 29 3b  open database");
1630: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1640: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  0;.    }.    err
1650: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1660: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
1670: 22 6c 6f 63 61 6c 69 7a 65 64 22 2c 20 53 51 4c  "localized", SQL
1680: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 63 6f 6c  ITE_UTF8, 0, col
1690: 6c 5f 6c 6f 63 61 6c 69 7a 65 64 29 3b 0a 20 20  l_localized);.  
16a0: 20 20 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c    if (err != SQL
16b0: 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20  ITE_OK) {.      
16c0: 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f    throw_sqlite3_
16d0: 65 78 63 65 70 74 69 6f 6e 5f 65 72 72 63 6f 64  exception_errcod
16e0: 65 28 65 6e 76 2c 20 65 72 72 2c 20 22 43 6f 75  e(env, err, "Cou
16f0: 6c 64 20 6e 6f 74 20 72 65 67 69 73 74 65 72 20  ld not register 
1700: 63 6f 6c 6c 61 74 69 6f 6e 22 29 3b 0a 20 20 20  collation");.   
1710: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
1720: 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  se(db);.        
1730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1740: 0a 20 20 20 20 2f 2f 20 43 68 65 63 6b 20 74 68  .    // Check th
1750: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1760: 69 73 20 72 65 61 6c 6c 79 20 72 65 61 64 2f 77  is really read/w
1770: 72 69 74 65 20 77 68 65 6e 20 74 68 61 74 20 69  rite when that i
1780: 73 20 77 68 61 74 20 77 65 20 61 73 6b 65 64 20  s what we asked 
1790: 66 6f 72 2e 0a 20 20 20 20 69 66 20 28 28 73 71  for..    if ((sq
17a0: 6c 69 74 65 46 6c 61 67 73 20 26 20 53 51 4c 49  liteFlags & SQLI
17b0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
17c0: 45 29 20 26 26 20 73 71 6c 69 74 65 33 5f 64 62  E) && sqlite3_db
17d0: 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 4e 55  _readonly(db, NU
17e0: 4c 4c 29 29 20 7b 0a 20 20 20 20 20 20 20 20 74  LL)) {.        t
17f0: 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78 63  hrow_sqlite3_exc
1800: 65 70 74 69 6f 6e 28 65 6e 76 2c 20 64 62 2c 20  eption(env, db, 
1810: 22 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20  "Could not open 
1820: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1830: 72 65 61 64 2f 77 72 69 74 65 20 6d 6f 64 65 2e  read/write mode.
1840: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
1850: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
1860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 53  .    }..    // S
1880: 65 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 62  et the default b
1890: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 6f 20 72  usy handler to r
18a0: 65 74 72 79 20 61 75 74 6f 6d 61 74 69 63 61 6c  etry automatical
18b0: 6c 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ly before return
18c0: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  ing SQLITE_BUSY.
18d0: 0a 20 20 20 20 65 72 72 20 3d 20 73 71 6c 69 74  .    err = sqlit
18e0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
18f0: 64 62 2c 20 42 55 53 59 5f 54 49 4d 45 4f 55 54  db, BUSY_TIMEOUT
1900: 5f 4d 53 29 3b 0a 20 20 20 20 69 66 20 28 65 72  _MS);.    if (er
1910: 72 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20  r != SQLITE_OK) 
1920: 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f  {.        throw_
1930: 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f  sqlite3_exceptio
1940: 6e 28 65 6e 76 2c 20 64 62 2c 20 22 43 6f 75 6c  n(env, db, "Coul
1950: 64 20 6e 6f 74 20 73 65 74 20 62 75 73 79 20 74  d not set busy t
1960: 69 6d 65 6f 75 74 22 29 3b 0a 20 20 20 20 20 20  imeout");.      
1970: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1980: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  db);.        ret
1990: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
19a0: 20 20 2f 2f 20 43 72 65 61 74 65 20 77 72 61 70    // Create wrap
19b0: 70 65 72 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  per object..    
19c0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
19d0: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 6e  * connection = n
19e0: 65 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  ew SQLiteConnect
19f0: 69 6f 6e 28 64 62 2c 20 6f 70 65 6e 46 6c 61 67  ion(db, openFlag
1a00: 73 2c 20 70 61 74 68 2c 20 6c 61 62 65 6c 29 3b  s, path, label);
1a10: 0a 0a 20 20 20 20 2f 2f 20 45 6e 61 62 6c 65 20  ..    // Enable 
1a20: 74 72 61 63 69 6e 67 20 61 6e 64 20 70 72 6f 66  tracing and prof
1a30: 69 6c 69 6e 67 20 69 66 20 72 65 71 75 65 73 74  iling if request
1a40: 65 64 2e 0a 20 20 20 20 69 66 20 28 65 6e 61 62  ed..    if (enab
1a50: 6c 65 54 72 61 63 65 29 20 7b 0a 20 20 20 20 20  leTrace) {.     
1a60: 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
1a70: 28 64 62 2c 20 26 73 71 6c 69 74 65 54 72 61 63  (db, &sqliteTrac
1a80: 65 43 61 6c 6c 62 61 63 6b 2c 20 63 6f 6e 6e 65  eCallback, conne
1a90: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  ction);.    }.  
1aa0: 20 20 69 66 20 28 65 6e 61 62 6c 65 50 72 6f 66    if (enableProf
1ab0: 69 6c 65 29 20 7b 0a 20 20 20 20 20 20 20 20 73  ile) {.        s
1ac0: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 64  qlite3_profile(d
1ad0: 62 2c 20 26 73 71 6c 69 74 65 50 72 6f 66 69 6c  b, &sqliteProfil
1ae0: 65 43 61 6c 6c 62 61 63 6b 2c 20 63 6f 6e 6e 65  eCallback, conne
1af0: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  ction);.    }.. 
1b00: 20 20 20 41 4c 4f 47 56 28 22 4f 70 65 6e 65 64     ALOGV("Opened
1b10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 25 70 20 77   connection %p w
1b20: 69 74 68 20 6c 61 62 65 6c 20 27 25 73 27 22 2c  ith label '%s'",
1b30: 20 64 62 2c 20 6c 61 62 65 6c 2e 63 5f 73 74 72   db, label.c_str
1b40: 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
1b50: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
1b60: 3c 6a 6c 6f 6e 67 3e 28 63 6f 6e 6e 65 63 74 69  <jlong>(connecti
1b70: 6f 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  on);.}..static v
1b80: 6f 69 64 20 6e 61 74 69 76 65 43 6c 6f 73 65 28  oid nativeClose(
1b90: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c  JNIEnv* env, jcl
1ba0: 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67  ass clazz, jlong
1bb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 20   connectionPtr) 
1bc0: 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e  {.    SQLiteConn
1bd0: 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69  ection* connecti
1be0: 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74  on = reinterpret
1bf0: 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e  _cast<SQLiteConn
1c00: 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74  ection*>(connect
1c10: 69 6f 6e 50 74 72 29 3b 0a 0a 20 20 20 20 69 66  ionPtr);..    if
1c20: 20 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a   (connection) {.
1c30: 20 20 20 20 20 20 20 20 41 4c 4f 47 56 28 22 43          ALOGV("C
1c40: 6c 6f 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  losing connectio
1c50: 6e 20 25 70 22 2c 20 63 6f 6e 6e 65 63 74 69 6f  n %p", connectio
1c60: 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  n->db);.        
1c70: 69 6e 74 20 65 72 72 20 3d 20 73 71 6c 69 74 65  int err = sqlite
1c80: 33 5f 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69  3_close(connecti
1c90: 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  on->db);.       
1ca0: 20 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c 49   if (err != SQLI
1cb0: 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20  TE_OK) {.       
1cc0: 20 20 20 20 20 2f 2f 20 54 68 69 73 20 63 61 6e       // This can
1cd0: 20 68 61 70 70 65 6e 20 69 66 20 73 75 62 2d 6f   happen if sub-o
1ce0: 62 6a 65 63 74 73 20 61 72 65 6e 27 74 20 63 6c  bjects aren't cl
1cf0: 6f 73 65 64 20 66 69 72 73 74 2e 20 20 4d 61 6b  osed first.  Mak
1d00: 65 20 73 75 72 65 20 74 68 65 20 63 61 6c 6c 65  e sure the calle
1d10: 72 20 6b 6e 6f 77 73 2e 0a 20 20 20 20 20 20 20  r knows..       
1d20: 20 20 20 20 20 41 4c 4f 47 45 28 22 73 71 6c 69       ALOGE("sqli
1d30: 74 65 33 5f 63 6c 6f 73 65 28 25 70 29 20 66 61  te3_close(%p) fa
1d40: 69 6c 65 64 3a 20 25 64 22 2c 20 63 6f 6e 6e 65  iled: %d", conne
1d50: 63 74 69 6f 6e 2d 3e 64 62 2c 20 65 72 72 29 3b  ction->db, err);
1d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
1d70: 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70  ow_sqlite3_excep
1d80: 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65 63  tion(env, connec
1d90: 74 69 6f 6e 2d 3e 64 62 2c 20 22 43 6f 75 6e 74  tion->db, "Count
1da0: 20 6e 6f 74 20 63 6c 6f 73 65 20 64 62 2e 22 29   not close db.")
1db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1dc0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
1dd0: 0a 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20  .        delete 
1de0: 63 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 20 20 20 20  connection;.    
1df0: 7d 0a 7d 0a 0a 2f 2f 20 43 61 6c 6c 65 64 20 65  }.}..// Called e
1e00: 61 63 68 20 74 69 6d 65 20 61 20 63 75 73 74 6f  ach time a custo
1e10: 6d 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 76  m function is ev
1e20: 61 6c 75 61 74 65 64 2e 0a 73 74 61 74 69 63 20  aluated..static 
1e30: 76 6f 69 64 20 73 71 6c 69 74 65 43 75 73 74 6f  void sqliteCusto
1e40: 6d 46 75 6e 63 74 69 6f 6e 43 61 6c 6c 62 61 63  mFunctionCallbac
1e50: 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  k(sqlite3_contex
1e60: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20  t *context,.    
1e70: 20 20 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71      int argc, sq
1e80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
1e90: 67 76 29 20 7b 0a 0a 20 20 20 20 4a 4e 49 45 6e  gv) {..    JNIEn
1ea0: 76 2a 20 65 6e 76 20 3d 20 30 3b 0a 20 20 20 20  v* env = 0;.    
1eb0: 67 70 4a 61 76 61 56 4d 2d 3e 47 65 74 45 6e 76  gpJavaVM->GetEnv
1ec0: 28 28 76 6f 69 64 2a 2a 29 26 65 6e 76 2c 20 4a  ((void**)&env, J
1ed0: 4e 49 5f 56 45 52 53 49 4f 4e 5f 31 5f 34 29 3b  NI_VERSION_1_4);
1ee0: 0a 0a 20 20 20 20 2f 2f 20 47 65 74 20 74 68 65  ..    // Get the
1ef0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
1f00: 6f 6e 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2f  on object..    /
1f10: 2f 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6c  / Create a new l
1f20: 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
1f30: 6f 20 69 74 20 69 6e 20 63 61 73 65 20 74 68 65  o it in case the
1f40: 20 63 61 6c 6c 62 61 63 6b 20 74 72 69 65 73 20   callback tries 
1f50: 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  to do something.
1f60: 20 20 20 20 2f 2f 20 64 75 6d 62 20 6c 69 6b 65      // dumb like
1f70: 20 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20   unregister the 
1f80: 66 75 6e 63 74 69 6f 6e 20 28 74 68 65 72 65 62  function (thereb
1f90: 79 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65  y destroying the
1fa0: 20 67 6c 6f 62 61 6c 20 72 65 66 29 20 77 68 69   global ref) whi
1fb0: 6c 65 20 69 74 20 69 73 20 72 75 6e 6e 69 6e 67  le it is running
1fc0: 2e 0a 20 20 20 20 6a 6f 62 6a 65 63 74 20 66 75  ..    jobject fu
1fd0: 6e 63 74 69 6f 6e 4f 62 6a 47 6c 6f 62 61 6c 20  nctionObjGlobal 
1fe0: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
1ff0: 73 74 3c 6a 6f 62 6a 65 63 74 3e 28 73 71 6c 69  st<jobject>(sqli
2000: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
2010: 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 6a 6f 62  ntext));.    job
2020: 6a 65 63 74 20 66 75 6e 63 74 69 6f 6e 4f 62 6a  ject functionObj
2030: 20 3d 20 65 6e 76 2d 3e 4e 65 77 4c 6f 63 61 6c   = env->NewLocal
2040: 52 65 66 28 66 75 6e 63 74 69 6f 6e 4f 62 6a 47  Ref(functionObjG
2050: 6c 6f 62 61 6c 29 3b 0a 0a 20 20 20 20 6a 6f 62  lobal);..    job
2060: 6a 65 63 74 41 72 72 61 79 20 61 72 67 73 41 72  jectArray argsAr
2070: 72 61 79 20 3d 20 65 6e 76 2d 3e 4e 65 77 4f 62  ray = env->NewOb
2080: 6a 65 63 74 41 72 72 61 79 28 61 72 67 63 2c 20  jectArray(argc, 
2090: 67 53 74 72 69 6e 67 43 6c 61 73 73 49 6e 66 6f  gStringClassInfo
20a0: 2e 63 6c 61 7a 7a 2c 20 4e 55 4c 4c 29 3b 0a 20  .clazz, NULL);. 
20b0: 20 20 20 69 66 20 28 61 72 67 73 41 72 72 61 79     if (argsArray
20c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ) {.        for 
20d0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
20e0: 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a 20 20 20  argc; i++) {.   
20f0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 6a           const j
2100: 63 68 61 72 2a 20 61 72 67 20 3d 20 73 74 61 74  char* arg = stat
2110: 69 63 5f 63 61 73 74 3c 63 6f 6e 73 74 20 6a 63  ic_cast<const jc
2120: 68 61 72 2a 3e 28 73 71 6c 69 74 65 33 5f 76 61  har*>(sqlite3_va
2130: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
2140: 69 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i]));.          
2150: 20 20 69 66 20 28 21 61 72 67 29 20 7b 0a 20 20    if (!arg) {.  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4c                AL
2170: 4f 47 57 28 22 4e 55 4c 4c 20 61 72 67 75 6d 65  OGW("NULL argume
2180: 6e 74 20 69 6e 20 63 75 73 74 6f 6d 5f 66 75 6e  nt in custom_fun
2190: 63 74 69 6f 6e 5f 63 61 6c 6c 62 61 63 6b 2e 20  ction_callback. 
21a0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   This should not
21b0: 20 68 61 70 70 65 6e 2e 22 29 3b 0a 20 20 20 20   happen.");.    
21c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
21d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e0: 20 73 69 7a 65 5f 74 20 61 72 67 4c 65 6e 20 3d   size_t argLen =
21f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2200: 79 74 65 73 31 36 28 61 72 67 76 5b 69 5d 29 20  ytes16(argv[i]) 
2210: 2f 20 73 69 7a 65 6f 66 28 6a 63 68 61 72 29 3b  / sizeof(jchar);
2220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2230: 20 6a 73 74 72 69 6e 67 20 61 72 67 53 74 72 20   jstring argStr 
2240: 3d 20 65 6e 76 2d 3e 4e 65 77 53 74 72 69 6e 67  = env->NewString
2250: 28 61 72 67 2c 20 61 72 67 4c 65 6e 29 3b 0a 20  (arg, argLen);. 
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2270: 66 20 28 21 61 72 67 53 74 72 29 20 7b 0a 20 20  f (!argStr) {.  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 20 2f 2f    goto error; //
22a0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 65   out of memory e
22b0: 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  rror.           
22c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22d0: 20 20 20 20 20 20 20 65 6e 76 2d 3e 53 65 74 4f         env->SetO
22e0: 62 6a 65 63 74 41 72 72 61 79 45 6c 65 6d 65 6e  bjectArrayElemen
22f0: 74 28 61 72 67 73 41 72 72 61 79 2c 20 69 2c 20  t(argsArray, i, 
2300: 61 72 67 53 74 72 29 3b 0a 20 20 20 20 20 20 20  argStr);.       
2310: 20 20 20 20 20 20 20 20 20 65 6e 76 2d 3e 44 65           env->De
2320: 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28 61 72 67  leteLocalRef(arg
2330: 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Str);.          
2340: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
2350: 20 20 20 20 20 20 20 2f 2f 20 54 4f 44 4f 3a 20         // TODO: 
2360: 53 75 70 70 6f 72 74 20 66 75 6e 63 74 69 6f 6e  Support function
2370: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  s that return va
2380: 6c 75 65 73 2e 0a 20 20 20 20 20 20 20 20 65 6e  lues..        en
2390: 76 2d 3e 43 61 6c 6c 56 6f 69 64 4d 65 74 68 6f  v->CallVoidMetho
23a0: 64 28 66 75 6e 63 74 69 6f 6e 4f 62 6a 2c 0a 20  d(functionObj,. 
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
23c0: 53 51 4c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63  SQLiteCustomFunc
23d0: 74 69 6f 6e 43 6c 61 73 73 49 6e 66 6f 2e 64 69  tionClassInfo.di
23e0: 73 70 61 74 63 68 43 61 6c 6c 62 61 63 6b 2c 20  spatchCallback, 
23f0: 61 72 67 73 41 72 72 61 79 29 3b 0a 0a 65 72 72  argsArray);..err
2400: 6f 72 3a 0a 20 20 20 20 20 20 20 20 65 6e 76 2d  or:.        env-
2410: 3e 44 65 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28  >DeleteLocalRef(
2420: 61 72 67 73 41 72 72 61 79 29 3b 0a 20 20 20 20  argsArray);.    
2430: 7d 0a 0a 20 20 20 20 65 6e 76 2d 3e 44 65 6c 65  }..    env->Dele
2440: 74 65 4c 6f 63 61 6c 52 65 66 28 66 75 6e 63 74  teLocalRef(funct
2450: 69 6f 6e 4f 62 6a 29 3b 0a 0a 20 20 20 20 69 66  ionObj);..    if
2460: 20 28 65 6e 76 2d 3e 45 78 63 65 70 74 69 6f 6e   (env->Exception
2470: 43 68 65 63 6b 28 29 29 20 7b 0a 20 20 20 20 20  Check()) {.     
2480: 20 20 20 41 4c 4f 47 45 28 22 41 6e 20 65 78 63     ALOGE("An exc
2490: 65 70 74 69 6f 6e 20 77 61 73 20 74 68 72 6f 77  eption was throw
24a0: 6e 20 62 79 20 63 75 73 74 6f 6d 20 53 51 4c 69  n by custom SQLi
24b0: 74 65 20 66 75 6e 63 74 69 6f 6e 2e 22 29 3b 0a  te function.");.
24c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 47 45 5f          /* LOGE_
24d0: 45 58 28 65 6e 76 29 3b 20 2a 2f 0a 20 20 20 20  EX(env); */.    
24e0: 20 20 20 20 65 6e 76 2d 3e 45 78 63 65 70 74 69      env->Excepti
24f0: 6f 6e 43 6c 65 61 72 28 29 3b 0a 20 20 20 20 7d  onClear();.    }
2500: 0a 7d 0a 0a 2f 2f 20 43 61 6c 6c 65 64 20 77 68  .}..// Called wh
2510: 65 6e 20 61 20 63 75 73 74 6f 6d 20 66 75 6e 63  en a custom func
2520: 74 69 6f 6e 20 69 73 20 64 65 73 74 72 6f 79 65  tion is destroye
2530: 64 2e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  d..static void s
2540: 71 6c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74  qliteCustomFunct
2550: 69 6f 6e 44 65 73 74 72 75 63 74 6f 72 28 76 6f  ionDestructor(vo
2560: 69 64 2a 20 64 61 74 61 29 20 7b 0a 20 20 20 20  id* data) {.    
2570: 6a 6f 62 6a 65 63 74 20 66 75 6e 63 74 69 6f 6e  jobject function
2580: 4f 62 6a 47 6c 6f 62 61 6c 20 3d 20 72 65 69 6e  ObjGlobal = rein
2590: 74 65 72 70 72 65 74 5f 63 61 73 74 3c 6a 6f 62  terpret_cast<job
25a0: 6a 65 63 74 3e 28 64 61 74 61 29 3b 0a 20 20 20  ject>(data);.   
25b0: 20 4a 4e 49 45 6e 76 2a 20 65 6e 76 20 3d 20 30   JNIEnv* env = 0
25c0: 3b 0a 20 20 20 20 67 70 4a 61 76 61 56 4d 2d 3e  ;.    gpJavaVM->
25d0: 47 65 74 45 6e 76 28 28 76 6f 69 64 2a 2a 29 26  GetEnv((void**)&
25e0: 65 6e 76 2c 20 4a 4e 49 5f 56 45 52 53 49 4f 4e  env, JNI_VERSION
25f0: 5f 31 5f 34 29 3b 0a 20 20 20 20 65 6e 76 2d 3e  _1_4);.    env->
2600: 44 65 6c 65 74 65 47 6c 6f 62 61 6c 52 65 66 28  DeleteGlobalRef(
2610: 66 75 6e 63 74 69 6f 6e 4f 62 6a 47 6c 6f 62 61  functionObjGloba
2620: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  l);.}..static vo
2630: 69 64 20 6e 61 74 69 76 65 52 65 67 69 73 74 65  id nativeRegiste
2640: 72 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 28  rCustomFunction(
2650: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c  JNIEnv* env, jcl
2660: 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67  ass clazz, jlong
2670: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a   connectionPtr,.
2680: 20 20 20 20 20 20 20 20 6a 6f 62 6a 65 63 74 20          jobject 
2690: 66 75 6e 63 74 69 6f 6e 4f 62 6a 29 20 7b 0a 20  functionObj) {. 
26a0: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
26b0: 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ion* connection 
26c0: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
26d0: 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  st<SQLiteConnect
26e0: 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e  ion*>(connection
26f0: 50 74 72 29 3b 0a 0a 20 20 20 20 6a 73 74 72 69  Ptr);..    jstri
2700: 6e 67 20 6e 61 6d 65 53 74 72 20 3d 20 6a 73 74  ng nameStr = jst
2710: 72 69 6e 67 28 65 6e 76 2d 3e 47 65 74 4f 62 6a  ring(env->GetObj
2720: 65 63 74 46 69 65 6c 64 28 0a 20 20 20 20 20 20  ectField(.      
2730: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 4f 62        functionOb
2740: 6a 2c 20 67 53 51 4c 69 74 65 43 75 73 74 6f 6d  j, gSQLiteCustom
2750: 46 75 6e 63 74 69 6f 6e 43 6c 61 73 73 49 6e 66  FunctionClassInf
2760: 6f 2e 6e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 69  o.name));.    ji
2770: 6e 74 20 6e 75 6d 41 72 67 73 20 3d 20 65 6e 76  nt numArgs = env
2780: 2d 3e 47 65 74 49 6e 74 46 69 65 6c 64 28 66 75  ->GetIntField(fu
2790: 6e 63 74 69 6f 6e 4f 62 6a 2c 20 67 53 51 4c 69  nctionObj, gSQLi
27a0: 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e  teCustomFunction
27b0: 43 6c 61 73 73 49 6e 66 6f 2e 6e 75 6d 41 72 67  ClassInfo.numArg
27c0: 73 29 3b 0a 0a 20 20 20 20 6a 6f 62 6a 65 63 74  s);..    jobject
27d0: 20 66 75 6e 63 74 69 6f 6e 4f 62 6a 47 6c 6f 62   functionObjGlob
27e0: 61 6c 20 3d 20 65 6e 76 2d 3e 4e 65 77 47 6c 6f  al = env->NewGlo
27f0: 62 61 6c 52 65 66 28 66 75 6e 63 74 69 6f 6e 4f  balRef(functionO
2800: 62 6a 29 3b 0a 0a 20 20 20 20 63 6f 6e 73 74 20  bj);..    const 
2810: 63 68 61 72 2a 20 6e 61 6d 65 20 3d 20 65 6e 76  char* name = env
2820: 2d 3e 47 65 74 53 74 72 69 6e 67 55 54 46 43 68  ->GetStringUTFCh
2830: 61 72 73 28 6e 61 6d 65 53 74 72 2c 20 4e 55 4c  ars(nameStr, NUL
2840: 4c 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20  L);.    int err 
2850: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2860: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 63 6f 6e  _function_v2(con
2870: 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 6e 61 6d  nection->db, nam
2880: 65 2c 20 6e 75 6d 41 72 67 73 2c 20 53 51 4c 49  e, numArgs, SQLI
2890: 54 45 5f 55 54 46 31 36 2c 0a 20 20 20 20 20 20  TE_UTF16,.      
28a0: 20 20 20 20 20 20 72 65 69 6e 74 65 72 70 72 65        reinterpre
28b0: 74 5f 63 61 73 74 3c 76 6f 69 64 2a 3e 28 66 75  t_cast<void*>(fu
28c0: 6e 63 74 69 6f 6e 4f 62 6a 47 6c 6f 62 61 6c 29  nctionObjGlobal)
28d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 73  ,.            &s
28e0: 71 6c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74  qliteCustomFunct
28f0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 2c 20 4e 55 4c  ionCallback, NUL
2900: 4c 2c 20 4e 55 4c 4c 2c 20 26 73 71 6c 69 74 65  L, NULL, &sqlite
2910: 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 44 65  CustomFunctionDe
2920: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 65  structor);.    e
2930: 6e 76 2d 3e 52 65 6c 65 61 73 65 53 74 72 69 6e  nv->ReleaseStrin
2940: 67 55 54 46 43 68 61 72 73 28 6e 61 6d 65 53 74  gUTFChars(nameSt
2950: 72 2c 20 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 69  r, name);..    i
2960: 66 20 28 65 72 72 20 21 3d 20 53 51 4c 49 54 45  f (err != SQLITE
2970: 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 41  _OK) {.        A
2980: 4c 4f 47 45 28 22 73 71 6c 69 74 65 33 5f 63 72  LOGE("sqlite3_cr
2990: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 72 65  eate_function re
29a0: 74 75 72 6e 65 64 20 25 64 22 2c 20 65 72 72 29  turned %d", err)
29b0: 3b 0a 20 20 20 20 20 20 20 20 65 6e 76 2d 3e 44  ;.        env->D
29c0: 65 6c 65 74 65 47 6c 6f 62 61 6c 52 65 66 28 66  eleteGlobalRef(f
29d0: 75 6e 63 74 69 6f 6e 4f 62 6a 47 6c 6f 62 61 6c  unctionObjGlobal
29e0: 29 3b 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77  );.        throw
29f0: 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74 69  _sqlite3_excepti
2a00: 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69  on(env, connecti
2a10: 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  on->db);.       
2a20: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 7d   return;.    }.}
2a30: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 61  ..static void na
2a40: 74 69 76 65 52 65 67 69 73 74 65 72 4c 6f 63 61  tiveRegisterLoca
2a50: 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f 72 73 28 4a  lizedCollators(J
2a60: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61  NIEnv* env, jcla
2a70: 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20  ss clazz, jlong 
2a80: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20  connectionPtr,. 
2a90: 20 20 20 20 20 20 20 6a 73 74 72 69 6e 67 20 6c         jstring l
2aa0: 6f 63 61 6c 65 53 74 72 29 20 7b 0a 20 20 2f 2a  ocaleStr) {.  /*
2ab0: 20 4c 6f 63 61 6c 69 7a 65 64 20 63 6f 6c 6c 61   Localized colla
2ac0: 74 6f 72 73 20 61 72 65 20 6e 6f 74 20 73 75 70  tors are not sup
2ad0: 70 6f 72 74 65 64 2e 20 2a 2f 0a 7d 0a 0a 73 74  ported. */.}..st
2ae0: 61 74 69 63 20 6a 6c 6f 6e 67 20 6e 61 74 69 76  atic jlong nativ
2af0: 65 50 72 65 70 61 72 65 53 74 61 74 65 6d 65 6e  ePrepareStatemen
2b00: 74 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a  t(JNIEnv* env, j
2b10: 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f  class clazz, jlo
2b20: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  ng connectionPtr
2b30: 2c 0a 20 20 20 20 20 20 20 20 6a 73 74 72 69 6e  ,.        jstrin
2b40: 67 20 73 71 6c 53 74 72 69 6e 67 29 20 7b 0a 20  g sqlString) {. 
2b50: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
2b60: 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ion* connection 
2b70: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
2b80: 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  st<SQLiteConnect
2b90: 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e  ion*>(connection
2ba0: 50 74 72 29 3b 0a 0a 20 20 20 20 6a 73 69 7a 65  Ptr);..    jsize
2bb0: 20 73 71 6c 4c 65 6e 67 74 68 20 3d 20 65 6e 76   sqlLength = env
2bc0: 2d 3e 47 65 74 53 74 72 69 6e 67 4c 65 6e 67 74  ->GetStringLengt
2bd0: 68 28 73 71 6c 53 74 72 69 6e 67 29 3b 0a 20 20  h(sqlString);.  
2be0: 20 20 63 6f 6e 73 74 20 6a 63 68 61 72 2a 20 73    const jchar* s
2bf0: 71 6c 20 3d 20 65 6e 76 2d 3e 47 65 74 53 74 72  ql = env->GetStr
2c00: 69 6e 67 43 72 69 74 69 63 61 6c 28 73 71 6c 53  ingCritical(sqlS
2c10: 74 72 69 6e 67 2c 20 4e 55 4c 4c 29 3b 0a 20 20  tring, NULL);.  
2c20: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20    sqlite3_stmt* 
2c30: 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 69  statement;.    i
2c40: 6e 74 20 65 72 72 20 3d 20 73 71 6c 69 74 65 33  nt err = sqlite3
2c50: 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 63 6f  _prepare16_v2(co
2c60: 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 0a 20 20  nnection->db,.  
2c70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 2c 20 73            sql, s
2c80: 71 6c 4c 65 6e 67 74 68 20 2a 20 73 69 7a 65 6f  qlLength * sizeo
2c90: 66 28 6a 63 68 61 72 29 2c 20 26 73 74 61 74 65  f(jchar), &state
2ca0: 6d 65 6e 74 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ment, NULL);.   
2cb0: 20 65 6e 76 2d 3e 52 65 6c 65 61 73 65 53 74 72   env->ReleaseStr
2cc0: 69 6e 67 43 72 69 74 69 63 61 6c 28 73 71 6c 53  ingCritical(sqlS
2cd0: 74 72 69 6e 67 2c 20 73 71 6c 29 3b 0a 0a 20 20  tring, sql);..  
2ce0: 20 20 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c    if (err != SQL
2cf0: 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20  ITE_OK) {.      
2d00: 20 20 2f 2f 20 45 72 72 6f 72 20 6d 65 73 73 61    // Error messa
2d10: 67 65 73 20 6c 69 6b 65 20 27 6e 65 61 72 20 22  ges like 'near "
2d20: 29 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  )": syntax error
2d30: 27 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20  ' are not.      
2d40: 20 20 2f 2f 20 61 6c 77 61 79 73 20 68 65 6c 70    // always help
2d50: 66 75 6c 20 65 6e 6f 75 67 68 2c 20 73 6f 20 63  ful enough, so c
2d60: 6f 6e 73 74 72 75 63 74 20 61 6e 20 65 72 72 6f  onstruct an erro
2d70: 72 20 73 74 72 69 6e 67 20 74 68 61 74 0a 20 20  r string that.  
2d80: 20 20 20 20 20 20 2f 2f 20 69 6e 63 6c 75 64 65        // include
2d90: 73 20 74 68 65 20 71 75 65 72 79 20 69 74 73 65  s the query itse
2da0: 6c 66 2e 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  lf..        cons
2db0: 74 20 63 68 61 72 20 2a 71 75 65 72 79 20 3d 20  t char *query = 
2dc0: 65 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67 55 54  env->GetStringUT
2dd0: 46 43 68 61 72 73 28 73 71 6c 53 74 72 69 6e 67  FChars(sqlString
2de0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  , NULL);.       
2df0: 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65 20 3d   char *message =
2e00: 20 28 63 68 61 72 2a 29 20 6d 61 6c 6c 6f 63 28   (char*) malloc(
2e10: 73 74 72 6c 65 6e 28 71 75 65 72 79 29 20 2b 20  strlen(query) + 
2e20: 35 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  50);.        if 
2e30: 28 6d 65 73 73 61 67 65 29 20 7b 0a 20 20 20 20  (message) {.    
2e40: 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 6d          strcpy(m
2e50: 65 73 73 61 67 65 2c 20 22 2c 20 77 68 69 6c 65  essage, ", while
2e60: 20 63 6f 6d 70 69 6c 69 6e 67 3a 20 22 29 3b 20   compiling: "); 
2e70: 2f 2f 20 6c 65 73 73 20 74 68 61 6e 20 35 30 20  // less than 50 
2e80: 63 68 61 72 73 0a 20 20 20 20 20 20 20 20 20 20  chars.          
2e90: 20 20 73 74 72 63 61 74 28 6d 65 73 73 61 67 65    strcat(message
2ea0: 2c 20 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20  , query);.      
2eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6e 76 2d    }.        env-
2ec0: 3e 52 65 6c 65 61 73 65 53 74 72 69 6e 67 55 54  >ReleaseStringUT
2ed0: 46 43 68 61 72 73 28 73 71 6c 53 74 72 69 6e 67  FChars(sqlString
2ee0: 2c 20 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20  , query);.      
2ef0: 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f    throw_sqlite3_
2f00: 65 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63  exception(env, c
2f10: 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 6d  onnection->db, m
2f20: 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
2f30: 20 66 72 65 65 28 6d 65 73 73 61 67 65 29 3b 0a   free(message);.
2f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2f50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 41 4c 4f  ;.    }..    ALO
2f60: 47 56 28 22 50 72 65 70 61 72 65 64 20 73 74 61  GV("Prepared sta
2f70: 74 65 6d 65 6e 74 20 25 70 20 6f 6e 20 63 6f 6e  tement %p on con
2f80: 6e 65 63 74 69 6f 6e 20 25 70 22 2c 20 73 74 61  nection %p", sta
2f90: 74 65 6d 65 6e 74 2c 20 63 6f 6e 6e 65 63 74 69  tement, connecti
2fa0: 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74  on->db);.    ret
2fb0: 75 72 6e 20 72 65 69 6e 74 65 72 70 72 65 74 5f  urn reinterpret_
2fc0: 63 61 73 74 3c 6a 6c 6f 6e 67 3e 28 73 74 61 74  cast<jlong>(stat
2fd0: 65 6d 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69  ement);.}..stati
2fe0: 63 20 76 6f 69 64 20 6e 61 74 69 76 65 46 69 6e  c void nativeFin
2ff0: 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e 74 28 4a  alizeStatement(J
3000: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61  NIEnv* env, jcla
3010: 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20  ss clazz, jlong 
3020: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20  connectionPtr,. 
3030: 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61         jlong sta
3040: 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20 20  tementPtr) {.   
3050: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
3060: 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  n* connection = 
3070: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
3080: 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  <SQLiteConnectio
3090: 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  n*>(connectionPt
30a0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
30b0: 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20  stmt* statement 
30c0: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
30d0: 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  st<sqlite3_stmt*
30e0: 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  >(statementPtr);
30f0: 0a 0a 20 20 20 20 2f 2f 20 57 65 20 69 67 6e 6f  ..    // We igno
3100: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  re the result of
3110: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3120: 65 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  e because it is 
3130: 72 65 61 6c 6c 79 20 74 65 6c 6c 69 6e 67 20 75  really telling u
3140: 73 20 61 62 6f 75 74 0a 20 20 20 20 2f 2f 20 77  s about.    // w
3150: 68 65 74 68 65 72 20 61 6e 79 20 65 72 72 6f 72  hether any error
3160: 73 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  s occurred while
3170: 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 73   executing the s
3180: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 73  tatement.  The s
3190: 74 61 74 65 6d 65 6e 74 20 69 74 73 65 6c 66 0a  tatement itself.
31a0: 20 20 20 20 2f 2f 20 69 73 20 61 6c 77 61 79 73      // is always
31b0: 20 66 69 6e 61 6c 69 7a 65 64 20 72 65 67 61 72   finalized regar
31c0: 64 6c 65 73 73 2e 0a 20 20 20 20 41 4c 4f 47 56  dless..    ALOGV
31d0: 28 22 46 69 6e 61 6c 69 7a 65 64 20 73 74 61 74  ("Finalized stat
31e0: 65 6d 65 6e 74 20 25 70 20 6f 6e 20 63 6f 6e 6e  ement %p on conn
31f0: 65 63 74 69 6f 6e 20 25 70 22 2c 20 73 74 61 74  ection %p", stat
3200: 65 6d 65 6e 74 2c 20 63 6f 6e 6e 65 63 74 69 6f  ement, connectio
3210: 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  n->db);.    sqli
3220: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 73 74 61  te3_finalize(sta
3230: 74 65 6d 65 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74  tement);.}..stat
3240: 69 63 20 6a 69 6e 74 20 6e 61 74 69 76 65 47 65  ic jint nativeGe
3250: 74 50 61 72 61 6d 65 74 65 72 43 6f 75 6e 74 28  tParameterCount(
3260: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c  JNIEnv* env, jcl
3270: 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67  ass clazz, jlong
3280: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a   connectionPtr,.
3290: 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74          jlong st
32a0: 61 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20  atementPtr) {.  
32b0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20    sqlite3_stmt* 
32c0: 73 74 61 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e  statement = rein
32d0: 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c  terpret_cast<sql
32e0: 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74  ite3_stmt*>(stat
32f0: 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20  ementPtr);..    
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62  return sqlite3_b
3310: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
3320: 75 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a  unt(statement);.
3330: 7d 0a 0a 73 74 61 74 69 63 20 6a 62 6f 6f 6c 65  }..static jboole
3340: 61 6e 20 6e 61 74 69 76 65 49 73 52 65 61 64 4f  an nativeIsReadO
3350: 6e 6c 79 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  nly(JNIEnv* env,
3360: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a   jclass clazz, j
3370: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
3380: 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f 6e  tr,.        jlon
3390: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 20  g statementPtr) 
33a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
33b0: 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20  mt* statement = 
33c0: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
33d0: 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28  <sqlite3_stmt*>(
33e0: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a  statementPtr);..
33f0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
3400: 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
3410: 28 73 74 61 74 65 6d 65 6e 74 29 20 21 3d 20 30  (statement) != 0
3420: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 69 6e 74  ;.}..static jint
3430: 20 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e   nativeGetColumn
3440: 43 6f 75 6e 74 28 4a 4e 49 45 6e 76 2a 20 65 6e  Count(JNIEnv* en
3450: 76 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c  v, jclass clazz,
3460: 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   jlong connectio
3470: 6e 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c  nPtr,.        jl
3480: 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72  ong statementPtr
3490: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ) {.    sqlite3_
34a0: 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20  stmt* statement 
34b0: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
34c0: 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  st<sqlite3_stmt*
34d0: 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  >(statementPtr);
34e0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ..    return sql
34f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
3500: 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 7d 0a  t(statement);.}.
3510: 0a 73 74 61 74 69 63 20 6a 73 74 72 69 6e 67 20  .static jstring 
3520: 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e 4e  nativeGetColumnN
3530: 61 6d 65 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  ame(JNIEnv* env,
3540: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a   jclass clazz, j
3550: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
3560: 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f 6e  tr,.        jlon
3570: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20  g statementPtr, 
3580: 6a 69 6e 74 20 69 6e 64 65 78 29 20 7b 0a 20 20  jint index) {.  
3590: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20    sqlite3_stmt* 
35a0: 73 74 61 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e  statement = rein
35b0: 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c  terpret_cast<sql
35c0: 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74  ite3_stmt*>(stat
35d0: 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20  ementPtr);..    
35e0: 63 6f 6e 73 74 20 6a 63 68 61 72 2a 20 6e 61 6d  const jchar* nam
35f0: 65 20 3d 20 73 74 61 74 69 63 5f 63 61 73 74 3c  e = static_cast<
3600: 63 6f 6e 73 74 20 6a 63 68 61 72 2a 3e 28 73 71  const jchar*>(sq
3610: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
3620: 65 31 36 28 73 74 61 74 65 6d 65 6e 74 2c 20 69  e16(statement, i
3630: 6e 64 65 78 29 29 3b 0a 20 20 20 20 69 66 20 28  ndex));.    if (
3640: 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20  name) {.        
3650: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 20 3d 20  size_t length = 
3660: 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  0;.        while
3670: 20 28 6e 61 6d 65 5b 6c 65 6e 67 74 68 5d 29 20   (name[length]) 
3680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
3690: 6e 67 74 68 20 2b 3d 20 31 3b 0a 20 20 20 20 20  ngth += 1;.     
36a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
36b0: 75 72 6e 20 65 6e 76 2d 3e 4e 65 77 53 74 72 69  urn env->NewStri
36c0: 6e 67 28 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 29  ng(name, length)
36d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
36e0: 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74  rn NULL;.}..stat
36f0: 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 42 69  ic void nativeBi
3700: 6e 64 4e 75 6c 6c 28 4a 4e 49 45 6e 76 2a 20 65  ndNull(JNIEnv* e
3710: 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a  nv, jclass clazz
3720: 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69  , jlong connecti
3730: 6f 6e 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a  onPtr,.        j
3740: 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74  long statementPt
3750: 72 2c 20 6a 69 6e 74 20 69 6e 64 65 78 29 20 7b  r, jint index) {
3760: 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65  .    SQLiteConne
3770: 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f  ction* connectio
3780: 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f  n = reinterpret_
3790: 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65  cast<SQLiteConne
37a0: 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69  ction*>(connecti
37b0: 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  onPtr);.    sqli
37c0: 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d  te3_stmt* statem
37d0: 65 6e 74 20 3d 20 72 65 69 6e 74 65 72 70 72 65  ent = reinterpre
37e0: 74 5f 63 61 73 74 3c 73 71 6c 69 74 65 33 5f 73  t_cast<sqlite3_s
37f0: 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50  tmt*>(statementP
3800: 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20 65 72  tr);..    int er
3810: 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  r = sqlite3_bind
3820: 5f 6e 75 6c 6c 28 73 74 61 74 65 6d 65 6e 74 2c  _null(statement,
3830: 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 20   index);.    if 
3840: 28 65 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 4f  (err != SQLITE_O
3850: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72  K) {.        thr
3860: 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70  ow_sqlite3_excep
3870: 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65 63  tion(env, connec
3880: 74 69 6f 6e 2d 3e 64 62 2c 20 4e 55 4c 4c 29 3b  tion->db, NULL);
3890: 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  .    }.}..static
38a0: 20 76 6f 69 64 20 6e 61 74 69 76 65 42 69 6e 64   void nativeBind
38b0: 4c 6f 6e 67 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  Long(JNIEnv* env
38c0: 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20  , jclass clazz, 
38d0: 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  jlong connection
38e0: 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f  Ptr,.        jlo
38f0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c  ng statementPtr,
3900: 20 6a 69 6e 74 20 69 6e 64 65 78 2c 20 6a 6c 6f   jint index, jlo
3910: 6e 67 20 76 61 6c 75 65 29 20 7b 0a 20 20 20 20  ng value) {.    
3920: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
3930: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72  * connection = r
3940: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c  einterpret_cast<
3950: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
3960: 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  *>(connectionPtr
3970: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
3980: 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d  tmt* statement =
3990: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73   reinterpret_cas
39a0: 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e  t<sqlite3_stmt*>
39b0: 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a  (statementPtr);.
39c0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 73  .    int err = s
39d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
39e0: 34 28 73 74 61 74 65 6d 65 6e 74 2c 20 69 6e 64  4(statement, ind
39f0: 65 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  ex, value);.    
3a00: 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c 49 54  if (err != SQLIT
3a10: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  E_OK) {.        
3a20: 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78  throw_sqlite3_ex
3a30: 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e  ception(env, con
3a40: 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 4e 55 4c  nection->db, NUL
3a50: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  L);.    }.}..sta
3a60: 74 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 42  tic void nativeB
3a70: 69 6e 64 44 6f 75 62 6c 65 28 4a 4e 49 45 6e 76  indDouble(JNIEnv
3a80: 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c  * env, jclass cl
3a90: 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65  azz, jlong conne
3aa0: 63 74 69 6f 6e 50 74 72 2c 0a 20 20 20 20 20 20  ctionPtr,.      
3ab0: 20 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e    jlong statemen
3ac0: 74 50 74 72 2c 20 6a 69 6e 74 20 69 6e 64 65 78  tPtr, jint index
3ad0: 2c 20 6a 64 6f 75 62 6c 65 20 76 61 6c 75 65 29  , jdouble value)
3ae0: 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e   {.    SQLiteCon
3af0: 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74  nection* connect
3b00: 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65  ion = reinterpre
3b10: 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e  t_cast<SQLiteCon
3b20: 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63  nection*>(connec
3b30: 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73 71  tionPtr);.    sq
3b40: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74  lite3_stmt* stat
3b50: 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65 72 70  ement = reinterp
3b60: 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74 65 33  ret_cast<sqlite3
3b70: 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e  _stmt*>(statemen
3b80: 74 50 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20  tPtr);..    int 
3b90: 65 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  err = sqlite3_bi
3ba0: 6e 64 5f 64 6f 75 62 6c 65 28 73 74 61 74 65 6d  nd_double(statem
3bb0: 65 6e 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75  ent, index, valu
3bc0: 65 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72 20  e);.    if (err 
3bd0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
3be0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f 73 71          throw_sq
3bf0: 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f 6e 28  lite3_exception(
3c00: 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  env, connection-
3c10: 3e 64 62 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  >db, NULL);.    
3c20: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
3c30: 20 6e 61 74 69 76 65 42 69 6e 64 53 74 72 69 6e   nativeBindStrin
3c40: 67 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a  g(JNIEnv* env, j
3c50: 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f  class clazz, jlo
3c60: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  ng connectionPtr
3c70: 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20  ,.        jlong 
3c80: 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 6a 69  statementPtr, ji
3c90: 6e 74 20 69 6e 64 65 78 2c 20 6a 73 74 72 69 6e  nt index, jstrin
3ca0: 67 20 76 61 6c 75 65 53 74 72 69 6e 67 29 20 7b  g valueString) {
3cb0: 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65  .    SQLiteConne
3cc0: 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f  ction* connectio
3cd0: 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f  n = reinterpret_
3ce0: 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65  cast<SQLiteConne
3cf0: 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69  ction*>(connecti
3d00: 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  onPtr);.    sqli
3d10: 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d  te3_stmt* statem
3d20: 65 6e 74 20 3d 20 72 65 69 6e 74 65 72 70 72 65  ent = reinterpre
3d30: 74 5f 63 61 73 74 3c 73 71 6c 69 74 65 33 5f 73  t_cast<sqlite3_s
3d40: 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50  tmt*>(statementP
3d50: 74 72 29 3b 0a 0a 20 20 20 20 6a 73 69 7a 65 20  tr);..    jsize 
3d60: 76 61 6c 75 65 4c 65 6e 67 74 68 20 3d 20 65 6e  valueLength = en
3d70: 76 2d 3e 47 65 74 53 74 72 69 6e 67 4c 65 6e 67  v->GetStringLeng
3d80: 74 68 28 76 61 6c 75 65 53 74 72 69 6e 67 29 3b  th(valueString);
3d90: 0a 20 20 20 20 63 6f 6e 73 74 20 6a 63 68 61 72  .    const jchar
3da0: 2a 20 76 61 6c 75 65 20 3d 20 65 6e 76 2d 3e 47  * value = env->G
3db0: 65 74 53 74 72 69 6e 67 43 72 69 74 69 63 61 6c  etStringCritical
3dc0: 28 76 61 6c 75 65 53 74 72 69 6e 67 2c 20 4e 55  (valueString, NU
3dd0: 4c 4c 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  LL);.    int err
3de0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
3df0: 74 65 78 74 31 36 28 73 74 61 74 65 6d 65 6e 74  text16(statement
3e00: 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75 65 2c 20  , index, value, 
3e10: 76 61 6c 75 65 4c 65 6e 67 74 68 20 2a 20 73 69  valueLength * si
3e20: 7a 65 6f 66 28 6a 63 68 61 72 29 2c 0a 20 20 20  zeof(jchar),.   
3e30: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3e40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
3e50: 65 6e 76 2d 3e 52 65 6c 65 61 73 65 53 74 72 69  env->ReleaseStri
3e60: 6e 67 43 72 69 74 69 63 61 6c 28 76 61 6c 75 65  ngCritical(value
3e70: 53 74 72 69 6e 67 2c 20 76 61 6c 75 65 29 3b 0a  String, value);.
3e80: 20 20 20 20 69 66 20 28 65 72 72 20 21 3d 20 53      if (err != S
3e90: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
3ea0: 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65      throw_sqlite
3eb0: 33 5f 65 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c  3_exception(env,
3ec0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c   connection->db,
3ed0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a   NULL);.    }.}.
3ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 61 74  .static void nat
3ef0: 69 76 65 42 69 6e 64 42 6c 6f 62 28 4a 4e 49 45  iveBindBlob(JNIE
3f00: 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20  nv* env, jclass 
3f10: 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63 6f 6e  clazz, jlong con
3f20: 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20 20 20  nectionPtr,.    
3f30: 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d      jlong statem
3f40: 65 6e 74 50 74 72 2c 20 6a 69 6e 74 20 69 6e 64  entPtr, jint ind
3f50: 65 78 2c 20 6a 62 79 74 65 41 72 72 61 79 20 76  ex, jbyteArray v
3f60: 61 6c 75 65 41 72 72 61 79 29 20 7b 0a 20 20 20  alueArray) {.   
3f70: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
3f80: 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  n* connection = 
3f90: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
3fa0: 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  <SQLiteConnectio
3fb0: 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  n*>(connectionPt
3fc0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
3fd0: 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20  stmt* statement 
3fe0: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
3ff0: 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  st<sqlite3_stmt*
4000: 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  >(statementPtr);
4010: 0a 0a 20 20 20 20 6a 73 69 7a 65 20 76 61 6c 75  ..    jsize valu
4020: 65 4c 65 6e 67 74 68 20 3d 20 65 6e 76 2d 3e 47  eLength = env->G
4030: 65 74 41 72 72 61 79 4c 65 6e 67 74 68 28 76 61  etArrayLength(va
4040: 6c 75 65 41 72 72 61 79 29 3b 0a 20 20 20 20 6a  lueArray);.    j
4050: 62 79 74 65 2a 20 76 61 6c 75 65 20 3d 20 73 74  byte* value = st
4060: 61 74 69 63 5f 63 61 73 74 3c 6a 62 79 74 65 2a  atic_cast<jbyte*
4070: 3e 28 65 6e 76 2d 3e 47 65 74 50 72 69 6d 69 74  >(env->GetPrimit
4080: 69 76 65 41 72 72 61 79 43 72 69 74 69 63 61 6c  iveArrayCritical
4090: 28 76 61 6c 75 65 41 72 72 61 79 2c 20 4e 55 4c  (valueArray, NUL
40a0: 4c 29 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  L));.    int err
40b0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
40c0: 62 6c 6f 62 28 73 74 61 74 65 6d 65 6e 74 2c 20  blob(statement, 
40d0: 69 6e 64 65 78 2c 20 76 61 6c 75 65 2c 20 76 61  index, value, va
40e0: 6c 75 65 4c 65 6e 67 74 68 2c 20 53 51 4c 49 54  lueLength, SQLIT
40f0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
4100: 20 20 65 6e 76 2d 3e 52 65 6c 65 61 73 65 50 72    env->ReleasePr
4110: 69 6d 69 74 69 76 65 41 72 72 61 79 43 72 69 74  imitiveArrayCrit
4120: 69 63 61 6c 28 76 61 6c 75 65 41 72 72 61 79 2c  ical(valueArray,
4130: 20 76 61 6c 75 65 2c 20 4a 4e 49 5f 41 42 4f 52   value, JNI_ABOR
4140: 54 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72 20  T);.    if (err 
4150: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
4160: 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f 73 71          throw_sq
4170: 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f 6e 28  lite3_exception(
4180: 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  env, connection-
4190: 3e 64 62 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  >db, NULL);.    
41a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
41b0: 20 6e 61 74 69 76 65 52 65 73 65 74 53 74 61 74   nativeResetStat
41c0: 65 6d 65 6e 74 41 6e 64 43 6c 65 61 72 42 69 6e  ementAndClearBin
41d0: 64 69 6e 67 73 28 4a 4e 49 45 6e 76 2a 20 65 6e  dings(JNIEnv* en
41e0: 76 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c  v, jclass clazz,
41f0: 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   jlong connectio
4200: 6e 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c  nPtr,.        jl
4210: 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72  ong statementPtr
4220: 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f  ) {.    SQLiteCo
4230: 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63  nnection* connec
4240: 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72  tion = reinterpr
4250: 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f  et_cast<SQLiteCo
4260: 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65  nnection*>(conne
4270: 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73  ctionPtr);.    s
4280: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61  qlite3_stmt* sta
4290: 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65 72  tement = reinter
42a0: 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74 65  pret_cast<sqlite
42b0: 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65  3_stmt*>(stateme
42c0: 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74  ntPtr);..    int
42d0: 20 65 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 72   err = sqlite3_r
42e0: 65 73 65 74 28 73 74 61 74 65 6d 65 6e 74 29 3b  eset(statement);
42f0: 0a 20 20 20 20 69 66 20 28 65 72 72 20 3d 3d 20  .    if (err == 
4300: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
4310: 20 20 20 20 20 65 72 72 20 3d 20 73 71 6c 69 74       err = sqlit
4320: 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
4330: 73 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  s(statement);.  
4340: 20 20 7d 0a 20 20 20 20 69 66 20 28 65 72 72 20    }.    if (err 
4350: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
4360: 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f 73 71          throw_sq
4370: 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f 6e 28  lite3_exception(
4380: 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  env, connection-
4390: 3e 64 62 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  >db, NULL);.    
43a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
43b0: 65 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28  executeNonQuery(
43c0: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 53 51 4c  JNIEnv* env, SQL
43d0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63  iteConnection* c
43e0: 6f 6e 6e 65 63 74 69 6f 6e 2c 20 73 71 6c 69 74  onnection, sqlit
43f0: 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d 65  e3_stmt* stateme
4400: 6e 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 65 72  nt) {.    int er
4410: 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  r = sqlite3_step
4420: 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  (statement);.   
4430: 20 69 66 20 28 65 72 72 20 3d 3d 20 53 51 4c 49   if (err == SQLI
4440: 54 45 5f 52 4f 57 29 20 7b 0a 20 20 20 20 20 20  TE_ROW) {.      
4450: 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f    throw_sqlite3_
4460: 65 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 0a 20  exception(env,. 
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
4480: 51 75 65 72 69 65 73 20 63 61 6e 20 62 65 20 70  Queries can be p
4490: 65 72 66 6f 72 6d 65 64 20 75 73 69 6e 67 20 53  erformed using S
44a0: 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 71 75  QLiteDatabase qu
44b0: 65 72 79 20 6f 72 20 72 61 77 51 75 65 72 79 20  ery or rawQuery 
44c0: 6d 65 74 68 6f 64 73 20 6f 6e 6c 79 2e 22 29 3b  methods only.");
44d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
44e0: 65 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 44 4f  err != SQLITE_DO
44f0: 4e 45 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68  NE) {.        th
4500: 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65  row_sqlite3_exce
4510: 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65  ption(env, conne
4520: 63 74 69 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20 20  ction->db);.    
4530: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 65 72 72  }.    return err
4540: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
4550: 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 28 4a   nativeExecute(J
4560: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61  NIEnv* env, jcla
4570: 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20  ss clazz, jlong 
4580: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20  connectionPtr,. 
4590: 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61         jlong sta
45a0: 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20 20  tementPtr) {.   
45b0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
45c0: 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  n* connection = 
45d0: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
45e0: 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  <SQLiteConnectio
45f0: 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  n*>(connectionPt
4600: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
4610: 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20  stmt* statement 
4620: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
4630: 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  st<sqlite3_stmt*
4640: 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  >(statementPtr);
4650: 0a 0a 20 20 20 20 65 78 65 63 75 74 65 4e 6f 6e  ..    executeNon
4660: 51 75 65 72 79 28 65 6e 76 2c 20 63 6f 6e 6e 65  Query(env, conne
4670: 63 74 69 6f 6e 2c 20 73 74 61 74 65 6d 65 6e 74  ction, statement
4680: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 69 6e  );.}..static jin
4690: 74 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 46  t nativeExecuteF
46a0: 6f 72 43 68 61 6e 67 65 64 52 6f 77 43 6f 75 6e  orChangedRowCoun
46b0: 74 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a  t(JNIEnv* env, j
46c0: 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 0a 20 20 20  class clazz,.   
46d0: 20 20 20 20 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65       jlong conne
46e0: 63 74 69 6f 6e 50 74 72 2c 20 6a 6c 6f 6e 67 20  ctionPtr, jlong 
46f0: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a  statementPtr) {.
4700: 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
4710: 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  tion* connection
4720: 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63   = reinterpret_c
4730: 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ast<SQLiteConnec
4740: 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f  tion*>(connectio
4750: 6e 50 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  nPtr);.    sqlit
4760: 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d 65  e3_stmt* stateme
4770: 6e 74 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74  nt = reinterpret
4780: 5f 63 61 73 74 3c 73 71 6c 69 74 65 33 5f 73 74  _cast<sqlite3_st
4790: 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50 74  mt*>(statementPt
47a0: 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20 65 72 72  r);..    int err
47b0: 20 3d 20 65 78 65 63 75 74 65 4e 6f 6e 51 75 65   = executeNonQue
47c0: 72 79 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69  ry(env, connecti
47d0: 6f 6e 2c 20 73 74 61 74 65 6d 65 6e 74 29 3b 0a  on, statement);.
47e0: 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 20 3d      return err =
47f0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  = SQLITE_DONE ? 
4800: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
4810: 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 29 20  connection->db) 
4820: 3a 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  : -1;.}..static 
4830: 6a 6c 6f 6e 67 20 6e 61 74 69 76 65 45 78 65 63  jlong nativeExec
4840: 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72 74  uteForLastInsert
4850: 65 64 52 6f 77 49 64 28 4a 4e 49 45 6e 76 2a 20  edRowId(JNIEnv* 
4860: 65 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a  env, jclass claz
4870: 7a 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67  z,.        jlong
4880: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20   connectionPtr, 
4890: 6a 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50  jlong statementP
48a0: 74 72 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65  tr) {.    SQLite
48b0: 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e  Connection* conn
48c0: 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72  ection = reinter
48d0: 70 72 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65  pret_cast<SQLite
48e0: 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e  Connection*>(con
48f0: 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20  nectionPtr);.   
4900: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73   sqlite3_stmt* s
4910: 74 61 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74  tatement = reint
4920: 65 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69  erpret_cast<sqli
4930: 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65  te3_stmt*>(state
4940: 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20 69  mentPtr);..    i
4950: 6e 74 20 65 72 72 20 3d 20 65 78 65 63 75 74 65  nt err = execute
4960: 4e 6f 6e 51 75 65 72 79 28 65 6e 76 2c 20 63 6f  NonQuery(env, co
4970: 6e 6e 65 63 74 69 6f 6e 2c 20 73 74 61 74 65 6d  nnection, statem
4980: 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ent);.    return
4990: 20 65 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 44   err == SQLITE_D
49a0: 4f 4e 45 20 26 26 20 73 71 6c 69 74 65 33 5f 63  ONE && sqlite3_c
49b0: 68 61 6e 67 65 73 28 63 6f 6e 6e 65 63 74 69 6f  hanges(connectio
49c0: 6e 2d 3e 64 62 29 20 3e 20 30 0a 20 20 20 20 20  n->db) > 0.     
49d0: 20 20 20 20 20 20 20 3f 20 73 71 6c 69 74 65 33         ? sqlite3
49e0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
49f0: 69 64 28 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64  id(connection->d
4a00: 62 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74  b) : -1;.}..stat
4a10: 69 63 20 69 6e 74 20 65 78 65 63 75 74 65 4f 6e  ic int executeOn
4a20: 65 52 6f 77 51 75 65 72 79 28 4a 4e 49 45 6e 76  eRowQuery(JNIEnv
4a30: 2a 20 65 6e 76 2c 20 53 51 4c 69 74 65 43 6f 6e  * env, SQLiteCon
4a40: 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74  nection* connect
4a50: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d  ion, sqlite3_stm
4a60: 74 2a 20 73 74 61 74 65 6d 65 6e 74 29 20 7b 0a  t* statement) {.
4a70: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 73 71      int err = sq
4a80: 6c 69 74 65 33 5f 73 74 65 70 28 73 74 61 74 65  lite3_step(state
4a90: 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 65  ment);.    if (e
4aa0: 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 52 4f 57  rr != SQLITE_ROW
4ab0: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f  ) {.        thro
4ac0: 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74  w_sqlite3_except
4ad0: 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74  ion(env, connect
4ae0: 69 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  ion->db);.    }.
4af0: 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a      return err;.
4b00: 7d 0a 0a 73 74 61 74 69 63 20 6a 6c 6f 6e 67 20  }..static jlong 
4b10: 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72  nativeExecuteFor
4b20: 4c 6f 6e 67 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  Long(JNIEnv* env
4b30: 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 0a  , jclass clazz,.
4b40: 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 63 6f          jlong co
4b50: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6a 6c 6f  nnectionPtr, jlo
4b60: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29  ng statementPtr)
4b70: 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e   {.    SQLiteCon
4b80: 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74  nection* connect
4b90: 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65  ion = reinterpre
4ba0: 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e  t_cast<SQLiteCon
4bb0: 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63  nection*>(connec
4bc0: 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73 71  tionPtr);.    sq
4bd0: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74  lite3_stmt* stat
4be0: 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65 72 70  ement = reinterp
4bf0: 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74 65 33  ret_cast<sqlite3
4c00: 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e  _stmt*>(statemen
4c10: 74 50 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20  tPtr);..    int 
4c20: 65 72 72 20 3d 20 65 78 65 63 75 74 65 4f 6e 65  err = executeOne
4c30: 52 6f 77 51 75 65 72 79 28 65 6e 76 2c 20 63 6f  RowQuery(env, co
4c40: 6e 6e 65 63 74 69 6f 6e 2c 20 73 74 61 74 65 6d  nnection, statem
4c50: 65 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 65 72  ent);.    if (er
4c60: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20  r == SQLITE_ROW 
4c70: 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  && sqlite3_colum
4c80: 6e 5f 63 6f 75 6e 74 28 73 74 61 74 65 6d 65 6e  n_count(statemen
4c90: 74 29 20 3e 3d 20 31 29 20 7b 0a 20 20 20 20 20  t) >= 1) {.     
4ca0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
4cb0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 73  3_column_int64(s
4cc0: 74 61 74 65 6d 65 6e 74 2c 20 30 29 3b 0a 20 20  tatement, 0);.  
4cd0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d    }.    return -
4ce0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 73 74  1;.}..static jst
4cf0: 72 69 6e 67 20 6e 61 74 69 76 65 45 78 65 63 75  ring nativeExecu
4d00: 74 65 46 6f 72 53 74 72 69 6e 67 28 4a 4e 49 45  teForString(JNIE
4d10: 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20  nv* env, jclass 
4d20: 63 6c 61 7a 7a 2c 0a 20 20 20 20 20 20 20 20 6a  clazz,.        j
4d30: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
4d40: 74 72 2c 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d  tr, jlong statem
4d50: 65 6e 74 50 74 72 29 20 7b 0a 20 20 20 20 53 51  entPtr) {.    SQ
4d60: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20  LiteConnection* 
4d70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69  connection = rei
4d80: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51  nterpret_cast<SQ
4d90: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e  LiteConnection*>
4da0: 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b  (connectionPtr);
4db0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
4dc0: 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 72  t* statement = r
4dd0: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c  einterpret_cast<
4de0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73  sqlite3_stmt*>(s
4df0: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20  tatementPtr);.. 
4e00: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 78 65     int err = exe
4e10: 63 75 74 65 4f 6e 65 52 6f 77 51 75 65 72 79 28  cuteOneRowQuery(
4e20: 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  env, connection,
4e30: 20 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20   statement);.   
4e40: 20 69 66 20 28 65 72 72 20 3d 3d 20 53 51 4c 49   if (err == SQLI
4e50: 54 45 5f 52 4f 57 20 26 26 20 73 71 6c 69 74 65  TE_ROW && sqlite
4e60: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 73  3_column_count(s
4e70: 74 61 74 65 6d 65 6e 74 29 20 3e 3d 20 31 29 20  tatement) >= 1) 
4e80: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
4e90: 6a 63 68 61 72 2a 20 74 65 78 74 20 3d 20 73 74  jchar* text = st
4ea0: 61 74 69 63 5f 63 61 73 74 3c 63 6f 6e 73 74 20  atic_cast<const 
4eb0: 6a 63 68 61 72 2a 3e 28 73 71 6c 69 74 65 33 5f  jchar*>(sqlite3_
4ec0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 73 74  column_text16(st
4ed0: 61 74 65 6d 65 6e 74 2c 20 30 29 29 3b 0a 20 20  atement, 0));.  
4ee0: 20 20 20 20 20 20 69 66 20 28 74 65 78 74 29 20        if (text) 
4ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69  {.            si
4f00: 7a 65 5f 74 20 6c 65 6e 67 74 68 20 3d 20 73 71  ze_t length = sq
4f10: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
4f20: 65 73 31 36 28 73 74 61 74 65 6d 65 6e 74 2c 20  es16(statement, 
4f30: 30 29 20 2f 20 73 69 7a 65 6f 66 28 6a 63 68 61  0) / sizeof(jcha
4f40: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
4f50: 72 65 74 75 72 6e 20 65 6e 76 2d 3e 4e 65 77 53  return env->NewS
4f60: 74 72 69 6e 67 28 74 65 78 74 2c 20 6c 65 6e 67  tring(text, leng
4f70: 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  th);.        }. 
4f80: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4f90: 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  NULL;.}..static 
4fa0: 69 6e 74 20 63 72 65 61 74 65 41 73 68 6d 65 6d  int createAshmem
4fb0: 52 65 67 69 6f 6e 57 69 74 68 44 61 74 61 28 4a  RegionWithData(J
4fc0: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 63 6f 6e 73  NIEnv* env, cons
4fd0: 74 20 76 6f 69 64 2a 20 64 61 74 61 2c 20 73 69  t void* data, si
4fe0: 7a 65 5f 74 20 6c 65 6e 67 74 68 29 20 7b 0a 20  ze_t length) {. 
4ff0: 20 20 20 6a 6e 69 54 68 72 6f 77 49 4f 45 78 63     jniThrowIOExc
5000: 65 70 74 69 6f 6e 28 65 6e 76 2c 20 2d 31 29 3b  eption(env, -1);
5010: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
5020: 7d 0a 0a 73 74 61 74 69 63 20 6a 69 6e 74 20 6e  }..static jint n
5030: 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 42  ativeExecuteForB
5040: 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f  lobFileDescripto
5050: 72 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a  r(JNIEnv* env, j
5060: 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 0a 20 20 20  class clazz,.   
5070: 20 20 20 20 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65       jlong conne
5080: 63 74 69 6f 6e 50 74 72 2c 20 6a 6c 6f 6e 67 20  ctionPtr, jlong 
5090: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a  statementPtr) {.
50a0: 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63      SQLiteConnec
50b0: 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  tion* connection
50c0: 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63   = reinterpret_c
50d0: 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ast<SQLiteConnec
50e0: 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f  tion*>(connectio
50f0: 6e 50 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  nPtr);.    sqlit
5100: 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d 65  e3_stmt* stateme
5110: 6e 74 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74  nt = reinterpret
5120: 5f 63 61 73 74 3c 73 71 6c 69 74 65 33 5f 73 74  _cast<sqlite3_st
5130: 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50 74  mt*>(statementPt
5140: 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20 65 72 72  r);..    int err
5150: 20 3d 20 65 78 65 63 75 74 65 4f 6e 65 52 6f 77   = executeOneRow
5160: 51 75 65 72 79 28 65 6e 76 2c 20 63 6f 6e 6e 65  Query(env, conne
5170: 63 74 69 6f 6e 2c 20 73 74 61 74 65 6d 65 6e 74  ction, statement
5180: 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72 20 3d  );.    if (err =
5190: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20  = SQLITE_ROW && 
51a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
51b0: 6f 75 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 20  ount(statement) 
51c0: 3e 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20  >= 1) {.        
51d0: 63 6f 6e 73 74 20 76 6f 69 64 2a 20 62 6c 6f 62  const void* blob
51e0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
51f0: 6e 5f 62 6c 6f 62 28 73 74 61 74 65 6d 65 6e 74  n_blob(statement
5200: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
5210: 20 28 62 6c 6f 62 29 20 7b 0a 20 20 20 20 20 20   (blob) {.      
5220: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68        int length
5230: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
5240: 6e 5f 62 79 74 65 73 28 73 74 61 74 65 6d 65 6e  n_bytes(statemen
5250: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t, 0);.         
5260: 20 20 20 69 66 20 28 6c 65 6e 67 74 68 20 3e 3d     if (length >=
5270: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
5280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 72 65        return cre
5290: 61 74 65 41 73 68 6d 65 6d 52 65 67 69 6f 6e 57  ateAshmemRegionW
52a0: 69 74 68 44 61 74 61 28 65 6e 76 2c 20 62 6c 6f  ithData(env, blo
52b0: 62 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20  b, length);.    
52c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
52d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
52e0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
52f0: 2a 20 4e 6f 74 65 3a 20 54 68 65 20 66 6f 6c 6c  * Note: The foll
5300: 6f 77 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6d 75  owing symbols mu
5310: 73 74 20 62 65 20 69 6e 20 74 68 65 20 73 61 6d  st be in the sam
5320: 65 20 6f 72 64 65 72 20 61 73 20 74 68 65 20 63  e order as the c
5330: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
5340: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
5350: 61 4d 65 74 68 6f 64 5b 5d 20 61 72 72 61 79 20  aMethod[] array 
5360: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 74 69  in function nati
5370: 76 65 45 78 65 63 75 74 65 46 6f 72 43 75 72 73  veExecuteForCurs
5380: 6f 72 57 69 6e 64 6f 77 28 29 2e 0a 2a 2f 0a 65  orWindow()..*/.e
5390: 6e 75 6d 20 43 57 4d 65 74 68 6f 64 4e 61 6d 65  num CWMethodName
53a0: 73 20 7b 0a 20 20 43 57 5f 43 4c 45 41 52 20 20  s {.  CW_CLEAR  
53b0: 20 20 20 20 20 20 20 3d 20 30 2c 0a 20 20 43 57         = 0,.  CW
53c0: 5f 53 45 54 4e 55 4d 43 4f 4c 55 4d 4e 53 20 3d  _SETNUMCOLUMNS =
53d0: 20 31 2c 0a 20 20 43 57 5f 41 4c 4c 4f 43 52 4f   1,.  CW_ALLOCRO
53e0: 57 20 20 20 20 20 20 3d 20 32 2c 0a 20 20 43 57  W      = 2,.  CW
53f0: 5f 46 52 45 45 4c 41 53 54 52 4f 57 20 20 20 3d  _FREELASTROW   =
5400: 20 33 2c 0a 20 20 43 57 5f 50 55 54 4e 55 4c 4c   3,.  CW_PUTNULL
5410: 20 20 20 20 20 20 20 3d 20 34 2c 0a 20 20 43 57         = 4,.  CW
5420: 5f 50 55 54 4c 4f 4e 47 20 20 20 20 20 20 20 3d  _PUTLONG       =
5430: 20 35 2c 0a 20 20 43 57 5f 50 55 54 44 4f 55 42   5,.  CW_PUTDOUB
5440: 4c 45 20 20 20 20 20 3d 20 36 2c 0a 20 20 43 57  LE     = 6,.  CW
5450: 5f 50 55 54 53 54 52 49 4e 47 20 20 20 20 20 3d  _PUTSTRING     =
5460: 20 37 2c 0a 20 20 43 57 5f 50 55 54 42 4c 4f 42   7,.  CW_PUTBLOB
5470: 20 20 20 20 20 20 20 3d 20 38 0a 7d 3b 0a 0a 2f         = 8.};../
5480: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
5490: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
54a0: 72 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  re represents a 
54b0: 73 69 6e 67 6c 65 20 43 75 72 73 6f 72 57 69 6e  single CursorWin
54c0: 64 6f 77 20 6a 61 76 61 20 6d 65 74 68 6f 64 2e  dow java method.
54d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 43 57 4d 65 74  .*/.struct CWMet
54e0: 68 6f 64 20 7b 0a 20 20 6a 6d 65 74 68 6f 64 49  hod {.  jmethodI
54f0: 44 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  D id;           
5500: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 74 68 6f          /* Metho
5510: 64 20 69 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  d id */.  const 
5520: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
5530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 74            /* Met
5540: 68 6f 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  hod name */.  co
5550: 6e 73 74 20 63 68 61 72 20 2a 7a 53 69 67 3b 20  nst char *zSig; 
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5570: 20 4d 65 74 68 6f 64 20 4a 4e 49 20 73 69 67 6e   Method JNI sign
5580: 61 74 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ature */.};../*.
5590: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 6f  ** Append the co
55a0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
55b0: 77 20 74 68 61 74 20 53 51 4c 20 73 74 61 74 65  w that SQL state
55c0: 6d 65 6e 74 20 70 53 74 6d 74 20 63 75 72 72 65  ment pStmt curre
55d0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ntly points to.*
55e0: 2a 20 74 6f 20 74 68 65 20 43 75 72 73 6f 72 57  * to the CursorW
55f0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73  indow object pas
5600: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
5610: 64 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  d argument. The 
5620: 43 75 72 73 6f 72 57 69 6e 64 6f 77 0a 2a 2a 20  CursorWindow.** 
5630: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
5640: 6e 73 20 69 52 6f 77 20 72 6f 77 73 2e 20 52 65  ns iRow rows. Re
5650: 74 75 72 6e 20 74 72 75 65 20 6f 6e 20 73 75 63  turn true on suc
5660: 63 65 73 73 20 6f 72 20 66 61 6c 73 65 20 69 66  cess or false if
5670: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
5680: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 6a  urs..*/.static j
5690: 62 6f 6f 6c 65 61 6e 20 63 6f 70 79 52 6f 77 54  boolean copyRowT
56a0: 6f 57 69 6e 64 6f 77 28 0a 20 20 4a 4e 49 45 6e  oWindow(.  JNIEn
56b0: 76 20 2a 70 45 6e 76 2c 0a 20 20 6a 6f 62 6a 65  v *pEnv,.  jobje
56c0: 63 74 20 77 69 6e 2c 0a 20 20 69 6e 74 20 69 52  ct win,.  int iR
56d0: 6f 77 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ow,.  sqlite3_st
56e0: 6d 74 20 2a 70 53 74 6d 74 2c 0a 20 20 43 57 4d  mt *pStmt,.  CWM
56f0: 65 74 68 6f 64 20 2a 61 4d 65 74 68 6f 64 0a 29  ethod *aMethod.)
5700: 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73  {.  int nCol = s
5710: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
5720: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 6e  unt(pStmt);.  in
5730: 74 20 69 3b 0a 20 20 6a 62 6f 6f 6c 65 61 6e 20  t i;.  jboolean 
5740: 62 4f 6b 3b 0a 0a 20 20 62 4f 6b 20 3d 20 70 45  bOk;..  bOk = pE
5750: 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d  nv->CallBooleanM
5760: 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68  ethod(win, aMeth
5770: 6f 64 5b 43 57 5f 41 4c 4c 4f 43 52 4f 57 5d 2e  od[CW_ALLOCROW].
5780: 69 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  id);.  for(i=0; 
5790: 62 4f 6b 20 26 26 20 69 3c 6e 43 6f 6c 3b 20 69  bOk && i<nCol; i
57a0: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
57b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
57c0: 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 20 29  type(pStmt, i) )
57d0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
57e0: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
57f0: 20 20 20 20 62 4f 6b 20 3d 20 70 45 6e 76 2d 3e      bOk = pEnv->
5800: 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d 65 74 68 6f  CallBooleanMetho
5810: 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64 5b 43  d(win, aMethod[C
5820: 57 5f 50 55 54 4e 55 4c 4c 5d 2e 69 64 2c 20 69  W_PUTNULL].id, i
5830: 52 6f 77 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  Row, i);.       
5840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5850: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
5860: 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
5870: 20 20 20 20 20 20 6a 6c 6f 6e 67 20 76 61 6c 20        jlong val 
5880: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5890: 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 29  _int64(pStmt, i)
58a0: 3b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20  ;.        bOk = 
58b0: 70 45 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61  pEnv->CallBoolea
58c0: 6e 4d 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65  nMethod(win, aMe
58d0: 74 68 6f 64 5b 43 57 5f 50 55 54 4c 4f 4e 47 5d  thod[CW_PUTLONG]
58e0: 2e 69 64 2c 20 76 61 6c 2c 20 69 52 6f 77 2c 20  .id, val, iRow, 
58f0: 69 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  i);.        brea
5900: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
5910: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
5920: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 6a  OAT: {.        j
5930: 64 6f 75 62 6c 65 20 76 61 6c 20 3d 20 73 71 6c  double val = sql
5940: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
5950: 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  le(pStmt, i);.  
5960: 20 20 20 20 20 20 62 4f 6b 20 3d 20 70 45 6e 76        bOk = pEnv
5970: 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d 65 74  ->CallBooleanMet
5980: 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64  hod(win, aMethod
5990: 5b 43 57 5f 50 55 54 44 4f 55 42 4c 45 5d 2e 69  [CW_PUTDOUBLE].i
59a0: 64 2c 20 76 61 6c 2c 20 69 52 6f 77 2c 20 69 29  d, val, iRow, i)
59b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
59c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
59d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
59e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 6a 63 68 61  : {.        jcha
59f0: 72 20 2a 70 53 74 72 20 3d 20 28 6a 63 68 61 72  r *pStr = (jchar
5a00: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
5a10: 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69  _text16(pStmt, i
5a20: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  );.        int n
5a30: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Str = sqlite3_co
5a40: 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 70 53 74  lumn_bytes16(pSt
5a50: 6d 74 2c 20 69 29 20 2f 20 73 69 7a 65 6f 66 28  mt, i) / sizeof(
5a60: 6a 63 68 61 72 29 3b 0a 20 20 20 20 20 20 20 20  jchar);.        
5a70: 6a 73 74 72 69 6e 67 20 76 61 6c 20 3d 20 70 45  jstring val = pE
5a80: 6e 76 2d 3e 4e 65 77 53 74 72 69 6e 67 28 70 53  nv->NewString(pS
5a90: 74 72 2c 20 6e 53 74 72 29 3b 0a 20 20 20 20 20  tr, nStr);.     
5aa0: 20 20 20 62 4f 6b 20 3d 20 70 45 6e 76 2d 3e 43     bOk = pEnv->C
5ab0: 61 6c 6c 42 6f 6f 6c 65 61 6e 4d 65 74 68 6f 64  allBooleanMethod
5ac0: 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64 5b 43 57  (win, aMethod[CW
5ad0: 5f 50 55 54 53 54 52 49 4e 47 5d 2e 69 64 2c 20  _PUTSTRING].id, 
5ae0: 76 61 6c 2c 20 69 52 6f 77 2c 20 69 29 3b 0a 20  val, iRow, i);. 
5af0: 20 20 20 20 20 20 20 70 45 6e 76 2d 3e 44 65 6c         pEnv->Del
5b00: 65 74 65 4c 6f 63 61 6c 52 65 66 28 76 61 6c 29  eteLocalRef(val)
5b10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5b20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
5b30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5b40: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
5b50: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
5b60: 53 74 6d 74 2c 20 69 29 3d 3d 53 51 4c 49 54 45  Stmt, i)==SQLITE
5b70: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20 20 20  _BLOB );.       
5b80: 20 63 6f 6e 73 74 20 6a 62 79 74 65 20 2a 70 20   const jbyte *p 
5b90: 3d 20 28 63 6f 6e 73 74 20 6a 62 79 74 65 2a 29  = (const jbyte*)
5ba0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
5bb0: 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  lob(pStmt, i);. 
5bc0: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
5bd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
5be0: 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  tes(pStmt, i);. 
5bf0: 20 20 20 20 20 20 20 6a 62 79 74 65 41 72 72 61         jbyteArra
5c00: 79 20 76 61 6c 20 3d 20 70 45 6e 76 2d 3e 4e 65  y val = pEnv->Ne
5c10: 77 42 79 74 65 41 72 72 61 79 28 6e 29 3b 0a 20  wByteArray(n);. 
5c20: 20 20 20 20 20 20 20 70 45 6e 76 2d 3e 53 65 74         pEnv->Set
5c30: 42 79 74 65 41 72 72 61 79 52 65 67 69 6f 6e 28  ByteArrayRegion(
5c40: 76 61 6c 2c 20 30 2c 20 6e 2c 20 70 29 3b 0a 20  val, 0, n, p);. 
5c50: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 70 45 6e         bOk = pEn
5c60: 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d 65  v->CallBooleanMe
5c70: 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f  thod(win, aMetho
5c80: 64 5b 43 57 5f 50 55 54 42 4c 4f 42 5d 2e 69 64  d[CW_PUTBLOB].id
5c90: 2c 20 76 61 6c 2c 20 69 52 6f 77 2c 20 69 29 3b  , val, iRow, i);
5ca0: 0a 20 20 20 20 20 20 20 20 70 45 6e 76 2d 3e 44  .        pEnv->D
5cb0: 65 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28 76 61  eleteLocalRef(va
5cc0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  l);.        brea
5cd0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5ce0: 0a 0a 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30  ..    if( bOk==0
5cf0: 20 29 7b 0a 20 20 20 20 20 20 70 45 6e 76 2d 3e   ){.      pEnv->
5d00: 43 61 6c 6c 56 6f 69 64 4d 65 74 68 6f 64 28 77  CallVoidMethod(w
5d10: 69 6e 2c 20 61 4d 65 74 68 6f 64 5b 43 57 5f 46  in, aMethod[CW_F
5d20: 52 45 45 4c 41 53 54 52 4f 57 5d 2e 69 64 29 3b  REELASTROW].id);
5d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
5d40: 74 75 72 6e 20 62 4f 6b 3b 0a 7d 0a 0a 73 74 61  turn bOk;.}..sta
5d50: 74 69 63 20 6a 62 6f 6f 6c 65 61 6e 20 73 65 74  tic jboolean set
5d60: 57 69 6e 64 6f 77 4e 75 6d 43 6f 6c 75 6d 6e 73  WindowNumColumns
5d70: 28 0a 20 20 4a 4e 49 45 6e 76 20 2a 70 45 6e 76  (.  JNIEnv *pEnv
5d80: 2c 0a 20 20 6a 6f 62 6a 65 63 74 20 77 69 6e 2c  ,.  jobject win,
5d90: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5da0: 2a 70 53 74 6d 74 2c 0a 20 20 43 57 4d 65 74 68  *pStmt,.  CWMeth
5db0: 6f 64 20 2a 61 4d 65 74 68 6f 64 0a 29 7b 0a 20  od *aMethod.){. 
5dc0: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a 20 20 70 45   int nCol;..  pE
5dd0: 6e 76 2d 3e 43 61 6c 6c 56 6f 69 64 4d 65 74 68  nv->CallVoidMeth
5de0: 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64 5b  od(win, aMethod[
5df0: 43 57 5f 43 4c 45 41 52 5d 2e 69 64 29 3b 0a 20  CW_CLEAR].id);. 
5e00: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
5e10: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
5e20: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 45  mt);.  return pE
5e30: 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d  nv->CallBooleanM
5e40: 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68  ethod(win, aMeth
5e50: 6f 64 5b 43 57 5f 53 45 54 4e 55 4d 43 4f 4c 55  od[CW_SETNUMCOLU
5e60: 4d 4e 53 5d 2e 69 64 2c 20 28 6a 69 6e 74 29 6e  MNS].id, (jint)n
5e70: 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
5e80: 68 69 73 20 6d 65 74 68 6f 64 20 68 61 73 20 62  his method has b
5e90: 65 65 6e 20 72 65 77 72 69 74 74 65 6e 20 66 6f  een rewritten fo
5ea0: 72 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74  r org.sqlite.dat
5eb0: 61 62 61 73 65 2e 2a 2e 20 54 68 65 20 6f 72 69  abase.*. The ori
5ec0: 67 69 6e 61 6c 20 0a 2a 2a 20 61 6e 64 72 6f 69  ginal .** androi
5ed0: 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  d implementation
5ee0: 20 75 73 65 64 20 74 68 65 20 43 2b 2b 20 69 6e   used the C++ in
5ef0: 74 65 72 66 61 63 65 20 74 6f 20 70 6f 70 75 6c  terface to popul
5f00: 61 74 65 20 61 20 43 75 72 73 6f 72 57 69 6e 64  ate a CursorWind
5f10: 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 69  ow.** object. Si
5f20: 6e 63 65 20 74 68 65 20 4e 44 4b 20 64 6f 65 73  nce the NDK does
5f30: 20 6e 6f 74 20 65 78 70 6f 72 74 20 74 68 69 73   not export this
5f40: 20 69 6e 74 65 72 66 61 63 65 2c 20 77 65 20 69   interface, we i
5f50: 6e 76 6f 6b 65 20 74 68 65 20 4a 61 76 61 0a 2a  nvoke the Java.*
5f60: 2a 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  * interface usin
5f70: 67 20 73 74 61 6e 64 61 72 64 20 4a 4e 49 20 6d  g standard JNI m
5f80: 65 74 68 6f 64 73 20 74 6f 20 64 6f 20 74 68 65  ethods to do the
5f90: 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 2a 2a 0a   same thing..**.
5fa0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5fb0: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 53 51   executes the SQ
5fc0: 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 20 6f  Lite statement o
5fd0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
5fe0: 74 68 65 20 34 74 68 20 0a 2a 2a 20 61 72 67 75  the 4th .** argu
5ff0: 6d 65 6e 74 20 61 6e 64 20 63 6f 70 69 65 73 20  ment and copies 
6000: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65 74 75  one or more retu
6010: 72 6e 65 64 20 72 6f 77 73 20 69 6e 74 6f 20 74  rned rows into t
6020: 68 65 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 0a  he CursorWindow.
6030: 2a 2a 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ** object passed
6040: 20 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75   as the 5th argu
6050: 6d 65 6e 74 2e 20 54 68 65 20 73 65 74 20 6f 66  ment. The set of
6060: 20 72 6f 77 73 20 63 6f 70 69 65 64 20 69 6e 74   rows copied int
6070: 6f 20 74 68 65 20 0a 2a 2a 20 43 75 72 73 6f 72  o the .** Cursor
6080: 57 69 6e 64 6f 77 20 69 73 20 61 6c 77 61 79 73  Window is always
6090: 20 63 6f 6e 74 69 67 75 6f 75 73 2e 0a 2a 2a 0a   contiguous..**.
60a0: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 72 6f 77 20  ** The only row 
60b0: 74 68 61 74 20 2a 6d 75 73 74 2a 20 62 65 20 63  that *must* be c
60c0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 43  opied into the C
60d0: 75 72 73 6f 72 57 69 6e 64 6f 77 20 69 73 20 72  ursorWindow is r
60e0: 6f 77 20 0a 2a 2a 20 69 52 6f 77 52 65 71 75 69  ow .** iRowRequi
60f0: 72 65 64 2e 20 49 64 65 61 6c 6c 79 2c 20 61 6c  red. Ideally, al
6100: 6c 20 72 6f 77 73 20 66 72 6f 6d 20 69 52 6f 77  l rows from iRow
6110: 53 74 61 72 74 20 74 68 72 6f 75 67 68 20 74 6f  Start through to
6120: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74   the end.** of t
6130: 68 65 20 71 75 65 72 79 20 61 72 65 20 63 6f 70  he query are cop
6140: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 43 75 72  ied into the Cur
6150: 73 6f 72 57 69 6e 64 6f 77 2e 20 49 66 20 74 68  sorWindow. If th
6160: 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  is is not possib
6170: 6c 65 0a 2a 2a 20 28 43 75 72 73 6f 72 57 69 6e  le.** (CursorWin
6180: 64 6f 77 20 6f 62 6a 65 63 74 73 20 68 61 76 65  dow objects have
6190: 20 61 20 66 69 6e 69 74 65 20 63 61 70 61 63 69   a finite capaci
61a0: 74 79 29 2c 20 73 6f 6d 65 20 63 6f 6d 70 72 6f  ty), some compro
61b0: 6d 69 73 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a  mise position.**
61c0: 20 69 73 20 66 6f 75 6e 64 20 28 73 65 65 20 63   is found (see c
61d0: 6f 6d 6d 65 6e 74 73 20 65 6d 62 65 64 64 65 64  omments embedded
61e0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 62 65 6c   in the code bel
61f0: 6f 77 20 66 6f 72 20 64 65 74 61 69 6c 73 29 2e  ow for details).
6200: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
6210: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 36 34 2d  n value is a 64-
6220: 62 69 74 20 69 6e 74 65 67 65 72 20 63 61 6c 63  bit integer calc
6230: 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  ulated as follow
6240: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 28 69  s:.**.**      (i
6250: 53 74 61 72 74 20 3c 3c 20 33 32 29 20 7c 20 6e  Start << 32) | n
6260: 52 6f 77 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  Row.**.** where 
6270: 69 53 74 61 72 74 20 69 73 20 74 68 65 20 69 6e  iStart is the in
6280: 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
6290: 20 72 6f 77 20 63 6f 70 69 65 64 20 69 6e 74 6f   row copied into
62a0: 20 74 68 65 20 43 75 72 73 6f 72 57 69 6e 64 6f   the CursorWindo
62b0: 77 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 75  w..** If the cou
62c0: 6e 74 41 6c 6c 52 6f 77 73 20 61 72 67 75 6d 65  ntAllRows argume
62d0: 6e 74 20 69 73 20 74 72 75 65 2c 20 6e 52 6f 77  nt is true, nRow
62e0: 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
62f0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 2a 2a 20  mber of rows.** 
6300: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
6310: 71 75 65 72 79 2e 20 4f 74 68 65 72 77 69 73 65  query. Otherwise
6320: 2c 20 6e 52 6f 77 20 69 73 20 6f 6e 65 20 67 72  , nRow is one gr
6330: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 69  eater than the i
6340: 6e 64 65 78 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ndex of .** the 
6350: 6c 61 73 74 20 72 6f 77 20 63 6f 70 69 65 64 20  last row copied 
6360: 69 6e 74 6f 20 74 68 65 20 43 75 72 73 6f 72 57  into the CursorW
6370: 69 6e 64 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  indow..*/.static
6380: 20 6a 6c 6f 6e 67 20 6e 61 74 69 76 65 45 78 65   jlong nativeExe
6390: 63 75 74 65 46 6f 72 43 75 72 73 6f 72 57 69 6e  cuteForCursorWin
63a0: 64 6f 77 28 0a 20 20 4a 4e 49 45 6e 76 20 2a 70  dow(.  JNIEnv *p
63b0: 45 6e 76 2c 20 0a 20 20 6a 63 6c 61 73 73 20 63  Env, .  jclass c
63c0: 6c 61 7a 7a 2c 0a 20 20 6a 6c 6f 6e 67 20 63 6f  lazz,.  jlong co
63d0: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 20 20 20  nnectionPtr,    
63e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
63f0: 65 72 20 74 6f 20 53 51 4c 69 74 65 43 6f 6e 6e  er to SQLiteConn
6400: 65 63 74 69 6f 6e 20 43 2b 2b 20 6f 62 6a 65 63  ection C++ objec
6410: 74 20 2a 2f 0a 20 20 6a 6c 6f 6e 67 20 73 74 61  t */.  jlong sta
6420: 74 65 6d 65 6e 74 50 74 72 2c 20 20 20 20 20 20  tementPtr,      
6430: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6440: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 6d  r to sqlite3_stm
6450: 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6a 6f  t object */.  jo
6460: 62 6a 65 63 74 20 77 69 6e 2c 20 20 20 20 20 20  bject win,      
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6480: 20 54 68 65 20 43 75 72 73 6f 72 57 69 6e 64 6f   The CursorWindo
6490: 77 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  w object to popu
64a0: 6c 61 74 65 20 2a 2f 0a 20 20 6a 69 6e 74 20 73  late */.  jint s
64b0: 74 61 72 74 50 6f 73 2c 20 20 20 20 20 20 20 20  tartPos,        
64c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
64d0: 73 74 20 72 6f 77 20 74 6f 20 61 64 64 20 28 61  st row to add (a
64e0: 64 76 69 73 6f 72 79 29 20 2a 2f 0a 20 20 6a 69  dvisory) */.  ji
64f0: 6e 74 20 69 52 6f 77 52 65 71 75 69 72 65 64 2c  nt iRowRequired,
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6510: 20 52 65 71 75 69 72 65 64 20 72 6f 77 20 2a 2f   Required row */
6520: 0a 20 20 6a 62 6f 6f 6c 65 61 6e 20 63 6f 75 6e  .  jboolean coun
6530: 74 41 6c 6c 52 6f 77 73 0a 29 20 7b 0a 20 20 53  tAllRows.) {.  S
6540: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
6550: 2a 70 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72  *pConnection = r
6560: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c  einterpret_cast<
6570: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
6580: 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  *>(connectionPtr
6590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  );.  sqlite3_stm
65a0: 74 20 2a 70 53 74 6d 74 20 3d 20 72 65 69 6e 74  t *pStmt = reint
65b0: 65 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69  erpret_cast<sqli
65c0: 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65  te3_stmt*>(state
65d0: 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20 43 57 4d  mentPtr);..  CWM
65e0: 65 74 68 6f 64 20 61 4d 65 74 68 6f 64 5b 5d 20  ethod aMethod[] 
65f0: 3d 20 7b 0a 20 20 20 20 7b 30 2c 20 22 63 6c 65  = {.    {0, "cle
6600: 61 72 22 2c 20 20 20 20 20 20 20 20 20 22 28 29  ar",         "()
6610: 56 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 22 73 65  V"},.    {0, "se
6620: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 22 2c 20 22 28  tNumColumns", "(
6630: 49 29 5a 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 22  I)Z"},.    {0, "
6640: 61 6c 6c 6f 63 52 6f 77 22 2c 20 20 20 20 20 20  allocRow",      
6650: 22 28 29 5a 22 7d 2c 0a 20 20 20 20 7b 30 2c 20  "()Z"},.    {0, 
6660: 22 66 72 65 65 4c 61 73 74 52 6f 77 22 2c 20 20  "freeLastRow",  
6670: 20 22 28 29 56 22 7d 2c 0a 20 20 20 20 7b 30 2c   "()V"},.    {0,
6680: 20 22 70 75 74 4e 75 6c 6c 22 2c 20 20 20 20 20   "putNull",     
6690: 20 20 22 28 49 49 29 5a 22 7d 2c 0a 20 20 20 20    "(II)Z"},.    
66a0: 7b 30 2c 20 22 70 75 74 4c 6f 6e 67 22 2c 20 20  {0, "putLong",  
66b0: 20 20 20 20 20 22 28 4a 49 49 29 5a 22 7d 2c 0a       "(JII)Z"},.
66c0: 20 20 20 20 7b 30 2c 20 22 70 75 74 44 6f 75 62      {0, "putDoub
66d0: 6c 65 22 2c 20 20 20 20 20 22 28 44 49 49 29 5a  le",     "(DII)Z
66e0: 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 22 70 75 74  "},.    {0, "put
66f0: 53 74 72 69 6e 67 22 2c 20 20 20 20 20 22 28 4c  String",     "(L
6700: 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67  java/lang/String
6710: 3b 49 49 29 5a 22 7d 2c 0a 20 20 20 20 7b 30 2c  ;II)Z"},.    {0,
6720: 20 22 70 75 74 42 6c 6f 62 22 2c 20 20 20 20 20   "putBlob",     
6730: 20 20 22 28 5b 42 49 49 29 5a 22 7d 2c 0a 20 20    "([BII)Z"},.  
6740: 7d 3b 0a 20 20 6a 63 6c 61 73 73 20 63 6c 73 3b  };.  jclass cls;
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6760: 20 20 20 20 20 2f 2a 20 43 6c 61 73 73 20 61 6e       /* Class an
6770: 64 72 6f 69 64 2e 64 61 74 61 62 61 73 65 2e 43  droid.database.C
6780: 75 72 73 6f 72 57 69 6e 64 6f 77 20 2a 2f 0a 20  ursorWindow */. 
6790: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
67c0: 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
67d0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
67e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
67f0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
6800: 72 65 74 75 72 6e 65 64 20 62 79 20 70 53 74 6d  returned by pStm
6810: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  t */.  int nRow;
6820: 0a 20 20 6a 62 6f 6f 6c 65 61 6e 20 62 4f 6b 3b  .  jboolean bOk;
6830: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b 20 20  .  int iStart;  
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f 77 20     /* First row 
6860: 63 6f 70 69 65 64 20 74 6f 20 43 75 72 73 6f 72  copied to Cursor
6870: 57 69 6e 64 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 20  Window */..  /* 
6880: 4c 6f 63 61 74 65 20 61 6c 6c 20 72 65 71 75 69  Locate all requi
6890: 72 65 64 20 43 75 72 73 6f 72 57 69 6e 64 6f 77  red CursorWindow
68a0: 20 6d 65 74 68 6f 64 73 2e 20 2a 2f 0a 20 20 63   methods. */.  c
68b0: 6c 73 20 3d 20 70 45 6e 76 2d 3e 46 69 6e 64 43  ls = pEnv->FindC
68c0: 6c 61 73 73 28 22 61 6e 64 72 6f 69 64 2f 64 61  lass("android/da
68d0: 74 61 62 61 73 65 2f 43 75 72 73 6f 72 57 69 6e  tabase/CursorWin
68e0: 64 6f 77 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  dow");.  for(i=0
68f0: 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 4d 65 74  ; i<(sizeof(aMet
6900: 68 6f 64 29 2f 73 69 7a 65 6f 66 28 73 74 72 75  hod)/sizeof(stru
6910: 63 74 20 43 57 4d 65 74 68 6f 64 29 29 3b 20 69  ct CWMethod)); i
6920: 2b 2b 29 7b 0a 20 20 20 20 61 4d 65 74 68 6f 64  ++){.    aMethod
6930: 5b 69 5d 2e 69 64 20 3d 20 70 45 6e 76 2d 3e 47  [i].id = pEnv->G
6940: 65 74 4d 65 74 68 6f 64 49 44 28 63 6c 73 2c 20  etMethodID(cls, 
6950: 61 4d 65 74 68 6f 64 5b 69 5d 2e 7a 4e 61 6d 65  aMethod[i].zName
6960: 2c 20 61 4d 65 74 68 6f 64 5b 69 5d 2e 7a 53 69  , aMethod[i].zSi
6970: 67 29 3b 0a 20 20 20 20 69 66 28 20 61 4d 65 74  g);.    if( aMet
6980: 68 6f 64 5b 69 5d 2e 69 64 3d 3d 4e 55 4c 4c 20  hod[i].id==NULL 
6990: 29 7b 0a 20 20 20 20 20 20 6a 6e 69 54 68 72 6f  ){.      jniThro
69a0: 77 45 78 63 65 70 74 69 6f 6e 46 6d 74 28 70 45  wExceptionFmt(pE
69b0: 6e 76 2c 20 22 6a 61 76 61 2f 6c 61 6e 67 2f 45  nv, "java/lang/E
69c0: 78 63 65 70 74 69 6f 6e 22 2c 20 0a 20 20 20 20  xception", .    
69d0: 20 20 20 20 20 20 22 46 61 69 6c 65 64 20 74 6f        "Failed to
69e0: 20 66 69 6e 64 20 6d 65 74 68 6f 64 20 43 75 72   find method Cur
69f0: 73 6f 72 57 69 6e 64 6f 77 2e 25 73 28 29 22 2c  sorWindow.%s()",
6a00: 20 61 4d 65 74 68 6f 64 5b 69 5d 2e 7a 4e 61 6d   aMethod[i].zNam
6a10: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
6a20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6a30: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 53 65 74 20  .  }...  /* Set 
6a40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6a50: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 77 69 6e  lumns in the win
6a60: 64 6f 77 20 2a 2f 0a 20 20 62 4f 6b 20 3d 20 73  dow */.  bOk = s
6a70: 65 74 57 69 6e 64 6f 77 4e 75 6d 43 6f 6c 75 6d  etWindowNumColum
6a80: 6e 73 28 70 45 6e 76 2c 20 77 69 6e 2c 20 70 53  ns(pEnv, win, pS
6a90: 74 6d 74 2c 20 61 4d 65 74 68 6f 64 29 3b 0a 20  tmt, aMethod);. 
6aa0: 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
6ab0: 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 52 6f 77 20  turn 0;..  nRow 
6ac0: 3d 20 30 3b 0a 20 20 69 53 74 61 72 74 20 3d 20  = 0;.  iStart = 
6ad0: 73 74 61 72 74 50 6f 73 3b 0a 20 20 77 68 69 6c  startPos;.  whil
6ae0: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
6af0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
6b00: 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c  OW ){.    /* Onl
6b10: 79 20 63 6f 70 79 20 69 6e 20 72 6f 77 73 20 74  y copy in rows t
6b20: 68 61 74 20 6f 63 63 75 72 20 61 74 20 6f 72 20  hat occur at or 
6b30: 61 66 74 65 72 20 72 6f 77 20 69 6e 64 65 78 20  after row index 
6b40: 69 53 74 61 72 74 2e 20 2a 2f 0a 20 20 20 20 69  iStart. */.    i
6b50: 66 28 20 6e 52 6f 77 3e 3d 69 53 74 61 72 74 20  f( nRow>=iStart 
6b60: 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
6b70: 62 4f 6b 20 3d 20 63 6f 70 79 52 6f 77 54 6f 57  bOk = copyRowToW
6b80: 69 6e 64 6f 77 28 70 45 6e 76 2c 20 77 69 6e 2c  indow(pEnv, win,
6b90: 20 28 6e 52 6f 77 20 2d 20 69 53 74 61 72 74 29   (nRow - iStart)
6ba0: 2c 20 70 53 74 6d 74 2c 20 61 4d 65 74 68 6f 64  , pStmt, aMethod
6bb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
6bc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
6bd0: 2a 20 54 68 65 20 43 75 72 73 6f 72 57 69 6e 64  * The CursorWind
6be0: 6f 77 20 6f 62 6a 65 63 74 20 72 61 6e 20 6f 75  ow object ran ou
6bf0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 49 66 20  t of memory. If 
6c00: 72 6f 77 20 69 52 6f 77 52 65 71 75 69 72 65 64  row iRowRequired
6c10: 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
6c20: 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79  not successfully
6c30: 20 61 64 64 65 64 20 62 65 66 6f 72 65 20 74 68   added before th
6c40: 69 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  is happened, cle
6c50: 61 72 20 74 68 65 20 43 75 72 73 6f 72 57 69 6e  ar the CursorWin
6c60: 64 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  dow.        ** a
6c70: 6e 64 20 74 72 79 20 74 6f 20 61 64 64 20 74 68  nd try to add th
6c80: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 67  e current row ag
6c90: 61 69 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ain.  */.       
6ca0: 20 69 66 28 20 6e 52 6f 77 3c 3d 69 52 6f 77 52   if( nRow<=iRowR
6cb0: 65 71 75 69 72 65 64 20 29 7b 0a 20 20 20 20 20  equired ){.     
6cc0: 20 20 20 20 20 62 4f 6b 20 3d 20 73 65 74 57 69       bOk = setWi
6cd0: 6e 64 6f 77 4e 75 6d 43 6f 6c 75 6d 6e 73 28 70  ndowNumColumns(p
6ce0: 45 6e 76 2c 20 77 69 6e 2c 20 70 53 74 6d 74 2c  Env, win, pStmt,
6cf0: 20 61 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20 20   aMethod);.     
6d00: 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20       if( bOk==0 
6d10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6d20: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
6d30: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  mt);.           
6d40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6d60: 20 69 53 74 61 72 74 20 3d 20 6e 52 6f 77 3b 0a   iStart = nRow;.
6d70: 20 20 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20            bOk = 
6d80: 63 6f 70 79 52 6f 77 54 6f 57 69 6e 64 6f 77 28  copyRowToWindow(
6d90: 70 45 6e 76 2c 20 77 69 6e 2c 20 28 6e 52 6f 77  pEnv, win, (nRow
6da0: 20 2d 20 69 53 74 61 72 74 29 2c 20 70 53 74 6d   - iStart), pStm
6db0: 74 2c 20 61 4d 65 74 68 6f 64 29 3b 0a 20 20 20  t, aMethod);.   
6dc0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
6dd0: 2f 2a 20 49 66 20 74 68 65 20 43 75 72 73 6f 72  /* If the Cursor
6de0: 57 69 6e 64 6f 77 20 69 73 20 73 74 69 6c 6c 20  Window is still 
6df0: 66 75 6c 6c 20 61 6e 64 20 74 68 65 20 63 6f 75  full and the cou
6e00: 6e 74 41 6c 6c 52 6f 77 73 20 66 6c 61 67 20 69  ntAllRows flag i
6e10: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
6e20: 20 73 65 74 2c 20 62 72 65 61 6b 20 6f 75 74 20   set, break out 
6e30: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 68 65 72 65  of the loop here
6e40: 2e 20 49 66 20 63 6f 75 6e 74 41 6c 6c 52 6f 77  . If countAllRow
6e50: 73 20 69 73 20 73 65 74 2c 20 63 6f 6e 74 69 6e  s is set, contin
6e60: 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ue.        ** so
6e70: 20 61 73 20 74 6f 20 73 65 74 20 76 61 72 69 61   as to set varia
6e80: 62 6c 65 20 6e 52 6f 77 20 63 6f 72 72 65 63 74  ble nRow correct
6e90: 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ly.  */.        
6ea0: 69 66 28 20 62 4f 6b 3d 3d 30 20 26 26 20 63 6f  if( bOk==0 && co
6eb0: 75 6e 74 41 6c 6c 52 6f 77 73 3d 3d 30 20 29 20  untAllRows==0 ) 
6ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6ed0: 20 20 20 7d 0a 0a 20 20 20 20 6e 52 6f 77 2b 2b     }..    nRow++
6ee0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  ;.  }..  /* Fina
6ef0: 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65  lize the stateme
6f00: 6e 74 2e 20 49 66 20 74 68 69 73 20 69 6e 64 69  nt. If this indi
6f10: 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6f  cates an error o
6f20: 63 63 75 72 72 65 64 2c 20 74 68 72 6f 77 20 61  ccurred, throw a
6f30: 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 45 78 63  n.  ** SQLiteExc
6f40: 65 70 74 69 6f 6e 20 65 78 63 65 70 74 69 6f 6e  eption exception
6f50: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
6f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
6f70: 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21  Stmt);.  if( rc!
6f80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6f90: 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f    throw_sqlite3_
6fa0: 65 78 63 65 70 74 69 6f 6e 28 70 45 6e 76 2c 20  exception(pEnv, 
6fb0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
6fc0: 65 28 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 72  e(pStmt));.    r
6fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
6fe0: 6a 6c 6f 6e 67 20 6c 52 65 74 20 3d 20 6a 6c 6f  jlong lRet = jlo
6ff0: 6e 67 28 69 53 74 61 72 74 29 20 3c 3c 20 33 32  ng(iStart) << 32
7000: 20 7c 20 6a 6c 6f 6e 67 28 6e 52 6f 77 29 3b 0a   | jlong(nRow);.
7010: 20 20 72 65 74 75 72 6e 20 6c 52 65 74 3b 0a 7d    return lRet;.}
7020: 0a 0a 73 74 61 74 69 63 20 6a 69 6e 74 20 6e 61  ..static jint na
7030: 74 69 76 65 47 65 74 44 62 4c 6f 6f 6b 61 73 69  tiveGetDbLookasi
7040: 64 65 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20  de(JNIEnv* env, 
7050: 6a 6f 62 6a 65 63 74 20 63 6c 61 7a 7a 2c 20 6a  jobject clazz, j
7060: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
7070: 74 72 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65  tr) {.    SQLite
7080: 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e  Connection* conn
7090: 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72  ection = reinter
70a0: 70 72 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65  pret_cast<SQLite
70b0: 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e  Connection*>(con
70c0: 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 0a 20 20  nectionPtr);..  
70d0: 20 20 69 6e 74 20 63 75 72 20 3d 20 2d 31 3b 0a    int cur = -1;.
70e0: 20 20 20 20 69 6e 74 20 75 6e 75 73 65 64 3b 0a      int unused;.
70f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
7100: 74 61 74 75 73 28 63 6f 6e 6e 65 63 74 69 6f 6e  tatus(connection
7110: 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  ->db, SQLITE_DBS
7120: 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
7130: 55 53 45 44 2c 20 26 63 75 72 2c 20 26 75 6e 75  USED, &cur, &unu
7140: 73 65 64 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  sed, 0);.    ret
7150: 75 72 6e 20 63 75 72 3b 0a 7d 0a 0a 73 74 61 74  urn cur;.}..stat
7160: 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 43 61  ic void nativeCa
7170: 6e 63 65 6c 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  ncel(JNIEnv* env
7180: 2c 20 6a 6f 62 6a 65 63 74 20 63 6c 61 7a 7a 2c  , jobject clazz,
7190: 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   jlong connectio
71a0: 6e 50 74 72 29 20 7b 0a 20 20 20 20 53 51 4c 69  nPtr) {.    SQLi
71b0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f  teConnection* co
71c0: 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74  nnection = reint
71d0: 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c 69  erpret_cast<SQLi
71e0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63  teConnection*>(c
71f0: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20  onnectionPtr);. 
7200: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 63     connection->c
7210: 61 6e 63 65 6c 65 64 20 3d 20 74 72 75 65 3b 0a  anceled = true;.
7220: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  }..static void n
7230: 61 74 69 76 65 52 65 73 65 74 43 61 6e 63 65 6c  ativeResetCancel
7240: 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 6f  (JNIEnv* env, jo
7250: 62 6a 65 63 74 20 63 6c 61 7a 7a 2c 20 6a 6c 6f  bject clazz, jlo
7260: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  ng connectionPtr
7270: 2c 0a 20 20 20 20 20 20 20 20 6a 62 6f 6f 6c 65  ,.        jboole
7280: 61 6e 20 63 61 6e 63 65 6c 61 62 6c 65 29 20 7b  an cancelable) {
7290: 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65  .    SQLiteConne
72a0: 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f  ction* connectio
72b0: 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f  n = reinterpret_
72c0: 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65  cast<SQLiteConne
72d0: 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69  ction*>(connecti
72e0: 6f 6e 50 74 72 29 3b 0a 20 20 20 20 63 6f 6e 6e  onPtr);.    conn
72f0: 65 63 74 69 6f 6e 2d 3e 63 61 6e 63 65 6c 65 64  ection->canceled
7300: 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20 69   = false;..    i
7310: 66 20 28 63 61 6e 63 65 6c 61 62 6c 65 29 20 7b  f (cancelable) {
7320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7330: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
7340: 72 28 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62  r(connection->db
7350: 2c 20 34 2c 20 73 71 6c 69 74 65 50 72 6f 67 72  , 4, sqliteProgr
7360: 65 73 73 48 61 6e 64 6c 65 72 43 61 6c 6c 62 61  essHandlerCallba
7370: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
7380: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b      connection);
7390: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
73a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
73b0: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 63  ogress_handler(c
73c0: 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 30  onnection->db, 0
73d0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20  , NULL, NULL);. 
73e0: 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 6a     }.}..static j
73f0: 62 6f 6f 6c 65 61 6e 20 6e 61 74 69 76 65 48 61  boolean nativeHa
7400: 73 43 6f 64 65 63 28 4a 4e 49 45 6e 76 2a 20 65  sCodec(JNIEnv* e
7410: 6e 76 2c 20 6a 6f 62 6a 65 63 74 20 63 6c 61 7a  nv, jobject claz
7420: 7a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  z){.#ifdef SQLIT
7430: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 72 65  E_HAS_CODEC.  re
7440: 74 75 72 6e 20 74 72 75 65 3b 0a 23 65 6c 73 65  turn true;.#else
7450: 0a 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b  .  return false;
7460: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 73 74 61 74  .#endif.}...stat
7470: 69 63 20 4a 4e 49 4e 61 74 69 76 65 4d 65 74 68  ic JNINativeMeth
7480: 6f 64 20 73 4d 65 74 68 6f 64 73 5b 5d 20 3d 0a  od sMethods[] =.
7490: 7b 0a 20 20 20 20 2f 2a 20 6e 61 6d 65 2c 20 73  {.    /* name, s
74a0: 69 67 6e 61 74 75 72 65 2c 20 66 75 6e 63 50 74  ignature, funcPt
74b0: 72 20 2a 2f 0a 20 20 20 20 7b 20 22 6e 61 74 69  r */.    { "nati
74c0: 76 65 4f 70 65 6e 22 2c 20 22 28 4c 6a 61 76 61  veOpen", "(Ljava
74d0: 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 49 4c 6a  /lang/String;ILj
74e0: 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b  ava/lang/String;
74f0: 5a 5a 29 4a 22 2c 0a 20 20 20 20 20 20 20 20 20  ZZ)J",.         
7500: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
7510: 4f 70 65 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 6e  Open },.    { "n
7520: 61 74 69 76 65 43 6c 6f 73 65 22 2c 20 22 28 4a  ativeClose", "(J
7530: 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )V",.           
7540: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 43 6c   (void*)nativeCl
7550: 6f 73 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61  ose },.    { "na
7560: 74 69 76 65 52 65 67 69 73 74 65 72 43 75 73 74  tiveRegisterCust
7570: 6f 6d 46 75 6e 63 74 69 6f 6e 22 2c 20 22 28 4a  omFunction", "(J
7580: 4c 6f 72 67 2f 73 71 6c 69 74 65 2f 64 61 74 61  Lorg/sqlite/data
7590: 62 61 73 65 2f 73 71 6c 69 74 65 2f 53 51 4c 69  base/sqlite/SQLi
75a0: 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e  teCustomFunction
75b0: 3b 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ;)V",.          
75c0: 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 52    (void*)nativeR
75d0: 65 67 69 73 74 65 72 43 75 73 74 6f 6d 46 75 6e  egisterCustomFun
75e0: 63 74 69 6f 6e 20 7d 2c 0a 20 20 20 20 7b 20 22  ction },.    { "
75f0: 6e 61 74 69 76 65 52 65 67 69 73 74 65 72 4c 6f  nativeRegisterLo
7600: 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f 72 73  calizedCollators
7610: 22 2c 20 22 28 4a 4c 6a 61 76 61 2f 6c 61 6e 67  ", "(JLjava/lang
7620: 2f 53 74 72 69 6e 67 3b 29 56 22 2c 0a 20 20 20  /String;)V",.   
7630: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
7640: 6e 61 74 69 76 65 52 65 67 69 73 74 65 72 4c 6f  nativeRegisterLo
7650: 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f 72 73  calizedCollators
7660: 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76   },.    { "nativ
7670: 65 50 72 65 70 61 72 65 53 74 61 74 65 6d 65 6e  ePrepareStatemen
7680: 74 22 2c 20 22 28 4a 4c 6a 61 76 61 2f 6c 61 6e  t", "(JLjava/lan
7690: 67 2f 53 74 72 69 6e 67 3b 29 4a 22 2c 0a 20 20  g/String;)J",.  
76a0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
76b0: 29 6e 61 74 69 76 65 50 72 65 70 61 72 65 53 74  )nativePrepareSt
76c0: 61 74 65 6d 65 6e 74 20 7d 2c 0a 20 20 20 20 7b  atement },.    {
76d0: 20 22 6e 61 74 69 76 65 46 69 6e 61 6c 69 7a 65   "nativeFinalize
76e0: 53 74 61 74 65 6d 65 6e 74 22 2c 20 22 28 4a 4a  Statement", "(JJ
76f0: 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )V",.           
7700: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 46 69   (void*)nativeFi
7710: 6e 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e 74 20  nalizeStatement 
7720: 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65  },.    { "native
7730: 47 65 74 50 61 72 61 6d 65 74 65 72 43 6f 75 6e  GetParameterCoun
7740: 74 22 2c 20 22 28 4a 4a 29 49 22 2c 0a 20 20 20  t", "(JJ)I",.   
7750: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
7760: 6e 61 74 69 76 65 47 65 74 50 61 72 61 6d 65 74  nativeGetParamet
7770: 65 72 43 6f 75 6e 74 20 7d 2c 0a 20 20 20 20 7b  erCount },.    {
7780: 20 22 6e 61 74 69 76 65 49 73 52 65 61 64 4f 6e   "nativeIsReadOn
7790: 6c 79 22 2c 20 22 28 4a 4a 29 5a 22 2c 0a 20 20  ly", "(JJ)Z",.  
77a0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
77b0: 29 6e 61 74 69 76 65 49 73 52 65 61 64 4f 6e 6c  )nativeIsReadOnl
77c0: 79 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69  y },.    { "nati
77d0: 76 65 47 65 74 43 6f 6c 75 6d 6e 43 6f 75 6e 74  veGetColumnCount
77e0: 22 2c 20 22 28 4a 4a 29 49 22 2c 0a 20 20 20 20  ", "(JJ)I",.    
77f0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e          (void*)n
7800: 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e 43 6f  ativeGetColumnCo
7810: 75 6e 74 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61  unt },.    { "na
7820: 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  tiveGetColumnNam
7830: 65 22 2c 20 22 28 4a 4a 49 29 4c 6a 61 76 61 2f  e", "(JJI)Ljava/
7840: 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 22 2c 0a 20  lang/String;",. 
7850: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
7860: 2a 29 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d  *)nativeGetColum
7870: 6e 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 7b 20 22  nName },.    { "
7880: 6e 61 74 69 76 65 42 69 6e 64 4e 75 6c 6c 22 2c  nativeBindNull",
7890: 20 22 28 4a 4a 49 29 56 22 2c 0a 20 20 20 20 20   "(JJI)V",.     
78a0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e 61         (void*)na
78b0: 74 69 76 65 42 69 6e 64 4e 75 6c 6c 20 7d 2c 0a  tiveBindNull },.
78c0: 20 20 20 20 7b 20 22 6e 61 74 69 76 65 42 69 6e      { "nativeBin
78d0: 64 4c 6f 6e 67 22 2c 20 22 28 4a 4a 49 4a 29 56  dLong", "(JJIJ)V
78e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
78f0: 76 6f 69 64 2a 29 6e 61 74 69 76 65 42 69 6e 64  void*)nativeBind
7900: 4c 6f 6e 67 20 7d 2c 0a 20 20 20 20 7b 20 22 6e  Long },.    { "n
7910: 61 74 69 76 65 42 69 6e 64 44 6f 75 62 6c 65 22  ativeBindDouble"
7920: 2c 20 22 28 4a 4a 49 44 29 56 22 2c 0a 20 20 20  , "(JJID)V",.   
7930: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
7940: 6e 61 74 69 76 65 42 69 6e 64 44 6f 75 62 6c 65  nativeBindDouble
7950: 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76   },.    { "nativ
7960: 65 42 69 6e 64 53 74 72 69 6e 67 22 2c 20 22 28  eBindString", "(
7970: 4a 4a 49 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74  JJILjava/lang/St
7980: 72 69 6e 67 3b 29 56 22 2c 0a 20 20 20 20 20 20  ring;)V",.      
7990: 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e 61 74        (void*)nat
79a0: 69 76 65 42 69 6e 64 53 74 72 69 6e 67 20 7d 2c  iveBindString },
79b0: 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 42 69  .    { "nativeBi
79c0: 6e 64 42 6c 6f 62 22 2c 20 22 28 4a 4a 49 5b 42  ndBlob", "(JJI[B
79d0: 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )V",.           
79e0: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 42 69   (void*)nativeBi
79f0: 6e 64 42 6c 6f 62 20 7d 2c 0a 20 20 20 20 7b 20  ndBlob },.    { 
7a00: 22 6e 61 74 69 76 65 52 65 73 65 74 53 74 61 74  "nativeResetStat
7a10: 65 6d 65 6e 74 41 6e 64 43 6c 65 61 72 42 69 6e  ementAndClearBin
7a20: 64 69 6e 67 73 22 2c 20 22 28 4a 4a 29 56 22 2c  dings", "(JJ)V",
7a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
7a40: 69 64 2a 29 6e 61 74 69 76 65 52 65 73 65 74 53  id*)nativeResetS
7a50: 74 61 74 65 6d 65 6e 74 41 6e 64 43 6c 65 61 72  tatementAndClear
7a60: 42 69 6e 64 69 6e 67 73 20 7d 2c 0a 20 20 20 20  Bindings },.    
7a70: 7b 20 22 6e 61 74 69 76 65 45 78 65 63 75 74 65  { "nativeExecute
7a80: 22 2c 20 22 28 4a 4a 29 56 22 2c 0a 20 20 20 20  ", "(JJ)V",.    
7a90: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e          (void*)n
7aa0: 61 74 69 76 65 45 78 65 63 75 74 65 20 7d 2c 0a  ativeExecute },.
7ab0: 20 20 20 20 7b 20 22 6e 61 74 69 76 65 45 78 65      { "nativeExe
7ac0: 63 75 74 65 46 6f 72 4c 6f 6e 67 22 2c 20 22 28  cuteForLong", "(
7ad0: 4a 4a 29 4a 22 2c 0a 20 20 20 20 20 20 20 20 20  JJ)J",.         
7ae0: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
7af0: 45 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 20 7d  ExecuteForLong }
7b00: 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 45  ,.    { "nativeE
7b10: 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67 22  xecuteForString"
7b20: 2c 20 22 28 4a 4a 29 4c 6a 61 76 61 2f 6c 61 6e  , "(JJ)Ljava/lan
7b30: 67 2f 53 74 72 69 6e 67 3b 22 2c 0a 20 20 20 20  g/String;",.    
7b40: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e          (void*)n
7b50: 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 53  ativeExecuteForS
7b60: 74 72 69 6e 67 20 7d 2c 0a 20 20 20 20 7b 20 22  tring },.    { "
7b70: 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72  nativeExecuteFor
7b80: 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74  BlobFileDescript
7b90: 6f 72 22 2c 20 22 28 4a 4a 29 49 22 2c 0a 20 20  or", "(JJ)I",.  
7ba0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
7bb0: 29 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f  )nativeExecuteFo
7bc0: 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70  rBlobFileDescrip
7bd0: 74 6f 72 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61  tor },.    { "na
7be0: 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 43 68  tiveExecuteForCh
7bf0: 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74 22 2c 20  angedRowCount", 
7c00: 22 28 4a 4a 29 49 22 2c 0a 20 20 20 20 20 20 20  "(JJ)I",.       
7c10: 20 20 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69       (void*)nati
7c20: 76 65 45 78 65 63 75 74 65 46 6f 72 43 68 61 6e  veExecuteForChan
7c30: 67 65 64 52 6f 77 43 6f 75 6e 74 20 7d 2c 0a 20  gedRowCount },. 
7c40: 20 20 20 7b 20 22 6e 61 74 69 76 65 45 78 65 63     { "nativeExec
7c50: 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72 74  uteForLastInsert
7c60: 65 64 52 6f 77 49 64 22 2c 20 22 28 4a 4a 29 4a  edRowId", "(JJ)J
7c70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
7c80: 76 6f 69 64 2a 29 6e 61 74 69 76 65 45 78 65 63  void*)nativeExec
7c90: 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72 74  uteForLastInsert
7ca0: 65 64 52 6f 77 49 64 20 7d 2c 0a 20 20 20 20 7b  edRowId },.    {
7cb0: 20 22 6e 61 74 69 76 65 45 78 65 63 75 74 65 46   "nativeExecuteF
7cc0: 6f 72 43 75 72 73 6f 72 57 69 6e 64 6f 77 22 2c  orCursorWindow",
7cd0: 20 22 28 4a 4a 4c 61 6e 64 72 6f 69 64 2f 64 61   "(JJLandroid/da
7ce0: 74 61 62 61 73 65 2f 43 75 72 73 6f 72 57 69 6e  tabase/CursorWin
7cf0: 64 6f 77 3b 49 49 5a 29 4a 22 2c 0a 20 20 20 20  dow;IIZ)J",.    
7d00: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e          (void*)n
7d10: 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 43  ativeExecuteForC
7d20: 75 72 73 6f 72 57 69 6e 64 6f 77 20 7d 2c 0a 20  ursorWindow },. 
7d30: 20 20 20 7b 20 22 6e 61 74 69 76 65 47 65 74 44     { "nativeGetD
7d40: 62 4c 6f 6f 6b 61 73 69 64 65 22 2c 20 22 28 4a  bLookaside", "(J
7d50: 29 49 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )I",.           
7d60: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 47 65   (void*)nativeGe
7d70: 74 44 62 4c 6f 6f 6b 61 73 69 64 65 20 7d 2c 0a  tDbLookaside },.
7d80: 20 20 20 20 7b 20 22 6e 61 74 69 76 65 43 61 6e      { "nativeCan
7d90: 63 65 6c 22 2c 20 22 28 4a 29 56 22 2c 0a 20 20  cel", "(J)V",.  
7da0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
7db0: 29 6e 61 74 69 76 65 43 61 6e 63 65 6c 20 7d 2c  )nativeCancel },
7dc0: 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 52 65  .    { "nativeRe
7dd0: 73 65 74 43 61 6e 63 65 6c 22 2c 20 22 28 4a 5a  setCancel", "(JZ
7de0: 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )V",.           
7df0: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 52 65   (void*)nativeRe
7e00: 73 65 74 43 61 6e 63 65 6c 20 7d 2c 0a 0a 20 20  setCancel },..  
7e10: 20 20 7b 20 22 6e 61 74 69 76 65 48 61 73 43 6f    { "nativeHasCo
7e20: 64 65 63 22 2c 20 22 28 29 5a 22 2c 20 28 76 6f  dec", "()Z", (vo
7e30: 69 64 2a 29 6e 61 74 69 76 65 48 61 73 43 6f 64  id*)nativeHasCod
7e40: 65 63 20 7d 2c 0a 7d 3b 0a 0a 23 64 65 66 69 6e  ec },.};..#defin
7e50: 65 20 46 49 4e 44 5f 43 4c 41 53 53 28 76 61 72  e FIND_CLASS(var
7e60: 2c 20 63 6c 61 73 73 4e 61 6d 65 29 20 5c 0a 20  , className) \. 
7e70: 20 20 20 20 20 20 20 76 61 72 20 3d 20 65 6e 76         var = env
7e80: 2d 3e 46 69 6e 64 43 6c 61 73 73 28 63 6c 61 73  ->FindClass(clas
7e90: 73 4e 61 6d 65 29 3b 20 5c 0a 20 20 20 20 20 20  sName); \.      
7ea0: 20 20 4c 4f 47 5f 46 41 54 41 4c 5f 49 46 28 21    LOG_FATAL_IF(!
7eb0: 20 76 61 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f   var, "Unable to
7ec0: 20 66 69 6e 64 20 63 6c 61 73 73 20 22 20 63 6c   find class " cl
7ed0: 61 73 73 4e 61 6d 65 29 3b 0a 0a 23 64 65 66 69  assName);..#defi
7ee0: 6e 65 20 47 45 54 5f 4d 45 54 48 4f 44 5f 49 44  ne GET_METHOD_ID
7ef0: 28 76 61 72 2c 20 63 6c 61 7a 7a 2c 20 6d 65 74  (var, clazz, met
7f00: 68 6f 64 4e 61 6d 65 2c 20 66 69 65 6c 64 44 65  hodName, fieldDe
7f10: 73 63 72 69 70 74 6f 72 29 20 5c 0a 20 20 20 20  scriptor) \.    
7f20: 20 20 20 20 76 61 72 20 3d 20 65 6e 76 2d 3e 47      var = env->G
7f30: 65 74 4d 65 74 68 6f 64 49 44 28 63 6c 61 7a 7a  etMethodID(clazz
7f40: 2c 20 6d 65 74 68 6f 64 4e 61 6d 65 2c 20 66 69  , methodName, fi
7f50: 65 6c 64 44 65 73 63 72 69 70 74 6f 72 29 3b 20  eldDescriptor); 
7f60: 5c 0a 20 20 20 20 20 20 20 20 4c 4f 47 5f 46 41  \.        LOG_FA
7f70: 54 41 4c 5f 49 46 28 21 20 76 61 72 2c 20 22 55  TAL_IF(! var, "U
7f80: 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 6d 65  nable to find me
7f90: 74 68 6f 64 22 20 6d 65 74 68 6f 64 4e 61 6d 65  thod" methodName
7fa0: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 47 45 54 5f  );..#define GET_
7fb0: 46 49 45 4c 44 5f 49 44 28 76 61 72 2c 20 63 6c  FIELD_ID(var, cl
7fc0: 61 7a 7a 2c 20 66 69 65 6c 64 4e 61 6d 65 2c 20  azz, fieldName, 
7fd0: 66 69 65 6c 64 44 65 73 63 72 69 70 74 6f 72 29  fieldDescriptor)
7fe0: 20 5c 0a 20 20 20 20 20 20 20 20 76 61 72 20 3d   \.        var =
7ff0: 20 65 6e 76 2d 3e 47 65 74 46 69 65 6c 64 49 44   env->GetFieldID
8000: 28 63 6c 61 7a 7a 2c 20 66 69 65 6c 64 4e 61 6d  (clazz, fieldNam
8010: 65 2c 20 66 69 65 6c 64 44 65 73 63 72 69 70 74  e, fieldDescript
8020: 6f 72 29 3b 20 5c 0a 20 20 20 20 20 20 20 20 4c  or); \.        L
8030: 4f 47 5f 46 41 54 41 4c 5f 49 46 28 21 20 76 61  OG_FATAL_IF(! va
8040: 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 66 69  r, "Unable to fi
8050: 6e 64 20 66 69 65 6c 64 20 22 20 66 69 65 6c 64  nd field " field
8060: 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20 72 65 67 69  Name);..int regi
8070: 73 74 65 72 5f 61 6e 64 72 6f 69 64 5f 64 61 74  ster_android_dat
8080: 61 62 61 73 65 5f 53 51 4c 69 74 65 43 6f 6e 6e  abase_SQLiteConn
8090: 65 63 74 69 6f 6e 28 4a 4e 49 45 6e 76 20 2a 65  ection(JNIEnv *e
80a0: 6e 76 29 0a 7b 0a 20 20 20 20 6a 63 6c 61 73 73  nv).{.    jclass
80b0: 20 63 6c 61 7a 7a 3b 0a 20 20 20 20 46 49 4e 44   clazz;.    FIND
80c0: 5f 43 4c 41 53 53 28 63 6c 61 7a 7a 2c 20 22 6f  _CLASS(clazz, "o
80d0: 72 67 2f 73 71 6c 69 74 65 2f 64 61 74 61 62 61  rg/sqlite/databa
80e0: 73 65 2f 73 71 6c 69 74 65 2f 53 51 4c 69 74 65  se/sqlite/SQLite
80f0: 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 22 29  CustomFunction")
8100: 3b 0a 0a 20 20 20 20 47 45 54 5f 46 49 45 4c 44  ;..    GET_FIELD
8110: 5f 49 44 28 67 53 51 4c 69 74 65 43 75 73 74 6f  _ID(gSQLiteCusto
8120: 6d 46 75 6e 63 74 69 6f 6e 43 6c 61 73 73 49 6e  mFunctionClassIn
8130: 66 6f 2e 6e 61 6d 65 2c 20 63 6c 61 7a 7a 2c 0a  fo.name, clazz,.
8140: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 61 6d              "nam
8150: 65 22 2c 20 22 4c 6a 61 76 61 2f 6c 61 6e 67 2f  e", "Ljava/lang/
8160: 53 74 72 69 6e 67 3b 22 29 3b 0a 20 20 20 20 47  String;");.    G
8170: 45 54 5f 46 49 45 4c 44 5f 49 44 28 67 53 51 4c  ET_FIELD_ID(gSQL
8180: 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f  iteCustomFunctio
8190: 6e 43 6c 61 73 73 49 6e 66 6f 2e 6e 75 6d 41 72  nClassInfo.numAr
81a0: 67 73 2c 20 63 6c 61 7a 7a 2c 0a 20 20 20 20 20  gs, clazz,.     
81b0: 20 20 20 20 20 20 20 22 6e 75 6d 41 72 67 73 22         "numArgs"
81c0: 2c 20 22 49 22 29 3b 0a 20 20 20 20 47 45 54 5f  , "I");.    GET_
81d0: 4d 45 54 48 4f 44 5f 49 44 28 67 53 51 4c 69 74  METHOD_ID(gSQLit
81e0: 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 43  eCustomFunctionC
81f0: 6c 61 73 73 49 6e 66 6f 2e 64 69 73 70 61 74 63  lassInfo.dispatc
8200: 68 43 61 6c 6c 62 61 63 6b 2c 0a 20 20 20 20 20  hCallback,.     
8210: 20 20 20 20 20 20 20 63 6c 61 7a 7a 2c 20 22 64         clazz, "d
8220: 69 73 70 61 74 63 68 43 61 6c 6c 62 61 63 6b 22  ispatchCallback"
8230: 2c 20 22 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f  , "([Ljava/lang/
8240: 53 74 72 69 6e 67 3b 29 56 22 29 3b 0a 0a 20 20  String;)V");..  
8250: 20 20 46 49 4e 44 5f 43 4c 41 53 53 28 63 6c 61    FIND_CLASS(cla
8260: 7a 7a 2c 20 22 6a 61 76 61 2f 6c 61 6e 67 2f 53  zz, "java/lang/S
8270: 74 72 69 6e 67 22 29 3b 0a 20 20 20 20 67 53 74  tring");.    gSt
8280: 72 69 6e 67 43 6c 61 73 73 49 6e 66 6f 2e 63 6c  ringClassInfo.cl
8290: 61 7a 7a 20 3d 20 6a 63 6c 61 73 73 28 65 6e 76  azz = jclass(env
82a0: 2d 3e 4e 65 77 47 6c 6f 62 61 6c 52 65 66 28 63  ->NewGlobalRef(c
82b0: 6c 61 7a 7a 29 29 3b 0a 0a 20 20 20 20 72 65 74  lazz));..    ret
82c0: 75 72 6e 20 6a 6e 69 52 65 67 69 73 74 65 72 4e  urn jniRegisterN
82d0: 61 74 69 76 65 4d 65 74 68 6f 64 73 28 65 6e 76  ativeMethods(env
82e0: 2c 20 0a 20 20 20 20 20 20 20 20 22 6f 72 67 2f  , .        "org/
82f0: 73 71 6c 69 74 65 2f 64 61 74 61 62 61 73 65 2f  sqlite/database/
8300: 73 71 6c 69 74 65 2f 53 51 4c 69 74 65 43 6f 6e  sqlite/SQLiteCon
8310: 6e 65 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20  nection",.      
8320: 20 20 73 4d 65 74 68 6f 64 73 2c 20 4e 45 4c 45    sMethods, NELE
8330: 4d 28 73 4d 65 74 68 6f 64 73 29 0a 20 20 20 20  M(sMethods).    
8340: 29 3b 0a 7d 0a 0a 65 78 74 65 72 6e 20 69 6e 74  );.}..extern int
8350: 20 72 65 67 69 73 74 65 72 5f 61 6e 64 72 6f 69   register_androi
8360: 64 5f 64 61 74 61 62 61 73 65 5f 53 51 4c 69 74  d_database_SQLit
8370: 65 47 6c 6f 62 61 6c 28 4a 4e 49 45 6e 76 20 2a  eGlobal(JNIEnv *
8380: 65 6e 76 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74  env);.extern int
8390: 20 72 65 67 69 73 74 65 72 5f 61 6e 64 72 6f 69   register_androi
83a0: 64 5f 64 61 74 61 62 61 73 65 5f 53 51 4c 69 74  d_database_SQLit
83b0: 65 44 65 62 75 67 28 4a 4e 49 45 6e 76 20 2a 65  eDebug(JNIEnv *e
83c0: 6e 76 29 3b 0a 0a 7d 20 2f 2f 20 6e 61 6d 65 73  nv);..} // names
83d0: 70 61 63 65 20 61 6e 64 72 6f 69 64 0a 0a 65 78  pace android..ex
83e0: 74 65 72 6e 20 22 43 22 20 4a 4e 49 45 58 50 4f  tern "C" JNIEXPO
83f0: 52 54 20 6a 69 6e 74 20 4a 4e 49 43 41 4c 4c 20  RT jint JNICALL 
8400: 4a 4e 49 5f 4f 6e 4c 6f 61 64 28 4a 61 76 61 56  JNI_OnLoad(JavaV
8410: 4d 2a 20 76 6d 2c 20 76 6f 69 64 2a 20 72 65 73  M* vm, void* res
8420: 65 72 76 65 64 29 20 7b 0a 20 20 4a 4e 49 45 6e  erved) {.  JNIEn
8430: 76 20 2a 65 6e 76 20 3d 20 30 3b 0a 0a 20 20 61  v *env = 0;..  a
8440: 6e 64 72 6f 69 64 3a 3a 67 70 4a 61 76 61 56 4d  ndroid::gpJavaVM
8450: 20 3d 20 76 6d 3b 0a 20 20 76 6d 2d 3e 47 65 74   = vm;.  vm->Get
8460: 45 6e 76 28 28 76 6f 69 64 2a 2a 29 26 65 6e 76  Env((void**)&env
8470: 2c 20 4a 4e 49 5f 56 45 52 53 49 4f 4e 5f 31 5f  , JNI_VERSION_1_
8480: 34 29 3b 0a 0a 20 20 61 6e 64 72 6f 69 64 3a 3a  4);..  android::
8490: 72 65 67 69 73 74 65 72 5f 61 6e 64 72 6f 69 64  register_android
84a0: 5f 64 61 74 61 62 61 73 65 5f 53 51 4c 69 74 65  _database_SQLite
84b0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 65 6e 76 29 3b  Connection(env);
84c0: 0a 20 20 61 6e 64 72 6f 69 64 3a 3a 72 65 67 69  .  android::regi
84d0: 73 74 65 72 5f 61 6e 64 72 6f 69 64 5f 64 61 74  ster_android_dat
84e0: 61 62 61 73 65 5f 53 51 4c 69 74 65 44 65 62 75  abase_SQLiteDebu
84f0: 67 28 65 6e 76 29 3b 0a 20 20 61 6e 64 72 6f 69  g(env);.  androi
8500: 64 3a 3a 72 65 67 69 73 74 65 72 5f 61 6e 64 72  d::register_andr
8510: 6f 69 64 5f 64 61 74 61 62 61 73 65 5f 53 51 4c  oid_database_SQL
8520: 69 74 65 47 6c 6f 62 61 6c 28 65 6e 76 29 3b 0a  iteGlobal(env);.
8530: 0a 20 20 72 65 74 75 72 6e 20 4a 4e 49 5f 56 45  .  return JNI_VE
8540: 52 53 49 4f 4e 5f 31 5f 34 3b 0a 7d 0a 0a 0a 0a  RSION_1_4;.}....