SQLite Android Bindings

Hex Artifact Content
Login

Artifact 8ec1c34b80ea0db2dec81ca3f9de106a0c948c4e:


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 66 20 30 0a 23 69 6e  rt.h>..#if 0.#in
0390: 63 6c 75 64 65 20 3c 61 6e 64 72 6f 69 64 66 77  clude <androidfw
03a0: 2f 43 75 72 73 6f 72 57 69 6e 64 6f 77 2e 68 3e  /CursorWindow.h>
03b0: 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64  .#endif..#includ
03c0: 65 20 3c 73 71 6c 69 74 65 33 2e 68 3e 0a 23 69  e <sqlite3.h>.#i
03d0: 66 20 30 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71  f 0.#include <sq
03e0: 6c 69 74 65 33 5f 61 6e 64 72 6f 69 64 2e 68 3e  lite3_android.h>
03f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64  .#endif..#includ
0400: 65 20 22 61 6e 64 72 6f 69 64 5f 64 61 74 61 62  e "android_datab
0410: 61 73 65 5f 53 51 4c 69 74 65 43 6f 6d 6d 6f 6e  ase_SQLiteCommon
0420: 2e 68 22 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73  .h"..#include <s
0430: 74 72 69 6e 67 3e 0a 0a 2f 2f 20 53 65 74 20 74  tring>..// Set t
0440: 6f 20 31 20 74 6f 20 75 73 65 20 55 54 46 31 36  o 1 to use UTF16
0450: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 6c 6f 63   storage for loc
0460: 61 6c 69 7a 65 64 20 69 6e 64 65 78 65 73 2e 0a  alized indexes..
0470: 23 64 65 66 69 6e 65 20 55 54 46 31 36 5f 53 54  #define UTF16_ST
0480: 4f 52 41 47 45 20 30 0a 0a 6e 61 6d 65 73 70 61  ORAGE 0..namespa
0490: 63 65 20 61 6e 64 72 6f 69 64 20 7b 0a 0a 2f 2a  ce android {../*
04a0: 20 42 75 73 79 20 74 69 6d 65 6f 75 74 20 69 6e   Busy timeout in
04b0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 20   milliseconds.. 
04c0: 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e  * If another con
04d0: 6e 65 63 74 69 6f 6e 20 28 70 6f 73 73 69 62 6c  nection (possibl
04e0: 79 20 69 6e 20 61 6e 6f 74 68 65 72 20 70 72 6f  y in another pro
04f0: 63 65 73 73 29 20 68 61 73 20 74 68 65 20 64 61  cess) has the da
0500: 74 61 62 61 73 65 20 6c 6f 63 6b 65 64 20 66 6f  tabase locked fo
0510: 72 0a 20 2a 20 6c 6f 6e 67 65 72 20 74 68 61 6e  r. * longer than
0520: 20 74 68 69 73 20 61 6d 6f 75 6e 74 20 6f 66 20   this amount of 
0530: 74 69 6d 65 20 74 68 65 6e 20 53 51 4c 69 74 65  time then SQLite
0540: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 61   will generate a
0550: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
0560: 6f 72 2e 0a 20 2a 20 54 68 65 20 53 51 4c 49 54  or.. * The SQLIT
0570: 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 20  E_BUSY error is 
0580: 74 68 65 6e 20 72 61 69 73 65 64 20 61 73 20 61  then raised as a
0590: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 4c   SQLiteDatabaseL
05a0: 6f 63 6b 65 64 45 78 63 65 70 74 69 6f 6e 2e 0a  ockedException..
05b0: 20 2a 0a 20 2a 20 49 6e 20 6f 72 64 69 6e 61 72   *. * In ordinar
05c0: 79 20 75 73 61 67 65 2c 20 62 75 73 79 20 74 69  y usage, busy ti
05d0: 6d 65 6f 75 74 73 20 61 72 65 20 71 75 69 74 65  meouts are quite
05e0: 20 72 61 72 65 2e 20 20 4d 6f 73 74 20 64 61 74   rare.  Most dat
05f0: 61 62 61 73 65 73 20 6f 6e 6c 79 20 65 76 65 72  abases only ever
0600: 0a 20 2a 20 68 61 76 65 20 61 20 73 69 6e 67 6c  . * have a singl
0610: 65 20 6f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f  e open connectio
0620: 6e 20 61 74 20 61 20 74 69 6d 65 20 75 6e 6c 65  n at a time unle
0630: 73 73 20 74 68 65 79 20 61 72 65 20 75 73 69 6e  ss they are usin
0640: 67 20 57 41 4c 2e 20 20 57 68 65 6e 20 75 73 69  g WAL.  When usi
0650: 6e 67 0a 20 2a 20 57 41 4c 2c 20 61 20 74 69 6d  ng. * WAL, a tim
0660: 65 6f 75 74 20 63 6f 75 6c 64 20 6f 63 63 75 72  eout could occur
0670: 20 69 66 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69   if one connecti
0680: 6f 6e 20 69 73 20 62 75 73 79 20 70 65 72 66 6f  on is busy perfo
0690: 72 6d 69 6e 67 20 61 6e 20 61 75 74 6f 2d 63 68  rming an auto-ch
06a0: 65 63 6b 70 6f 69 6e 74 0a 20 2a 20 6f 70 65 72  eckpoint. * oper
06b0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 62 75 73 79  ation.  The busy
06c0: 20 74 69 6d 65 6f 75 74 20 6e 65 65 64 73 20 74   timeout needs t
06d0: 6f 20 62 65 20 6c 6f 6e 67 20 65 6e 6f 75 67 68  o be long enough
06e0: 20 74 6f 20 74 6f 6c 65 72 61 74 65 20 73 6c 6f   to tolerate slo
06f0: 77 20 49 2f 4f 20 77 72 69 74 65 0a 20 2a 20 6f  w I/O write. * o
0700: 70 65 72 61 74 69 6f 6e 73 20 62 75 74 20 6e 6f  perations but no
0710: 74 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 6f 20  t so long as to 
0720: 63 61 75 73 65 20 74 68 65 20 61 70 70 6c 69 63  cause the applic
0730: 61 74 69 6f 6e 20 74 6f 20 68 61 6e 67 20 69 6e  ation to hang in
0740: 64 65 66 69 6e 69 74 65 6c 79 20 69 66 0a 20 2a  definitely if. *
0750: 20 74 68 65 72 65 20 69 73 20 61 20 70 72 6f 62   there is a prob
0760: 6c 65 6d 20 61 63 71 75 69 72 69 6e 67 20 61 20  lem acquiring a 
0770: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
0780: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
0790: 69 6e 74 20 42 55 53 59 5f 54 49 4d 45 4f 55 54  int BUSY_TIMEOUT
07a0: 5f 4d 53 20 3d 20 32 35 30 30 3b 0a 0a 73 74 61  _MS = 2500;..sta
07b0: 74 69 63 20 4a 61 76 61 56 4d 20 2a 67 70 4a 61  tic JavaVM *gpJa
07c0: 76 61 56 4d 20 3d 20 30 3b 0a 0a 73 74 61 74 69  vaVM = 0;..stati
07d0: 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 6a  c struct {.    j
07e0: 66 69 65 6c 64 49 44 20 6e 61 6d 65 3b 0a 20 20  fieldID name;.  
07f0: 20 20 6a 66 69 65 6c 64 49 44 20 6e 75 6d 41 72    jfieldID numAr
0800: 67 73 3b 0a 20 20 20 20 6a 6d 65 74 68 6f 64 49  gs;.    jmethodI
0810: 44 20 64 69 73 70 61 74 63 68 43 61 6c 6c 62 61  D dispatchCallba
0820: 63 6b 3b 0a 7d 20 67 53 51 4c 69 74 65 43 75 73  ck;.} gSQLiteCus
0830: 74 6f 6d 46 75 6e 63 74 69 6f 6e 43 6c 61 73 73  tomFunctionClass
0840: 49 6e 66 6f 3b 0a 0a 73 74 61 74 69 63 20 73 74  Info;..static st
0850: 72 75 63 74 20 7b 0a 20 20 20 20 6a 63 6c 61 73  ruct {.    jclas
0860: 73 20 63 6c 61 7a 7a 3b 0a 7d 20 67 53 74 72 69  s clazz;.} gStri
0870: 6e 67 43 6c 61 73 73 49 6e 66 6f 3b 0a 0a 73 74  ngClassInfo;..st
0880: 72 75 63 74 20 53 51 4c 69 74 65 43 6f 6e 6e 65  ruct SQLiteConne
0890: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 2f 2f 20 4f  ction {.    // O
08a0: 70 65 6e 20 66 6c 61 67 73 2e 0a 20 20 20 20 2f  pen flags..    /
08b0: 2f 20 4d 75 73 74 20 62 65 20 6b 65 70 74 20 69  / Must be kept i
08c0: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
08d0: 63 6f 6e 73 74 61 6e 74 73 20 64 65 66 69 6e 65  constants define
08e0: 64 20 69 6e 20 53 51 4c 69 74 65 44 61 74 61 62  d in SQLiteDatab
08f0: 61 73 65 2e 6a 61 76 61 2e 0a 20 20 20 20 65 6e  ase.java..    en
0900: 75 6d 20 7b 0a 20 20 20 20 20 20 20 20 4f 50 45  um {.        OPE
0910: 4e 5f 52 45 41 44 57 52 49 54 45 20 20 20 20 20  N_READWRITE     
0920: 20 20 20 20 20 3d 20 30 78 30 30 30 30 30 30 30       = 0x0000000
0930: 30 2c 0a 20 20 20 20 20 20 20 20 4f 50 45 4e 5f  0,.        OPEN_
0940: 52 45 41 44 4f 4e 4c 59 20 20 20 20 20 20 20 20  READONLY        
0950: 20 20 20 3d 20 30 78 30 30 30 30 30 30 30 31 2c     = 0x00000001,
0960: 0a 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 52 45  .        OPEN_RE
0970: 41 44 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AD_MASK         
0980: 20 3d 20 30 78 30 30 30 30 30 30 30 31 2c 0a 20   = 0x00000001,. 
0990: 20 20 20 20 20 20 20 4e 4f 5f 4c 4f 43 41 4c 49         NO_LOCALI
09a0: 5a 45 44 5f 43 4f 4c 4c 41 54 4f 52 53 20 20 3d  ZED_COLLATORS  =
09b0: 20 30 78 30 30 30 30 30 30 31 30 2c 0a 20 20 20   0x00000010,.   
09c0: 20 20 20 20 20 43 52 45 41 54 45 5f 49 46 5f 4e       CREATE_IF_N
09d0: 45 43 45 53 53 41 52 59 20 20 20 20 20 3d 20 30  ECESSARY     = 0
09e0: 78 31 30 30 30 30 30 30 30 2c 0a 20 20 20 20 7d  x10000000,.    }
09f0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20  ;..    sqlite3* 
0a00: 63 6f 6e 73 74 20 64 62 3b 0a 20 20 20 20 63 6f  const db;.    co
0a10: 6e 73 74 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  nst int openFlag
0a20: 73 3b 0a 20 20 20 20 73 74 64 3a 3a 73 74 72 69  s;.    std::stri
0a30: 6e 67 20 70 61 74 68 3b 0a 20 20 20 20 73 74 64  ng path;.    std
0a40: 3a 3a 73 74 72 69 6e 67 20 6c 61 62 65 6c 3b 0a  ::string label;.
0a50: 0a 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 62 6f  .    volatile bo
0a60: 6f 6c 20 63 61 6e 63 65 6c 65 64 3b 0a 0a 20 20  ol canceled;..  
0a70: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
0a80: 6f 6e 28 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  on(sqlite3* db, 
0a90: 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 20 63  int openFlags, c
0aa0: 6f 6e 73 74 20 73 74 64 3a 3a 73 74 72 69 6e 67  onst std::string
0ab0: 26 20 70 61 74 68 2c 20 63 6f 6e 73 74 20 73 74  & path, const st
0ac0: 64 3a 3a 73 74 72 69 6e 67 26 20 6c 61 62 65 6c  d::string& label
0ad0: 29 20 3a 0a 20 20 20 20 20 20 20 20 64 62 28 64  ) :.        db(d
0ae0: 62 29 2c 20 6f 70 65 6e 46 6c 61 67 73 28 6f 70  b), openFlags(op
0af0: 65 6e 46 6c 61 67 73 29 2c 20 70 61 74 68 28 70  enFlags), path(p
0b00: 61 74 68 29 2c 20 6c 61 62 65 6c 28 6c 61 62 65  ath), label(labe
0b10: 6c 29 2c 20 63 61 6e 63 65 6c 65 64 28 66 61 6c  l), canceled(fal
0b20: 73 65 29 20 7b 20 7d 0a 7d 3b 0a 0a 2f 2f 20 43  se) { }.};..// C
0b30: 61 6c 6c 65 64 20 65 61 63 68 20 74 69 6d 65 20  alled each time 
0b40: 61 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 69  a statement begi
0b50: 6e 73 20 65 78 65 63 75 74 69 6f 6e 2c 20 77 68  ns execution, wh
0b60: 65 6e 20 74 72 61 63 69 6e 67 20 69 73 20 65 6e  en tracing is en
0b70: 61 62 6c 65 64 2e 0a 73 74 61 74 69 63 20 76 6f  abled..static vo
0b80: 69 64 20 73 71 6c 69 74 65 54 72 61 63 65 43 61  id sqliteTraceCa
0b90: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 64 61 74  llback(void *dat
0ba0: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  a, const char *s
0bb0: 71 6c 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65  ql) {.    SQLite
0bc0: 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e  Connection* conn
0bd0: 65 63 74 69 6f 6e 20 3d 20 73 74 61 74 69 63 5f  ection = static_
0be0: 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65  cast<SQLiteConne
0bf0: 63 74 69 6f 6e 2a 3e 28 64 61 74 61 29 3b 0a 20  ction*>(data);. 
0c00: 20 20 20 41 4c 4f 47 28 4c 4f 47 5f 56 45 52 42     ALOG(LOG_VERB
0c10: 4f 53 45 2c 20 53 51 4c 49 54 45 5f 54 52 41 43  OSE, SQLITE_TRAC
0c20: 45 5f 54 41 47 2c 20 22 25 73 3a 20 5c 22 25 73  E_TAG, "%s: \"%s
0c30: 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
0c40: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 6c     connection->l
0c50: 61 62 65 6c 2e 63 5f 73 74 72 28 29 2c 20 73 71  abel.c_str(), sq
0c60: 6c 29 3b 0a 7d 0a 0a 2f 2f 20 43 61 6c 6c 65 64  l);.}..// Called
0c70: 20 65 61 63 68 20 74 69 6d 65 20 61 20 73 74 61   each time a sta
0c80: 74 65 6d 65 6e 74 20 66 69 6e 69 73 68 65 73 20  tement finishes 
0c90: 65 78 65 63 75 74 69 6f 6e 2c 20 77 68 65 6e 20  execution, when 
0ca0: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 6e 61  profiling is ena
0cb0: 62 6c 65 64 2e 0a 73 74 61 74 69 63 20 76 6f 69  bled..static voi
0cc0: 64 20 73 71 6c 69 74 65 50 72 6f 66 69 6c 65 43  d sqliteProfileC
0cd0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 64 61  allback(void *da
0ce0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta, const char *
0cf0: 73 71 6c 2c 20 73 71 6c 69 74 65 33 5f 75 69 6e  sql, sqlite3_uin
0d00: 74 36 34 20 74 6d 29 20 7b 0a 20 20 20 20 53 51  t64 tm) {.    SQ
0d10: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20  LiteConnection* 
0d20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 73 74 61  connection = sta
0d30: 74 69 63 5f 63 61 73 74 3c 53 51 4c 69 74 65 43  tic_cast<SQLiteC
0d40: 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 64 61 74 61  onnection*>(data
0d50: 29 3b 0a 20 20 20 20 41 4c 4f 47 28 4c 4f 47 5f  );.    ALOG(LOG_
0d60: 56 45 52 42 4f 53 45 2c 20 53 51 4c 49 54 45 5f  VERBOSE, SQLITE_
0d70: 50 52 4f 46 49 4c 45 5f 54 41 47 2c 20 22 25 73  PROFILE_TAG, "%s
0d80: 3a 20 5c 22 25 73 5c 22 20 74 6f 6f 6b 20 25 30  : \"%s\" took %0
0d90: 2e 33 66 20 6d 73 5c 6e 22 2c 0a 20 20 20 20 20  .3f ms\n",.     
0da0: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
0db0: 6e 2d 3e 6c 61 62 65 6c 2e 63 5f 73 74 72 28 29  n->label.c_str()
0dc0: 2c 20 73 71 6c 2c 20 74 6d 20 2a 20 30 2e 30 30  , sql, tm * 0.00
0dd0: 30 30 30 31 66 29 3b 0a 7d 0a 0a 2f 2f 20 43 61  0001f);.}..// Ca
0de0: 6c 6c 65 64 20 61 66 74 65 72 20 65 61 63 68 20  lled after each 
0df0: 53 51 4c 69 74 65 20 56 4d 20 69 6e 73 74 72 75  SQLite VM instru
0e00: 63 74 69 6f 6e 20 77 68 65 6e 20 63 61 6e 63 65  ction when cance
0e10: 6c 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  lation is enable
0e20: 64 2e 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  d..static int sq
0e30: 6c 69 74 65 50 72 6f 67 72 65 73 73 48 61 6e 64  liteProgressHand
0e40: 6c 65 72 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  lerCallback(void
0e50: 2a 20 64 61 74 61 29 20 7b 0a 20 20 20 20 53 51  * data) {.    SQ
0e60: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20  LiteConnection* 
0e70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 73 74 61  connection = sta
0e80: 74 69 63 5f 63 61 73 74 3c 53 51 4c 69 74 65 43  tic_cast<SQLiteC
0e90: 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 64 61 74 61  onnection*>(data
0ea0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f  );.    return co
0eb0: 6e 6e 65 63 74 69 6f 6e 2d 3e 63 61 6e 63 65 6c  nnection->cancel
0ec0: 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
0ed0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
0ee0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0ef0: 63 65 20 63 61 6c 6c 62 61 63 6b 20 65 71 75 69  ce callback equi
0f00: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 62 75  valent to the bu
0f10: 69 6c 74 2d 69 6e 0a 2a 2a 20 42 49 4e 41 52 59  ilt-in.** BINARY
0f20: 20 73 65 71 75 65 6e 63 65 2e 20 0a 2a 2a 0a 2a   sequence. .**.*
0f30: 2a 20 53 74 6f 63 6b 20 41 6e 64 72 6f 69 64 20  * Stock Android 
0f40: 75 73 65 73 20 61 20 6d 6f 64 69 66 69 65 64 20  uses a modified 
0f50: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
0f60: 65 33 2e 63 20 74 68 61 74 20 63 61 6c 6c 73 20  e3.c that calls 
0f70: 6f 75 74 20 74 6f 20 61 20 6d 6f 64 75 6c 65 0a  out to a module.
0f80: 2a 2a 20 6e 61 6d 65 64 20 22 73 71 6c 69 74 65  ** named "sqlite
0f90: 33 5f 61 6e 64 72 6f 69 64 22 20 74 6f 20 61 64  3_android" to ad
0fa0: 64 20 65 78 74 72 61 20 62 75 69 6c 74 2d 69 6e  d extra built-in
0fb0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 61 6e 64 20   collations and 
0fc0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  functions to.** 
0fd0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 68 61 6e  all database han
0fe0: 64 6c 65 73 2e 20 53 70 65 63 69 66 69 63 61 6c  dles. Specifical
0ff0: 6c 79 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ly, collation se
1000: 71 75 65 6e 63 65 20 22 4c 4f 43 41 4c 49 5a 45  quence "LOCALIZE
1010: 44 22 2e 20 46 6f 72 20 6e 6f 77 2c 0a 2a 2a 20  D". For now,.** 
1020: 74 68 69 73 20 6d 6f 64 75 6c 65 20 64 6f 65 73  this module does
1030: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 73 71 6c   not include sql
1040: 69 74 65 33 5f 61 6e 64 72 6f 69 64 20 28 73 69  ite3_android (si
1050: 6e 63 65 20 69 74 20 69 73 20 64 69 66 66 69 63  nce it is diffic
1060: 75 6c 74 20 74 6f 20 62 75 69 6c 64 0a 2a 2a 20  ult to build.** 
1070: 77 69 74 68 20 74 68 65 20 4e 44 4b 20 6f 6e 6c  with the NDK onl
1080: 79 29 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 69  y). Instead, thi
1090: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
10a0: 67 69 73 74 65 72 65 64 20 61 73 20 22 4c 4f 43  gistered as "LOC
10b0: 41 4c 49 5a 45 44 22 20 66 6f 72 20 61 6c 6c 0a  ALIZED" for all.
10c0: 2a 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 20  ** new database 
10d0: 68 61 6e 64 6c 65 73 2e 20 0a 2a 2f 0a 73 74 61  handles. .*/.sta
10e0: 74 69 63 20 69 6e 74 20 63 6f 6c 6c 5f 6c 6f 63  tic int coll_loc
10f0: 61 6c 69 7a 65 64 28 0a 20 20 76 6f 69 64 20 2a  alized(.  void *
1100: 6e 6f 74 5f 75 73 65 64 2c 0a 20 20 69 6e 74 20  not_used,.  int 
1110: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1120: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
1130: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
1140: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
1150: 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e  t rc, n;.  n = n
1160: 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65  Key1<nKey2 ? nKe
1170: 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63  y1 : nKey2;.  rc
1180: 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
1190: 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
11a0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
11b0: 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
11c0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
11d0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 6c  rc;.}..static jl
11e0: 6f 6e 67 20 6e 61 74 69 76 65 4f 70 65 6e 28 4a  ong nativeOpen(J
11f0: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61  NIEnv* env, jcla
1200: 73 73 20 63 6c 61 7a 7a 2c 20 6a 73 74 72 69 6e  ss clazz, jstrin
1210: 67 20 70 61 74 68 53 74 72 2c 20 6a 69 6e 74 20  g pathStr, jint 
1220: 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20  openFlags,.     
1230: 20 20 20 6a 73 74 72 69 6e 67 20 6c 61 62 65 6c     jstring label
1240: 53 74 72 2c 20 6a 62 6f 6f 6c 65 61 6e 20 65 6e  Str, jboolean en
1250: 61 62 6c 65 54 72 61 63 65 2c 20 6a 62 6f 6f 6c  ableTrace, jbool
1260: 65 61 6e 20 65 6e 61 62 6c 65 50 72 6f 66 69 6c  ean enableProfil
1270: 65 29 20 7b 0a 20 20 20 20 69 6e 74 20 73 71 6c  e) {.    int sql
1280: 69 74 65 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  iteFlags;.    if
1290: 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51   (openFlags & SQ
12a0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 3a 3a  LiteConnection::
12b0: 43 52 45 41 54 45 5f 49 46 5f 4e 45 43 45 53 53  CREATE_IF_NECESS
12c0: 41 52 59 29 20 7b 0a 20 20 20 20 20 20 20 20 73  ARY) {.        s
12d0: 71 6c 69 74 65 46 6c 61 67 73 20 3d 20 53 51 4c  qliteFlags = SQL
12e0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12f0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
1300: 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 7d 20 65  _CREATE;.    } e
1310: 6c 73 65 20 69 66 20 28 6f 70 65 6e 46 6c 61 67  lse if (openFlag
1320: 73 20 26 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  s & SQLiteConnec
1330: 74 69 6f 6e 3a 3a 4f 50 45 4e 5f 52 45 41 44 4f  tion::OPEN_READO
1340: 4e 4c 59 29 20 7b 0a 20 20 20 20 20 20 20 20 73  NLY) {.        s
1350: 71 6c 69 74 65 46 6c 61 67 73 20 3d 20 53 51 4c  qliteFlags = SQL
1360: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1370: 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  Y;.    } else {.
1380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 6c          sqliteFl
1390: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
13a0: 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
13b0: 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   }..    const ch
13c0: 61 72 2a 20 70 61 74 68 43 68 61 72 73 20 3d 20  ar* pathChars = 
13d0: 65 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67 55 54  env->GetStringUT
13e0: 46 43 68 61 72 73 28 70 61 74 68 53 74 72 2c 20  FChars(pathStr, 
13f0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 74 64 3a 3a  NULL);.    std::
1400: 73 74 72 69 6e 67 20 70 61 74 68 28 70 61 74 68  string path(path
1410: 43 68 61 72 73 29 3b 0a 20 20 20 20 65 6e 76 2d  Chars);.    env-
1420: 3e 52 65 6c 65 61 73 65 53 74 72 69 6e 67 55 54  >ReleaseStringUT
1430: 46 43 68 61 72 73 28 70 61 74 68 53 74 72 2c 20  FChars(pathStr, 
1440: 70 61 74 68 43 68 61 72 73 29 3b 0a 0a 20 20 20  pathChars);..   
1450: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 6c 61 62   const char* lab
1460: 65 6c 43 68 61 72 73 20 3d 20 65 6e 76 2d 3e 47  elChars = env->G
1470: 65 74 53 74 72 69 6e 67 55 54 46 43 68 61 72 73  etStringUTFChars
1480: 28 6c 61 62 65 6c 53 74 72 2c 20 4e 55 4c 4c 29  (labelStr, NULL)
1490: 3b 0a 20 20 20 20 73 74 64 3a 3a 73 74 72 69 6e  ;.    std::strin
14a0: 67 20 6c 61 62 65 6c 28 6c 61 62 65 6c 43 68 61  g label(labelCha
14b0: 72 73 29 3b 0a 20 20 20 20 65 6e 76 2d 3e 52 65  rs);.    env->Re
14c0: 6c 65 61 73 65 53 74 72 69 6e 67 55 54 46 43 68  leaseStringUTFCh
14d0: 61 72 73 28 6c 61 62 65 6c 53 74 72 2c 20 6c 61  ars(labelStr, la
14e0: 62 65 6c 43 68 61 72 73 29 3b 0a 0a 20 20 20 20  belChars);..    
14f0: 73 71 6c 69 74 65 33 2a 20 64 62 3b 0a 20 20 20  sqlite3* db;.   
1500: 20 69 6e 74 20 65 72 72 20 3d 20 73 71 6c 69 74   int err = sqlit
1510: 65 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2e  e3_open_v2(path.
1520: 63 5f 73 74 72 28 29 2c 20 26 64 62 2c 20 73 71  c_str(), &db, sq
1530: 6c 69 74 65 46 6c 61 67 73 2c 20 4e 55 4c 4c 29  liteFlags, NULL)
1540: 3b 0a 20 20 20 20 69 66 20 28 65 72 72 20 21 3d  ;.    if (err !=
1550: 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20   SQLITE_OK) {.  
1560: 20 20 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69        throw_sqli
1570: 74 65 33 5f 65 78 63 65 70 74 69 6f 6e 5f 65 72  te3_exception_er
1580: 72 63 6f 64 65 28 65 6e 76 2c 20 65 72 72 2c 20  rcode(env, err, 
1590: 22 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20  "Could not open 
15a0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
15b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15c0: 20 20 7d 0a 20 20 20 20 65 72 72 20 3d 20 73 71    }.    err = sq
15d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
15e0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 6c 6f 63 61  lation(db, "loca
15f0: 6c 69 7a 65 64 22 2c 20 53 51 4c 49 54 45 5f 55  lized", SQLITE_U
1600: 54 46 38 2c 20 30 2c 20 63 6f 6c 6c 5f 6c 6f 63  TF8, 0, coll_loc
1610: 61 6c 69 7a 65 64 29 3b 0a 20 20 20 20 69 66 20  alized);.    if 
1620: 28 65 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 4f  (err != SQLITE_O
1630: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72  K) {.        thr
1640: 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70  ow_sqlite3_excep
1650: 74 69 6f 6e 5f 65 72 72 63 6f 64 65 28 65 6e 76  tion_errcode(env
1660: 2c 20 65 72 72 2c 20 22 43 6f 75 6c 64 20 6e 6f  , err, "Could no
1670: 74 20 72 65 67 69 73 74 65 72 20 63 6f 6c 6c 61  t register colla
1680: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  tion");.        
1690: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
16a0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
16b0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
16c0: 2f 2f 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  // Check that th
16d0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
16e0: 61 6c 6c 79 20 72 65 61 64 2f 77 72 69 74 65 20  ally read/write 
16f0: 77 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61  when that is wha
1700: 74 20 77 65 20 61 73 6b 65 64 20 66 6f 72 2e 0a  t we asked for..
1710: 20 20 20 20 69 66 20 28 28 73 71 6c 69 74 65 46      if ((sqliteF
1720: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1730: 45 4e 5f 52 45 41 44 57 52 49 54 45 29 20 26 26  EN_READWRITE) &&
1740: 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
1750: 6f 6e 6c 79 28 64 62 2c 20 4e 55 4c 4c 29 29 20  only(db, NULL)) 
1760: 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f  {.        throw_
1770: 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f  sqlite3_exceptio
1780: 6e 28 65 6e 76 2c 20 64 62 2c 20 22 43 6f 75 6c  n(env, db, "Coul
1790: 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 64  d not open the d
17a0: 61 74 61 62 61 73 65 20 69 6e 20 72 65 61 64 2f  atabase in read/
17b0: 77 72 69 74 65 20 6d 6f 64 65 2e 22 29 3b 0a 20  write mode.");. 
17c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
17d0: 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20  lose(db);.      
17e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
17f0: 7d 0a 0a 20 20 20 20 2f 2f 20 53 65 74 20 74 68  }..    // Set th
1800: 65 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  e default busy h
1810: 61 6e 64 6c 65 72 20 74 6f 20 72 65 74 72 79 20  andler to retry 
1820: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 65  automatically be
1830: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
1840: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1850: 65 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 75  err = sqlite3_bu
1860: 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 42  sy_timeout(db, B
1870: 55 53 59 5f 54 49 4d 45 4f 55 54 5f 4d 53 29 3b  USY_TIMEOUT_MS);
1880: 0a 20 20 20 20 69 66 20 28 65 72 72 20 21 3d 20  .    if (err != 
1890: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
18a0: 20 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69 74       throw_sqlit
18b0: 65 33 5f 65 78 63 65 70 74 69 6f 6e 28 65 6e 76  e3_exception(env
18c0: 2c 20 64 62 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  , db, "Could not
18d0: 20 73 65 74 20 62 75 73 79 20 74 69 6d 65 6f 75   set busy timeou
18e0: 74 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  t");.        sql
18f0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
1900: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  ;.    }..    // 
1920: 52 65 67 69 73 74 65 72 20 63 75 73 74 6f 6d 20  Register custom 
1930: 41 6e 64 72 6f 69 64 20 66 75 6e 63 74 69 6f 6e  Android function
1940: 73 2e 0a 23 69 66 20 30 0a 20 20 20 20 65 72 72  s..#if 0.    err
1950: 20 3d 20 72 65 67 69 73 74 65 72 5f 61 6e 64 72   = register_andr
1960: 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 73 28 64 62  oid_functions(db
1970: 2c 20 55 54 46 31 36 5f 53 54 4f 52 41 47 45 29  , UTF16_STORAGE)
1980: 3b 0a 20 20 20 20 69 66 20 28 65 72 72 29 20 7b  ;.    if (err) {
1990: 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f 73  .        throw_s
19a0: 71 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f 6e  qlite3_exception
19b0: 28 65 6e 76 2c 20 64 62 2c 20 22 43 6f 75 6c 64  (env, db, "Could
19c0: 20 6e 6f 74 20 72 65 67 69 73 74 65 72 20 41 6e   not register An
19d0: 64 72 6f 69 64 20 53 51 4c 20 66 75 6e 63 74 69  droid SQL functi
19e0: 6f 6e 73 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ons.");.        
19f0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
1a00: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1a10: 6e 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  n 0;.    }.#endi
1a20: 66 0a 0a 20 20 20 20 2f 2f 20 43 72 65 61 74 65  f..    // Create
1a30: 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 2e   wrapper object.
1a40: 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65  .    SQLiteConne
1a50: 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f  ction* connectio
1a60: 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f  n = new SQLiteCo
1a70: 6e 6e 65 63 74 69 6f 6e 28 64 62 2c 20 6f 70 65  nnection(db, ope
1a80: 6e 46 6c 61 67 73 2c 20 70 61 74 68 2c 20 6c 61  nFlags, path, la
1a90: 62 65 6c 29 3b 0a 0a 20 20 20 20 2f 2f 20 45 6e  bel);..    // En
1aa0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 61 6e 64  able tracing and
1ab0: 20 70 72 6f 66 69 6c 69 6e 67 20 69 66 20 72 65   profiling if re
1ac0: 71 75 65 73 74 65 64 2e 0a 20 20 20 20 69 66 20  quested..    if 
1ad0: 28 65 6e 61 62 6c 65 54 72 61 63 65 29 20 7b 0a  (enableTrace) {.
1ae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1af0: 74 72 61 63 65 28 64 62 2c 20 26 73 71 6c 69 74  trace(db, &sqlit
1b00: 65 54 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  eTraceCallback, 
1b10: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
1b20: 20 7d 0a 20 20 20 20 69 66 20 28 65 6e 61 62 6c   }.    if (enabl
1b30: 65 50 72 6f 66 69 6c 65 29 20 7b 0a 20 20 20 20  eProfile) {.    
1b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 6f 66      sqlite3_prof
1b50: 69 6c 65 28 64 62 2c 20 26 73 71 6c 69 74 65 50  ile(db, &sqliteP
1b60: 72 6f 66 69 6c 65 43 61 6c 6c 62 61 63 6b 2c 20  rofileCallback, 
1b70: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
1b80: 20 7d 0a 0a 20 20 20 20 41 4c 4f 47 56 28 22 4f   }..    ALOGV("O
1b90: 70 65 6e 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  pened connection
1ba0: 20 25 70 20 77 69 74 68 20 6c 61 62 65 6c 20 27   %p with label '
1bb0: 25 73 27 22 2c 20 64 62 2c 20 6c 61 62 65 6c 2e  %s'", db, label.
1bc0: 63 5f 73 74 72 28 29 29 3b 0a 20 20 20 20 72 65  c_str());.    re
1bd0: 74 75 72 6e 20 72 65 69 6e 74 65 72 70 72 65 74  turn reinterpret
1be0: 5f 63 61 73 74 3c 6a 6c 6f 6e 67 3e 28 63 6f 6e  _cast<jlong>(con
1bf0: 6e 65 63 74 69 6f 6e 29 3b 0a 7d 0a 0a 73 74 61  nection);.}..sta
1c00: 74 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 43  tic void nativeC
1c10: 6c 6f 73 65 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  lose(JNIEnv* env
1c20: 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20  , jclass clazz, 
1c30: 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  jlong connection
1c40: 50 74 72 29 20 7b 0a 20 20 20 20 53 51 4c 69 74  Ptr) {.    SQLit
1c50: 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e  eConnection* con
1c60: 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65  nection = reinte
1c70: 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c 69 74  rpret_cast<SQLit
1c80: 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f  eConnection*>(co
1c90: 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 0a 20  nnectionPtr);.. 
1ca0: 20 20 20 69 66 20 28 63 6f 6e 6e 65 63 74 69 6f     if (connectio
1cb0: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 41 4c 4f  n) {.        ALO
1cc0: 47 56 28 22 43 6c 6f 73 69 6e 67 20 63 6f 6e 6e  GV("Closing conn
1cd0: 65 63 74 69 6f 6e 20 25 70 22 2c 20 63 6f 6e 6e  ection %p", conn
1ce0: 65 63 74 69 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20  ection->db);.   
1cf0: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 73       int err = s
1d00: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 63 6f 6e  qlite3_close(con
1d10: 6e 65 63 74 69 6f 6e 2d 3e 64 62 29 3b 0a 20 20  nection->db);.  
1d20: 20 20 20 20 20 20 69 66 20 28 65 72 72 20 21 3d        if (err !=
1d30: 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20   SQLITE_OK) {.  
1d40: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 68 69            // Thi
1d50: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 66 20  s can happen if 
1d60: 73 75 62 2d 6f 62 6a 65 63 74 73 20 61 72 65 6e  sub-objects aren
1d70: 27 74 20 63 6c 6f 73 65 64 20 66 69 72 73 74 2e  't closed first.
1d80: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
1d90: 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 2e 0a 20 20  caller knows..  
1da0: 20 20 20 20 20 20 20 20 20 20 41 4c 4f 47 45 28            ALOGE(
1db0: 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 25  "sqlite3_close(%
1dc0: 70 29 20 66 61 69 6c 65 64 3a 20 25 64 22 2c 20  p) failed: %d", 
1dd0: 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20  connection->db, 
1de0: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
1df0: 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f    throw_sqlite3_
1e00: 65 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63  exception(env, c
1e10: 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 22  onnection->db, "
1e20: 43 6f 75 6e 74 20 6e 6f 74 20 63 6c 6f 73 65 20  Count not close 
1e30: 64 62 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  db.");.         
1e40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1e50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 64 65     }..        de
1e60: 6c 65 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b  lete connection;
1e70: 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 20 43 61 6c  .    }.}..// Cal
1e80: 6c 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  led each time a 
1e90: 63 75 73 74 6f 6d 20 66 75 6e 63 74 69 6f 6e 20  custom function 
1ea0: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 73 74  is evaluated..st
1eb0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
1ec0: 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 43 61  CustomFunctionCa
1ed0: 6c 6c 62 61 63 6b 28 73 71 6c 69 74 65 33 5f 63  llback(sqlite3_c
1ee0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1ef0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 72 67  .        int arg
1f00: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
1f10: 20 2a 2a 61 72 67 76 29 20 7b 0a 0a 20 20 20 20   **argv) {..    
1f20: 4a 4e 49 45 6e 76 2a 20 65 6e 76 20 3d 20 30 3b  JNIEnv* env = 0;
1f30: 0a 20 20 20 20 67 70 4a 61 76 61 56 4d 2d 3e 47  .    gpJavaVM->G
1f40: 65 74 45 6e 76 28 28 76 6f 69 64 2a 2a 29 26 65  etEnv((void**)&e
1f50: 6e 76 2c 20 4a 4e 49 5f 56 45 52 53 49 4f 4e 5f  nv, JNI_VERSION_
1f60: 31 5f 34 29 3b 0a 0a 20 20 20 20 2f 2f 20 47 65  1_4);..    // Ge
1f70: 74 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  t the callback f
1f80: 75 6e 63 74 69 6f 6e 20 6f 62 6a 65 63 74 2e 0a  unction object..
1f90: 20 20 20 20 2f 2f 20 43 72 65 61 74 65 20 61 20      // Create a 
1fa0: 6e 65 77 20 6c 6f 63 61 6c 20 72 65 66 65 72 65  new local refere
1fb0: 6e 63 65 20 74 6f 20 69 74 20 69 6e 20 63 61 73  nce to it in cas
1fc0: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74  e the callback t
1fd0: 72 69 65 73 20 74 6f 20 64 6f 20 73 6f 6d 65 74  ries to do somet
1fe0: 68 69 6e 67 0a 20 20 20 20 2f 2f 20 64 75 6d 62  hing.    // dumb
1ff0: 20 6c 69 6b 65 20 75 6e 72 65 67 69 73 74 65 72   like unregister
2000: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 28 74   the function (t
2010: 68 65 72 65 62 79 20 64 65 73 74 72 6f 79 69 6e  hereby destroyin
2020: 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 72 65 66  g the global ref
2030: 29 20 77 68 69 6c 65 20 69 74 20 69 73 20 72 75  ) while it is ru
2040: 6e 6e 69 6e 67 2e 0a 20 20 20 20 6a 6f 62 6a 65  nning..    jobje
2050: 63 74 20 66 75 6e 63 74 69 6f 6e 4f 62 6a 47 6c  ct functionObjGl
2060: 6f 62 61 6c 20 3d 20 72 65 69 6e 74 65 72 70 72  obal = reinterpr
2070: 65 74 5f 63 61 73 74 3c 6a 6f 62 6a 65 63 74 3e  et_cast<jobject>
2080: 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
2090: 74 61 28 63 6f 6e 74 65 78 74 29 29 3b 0a 20 20  ta(context));.  
20a0: 20 20 6a 6f 62 6a 65 63 74 20 66 75 6e 63 74 69    jobject functi
20b0: 6f 6e 4f 62 6a 20 3d 20 65 6e 76 2d 3e 4e 65 77  onObj = env->New
20c0: 4c 6f 63 61 6c 52 65 66 28 66 75 6e 63 74 69 6f  LocalRef(functio
20d0: 6e 4f 62 6a 47 6c 6f 62 61 6c 29 3b 0a 0a 20 20  nObjGlobal);..  
20e0: 20 20 6a 6f 62 6a 65 63 74 41 72 72 61 79 20 61    jobjectArray a
20f0: 72 67 73 41 72 72 61 79 20 3d 20 65 6e 76 2d 3e  rgsArray = env->
2100: 4e 65 77 4f 62 6a 65 63 74 41 72 72 61 79 28 61  NewObjectArray(a
2110: 72 67 63 2c 20 67 53 74 72 69 6e 67 43 6c 61 73  rgc, gStringClas
2120: 73 49 6e 66 6f 2e 63 6c 61 7a 7a 2c 20 4e 55 4c  sInfo.clazz, NUL
2130: 4c 29 3b 0a 20 20 20 20 69 66 20 28 61 72 67 73  L);.    if (args
2140: 41 72 72 61 79 29 20 7b 0a 20 20 20 20 20 20 20  Array) {.       
2150: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
2160: 20 69 20 3c 20 61 72 67 63 3b 20 69 2b 2b 29 20   i < argc; i++) 
2170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2180: 6e 73 74 20 6a 63 68 61 72 2a 20 61 72 67 20 3d  nst jchar* arg =
2190: 20 73 74 61 74 69 63 5f 63 61 73 74 3c 63 6f 6e   static_cast<con
21a0: 73 74 20 6a 63 68 61 72 2a 3e 28 73 71 6c 69 74  st jchar*>(sqlit
21b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
21c0: 61 72 67 76 5b 69 5d 29 29 3b 0a 20 20 20 20 20  argv[i]));.     
21d0: 20 20 20 20 20 20 20 69 66 20 28 21 61 72 67 29         if (!arg)
21e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
21f0: 20 20 20 41 4c 4f 47 57 28 22 4e 55 4c 4c 20 61     ALOGW("NULL a
2200: 72 67 75 6d 65 6e 74 20 69 6e 20 63 75 73 74 6f  rgument in custo
2210: 6d 5f 66 75 6e 63 74 69 6f 6e 5f 63 61 6c 6c 62  m_function_callb
2220: 61 63 6b 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ack.  This shoul
2230: 64 20 6e 6f 74 20 68 61 70 70 65 6e 2e 22 29 3b  d not happen.");
2240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
2250: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2260: 20 20 20 20 20 20 73 69 7a 65 5f 74 20 61 72 67        size_t arg
2270: 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Len = sqlite3_va
2280: 6c 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76  lue_bytes16(argv
2290: 5b 69 5d 29 20 2f 20 73 69 7a 65 6f 66 28 6a 63  [i]) / sizeof(jc
22a0: 68 61 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  har);.          
22b0: 20 20 20 20 20 20 6a 73 74 72 69 6e 67 20 61 72        jstring ar
22c0: 67 53 74 72 20 3d 20 65 6e 76 2d 3e 4e 65 77 53  gStr = env->NewS
22d0: 74 72 69 6e 67 28 61 72 67 2c 20 61 72 67 4c 65  tring(arg, argLe
22e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
22f0: 20 20 20 20 69 66 20 28 21 61 72 67 53 74 72 29      if (!argStr)
2300: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2310: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
2320: 72 3b 20 2f 2f 20 6f 75 74 20 6f 66 20 6d 65 6d  r; // out of mem
2330: 6f 72 79 20 65 72 72 6f 72 0a 20 20 20 20 20 20  ory error.      
2340: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2350: 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 76 2d              env-
2360: 3e 53 65 74 4f 62 6a 65 63 74 41 72 72 61 79 45  >SetObjectArrayE
2370: 6c 65 6d 65 6e 74 28 61 72 67 73 41 72 72 61 79  lement(argsArray
2380: 2c 20 69 2c 20 61 72 67 53 74 72 29 3b 0a 20 20  , i, argStr);.  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e                en
23a0: 76 2d 3e 44 65 6c 65 74 65 4c 6f 63 61 6c 52 65  v->DeleteLocalRe
23b0: 66 28 61 72 67 53 74 72 29 3b 0a 20 20 20 20 20  f(argStr);.     
23c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23d0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54   }..        // T
23e0: 4f 44 4f 3a 20 53 75 70 70 6f 72 74 20 66 75 6e  ODO: Support fun
23f0: 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
2400: 72 6e 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 20  rn values..     
2410: 20 20 20 65 6e 76 2d 3e 43 61 6c 6c 56 6f 69 64     env->CallVoid
2420: 4d 65 74 68 6f 64 28 66 75 6e 63 74 69 6f 6e 4f  Method(functionO
2430: 62 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  bj,.            
2440: 20 20 20 20 67 53 51 4c 69 74 65 43 75 73 74 6f      gSQLiteCusto
2450: 6d 46 75 6e 63 74 69 6f 6e 43 6c 61 73 73 49 6e  mFunctionClassIn
2460: 66 6f 2e 64 69 73 70 61 74 63 68 43 61 6c 6c 62  fo.dispatchCallb
2470: 61 63 6b 2c 20 61 72 67 73 41 72 72 61 79 29 3b  ack, argsArray);
2480: 0a 0a 65 72 72 6f 72 3a 0a 20 20 20 20 20 20 20  ..error:.       
2490: 20 65 6e 76 2d 3e 44 65 6c 65 74 65 4c 6f 63 61   env->DeleteLoca
24a0: 6c 52 65 66 28 61 72 67 73 41 72 72 61 79 29 3b  lRef(argsArray);
24b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6e 76 2d  .    }..    env-
24c0: 3e 44 65 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28  >DeleteLocalRef(
24d0: 66 75 6e 63 74 69 6f 6e 4f 62 6a 29 3b 0a 0a 20  functionObj);.. 
24e0: 20 20 20 69 66 20 28 65 6e 76 2d 3e 45 78 63 65     if (env->Exce
24f0: 70 74 69 6f 6e 43 68 65 63 6b 28 29 29 20 7b 0a  ptionCheck()) {.
2500: 20 20 20 20 20 20 20 20 41 4c 4f 47 45 28 22 41          ALOGE("A
2510: 6e 20 65 78 63 65 70 74 69 6f 6e 20 77 61 73 20  n exception was 
2520: 74 68 72 6f 77 6e 20 62 79 20 63 75 73 74 6f 6d  thrown by custom
2530: 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e   SQLite function
2540: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  .");.        /* 
2550: 4c 4f 47 45 5f 45 58 28 65 6e 76 29 3b 20 2a 2f  LOGE_EX(env); */
2560: 0a 20 20 20 20 20 20 20 20 65 6e 76 2d 3e 45 78  .        env->Ex
2570: 63 65 70 74 69 6f 6e 43 6c 65 61 72 28 29 3b 0a  ceptionClear();.
2580: 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 20 43 61 6c 6c      }.}..// Call
2590: 65 64 20 77 68 65 6e 20 61 20 63 75 73 74 6f 6d  ed when a custom
25a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73   function is des
25b0: 74 72 6f 79 65 64 2e 0a 73 74 61 74 69 63 20 76  troyed..static v
25c0: 6f 69 64 20 73 71 6c 69 74 65 43 75 73 74 6f 6d  oid sqliteCustom
25d0: 46 75 6e 63 74 69 6f 6e 44 65 73 74 72 75 63 74  FunctionDestruct
25e0: 6f 72 28 76 6f 69 64 2a 20 64 61 74 61 29 20 7b  or(void* data) {
25f0: 0a 20 20 20 20 6a 6f 62 6a 65 63 74 20 66 75 6e  .    jobject fun
2600: 63 74 69 6f 6e 4f 62 6a 47 6c 6f 62 61 6c 20 3d  ctionObjGlobal =
2610: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73   reinterpret_cas
2620: 74 3c 6a 6f 62 6a 65 63 74 3e 28 64 61 74 61 29  t<jobject>(data)
2630: 3b 0a 20 20 20 20 4a 4e 49 45 6e 76 2a 20 65 6e  ;.    JNIEnv* en
2640: 76 20 3d 20 30 3b 0a 20 20 20 20 67 70 4a 61 76  v = 0;.    gpJav
2650: 61 56 4d 2d 3e 47 65 74 45 6e 76 28 28 76 6f 69  aVM->GetEnv((voi
2660: 64 2a 2a 29 26 65 6e 76 2c 20 4a 4e 49 5f 56 45  d**)&env, JNI_VE
2670: 52 53 49 4f 4e 5f 31 5f 34 29 3b 0a 20 20 20 20  RSION_1_4);.    
2680: 65 6e 76 2d 3e 44 65 6c 65 74 65 47 6c 6f 62 61  env->DeleteGloba
2690: 6c 52 65 66 28 66 75 6e 63 74 69 6f 6e 4f 62 6a  lRef(functionObj
26a0: 47 6c 6f 62 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  Global);.}..stat
26b0: 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 52 65  ic void nativeRe
26c0: 67 69 73 74 65 72 43 75 73 74 6f 6d 46 75 6e 63  gisterCustomFunc
26d0: 74 69 6f 6e 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  tion(JNIEnv* env
26e0: 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20  , jclass clazz, 
26f0: 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  jlong connection
2700: 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6f 62  Ptr,.        job
2710: 6a 65 63 74 20 66 75 6e 63 74 69 6f 6e 4f 62 6a  ject functionObj
2720: 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f  ) {.    SQLiteCo
2730: 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63  nnection* connec
2740: 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72  tion = reinterpr
2750: 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f  et_cast<SQLiteCo
2760: 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65  nnection*>(conne
2770: 63 74 69 6f 6e 50 74 72 29 3b 0a 0a 20 20 20 20  ctionPtr);..    
2780: 6a 73 74 72 69 6e 67 20 6e 61 6d 65 53 74 72 20  jstring nameStr 
2790: 3d 20 6a 73 74 72 69 6e 67 28 65 6e 76 2d 3e 47  = jstring(env->G
27a0: 65 74 4f 62 6a 65 63 74 46 69 65 6c 64 28 0a 20  etObjectField(. 
27b0: 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74             funct
27c0: 69 6f 6e 4f 62 6a 2c 20 67 53 51 4c 69 74 65 43  ionObj, gSQLiteC
27d0: 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 43 6c 61  ustomFunctionCla
27e0: 73 73 49 6e 66 6f 2e 6e 61 6d 65 29 29 3b 0a 20  ssInfo.name));. 
27f0: 20 20 20 6a 69 6e 74 20 6e 75 6d 41 72 67 73 20     jint numArgs 
2800: 3d 20 65 6e 76 2d 3e 47 65 74 49 6e 74 46 69 65  = env->GetIntFie
2810: 6c 64 28 66 75 6e 63 74 69 6f 6e 4f 62 6a 2c 20  ld(functionObj, 
2820: 67 53 51 4c 69 74 65 43 75 73 74 6f 6d 46 75 6e  gSQLiteCustomFun
2830: 63 74 69 6f 6e 43 6c 61 73 73 49 6e 66 6f 2e 6e  ctionClassInfo.n
2840: 75 6d 41 72 67 73 29 3b 0a 0a 20 20 20 20 6a 6f  umArgs);..    jo
2850: 62 6a 65 63 74 20 66 75 6e 63 74 69 6f 6e 4f 62  bject functionOb
2860: 6a 47 6c 6f 62 61 6c 20 3d 20 65 6e 76 2d 3e 4e  jGlobal = env->N
2870: 65 77 47 6c 6f 62 61 6c 52 65 66 28 66 75 6e 63  ewGlobalRef(func
2880: 74 69 6f 6e 4f 62 6a 29 3b 0a 0a 20 20 20 20 63  tionObj);..    c
2890: 6f 6e 73 74 20 63 68 61 72 2a 20 6e 61 6d 65 20  onst char* name 
28a0: 3d 20 65 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67  = env->GetString
28b0: 55 54 46 43 68 61 72 73 28 6e 61 6d 65 53 74 72  UTFChars(nameStr
28c0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 6e 74  , NULL);.    int
28d0: 20 65 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 63   err = sqlite3_c
28e0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
28f0: 32 28 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62  2(connection->db
2900: 2c 20 6e 61 6d 65 2c 20 6e 75 6d 41 72 67 73 2c  , name, numArgs,
2910: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 0a 20   SQLITE_UTF16,. 
2920: 20 20 20 20 20 20 20 20 20 20 20 72 65 69 6e 74             reint
2930: 65 72 70 72 65 74 5f 63 61 73 74 3c 76 6f 69 64  erpret_cast<void
2940: 2a 3e 28 66 75 6e 63 74 69 6f 6e 4f 62 6a 47 6c  *>(functionObjGl
2950: 6f 62 61 6c 29 2c 0a 20 20 20 20 20 20 20 20 20  obal),.         
2960: 20 20 20 26 73 71 6c 69 74 65 43 75 73 74 6f 6d     &sqliteCustom
2970: 46 75 6e 63 74 69 6f 6e 43 61 6c 6c 62 61 63 6b  FunctionCallback
2980: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 73  , NULL, NULL, &s
2990: 71 6c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74  qliteCustomFunct
29a0: 69 6f 6e 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  ionDestructor);.
29b0: 20 20 20 20 65 6e 76 2d 3e 52 65 6c 65 61 73 65      env->Release
29c0: 53 74 72 69 6e 67 55 54 46 43 68 61 72 73 28 6e  StringUTFChars(n
29d0: 61 6d 65 53 74 72 2c 20 6e 61 6d 65 29 3b 0a 0a  ameStr, name);..
29e0: 20 20 20 20 69 66 20 28 65 72 72 20 21 3d 20 53      if (err != S
29f0: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
2a00: 20 20 20 20 41 4c 4f 47 45 28 22 73 71 6c 69 74      ALOGE("sqlit
2a10: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2a20: 6f 6e 20 72 65 74 75 72 6e 65 64 20 25 64 22 2c  on returned %d",
2a30: 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 65   err);.        e
2a40: 6e 76 2d 3e 44 65 6c 65 74 65 47 6c 6f 62 61 6c  nv->DeleteGlobal
2a50: 52 65 66 28 66 75 6e 63 74 69 6f 6e 4f 62 6a 47  Ref(functionObjG
2a60: 6c 6f 62 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  lobal);.        
2a70: 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78  throw_sqlite3_ex
2a80: 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e  ception(env, con
2a90: 6e 65 63 74 69 6f 6e 2d 3e 64 62 29 3b 0a 20 20  nection->db);.  
2aa0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2ab0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
2ac0: 69 64 20 6e 61 74 69 76 65 52 65 67 69 73 74 65  id nativeRegiste
2ad0: 72 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74  rLocalizedCollat
2ae0: 6f 72 73 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  ors(JNIEnv* env,
2af0: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a   jclass clazz, j
2b00: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
2b10: 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 73 74 72  tr,.        jstr
2b20: 69 6e 67 20 6c 6f 63 61 6c 65 53 74 72 29 20 7b  ing localeStr) {
2b30: 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65  .    SQLiteConne
2b40: 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f  ction* connectio
2b50: 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f  n = reinterpret_
2b60: 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65  cast<SQLiteConne
2b70: 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69  ction*>(connecti
2b80: 6f 6e 50 74 72 29 3b 0a 0a 20 20 20 20 63 6f 6e  onPtr);..    con
2b90: 73 74 20 63 68 61 72 2a 20 6c 6f 63 61 6c 65 20  st char* locale 
2ba0: 3d 20 65 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67  = env->GetString
2bb0: 55 54 46 43 68 61 72 73 28 6c 6f 63 61 6c 65 53  UTFChars(localeS
2bc0: 74 72 2c 20 4e 55 4c 4c 29 3b 0a 23 69 66 20 30  tr, NULL);.#if 0
2bd0: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 72  .    int err = r
2be0: 65 67 69 73 74 65 72 5f 6c 6f 63 61 6c 69 7a 65  egister_localize
2bf0: 64 5f 63 6f 6c 6c 61 74 6f 72 73 28 63 6f 6e 6e  d_collators(conn
2c00: 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 6c 6f 63 61  ection->db, loca
2c10: 6c 65 2c 20 55 54 46 31 36 5f 53 54 4f 52 41 47  le, UTF16_STORAG
2c20: 45 29 3b 0a 20 20 20 20 65 6e 76 2d 3e 52 65 6c  E);.    env->Rel
2c30: 65 61 73 65 53 74 72 69 6e 67 55 54 46 43 68 61  easeStringUTFCha
2c40: 72 73 28 6c 6f 63 61 6c 65 53 74 72 2c 20 6c 6f  rs(localeStr, lo
2c50: 63 61 6c 65 29 3b 0a 0a 20 20 20 20 69 66 20 28  cale);..    if (
2c60: 65 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  err != SQLITE_OK
2c70: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f  ) {.        thro
2c80: 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74  w_sqlite3_except
2c90: 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74  ion(env, connect
2ca0: 69 6f 6e 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  ion->db);.    }.
2cb0: 23 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63  #endif.}..static
2cc0: 20 6a 6c 6f 6e 67 20 6e 61 74 69 76 65 50 72 65   jlong nativePre
2cd0: 70 61 72 65 53 74 61 74 65 6d 65 6e 74 28 4a 4e  pareStatement(JN
2ce0: 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73  IEnv* env, jclas
2cf0: 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63  s clazz, jlong c
2d00: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20  onnectionPtr,.  
2d10: 20 20 20 20 20 20 6a 73 74 72 69 6e 67 20 73 71        jstring sq
2d20: 6c 53 74 72 69 6e 67 29 20 7b 0a 20 20 20 20 53  lString) {.    S
2d30: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
2d40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65   connection = re
2d50: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53  interpret_cast<S
2d60: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
2d70: 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29  >(connectionPtr)
2d80: 3b 0a 0a 20 20 20 20 6a 73 69 7a 65 20 73 71 6c  ;..    jsize sql
2d90: 4c 65 6e 67 74 68 20 3d 20 65 6e 76 2d 3e 47 65  Length = env->Ge
2da0: 74 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 71  tStringLength(sq
2db0: 6c 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 63 6f  lString);.    co
2dc0: 6e 73 74 20 6a 63 68 61 72 2a 20 73 71 6c 20 3d  nst jchar* sql =
2dd0: 20 65 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67 43   env->GetStringC
2de0: 72 69 74 69 63 61 6c 28 73 71 6c 53 74 72 69 6e  ritical(sqlStrin
2df0: 67 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71  g, NULL);.    sq
2e00: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74  lite3_stmt* stat
2e10: 65 6d 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 65  ement;.    int e
2e20: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rr = sqlite3_pre
2e30: 70 61 72 65 31 36 5f 76 32 28 63 6f 6e 6e 65 63  pare16_v2(connec
2e40: 74 69 6f 6e 2d 3e 64 62 2c 0a 20 20 20 20 20 20  tion->db,.      
2e50: 20 20 20 20 20 20 73 71 6c 2c 20 73 71 6c 4c 65        sql, sqlLe
2e60: 6e 67 74 68 20 2a 20 73 69 7a 65 6f 66 28 6a 63  ngth * sizeof(jc
2e70: 68 61 72 29 2c 20 26 73 74 61 74 65 6d 65 6e 74  har), &statement
2e80: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 65 6e 76  , NULL);.    env
2e90: 2d 3e 52 65 6c 65 61 73 65 53 74 72 69 6e 67 43  ->ReleaseStringC
2ea0: 72 69 74 69 63 61 6c 28 73 71 6c 53 74 72 69 6e  ritical(sqlStrin
2eb0: 67 2c 20 73 71 6c 29 3b 0a 0a 20 20 20 20 69 66  g, sql);..    if
2ec0: 20 28 65 72 72 20 21 3d 20 53 51 4c 49 54 45 5f   (err != SQLITE_
2ed0: 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  OK) {.        //
2ee0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   Error messages 
2ef0: 6c 69 6b 65 20 27 6e 65 61 72 20 22 29 22 3a 20  like 'near ")": 
2f00: 73 79 6e 74 61 78 20 65 72 72 6f 72 27 20 61 72  syntax error' ar
2f10: 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2f 2f  e not.        //
2f20: 20 61 6c 77 61 79 73 20 68 65 6c 70 66 75 6c 20   always helpful 
2f30: 65 6e 6f 75 67 68 2c 20 73 6f 20 63 6f 6e 73 74  enough, so const
2f40: 72 75 63 74 20 61 6e 20 65 72 72 6f 72 20 73 74  ruct an error st
2f50: 72 69 6e 67 20 74 68 61 74 0a 20 20 20 20 20 20  ring that.      
2f60: 20 20 2f 2f 20 69 6e 63 6c 75 64 65 73 20 74 68    // includes th
2f70: 65 20 71 75 65 72 79 20 69 74 73 65 6c 66 2e 0a  e query itself..
2f80: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2f90: 61 72 20 2a 71 75 65 72 79 20 3d 20 65 6e 76 2d  ar *query = env-
2fa0: 3e 47 65 74 53 74 72 69 6e 67 55 54 46 43 68 61  >GetStringUTFCha
2fb0: 72 73 28 73 71 6c 53 74 72 69 6e 67 2c 20 4e 55  rs(sqlString, NU
2fc0: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61  LL);.        cha
2fd0: 72 20 2a 6d 65 73 73 61 67 65 20 3d 20 28 63 68  r *message = (ch
2fe0: 61 72 2a 29 20 6d 61 6c 6c 6f 63 28 73 74 72 6c  ar*) malloc(strl
2ff0: 65 6e 28 71 75 65 72 79 29 20 2b 20 35 30 29 3b  en(query) + 50);
3000: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6d 65 73  .        if (mes
3010: 73 61 67 65 29 20 7b 0a 20 20 20 20 20 20 20 20  sage) {.        
3020: 20 20 20 20 73 74 72 63 70 79 28 6d 65 73 73 61      strcpy(messa
3030: 67 65 2c 20 22 2c 20 77 68 69 6c 65 20 63 6f 6d  ge, ", while com
3040: 70 69 6c 69 6e 67 3a 20 22 29 3b 20 2f 2f 20 6c  piling: "); // l
3050: 65 73 73 20 74 68 61 6e 20 35 30 20 63 68 61 72  ess than 50 char
3060: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  s.            st
3070: 72 63 61 74 28 6d 65 73 73 61 67 65 2c 20 71 75  rcat(message, qu
3080: 65 72 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ery);.        }.
3090: 20 20 20 20 20 20 20 20 65 6e 76 2d 3e 52 65 6c          env->Rel
30a0: 65 61 73 65 53 74 72 69 6e 67 55 54 46 43 68 61  easeStringUTFCha
30b0: 72 73 28 73 71 6c 53 74 72 69 6e 67 2c 20 71 75  rs(sqlString, qu
30c0: 65 72 79 29 3b 0a 20 20 20 20 20 20 20 20 74 68  ery);.        th
30d0: 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65  row_sqlite3_exce
30e0: 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65  ption(env, conne
30f0: 63 74 69 6f 6e 2d 3e 64 62 2c 20 6d 65 73 73 61  ction->db, messa
3100: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ge);.        fre
3110: 65 28 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  e(message);.    
3120: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3130: 20 20 7d 0a 0a 20 20 20 20 41 4c 4f 47 56 28 22    }..    ALOGV("
3140: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
3150: 6e 74 20 25 70 20 6f 6e 20 63 6f 6e 6e 65 63 74  nt %p on connect
3160: 69 6f 6e 20 25 70 22 2c 20 73 74 61 74 65 6d 65  ion %p", stateme
3170: 6e 74 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e  nt, connection->
3180: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
3190: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
31a0: 3c 6a 6c 6f 6e 67 3e 28 73 74 61 74 65 6d 65 6e  <jlong>(statemen
31b0: 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  t);.}..static vo
31c0: 69 64 20 6e 61 74 69 76 65 46 69 6e 61 6c 69 7a  id nativeFinaliz
31d0: 65 53 74 61 74 65 6d 65 6e 74 28 4a 4e 49 45 6e  eStatement(JNIEn
31e0: 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20 63  v* env, jclass c
31f0: 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e  lazz, jlong conn
3200: 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20 20 20 20  ectionPtr,.     
3210: 20 20 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d 65     jlong stateme
3220: 6e 74 50 74 72 29 20 7b 0a 20 20 20 20 53 51 4c  ntPtr) {.    SQL
3230: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63  iteConnection* c
3240: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e  onnection = rein
3250: 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c  terpret_cast<SQL
3260: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28  iteConnection*>(
3270: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a  connectionPtr);.
3280: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
3290: 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 72 65  * statement = re
32a0: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73  interpret_cast<s
32b0: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74  qlite3_stmt*>(st
32c0: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20  atementPtr);..  
32d0: 20 20 2f 2f 20 57 65 20 69 67 6e 6f 72 65 20 74    // We ignore t
32e0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 73 71 6c  he result of sql
32f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 62 65  ite3_finalize be
3300: 63 61 75 73 65 20 69 74 20 69 73 20 72 65 61 6c  cause it is real
3310: 6c 79 20 74 65 6c 6c 69 6e 67 20 75 73 20 61 62  ly telling us ab
3320: 6f 75 74 0a 20 20 20 20 2f 2f 20 77 68 65 74 68  out.    // wheth
3330: 65 72 20 61 6e 79 20 65 72 72 6f 72 73 20 6f 63  er any errors oc
3340: 63 75 72 72 65 64 20 77 68 69 6c 65 20 65 78 65  curred while exe
3350: 63 75 74 69 6e 67 20 74 68 65 20 73 74 61 74 65  cuting the state
3360: 6d 65 6e 74 2e 20 20 54 68 65 20 73 74 61 74 65  ment.  The state
3370: 6d 65 6e 74 20 69 74 73 65 6c 66 0a 20 20 20 20  ment itself.    
3380: 2f 2f 20 69 73 20 61 6c 77 61 79 73 20 66 69 6e  // is always fin
3390: 61 6c 69 7a 65 64 20 72 65 67 61 72 64 6c 65 73  alized regardles
33a0: 73 2e 0a 20 20 20 20 41 4c 4f 47 56 28 22 46 69  s..    ALOGV("Fi
33b0: 6e 61 6c 69 7a 65 64 20 73 74 61 74 65 6d 65 6e  nalized statemen
33c0: 74 20 25 70 20 6f 6e 20 63 6f 6e 6e 65 63 74 69  t %p on connecti
33d0: 6f 6e 20 25 70 22 2c 20 73 74 61 74 65 6d 65 6e  on %p", statemen
33e0: 74 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64  t, connection->d
33f0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  b);.    sqlite3_
3400: 66 69 6e 61 6c 69 7a 65 28 73 74 61 74 65 6d 65  finalize(stateme
3410: 6e 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a  nt);.}..static j
3420: 69 6e 74 20 6e 61 74 69 76 65 47 65 74 50 61 72  int nativeGetPar
3430: 61 6d 65 74 65 72 43 6f 75 6e 74 28 4a 4e 49 45  ameterCount(JNIE
3440: 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20  nv* env, jclass 
3450: 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63 6f 6e  clazz, jlong con
3460: 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20 20 20  nectionPtr,.    
3470: 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d      jlong statem
3480: 65 6e 74 50 74 72 29 20 7b 0a 20 20 20 20 53 51  entPtr) {.    SQ
3490: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20  LiteConnection* 
34a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69  connection = rei
34b0: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51  nterpret_cast<SQ
34c0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e  LiteConnection*>
34d0: 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b  (connectionPtr);
34e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
34f0: 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 72  t* statement = r
3500: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c  einterpret_cast<
3510: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73  sqlite3_stmt*>(s
3520: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20  tatementPtr);.. 
3530: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3540: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
3550: 5f 63 6f 75 6e 74 28 73 74 61 74 65 6d 65 6e 74  _count(statement
3560: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 62 6f  );.}..static jbo
3570: 6f 6c 65 61 6e 20 6e 61 74 69 76 65 49 73 52 65  olean nativeIsRe
3580: 61 64 4f 6e 6c 79 28 4a 4e 49 45 6e 76 2a 20 65  adOnly(JNIEnv* e
3590: 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a  nv, jclass clazz
35a0: 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69  , jlong connecti
35b0: 6f 6e 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a  onPtr,.        j
35c0: 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74  long statementPt
35d0: 72 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43  r) {.    SQLiteC
35e0: 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65  onnection* conne
35f0: 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70  ction = reinterp
3600: 72 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43  ret_cast<SQLiteC
3610: 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e  onnection*>(conn
3620: 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20  ectionPtr);.    
3630: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74  sqlite3_stmt* st
3640: 61 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65  atement = reinte
3650: 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74  rpret_cast<sqlit
3660: 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d  e3_stmt*>(statem
3670: 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20 72 65  entPtr);..    re
3680: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  turn sqlite3_stm
3690: 74 5f 72 65 61 64 6f 6e 6c 79 28 73 74 61 74 65  t_readonly(state
36a0: 6d 65 6e 74 29 20 21 3d 20 30 3b 0a 7d 0a 0a 73  ment) != 0;.}..s
36b0: 74 61 74 69 63 20 6a 69 6e 74 20 6e 61 74 69 76  tatic jint nativ
36c0: 65 47 65 74 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  eGetColumnCount(
36d0: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c  JNIEnv* env, jcl
36e0: 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67  ass clazz, jlong
36f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a   connectionPtr,.
3700: 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74          jlong st
3710: 61 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20  atementPtr) {.  
3720: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
3730: 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d  on* connection =
3740: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73   reinterpret_cas
3750: 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  t<SQLiteConnecti
3760: 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50  on*>(connectionP
3770: 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tr);.    sqlite3
3780: 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74  _stmt* statement
3790: 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63   = reinterpret_c
37a0: 61 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74  ast<sqlite3_stmt
37b0: 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29  *>(statementPtr)
37c0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ;..    return sq
37d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
37e0: 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 7d  nt(statement);.}
37f0: 0a 0a 73 74 61 74 69 63 20 6a 73 74 72 69 6e 67  ..static jstring
3800: 20 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e   nativeGetColumn
3810: 4e 61 6d 65 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  Name(JNIEnv* env
3820: 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20  , jclass clazz, 
3830: 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  jlong connection
3840: 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f  Ptr,.        jlo
3850: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c  ng statementPtr,
3860: 20 6a 69 6e 74 20 69 6e 64 65 78 29 20 7b 0a 20   jint index) {. 
3870: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
3880: 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ion* connection 
3890: 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61  = reinterpret_ca
38a0: 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  st<SQLiteConnect
38b0: 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e  ion*>(connection
38c0: 50 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Ptr);.    sqlite
38d0: 33 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e  3_stmt* statemen
38e0: 74 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f  t = reinterpret_
38f0: 63 61 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d  cast<sqlite3_stm
3900: 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72  t*>(statementPtr
3910: 29 3b 0a 0a 20 20 20 20 63 6f 6e 73 74 20 6a 63  );..    const jc
3920: 68 61 72 2a 20 6e 61 6d 65 20 3d 20 73 74 61 74  har* name = stat
3930: 69 63 5f 63 61 73 74 3c 63 6f 6e 73 74 20 6a 63  ic_cast<const jc
3940: 68 61 72 2a 3e 28 73 71 6c 69 74 65 33 5f 63 6f  har*>(sqlite3_co
3950: 6c 75 6d 6e 5f 6e 61 6d 65 31 36 28 73 74 61 74  lumn_name16(stat
3960: 65 6d 65 6e 74 2c 20 69 6e 64 65 78 29 29 3b 0a  ement, index));.
3970: 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a      if (name) {.
3980: 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6c          size_t l
3990: 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 20  ength = 0;.     
39a0: 20 20 20 77 68 69 6c 65 20 28 6e 61 6d 65 5b 6c     while (name[l
39b0: 65 6e 67 74 68 5d 29 20 7b 0a 20 20 20 20 20 20  ength]) {.      
39c0: 20 20 20 20 20 20 6c 65 6e 67 74 68 20 2b 3d 20        length += 
39d0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
39e0: 20 20 20 20 20 72 65 74 75 72 6e 20 65 6e 76 2d       return env-
39f0: 3e 4e 65 77 53 74 72 69 6e 67 28 6e 61 6d 65 2c  >NewString(name,
3a00: 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 7d 0a   length);.    }.
3a10: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
3a20: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
3a30: 6e 61 74 69 76 65 42 69 6e 64 4e 75 6c 6c 28 4a  nativeBindNull(J
3a40: 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61  NIEnv* env, jcla
3a50: 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20  ss clazz, jlong 
3a60: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20  connectionPtr,. 
3a70: 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61         jlong sta
3a80: 74 65 6d 65 6e 74 50 74 72 2c 20 6a 69 6e 74 20  tementPtr, jint 
3a90: 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 53 51 4c  index) {.    SQL
3aa0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63  iteConnection* c
3ab0: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e  onnection = rein
3ac0: 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c  terpret_cast<SQL
3ad0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28  iteConnection*>(
3ae0: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a  connectionPtr);.
3af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
3b00: 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 72 65  * statement = re
3b10: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73  interpret_cast<s
3b20: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74  qlite3_stmt*>(st
3b30: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20  atementPtr);..  
3b40: 20 20 69 6e 74 20 65 72 72 20 3d 20 73 71 6c 69    int err = sqli
3b50: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 73 74  te3_bind_null(st
3b60: 61 74 65 6d 65 6e 74 2c 20 69 6e 64 65 78 29 3b  atement, index);
3b70: 0a 20 20 20 20 69 66 20 28 65 72 72 20 21 3d 20  .    if (err != 
3b80: 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
3b90: 20 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69 74       throw_sqlit
3ba0: 65 33 5f 65 78 63 65 70 74 69 6f 6e 28 65 6e 76  e3_exception(env
3bb0: 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62  , connection->db
3bc0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 7d  , NULL);.    }.}
3bd0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 61  ..static void na
3be0: 74 69 76 65 42 69 6e 64 4c 6f 6e 67 28 4a 4e 49  tiveBindLong(JNI
3bf0: 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73  Env* env, jclass
3c00: 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63 6f   clazz, jlong co
3c10: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20 20  nnectionPtr,.   
3c20: 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61 74 65       jlong state
3c30: 6d 65 6e 74 50 74 72 2c 20 6a 69 6e 74 20 69 6e  mentPtr, jint in
3c40: 64 65 78 2c 20 6a 6c 6f 6e 67 20 76 61 6c 75 65  dex, jlong value
3c50: 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f  ) {.    SQLiteCo
3c60: 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63  nnection* connec
3c70: 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72  tion = reinterpr
3c80: 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f  et_cast<SQLiteCo
3c90: 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65  nnection*>(conne
3ca0: 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73  ctionPtr);.    s
3cb0: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61  qlite3_stmt* sta
3cc0: 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65 72  tement = reinter
3cd0: 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74 65  pret_cast<sqlite
3ce0: 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65  3_stmt*>(stateme
3cf0: 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74  ntPtr);..    int
3d00: 20 65 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 62   err = sqlite3_b
3d10: 69 6e 64 5f 69 6e 74 36 34 28 73 74 61 74 65 6d  ind_int64(statem
3d20: 65 6e 74 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75  ent, index, valu
3d30: 65 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72 20  e);.    if (err 
3d40: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  != SQLITE_OK) {.
3d50: 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f 73 71          throw_sq
3d60: 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f 6e 28  lite3_exception(
3d70: 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  env, connection-
3d80: 3e 64 62 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  >db, NULL);.    
3d90: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
3da0: 20 6e 61 74 69 76 65 42 69 6e 64 44 6f 75 62 6c   nativeBindDoubl
3db0: 65 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a  e(JNIEnv* env, j
3dc0: 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f  class clazz, jlo
3dd0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  ng connectionPtr
3de0: 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20  ,.        jlong 
3df0: 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 6a 69  statementPtr, ji
3e00: 6e 74 20 69 6e 64 65 78 2c 20 6a 64 6f 75 62 6c  nt index, jdoubl
3e10: 65 20 76 61 6c 75 65 29 20 7b 0a 20 20 20 20 53  e value) {.    S
3e20: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
3e30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65   connection = re
3e40: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53  interpret_cast<S
3e50: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
3e60: 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29  >(connectionPtr)
3e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
3e80: 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20  mt* statement = 
3e90: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
3ea0: 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28  <sqlite3_stmt*>(
3eb0: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a  statementPtr);..
3ec0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 73 71      int err = sq
3ed0: 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
3ee0: 65 28 73 74 61 74 65 6d 65 6e 74 2c 20 69 6e 64  e(statement, ind
3ef0: 65 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  ex, value);.    
3f00: 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c 49 54  if (err != SQLIT
3f10: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  E_OK) {.        
3f20: 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78  throw_sqlite3_ex
3f30: 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e  ception(env, con
3f40: 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 4e 55 4c  nection->db, NUL
3f50: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  L);.    }.}..sta
3f60: 74 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 42  tic void nativeB
3f70: 69 6e 64 53 74 72 69 6e 67 28 4a 4e 49 45 6e 76  indString(JNIEnv
3f80: 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c  * env, jclass cl
3f90: 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65  azz, jlong conne
3fa0: 63 74 69 6f 6e 50 74 72 2c 0a 20 20 20 20 20 20  ctionPtr,.      
3fb0: 20 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e    jlong statemen
3fc0: 74 50 74 72 2c 20 6a 69 6e 74 20 69 6e 64 65 78  tPtr, jint index
3fd0: 2c 20 6a 73 74 72 69 6e 67 20 76 61 6c 75 65 53  , jstring valueS
3fe0: 74 72 69 6e 67 29 20 7b 0a 20 20 20 20 53 51 4c  tring) {.    SQL
3ff0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63  iteConnection* c
4000: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e  onnection = rein
4010: 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c  terpret_cast<SQL
4020: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28  iteConnection*>(
4030: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a  connectionPtr);.
4040: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
4050: 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 72 65  * statement = re
4060: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73  interpret_cast<s
4070: 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74  qlite3_stmt*>(st
4080: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20  atementPtr);..  
4090: 20 20 6a 73 69 7a 65 20 76 61 6c 75 65 4c 65 6e    jsize valueLen
40a0: 67 74 68 20 3d 20 65 6e 76 2d 3e 47 65 74 53 74  gth = env->GetSt
40b0: 72 69 6e 67 4c 65 6e 67 74 68 28 76 61 6c 75 65  ringLength(value
40c0: 53 74 72 69 6e 67 29 3b 0a 20 20 20 20 63 6f 6e  String);.    con
40d0: 73 74 20 6a 63 68 61 72 2a 20 76 61 6c 75 65 20  st jchar* value 
40e0: 3d 20 65 6e 76 2d 3e 47 65 74 53 74 72 69 6e 67  = env->GetString
40f0: 43 72 69 74 69 63 61 6c 28 76 61 6c 75 65 53 74  Critical(valueSt
4100: 72 69 6e 67 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ring, NULL);.   
4110: 20 69 6e 74 20 65 72 72 20 3d 20 73 71 6c 69 74   int err = sqlit
4120: 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 73  e3_bind_text16(s
4130: 74 61 74 65 6d 65 6e 74 2c 20 69 6e 64 65 78 2c  tatement, index,
4140: 20 76 61 6c 75 65 2c 20 76 61 6c 75 65 4c 65 6e   value, valueLen
4150: 67 74 68 20 2a 20 73 69 7a 65 6f 66 28 6a 63 68  gth * sizeof(jch
4160: 61 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ar),.           
4170: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4180: 54 29 3b 0a 20 20 20 20 65 6e 76 2d 3e 52 65 6c  T);.    env->Rel
4190: 65 61 73 65 53 74 72 69 6e 67 43 72 69 74 69 63  easeStringCritic
41a0: 61 6c 28 76 61 6c 75 65 53 74 72 69 6e 67 2c 20  al(valueString, 
41b0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 20 28  value);.    if (
41c0: 65 72 72 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  err != SQLITE_OK
41d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f  ) {.        thro
41e0: 77 5f 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74  w_sqlite3_except
41f0: 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74  ion(env, connect
4200: 69 6f 6e 2d 3e 64 62 2c 20 4e 55 4c 4c 29 3b 0a  ion->db, NULL);.
4210: 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20      }.}..static 
4220: 76 6f 69 64 20 6e 61 74 69 76 65 42 69 6e 64 42  void nativeBindB
4230: 6c 6f 62 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  lob(JNIEnv* env,
4240: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 20 6a   jclass clazz, j
4250: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
4260: 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f 6e  tr,.        jlon
4270: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20  g statementPtr, 
4280: 6a 69 6e 74 20 69 6e 64 65 78 2c 20 6a 62 79 74  jint index, jbyt
4290: 65 41 72 72 61 79 20 76 61 6c 75 65 41 72 72 61  eArray valueArra
42a0: 79 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43  y) {.    SQLiteC
42b0: 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65  onnection* conne
42c0: 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70  ction = reinterp
42d0: 72 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43  ret_cast<SQLiteC
42e0: 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e  onnection*>(conn
42f0: 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20  ectionPtr);.    
4300: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74  sqlite3_stmt* st
4310: 61 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65  atement = reinte
4320: 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74  rpret_cast<sqlit
4330: 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d  e3_stmt*>(statem
4340: 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20 6a 73  entPtr);..    js
4350: 69 7a 65 20 76 61 6c 75 65 4c 65 6e 67 74 68 20  ize valueLength 
4360: 3d 20 65 6e 76 2d 3e 47 65 74 41 72 72 61 79 4c  = env->GetArrayL
4370: 65 6e 67 74 68 28 76 61 6c 75 65 41 72 72 61 79  ength(valueArray
4380: 29 3b 0a 20 20 20 20 6a 62 79 74 65 2a 20 76 61  );.    jbyte* va
4390: 6c 75 65 20 3d 20 73 74 61 74 69 63 5f 63 61 73  lue = static_cas
43a0: 74 3c 6a 62 79 74 65 2a 3e 28 65 6e 76 2d 3e 47  t<jbyte*>(env->G
43b0: 65 74 50 72 69 6d 69 74 69 76 65 41 72 72 61 79  etPrimitiveArray
43c0: 43 72 69 74 69 63 61 6c 28 76 61 6c 75 65 41 72  Critical(valueAr
43d0: 72 61 79 2c 20 4e 55 4c 4c 29 29 3b 0a 20 20 20  ray, NULL));.   
43e0: 20 69 6e 74 20 65 72 72 20 3d 20 73 71 6c 69 74   int err = sqlit
43f0: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 73 74 61  e3_bind_blob(sta
4400: 74 65 6d 65 6e 74 2c 20 69 6e 64 65 78 2c 20 76  tement, index, v
4410: 61 6c 75 65 2c 20 76 61 6c 75 65 4c 65 6e 67 74  alue, valueLengt
4420: 68 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  h, SQLITE_TRANSI
4430: 45 4e 54 29 3b 0a 20 20 20 20 65 6e 76 2d 3e 52  ENT);.    env->R
4440: 65 6c 65 61 73 65 50 72 69 6d 69 74 69 76 65 41  eleasePrimitiveA
4450: 72 72 61 79 43 72 69 74 69 63 61 6c 28 76 61 6c  rrayCritical(val
4460: 75 65 41 72 72 61 79 2c 20 76 61 6c 75 65 2c 20  ueArray, value, 
4470: 4a 4e 49 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  JNI_ABORT);.    
4480: 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c 49 54  if (err != SQLIT
4490: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  E_OK) {.        
44a0: 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78  throw_sqlite3_ex
44b0: 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e  ception(env, con
44c0: 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 4e 55 4c  nection->db, NUL
44d0: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  L);.    }.}..sta
44e0: 74 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 52  tic void nativeR
44f0: 65 73 65 74 53 74 61 74 65 6d 65 6e 74 41 6e 64  esetStatementAnd
4500: 43 6c 65 61 72 42 69 6e 64 69 6e 67 73 28 4a 4e  ClearBindings(JN
4510: 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73  IEnv* env, jclas
4520: 73 20 63 6c 61 7a 7a 2c 20 6a 6c 6f 6e 67 20 63  s clazz, jlong c
4530: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20  onnectionPtr,.  
4540: 20 20 20 20 20 20 6a 6c 6f 6e 67 20 73 74 61 74        jlong stat
4550: 65 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20 20 20  ementPtr) {.    
4560: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
4570: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72  * connection = r
4580: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c  einterpret_cast<
4590: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
45a0: 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  *>(connectionPtr
45b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
45c0: 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d  tmt* statement =
45d0: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73   reinterpret_cas
45e0: 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e  t<sqlite3_stmt*>
45f0: 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a  (statementPtr);.
4600: 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 73  .    int err = s
4610: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 73 74 61  qlite3_reset(sta
4620: 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 20  tement);.    if 
4630: 28 65 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 4f  (err == SQLITE_O
4640: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 65 72 72  K) {.        err
4650: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72   = sqlite3_clear
4660: 5f 62 69 6e 64 69 6e 67 73 28 73 74 61 74 65 6d  _bindings(statem
4670: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ent);.    }.    
4680: 69 66 20 28 65 72 72 20 21 3d 20 53 51 4c 49 54  if (err != SQLIT
4690: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  E_OK) {.        
46a0: 74 68 72 6f 77 5f 73 71 6c 69 74 65 33 5f 65 78  throw_sqlite3_ex
46b0: 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 63 6f 6e  ception(env, con
46c0: 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c 20 4e 55 4c  nection->db, NUL
46d0: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61  L);.    }.}..sta
46e0: 74 69 63 20 69 6e 74 20 65 78 65 63 75 74 65 4e  tic int executeN
46f0: 6f 6e 51 75 65 72 79 28 4a 4e 49 45 6e 76 2a 20  onQuery(JNIEnv* 
4700: 65 6e 76 2c 20 53 51 4c 69 74 65 43 6f 6e 6e 65  env, SQLiteConne
4710: 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f  ction* connectio
4720: 6e 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  n, sqlite3_stmt*
4730: 20 73 74 61 74 65 6d 65 6e 74 29 20 7b 0a 20 20   statement) {.  
4740: 20 20 69 6e 74 20 65 72 72 20 3d 20 73 71 6c 69    int err = sqli
4750: 74 65 33 5f 73 74 65 70 28 73 74 61 74 65 6d 65  te3_step(stateme
4760: 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72  nt);.    if (err
4770: 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 29 20   == SQLITE_ROW) 
4780: 7b 0a 20 20 20 20 20 20 20 20 74 68 72 6f 77 5f  {.        throw_
4790: 73 71 6c 69 74 65 33 5f 65 78 63 65 70 74 69 6f  sqlite3_exceptio
47a0: 6e 28 65 6e 76 2c 0a 20 20 20 20 20 20 20 20 20  n(env,.         
47b0: 20 20 20 20 20 20 20 22 51 75 65 72 69 65 73 20         "Queries 
47c0: 63 61 6e 20 62 65 20 70 65 72 66 6f 72 6d 65 64  can be performed
47d0: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 44 61 74   using SQLiteDat
47e0: 61 62 61 73 65 20 71 75 65 72 79 20 6f 72 20 72  abase query or r
47f0: 61 77 51 75 65 72 79 20 6d 65 74 68 6f 64 73 20  awQuery methods 
4800: 6f 6e 6c 79 2e 22 29 3b 0a 20 20 20 20 7d 20 65  only.");.    } e
4810: 6c 73 65 20 69 66 20 28 65 72 72 20 21 3d 20 53  lse if (err != S
4820: 51 4c 49 54 45 5f 44 4f 4e 45 29 20 7b 0a 20 20  QLITE_DONE) {.  
4830: 20 20 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69        throw_sqli
4840: 74 65 33 5f 65 78 63 65 70 74 69 6f 6e 28 65 6e  te3_exception(en
4850: 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64  v, connection->d
4860: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  b);.    }.    re
4870: 74 75 72 6e 20 65 72 72 3b 0a 7d 0a 0a 73 74 61  turn err;.}..sta
4880: 74 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65 45  tic void nativeE
4890: 78 65 63 75 74 65 28 4a 4e 49 45 6e 76 2a 20 65  xecute(JNIEnv* e
48a0: 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a  nv, jclass clazz
48b0: 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69  , jlong connecti
48c0: 6f 6e 50 74 72 2c 0a 20 20 20 20 20 20 20 20 6a  onPtr,.        j
48d0: 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74  long statementPt
48e0: 72 29 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43  r) {.    SQLiteC
48f0: 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65  onnection* conne
4900: 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70  ction = reinterp
4910: 72 65 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43  ret_cast<SQLiteC
4920: 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e  onnection*>(conn
4930: 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20  ectionPtr);.    
4940: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 73 74  sqlite3_stmt* st
4950: 61 74 65 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65  atement = reinte
4960: 72 70 72 65 74 5f 63 61 73 74 3c 73 71 6c 69 74  rpret_cast<sqlit
4970: 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d  e3_stmt*>(statem
4980: 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20 20 65 78  entPtr);..    ex
4990: 65 63 75 74 65 4e 6f 6e 51 75 65 72 79 28 65 6e  ecuteNonQuery(en
49a0: 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 73  v, connection, s
49b0: 74 61 74 65 6d 65 6e 74 29 3b 0a 7d 0a 0a 73 74  tatement);.}..st
49c0: 61 74 69 63 20 6a 69 6e 74 20 6e 61 74 69 76 65  atic jint native
49d0: 45 78 65 63 75 74 65 46 6f 72 43 68 61 6e 67 65  ExecuteForChange
49e0: 64 52 6f 77 43 6f 75 6e 74 28 4a 4e 49 45 6e 76  dRowCount(JNIEnv
49f0: 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73 20 63 6c  * env, jclass cl
4a00: 61 7a 7a 2c 0a 20 20 20 20 20 20 20 20 6a 6c 6f  azz,.        jlo
4a10: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  ng connectionPtr
4a20: 2c 20 6a 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e  , jlong statemen
4a30: 74 50 74 72 29 20 7b 0a 20 20 20 20 53 51 4c 69  tPtr) {.    SQLi
4a40: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f  teConnection* co
4a50: 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74  nnection = reint
4a60: 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c 69  erpret_cast<SQLi
4a70: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63  teConnection*>(c
4a80: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20  onnectionPtr);. 
4a90: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a     sqlite3_stmt*
4aa0: 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 72 65 69   statement = rei
4ab0: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73 71  nterpret_cast<sq
4ac0: 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61  lite3_stmt*>(sta
4ad0: 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20 20  tementPtr);..   
4ae0: 20 69 6e 74 20 65 72 72 20 3d 20 65 78 65 63 75   int err = execu
4af0: 74 65 4e 6f 6e 51 75 65 72 79 28 65 6e 76 2c 20  teNonQuery(env, 
4b00: 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 73 74 61 74  connection, stat
4b10: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75  ement);.    retu
4b20: 72 6e 20 65 72 72 20 3d 3d 20 53 51 4c 49 54 45  rn err == SQLITE
4b30: 5f 44 4f 4e 45 20 3f 20 73 71 6c 69 74 65 33 5f  _DONE ? sqlite3_
4b40: 63 68 61 6e 67 65 73 28 63 6f 6e 6e 65 63 74 69  changes(connecti
4b50: 6f 6e 2d 3e 64 62 29 20 3a 20 2d 31 3b 0a 7d 0a  on->db) : -1;.}.
4b60: 0a 73 74 61 74 69 63 20 6a 6c 6f 6e 67 20 6e 61  .static jlong na
4b70: 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 4c 61  tiveExecuteForLa
4b80: 73 74 49 6e 73 65 72 74 65 64 52 6f 77 49 64 28  stInsertedRowId(
4b90: 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c  JNIEnv* env, jcl
4ba0: 61 73 73 20 63 6c 61 7a 7a 2c 0a 20 20 20 20 20  ass clazz,.     
4bb0: 20 20 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74     jlong connect
4bc0: 69 6f 6e 50 74 72 2c 20 6a 6c 6f 6e 67 20 73 74  ionPtr, jlong st
4bd0: 61 74 65 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20  atementPtr) {.  
4be0: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
4bf0: 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d  on* connection =
4c00: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73   reinterpret_cas
4c10: 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  t<SQLiteConnecti
4c20: 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50  on*>(connectionP
4c30: 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tr);.    sqlite3
4c40: 5f 73 74 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74  _stmt* statement
4c50: 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63   = reinterpret_c
4c60: 61 73 74 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74  ast<sqlite3_stmt
4c70: 2a 3e 28 73 74 61 74 65 6d 65 6e 74 50 74 72 29  *>(statementPtr)
4c80: 3b 0a 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  ;..    int err =
4c90: 20 65 78 65 63 75 74 65 4e 6f 6e 51 75 65 72 79   executeNonQuery
4ca0: 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e  (env, connection
4cb0: 2c 20 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  , statement);.  
4cc0: 20 20 72 65 74 75 72 6e 20 65 72 72 20 3d 3d 20    return err == 
4cd0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 73  SQLITE_DONE && s
4ce0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 63  qlite3_changes(c
4cf0: 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 29 20 3e  onnection->db) >
4d00: 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 3f   0.            ?
4d10: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
4d20: 73 65 72 74 5f 72 6f 77 69 64 28 63 6f 6e 6e 65  sert_rowid(conne
4d30: 63 74 69 6f 6e 2d 3e 64 62 29 20 3a 20 2d 31 3b  ction->db) : -1;
4d40: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .}..static int e
4d50: 78 65 63 75 74 65 4f 6e 65 52 6f 77 51 75 65 72  xecuteOneRowQuer
4d60: 79 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20 53  y(JNIEnv* env, S
4d70: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
4d80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 73 71 6c   connection, sql
4d90: 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65  ite3_stmt* state
4da0: 6d 65 6e 74 29 20 7b 0a 20 20 20 20 69 6e 74 20  ment) {.    int 
4db0: 65 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  err = sqlite3_st
4dc0: 65 70 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ep(statement);. 
4dd0: 20 20 20 69 66 20 28 65 72 72 20 21 3d 20 53 51     if (err != SQ
4de0: 4c 49 54 45 5f 52 4f 57 29 20 7b 0a 20 20 20 20  LITE_ROW) {.    
4df0: 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65      throw_sqlite
4e00: 33 5f 65 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c  3_exception(env,
4e10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 29   connection->db)
4e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
4e30: 72 6e 20 65 72 72 3b 0a 7d 0a 0a 73 74 61 74 69  rn err;.}..stati
4e40: 63 20 6a 6c 6f 6e 67 20 6e 61 74 69 76 65 45 78  c jlong nativeEx
4e50: 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 4a 4e 49  ecuteForLong(JNI
4e60: 45 6e 76 2a 20 65 6e 76 2c 20 6a 63 6c 61 73 73  Env* env, jclass
4e70: 20 63 6c 61 7a 7a 2c 0a 20 20 20 20 20 20 20 20   clazz,.        
4e80: 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  jlong connection
4e90: 50 74 72 2c 20 6a 6c 6f 6e 67 20 73 74 61 74 65  Ptr, jlong state
4ea0: 6d 65 6e 74 50 74 72 29 20 7b 0a 20 20 20 20 53  mentPtr) {.    S
4eb0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
4ec0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65   connection = re
4ed0: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53  interpret_cast<S
4ee0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a  QLiteConnection*
4ef0: 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29  >(connectionPtr)
4f00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
4f10: 6d 74 2a 20 73 74 61 74 65 6d 65 6e 74 20 3d 20  mt* statement = 
4f20: 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74  reinterpret_cast
4f30: 3c 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28  <sqlite3_stmt*>(
4f40: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a  statementPtr);..
4f50: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 78      int err = ex
4f60: 65 63 75 74 65 4f 6e 65 52 6f 77 51 75 65 72 79  ecuteOneRowQuery
4f70: 28 65 6e 76 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e  (env, connection
4f80: 2c 20 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  , statement);.  
4f90: 20 20 69 66 20 28 65 72 72 20 3d 3d 20 53 51 4c    if (err == SQL
4fa0: 49 54 45 5f 52 4f 57 20 26 26 20 73 71 6c 69 74  ITE_ROW && sqlit
4fb0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
4fc0: 73 74 61 74 65 6d 65 6e 74 29 20 3e 3d 20 31 29  statement) >= 1)
4fd0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
4fe0: 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  n sqlite3_column
4ff0: 5f 69 6e 74 36 34 28 73 74 61 74 65 6d 65 6e 74  _int64(statement
5000: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
5010: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74  return -1;.}..st
5020: 61 74 69 63 20 6a 73 74 72 69 6e 67 20 6e 61 74  atic jstring nat
5030: 69 76 65 45 78 65 63 75 74 65 46 6f 72 53 74 72  iveExecuteForStr
5040: 69 6e 67 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  ing(JNIEnv* env,
5050: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 0a 20   jclass clazz,. 
5060: 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 63 6f 6e         jlong con
5070: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6a 6c 6f 6e  nectionPtr, jlon
5080: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 20  g statementPtr) 
5090: 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e  {.    SQLiteConn
50a0: 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69  ection* connecti
50b0: 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74  on = reinterpret
50c0: 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e  _cast<SQLiteConn
50d0: 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74  ection*>(connect
50e0: 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73 71 6c  ionPtr);.    sql
50f0: 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65  ite3_stmt* state
5100: 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65 72 70 72  ment = reinterpr
5110: 65 74 5f 63 61 73 74 3c 73 71 6c 69 74 65 33 5f  et_cast<sqlite3_
5120: 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74  stmt*>(statement
5130: 50 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20 65  Ptr);..    int e
5140: 72 72 20 3d 20 65 78 65 63 75 74 65 4f 6e 65 52  rr = executeOneR
5150: 6f 77 51 75 65 72 79 28 65 6e 76 2c 20 63 6f 6e  owQuery(env, con
5160: 6e 65 63 74 69 6f 6e 2c 20 73 74 61 74 65 6d 65  nection, stateme
5170: 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72  nt);.    if (err
5180: 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 26   == SQLITE_ROW &
5190: 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
51a0: 5f 63 6f 75 6e 74 28 73 74 61 74 65 6d 65 6e 74  _count(statement
51b0: 29 20 3e 3d 20 31 29 20 7b 0a 20 20 20 20 20 20  ) >= 1) {.      
51c0: 20 20 63 6f 6e 73 74 20 6a 63 68 61 72 2a 20 74    const jchar* t
51d0: 65 78 74 20 3d 20 73 74 61 74 69 63 5f 63 61 73  ext = static_cas
51e0: 74 3c 63 6f 6e 73 74 20 6a 63 68 61 72 2a 3e 28  t<const jchar*>(
51f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5200: 65 78 74 31 36 28 73 74 61 74 65 6d 65 6e 74 2c  ext16(statement,
5210: 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66   0));.        if
5220: 20 28 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20   (text) {.      
5230: 20 20 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e        size_t len
5240: 67 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  gth = sqlite3_co
5250: 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 73 74 61  lumn_bytes16(sta
5260: 74 65 6d 65 6e 74 2c 20 30 29 20 2f 20 73 69 7a  tement, 0) / siz
5270: 65 6f 66 28 6a 63 68 61 72 29 3b 0a 20 20 20 20  eof(jchar);.    
5280: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
5290: 6e 76 2d 3e 4e 65 77 53 74 72 69 6e 67 28 74 65  nv->NewString(te
52a0: 78 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20  xt, length);.   
52b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
52c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a   return NULL;.}.
52d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
52e0: 74 65 41 73 68 6d 65 6d 52 65 67 69 6f 6e 57 69  teAshmemRegionWi
52f0: 74 68 44 61 74 61 28 4a 4e 49 45 6e 76 2a 20 65  thData(JNIEnv* e
5300: 6e 76 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 20  nv, const void* 
5310: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 6c 65 6e  data, size_t len
5320: 67 74 68 29 20 7b 0a 23 69 66 20 30 0a 20 20 20  gth) {.#if 0.   
5330: 20 69 6e 74 20 65 72 72 6f 72 20 3d 20 30 3b 0a   int error = 0;.
5340: 20 20 20 20 69 6e 74 20 66 64 20 3d 20 61 73 68      int fd = ash
5350: 6d 65 6d 5f 63 72 65 61 74 65 5f 72 65 67 69 6f  mem_create_regio
5360: 6e 28 4e 55 4c 4c 2c 20 6c 65 6e 67 74 68 29 3b  n(NULL, length);
5370: 0a 20 20 20 20 69 66 20 28 66 64 20 3c 20 30 29  .    if (fd < 0)
5380: 20 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72   {.        error
5390: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
53a0: 20 20 41 4c 4f 47 45 28 22 61 73 68 6d 65 6d 5f    ALOGE("ashmem_
53b0: 63 72 65 61 74 65 5f 72 65 67 69 6f 6e 20 66 61  create_region fa
53c0: 69 6c 65 64 3a 20 25 73 22 2c 20 73 74 72 65 72  iled: %s", strer
53d0: 72 6f 72 28 65 72 72 6f 72 29 29 3b 0a 20 20 20  ror(error));.   
53e0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
53f0: 20 20 69 66 20 28 6c 65 6e 67 74 68 20 3e 20 30    if (length > 0
5400: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
5410: 76 6f 69 64 2a 20 70 74 72 20 3d 20 6d 6d 61 70  void* ptr = mmap
5420: 28 4e 55 4c 4c 2c 20 6c 65 6e 67 74 68 2c 20 50  (NULL, length, P
5430: 52 4f 54 5f 52 45 41 44 20 7c 20 50 52 4f 54 5f  ROT_READ | PROT_
5440: 57 52 49 54 45 2c 20 4d 41 50 5f 53 48 41 52 45  WRITE, MAP_SHARE
5450: 44 2c 20 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  D, fd, 0);.     
5460: 20 20 20 20 20 20 20 69 66 20 28 70 74 72 20 3d         if (ptr =
5470: 3d 20 4d 41 50 5f 46 41 49 4c 45 44 29 20 7b 0a  = MAP_FAILED) {.
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 65 72 72 6f 72 20 3d 20 65 72 72 6e 6f 3b 0a 20  error = errno;. 
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
54b0: 4c 4f 47 45 28 22 6d 6d 61 70 20 66 61 69 6c 65  LOGE("mmap faile
54c0: 64 3a 20 25 73 22 2c 20 73 74 72 65 72 72 6f 72  d: %s", strerror
54d0: 28 65 72 72 6f 72 29 29 3b 0a 20 20 20 20 20 20  (error));.      
54e0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
5500: 65 6d 63 70 79 28 70 74 72 2c 20 64 61 74 61 2c  emcpy(ptr, data,
5510: 20 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 20 20   length);.      
5520: 20 20 20 20 20 20 20 20 20 20 6d 75 6e 6d 61 70            munmap
5530: 28 70 74 72 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  (ptr, length);. 
5540: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5550: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
5560: 69 66 20 28 21 65 72 72 6f 72 29 20 7b 0a 20 20  if (!error) {.  
5570: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 73            if (as
5580: 68 6d 65 6d 5f 73 65 74 5f 70 72 6f 74 5f 72 65  hmem_set_prot_re
5590: 67 69 6f 6e 28 66 64 2c 20 50 52 4f 54 5f 52 45  gion(fd, PROT_RE
55a0: 41 44 29 20 3c 20 30 29 20 7b 0a 20 20 20 20 20  AD) < 0) {.     
55b0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
55c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
55d0: 20 20 20 20 20 20 20 20 20 20 41 4c 4f 47 45 28            ALOGE(
55e0: 22 61 73 68 6d 65 6d 5f 73 65 74 5f 70 72 6f 74  "ashmem_set_prot
55f0: 5f 72 65 67 69 6f 6e 20 66 61 69 6c 65 64 3a 20  _region failed: 
5600: 25 73 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72  %s", strerror(er
5610: 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  rno));.         
5620: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
5630: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5640: 72 6e 20 66 64 3b 0a 20 20 20 20 20 20 20 20 20  rn fd;.         
5650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
5660: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64          close(fd
5670: 29 3b 0a 20 20 20 20 7d 0a 0a 23 65 6e 64 69 66  );.    }..#endif
5680: 0a 20 20 20 20 6a 6e 69 54 68 72 6f 77 49 4f 45  .    jniThrowIOE
5690: 78 63 65 70 74 69 6f 6e 28 65 6e 76 2c 20 2d 31  xception(env, -1
56a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  );.    return -1
56b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 69 6e 74  ;.}..static jint
56c0: 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f   nativeExecuteFo
56d0: 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70  rBlobFileDescrip
56e0: 74 6f 72 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c  tor(JNIEnv* env,
56f0: 20 6a 63 6c 61 73 73 20 63 6c 61 7a 7a 2c 0a 20   jclass clazz,. 
5700: 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 63 6f 6e         jlong con
5710: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6a 6c 6f 6e  nectionPtr, jlon
5720: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 20  g statementPtr) 
5730: 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e  {.    SQLiteConn
5740: 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74 69  ection* connecti
5750: 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74  on = reinterpret
5760: 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e 6e  _cast<SQLiteConn
5770: 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74  ection*>(connect
5780: 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 73 71 6c  ionPtr);.    sql
5790: 69 74 65 33 5f 73 74 6d 74 2a 20 73 74 61 74 65  ite3_stmt* state
57a0: 6d 65 6e 74 20 3d 20 72 65 69 6e 74 65 72 70 72  ment = reinterpr
57b0: 65 74 5f 63 61 73 74 3c 73 71 6c 69 74 65 33 5f  et_cast<sqlite3_
57c0: 73 74 6d 74 2a 3e 28 73 74 61 74 65 6d 65 6e 74  stmt*>(statement
57d0: 50 74 72 29 3b 0a 0a 20 20 20 20 69 6e 74 20 65  Ptr);..    int e
57e0: 72 72 20 3d 20 65 78 65 63 75 74 65 4f 6e 65 52  rr = executeOneR
57f0: 6f 77 51 75 65 72 79 28 65 6e 76 2c 20 63 6f 6e  owQuery(env, con
5800: 6e 65 63 74 69 6f 6e 2c 20 73 74 61 74 65 6d 65  nection, stateme
5810: 6e 74 29 3b 0a 20 20 20 20 69 66 20 28 65 72 72  nt);.    if (err
5820: 20 3d 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 26   == SQLITE_ROW &
5830: 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
5840: 5f 63 6f 75 6e 74 28 73 74 61 74 65 6d 65 6e 74  _count(statement
5850: 29 20 3e 3d 20 31 29 20 7b 0a 20 20 20 20 20 20  ) >= 1) {.      
5860: 20 20 63 6f 6e 73 74 20 76 6f 69 64 2a 20 62 6c    const void* bl
5870: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
5880: 75 6d 6e 5f 62 6c 6f 62 28 73 74 61 74 65 6d 65  umn_blob(stateme
5890: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nt, 0);.        
58a0: 69 66 20 28 62 6c 6f 62 29 20 7b 0a 20 20 20 20  if (blob) {.    
58b0: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 67          int leng
58c0: 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  th = sqlite3_col
58d0: 75 6d 6e 5f 62 79 74 65 73 28 73 74 61 74 65 6d  umn_bytes(statem
58e0: 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ent, 0);.       
58f0: 20 20 20 20 20 69 66 20 28 6c 65 6e 67 74 68 20       if (length 
5900: 3e 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  >= 0) {.        
5910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
5920: 72 65 61 74 65 41 73 68 6d 65 6d 52 65 67 69 6f  reateAshmemRegio
5930: 6e 57 69 74 68 44 61 74 61 28 65 6e 76 2c 20 62  nWithData(env, b
5940: 6c 6f 62 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20  lob, length);.  
5950: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5960: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
5970: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
5980: 0a 2a 2a 20 4e 6f 74 65 3a 20 54 68 65 20 66 6f  .** Note: The fo
5990: 6c 6c 6f 77 69 6e 67 20 73 79 6d 62 6f 6c 73 20  llowing symbols 
59a0: 6d 75 73 74 20 62 65 20 69 6e 20 74 68 65 20 73  must be in the s
59b0: 61 6d 65 20 6f 72 64 65 72 20 61 73 20 74 68 65  ame order as the
59c0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
59d0: 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  * elements in th
59e0: 65 20 61 4d 65 74 68 6f 64 5b 5d 20 61 72 72 61  e aMethod[] arra
59f0: 79 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  y in function na
5a00: 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 43 75  tiveExecuteForCu
5a10: 72 73 6f 72 57 69 6e 64 6f 77 28 29 2e 0a 2a 2f  rsorWindow()..*/
5a20: 0a 65 6e 75 6d 20 43 57 4d 65 74 68 6f 64 4e 61  .enum CWMethodNa
5a30: 6d 65 73 20 7b 0a 20 20 43 57 5f 43 4c 45 41 52  mes {.  CW_CLEAR
5a40: 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a 20 20           = 0,.  
5a50: 43 57 5f 53 45 54 4e 55 4d 43 4f 4c 55 4d 4e 53  CW_SETNUMCOLUMNS
5a60: 20 3d 20 31 2c 0a 20 20 43 57 5f 41 4c 4c 4f 43   = 1,.  CW_ALLOC
5a70: 52 4f 57 20 20 20 20 20 20 3d 20 32 2c 0a 20 20  ROW      = 2,.  
5a80: 43 57 5f 46 52 45 45 4c 41 53 54 52 4f 57 20 20  CW_FREELASTROW  
5a90: 20 3d 20 33 2c 0a 20 20 43 57 5f 50 55 54 4e 55   = 3,.  CW_PUTNU
5aa0: 4c 4c 20 20 20 20 20 20 20 3d 20 34 2c 0a 20 20  LL       = 4,.  
5ab0: 43 57 5f 50 55 54 4c 4f 4e 47 20 20 20 20 20 20  CW_PUTLONG      
5ac0: 20 3d 20 35 2c 0a 20 20 43 57 5f 50 55 54 44 4f   = 5,.  CW_PUTDO
5ad0: 55 42 4c 45 20 20 20 20 20 3d 20 36 2c 0a 20 20  UBLE     = 6,.  
5ae0: 43 57 5f 50 55 54 53 54 52 49 4e 47 20 20 20 20  CW_PUTSTRING    
5af0: 20 3d 20 37 2c 0a 20 20 43 57 5f 50 55 54 42 4c   = 7,.  CW_PUTBL
5b00: 4f 42 20 20 20 20 20 20 20 3d 20 38 0a 7d 3b 0a  OB       = 8.};.
5b10: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
5b20: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
5b30: 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 73 20  ture represents 
5b40: 61 20 73 69 6e 67 6c 65 20 43 75 72 73 6f 72 57  a single CursorW
5b50: 69 6e 64 6f 77 20 6a 61 76 61 20 6d 65 74 68 6f  indow java metho
5b60: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 43 57 4d  d..*/.struct CWM
5b70: 65 74 68 6f 64 20 7b 0a 20 20 6a 6d 65 74 68 6f  ethod {.  jmetho
5b80: 64 49 44 20 69 64 3b 20 20 20 20 20 20 20 20 20  dID id;         
5b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 74            /* Met
5ba0: 68 6f 64 20 69 64 20 2a 2f 0a 20 20 63 6f 6e 73  hod id */.  cons
5bb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5bd0: 65 74 68 6f 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  ethod name */.  
5be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 69 67  const char *zSig
5bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5c00: 2f 2a 20 4d 65 74 68 6f 64 20 4a 4e 49 20 73 69  /* Method JNI si
5c10: 67 6e 61 74 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f  gnature */.};../
5c20: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20  *.** Append the 
5c30: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
5c40: 72 6f 77 20 74 68 61 74 20 53 51 4c 20 73 74 61  row that SQL sta
5c50: 74 65 6d 65 6e 74 20 70 53 74 6d 74 20 63 75 72  tement pStmt cur
5c60: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
5c70: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 75 72 73 6f  .** to the Curso
5c80: 72 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70  rWindow object p
5c90: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
5ca0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ond argument. Th
5cb0: 65 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 0a 2a  e CursorWindow.*
5cc0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  * currently cont
5cd0: 61 69 6e 73 20 69 52 6f 77 20 72 6f 77 73 2e 20  ains iRow rows. 
5ce0: 52 65 74 75 72 6e 20 74 72 75 65 20 6f 6e 20 73  Return true on s
5cf0: 75 63 63 65 73 73 20 6f 72 20 66 61 6c 73 65 20  uccess or false 
5d00: 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
5d10: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
5d20: 20 6a 62 6f 6f 6c 65 61 6e 20 63 6f 70 79 52 6f   jboolean copyRo
5d30: 77 54 6f 57 69 6e 64 6f 77 28 0a 20 20 4a 4e 49  wToWindow(.  JNI
5d40: 45 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 6a 6f 62  Env *pEnv,.  job
5d50: 6a 65 63 74 20 77 69 6e 2c 0a 20 20 69 6e 74 20  ject win,.  int 
5d60: 69 52 6f 77 2c 0a 20 20 73 71 6c 69 74 65 33 5f  iRow,.  sqlite3_
5d70: 73 74 6d 74 20 2a 70 53 74 6d 74 2c 0a 20 20 43  stmt *pStmt,.  C
5d80: 57 4d 65 74 68 6f 64 20 2a 61 4d 65 74 68 6f 64  WMethod *aMethod
5d90: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  .){.  int nCol =
5da0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5db0: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
5dc0: 69 6e 74 20 69 3b 0a 20 20 6a 62 6f 6f 6c 65 61  int i;.  jboolea
5dd0: 6e 20 62 4f 6b 3b 0a 0a 20 20 62 4f 6b 20 3d 20  n bOk;..  bOk = 
5de0: 70 45 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61  pEnv->CallBoolea
5df0: 6e 4d 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65  nMethod(win, aMe
5e00: 74 68 6f 64 5b 43 57 5f 41 4c 4c 4f 43 52 4f 57  thod[CW_ALLOCROW
5e10: 5d 2e 69 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ].id);.  for(i=0
5e20: 3b 20 62 4f 6b 20 26 26 20 69 3c 6e 43 6f 6c 3b  ; bOk && i<nCol;
5e30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63   i++){.    switc
5e40: 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
5e50: 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
5e60: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
5e70: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
5e80: 20 20 20 20 20 20 62 4f 6b 20 3d 20 70 45 6e 76        bOk = pEnv
5e90: 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d 65 74  ->CallBooleanMet
5ea0: 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64  hod(win, aMethod
5eb0: 5b 43 57 5f 50 55 54 4e 55 4c 4c 5d 2e 69 64 2c  [CW_PUTNULL].id,
5ec0: 20 69 52 6f 77 2c 20 69 29 3b 0a 20 20 20 20 20   iRow, i);.     
5ed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5ee0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  }..      case SQ
5ef0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
5f00: 20 20 20 20 20 20 20 20 6a 6c 6f 6e 67 20 76 61          jlong va
5f10: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
5f20: 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
5f30: 69 29 3b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20  i);.        bOk 
5f40: 3d 20 70 45 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c  = pEnv->CallBool
5f50: 65 61 6e 4d 65 74 68 6f 64 28 77 69 6e 2c 20 61  eanMethod(win, a
5f60: 4d 65 74 68 6f 64 5b 43 57 5f 50 55 54 4c 4f 4e  Method[CW_PUTLON
5f70: 47 5d 2e 69 64 2c 20 76 61 6c 2c 20 69 52 6f 77  G].id, val, iRow
5f80: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , i);.        br
5f90: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
5fa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5fb0: 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
5fc0: 20 6a 64 6f 75 62 6c 65 20 76 61 6c 20 3d 20 73   jdouble val = s
5fd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
5fe0: 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  uble(pStmt, i);.
5ff0: 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 70 45          bOk = pE
6000: 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d  nv->CallBooleanM
6010: 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68  ethod(win, aMeth
6020: 6f 64 5b 43 57 5f 50 55 54 44 4f 55 42 4c 45 5d  od[CW_PUTDOUBLE]
6030: 2e 69 64 2c 20 76 61 6c 2c 20 69 52 6f 77 2c 20  .id, val, iRow, 
6040: 69 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  i);.        brea
6050: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
6060: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
6070: 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 6a 63  XT: {.        jc
6080: 68 61 72 20 2a 70 53 74 72 20 3d 20 28 6a 63 68  har *pStr = (jch
6090: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
60a0: 6d 6e 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c  mn_text16(pStmt,
60b0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74   i);.        int
60c0: 20 6e 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   nStr = sqlite3_
60d0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 28 70  column_bytes16(p
60e0: 53 74 6d 74 2c 20 69 29 20 2f 20 73 69 7a 65 6f  Stmt, i) / sizeo
60f0: 66 28 6a 63 68 61 72 29 3b 0a 20 20 20 20 20 20  f(jchar);.      
6100: 20 20 6a 73 74 72 69 6e 67 20 76 61 6c 20 3d 20    jstring val = 
6110: 70 45 6e 76 2d 3e 4e 65 77 53 74 72 69 6e 67 28  pEnv->NewString(
6120: 70 53 74 72 2c 20 6e 53 74 72 29 3b 0a 20 20 20  pStr, nStr);.   
6130: 20 20 20 20 20 62 4f 6b 20 3d 20 70 45 6e 76 2d       bOk = pEnv-
6140: 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e 4d 65 74 68  >CallBooleanMeth
6150: 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64 5b  od(win, aMethod[
6160: 43 57 5f 50 55 54 53 54 52 49 4e 47 5d 2e 69 64  CW_PUTSTRING].id
6170: 2c 20 76 61 6c 2c 20 69 52 6f 77 2c 20 69 29 3b  , val, iRow, i);
6180: 0a 20 20 20 20 20 20 20 20 70 45 6e 76 2d 3e 44  .        pEnv->D
6190: 65 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28 76 61  eleteLocalRef(va
61a0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  l);.        brea
61b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
61c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
61d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
61e0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
61f0: 28 70 53 74 6d 74 2c 20 69 29 3d 3d 53 51 4c 49  (pStmt, i)==SQLI
6200: 54 45 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 20  TE_BLOB );.     
6210: 20 20 20 63 6f 6e 73 74 20 6a 62 79 74 65 20 2a     const jbyte *
6220: 70 20 3d 20 28 63 6f 6e 73 74 20 6a 62 79 74 65  p = (const jbyte
6230: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
6240: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 29 3b  _blob(pStmt, i);
6250: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
6260: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6270: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 29 3b  bytes(pStmt, i);
6280: 0a 20 20 20 20 20 20 20 20 6a 62 79 74 65 41 72  .        jbyteAr
6290: 72 61 79 20 76 61 6c 20 3d 20 70 45 6e 76 2d 3e  ray val = pEnv->
62a0: 4e 65 77 42 79 74 65 41 72 72 61 79 28 6e 29 3b  NewByteArray(n);
62b0: 0a 20 20 20 20 20 20 20 20 70 45 6e 76 2d 3e 53  .        pEnv->S
62c0: 65 74 42 79 74 65 41 72 72 61 79 52 65 67 69 6f  etByteArrayRegio
62d0: 6e 28 76 61 6c 2c 20 30 2c 20 6e 2c 20 70 29 3b  n(val, 0, n, p);
62e0: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 70  .        bOk = p
62f0: 45 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61 6e  Env->CallBoolean
6300: 4d 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74  Method(win, aMet
6310: 68 6f 64 5b 43 57 5f 50 55 54 42 4c 4f 42 5d 2e  hod[CW_PUTBLOB].
6320: 69 64 2c 20 76 61 6c 2c 20 69 52 6f 77 2c 20 69  id, val, iRow, i
6330: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 76 2d  );.        pEnv-
6340: 3e 44 65 6c 65 74 65 4c 6f 63 61 6c 52 65 66 28  >DeleteLocalRef(
6350: 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 62 72  val);.        br
6360: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6370: 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4f 6b 3d   }..    if( bOk=
6380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 6e 76  =0 ){.      pEnv
6390: 2d 3e 43 61 6c 6c 56 6f 69 64 4d 65 74 68 6f 64  ->CallVoidMethod
63a0: 28 77 69 6e 2c 20 61 4d 65 74 68 6f 64 5b 43 57  (win, aMethod[CW
63b0: 5f 46 52 45 45 4c 41 53 54 52 4f 57 5d 2e 69 64  _FREELASTROW].id
63c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
63d0: 72 65 74 75 72 6e 20 62 4f 6b 3b 0a 7d 0a 0a 73  return bOk;.}..s
63e0: 74 61 74 69 63 20 6a 62 6f 6f 6c 65 61 6e 20 73  tatic jboolean s
63f0: 65 74 57 69 6e 64 6f 77 4e 75 6d 43 6f 6c 75 6d  etWindowNumColum
6400: 6e 73 28 0a 20 20 4a 4e 49 45 6e 76 20 2a 70 45  ns(.  JNIEnv *pE
6410: 6e 76 2c 0a 20 20 6a 6f 62 6a 65 63 74 20 77 69  nv,.  jobject wi
6420: 6e 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  n,.  sqlite3_stm
6430: 74 20 2a 70 53 74 6d 74 2c 0a 20 20 43 57 4d 65  t *pStmt,.  CWMe
6440: 74 68 6f 64 20 2a 61 4d 65 74 68 6f 64 0a 29 7b  thod *aMethod.){
6450: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 0a 20 20  .  int nCol;..  
6460: 70 45 6e 76 2d 3e 43 61 6c 6c 56 6f 69 64 4d 65  pEnv->CallVoidMe
6470: 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65 74 68 6f  thod(win, aMetho
6480: 64 5b 43 57 5f 43 4c 45 41 52 5d 2e 69 64 29 3b  d[CW_CLEAR].id);
6490: 0a 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65  .  nCol = sqlite
64a0: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
64b0: 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Stmt);.  return 
64c0: 70 45 6e 76 2d 3e 43 61 6c 6c 42 6f 6f 6c 65 61  pEnv->CallBoolea
64d0: 6e 4d 65 74 68 6f 64 28 77 69 6e 2c 20 61 4d 65  nMethod(win, aMe
64e0: 74 68 6f 64 5b 43 57 5f 53 45 54 4e 55 4d 43 4f  thod[CW_SETNUMCO
64f0: 4c 55 4d 4e 53 5d 2e 69 64 2c 20 28 6a 69 6e 74  LUMNS].id, (jint
6500: 29 6e 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCol);.}../*.**
6510: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 68 61 73   This method has
6520: 20 62 65 65 6e 20 72 65 77 72 69 74 74 65 6e 20   been rewritten 
6530: 66 6f 72 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64  for org.sqlite.d
6540: 61 74 61 62 61 73 65 2e 2a 2e 20 54 68 65 20 6f  atabase.*. The o
6550: 72 69 67 69 6e 61 6c 20 0a 2a 2a 20 61 6e 64 72  riginal .** andr
6560: 6f 69 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  oid implementati
6570: 6f 6e 20 75 73 65 64 20 74 68 65 20 43 2b 2b 20  on used the C++ 
6580: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 70 6f 70  interface to pop
6590: 75 6c 61 74 65 20 61 20 43 75 72 73 6f 72 57 69  ulate a CursorWi
65a0: 6e 64 6f 77 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  ndow.** object. 
65b0: 53 69 6e 63 65 20 74 68 65 20 4e 44 4b 20 64 6f  Since the NDK do
65c0: 65 73 20 6e 6f 74 20 65 78 70 6f 72 74 20 74 68  es not export th
65d0: 69 73 20 69 6e 74 65 72 66 61 63 65 2c 20 77 65  is interface, we
65e0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 4a 61 76 61   invoke the Java
65f0: 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 20 75 73  .** interface us
6600: 69 6e 67 20 73 74 61 6e 64 61 72 64 20 4a 4e 49  ing standard JNI
6610: 20 6d 65 74 68 6f 64 73 20 74 6f 20 64 6f 20 74   methods to do t
6620: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 2a  he same thing..*
6630: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6640: 6f 6e 20 65 78 65 63 75 74 65 73 20 74 68 65 20  on executes the 
6650: 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74  SQLite statement
6660: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
6670: 73 20 74 68 65 20 34 74 68 20 0a 2a 2a 20 61 72  s the 4th .** ar
6680: 67 75 6d 65 6e 74 20 61 6e 64 20 63 6f 70 69 65  gument and copie
6690: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65  s one or more re
66a0: 74 75 72 6e 65 64 20 72 6f 77 73 20 69 6e 74 6f  turned rows into
66b0: 20 74 68 65 20 43 75 72 73 6f 72 57 69 6e 64 6f   the CursorWindo
66c0: 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 70 61 73 73  w.** object pass
66d0: 65 64 20 61 73 20 74 68 65 20 35 74 68 20 61 72  ed as the 5th ar
66e0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65 74 20  gument. The set 
66f0: 6f 66 20 72 6f 77 73 20 63 6f 70 69 65 64 20 69  of rows copied i
6700: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 43 75 72 73  nto the .** Curs
6710: 6f 72 57 69 6e 64 6f 77 20 69 73 20 61 6c 77 61  orWindow is alwa
6720: 79 73 20 63 6f 6e 74 69 67 75 6f 75 73 2e 0a 2a  ys contiguous..*
6730: 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 72 6f  *.** The only ro
6740: 77 20 74 68 61 74 20 2a 6d 75 73 74 2a 20 62 65  w that *must* be
6750: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
6760: 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 20 69 73   CursorWindow is
6770: 20 72 6f 77 20 0a 2a 2a 20 69 52 6f 77 52 65 71   row .** iRowReq
6780: 75 69 72 65 64 2e 20 49 64 65 61 6c 6c 79 2c 20  uired. Ideally, 
6790: 61 6c 6c 20 72 6f 77 73 20 66 72 6f 6d 20 69 52  all rows from iR
67a0: 6f 77 53 74 61 72 74 20 74 68 72 6f 75 67 68 20  owStart through 
67b0: 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66  to the end.** of
67c0: 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20 63   the query are c
67d0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 43  opied into the C
67e0: 75 72 73 6f 72 57 69 6e 64 6f 77 2e 20 49 66 20  ursorWindow. If 
67f0: 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  this is not poss
6800: 69 62 6c 65 0a 2a 2a 20 28 43 75 72 73 6f 72 57  ible.** (CursorW
6810: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 68 61  indow objects ha
6820: 76 65 20 61 20 66 69 6e 69 74 65 20 63 61 70 61  ve a finite capa
6830: 63 69 74 79 29 2c 20 73 6f 6d 65 20 63 6f 6d 70  city), some comp
6840: 72 6f 6d 69 73 65 20 70 6f 73 69 74 69 6f 6e 0a  romise position.
6850: 2a 2a 20 69 73 20 66 6f 75 6e 64 20 28 73 65 65  ** is found (see
6860: 20 63 6f 6d 6d 65 6e 74 73 20 65 6d 62 65 64 64   comments embedd
6870: 65 64 20 69 6e 20 74 68 65 20 63 6f 64 65 20 62  ed in the code b
6880: 65 6c 6f 77 20 66 6f 72 20 64 65 74 61 69 6c 73  elow for details
6890: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
68a0: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 36  urn value is a 6
68b0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 63 61  4-bit integer ca
68c0: 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c  lculated as foll
68d0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ows:.**.**      
68e0: 28 69 53 74 61 72 74 20 3c 3c 20 33 32 29 20 7c  (iStart << 32) |
68f0: 20 6e 52 6f 77 0a 2a 2a 0a 2a 2a 20 77 68 65 72   nRow.**.** wher
6900: 65 20 69 53 74 61 72 74 20 69 73 20 74 68 65 20  e iStart is the 
6910: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
6920: 73 74 20 72 6f 77 20 63 6f 70 69 65 64 20 69 6e  st row copied in
6930: 74 6f 20 74 68 65 20 43 75 72 73 6f 72 57 69 6e  to the CursorWin
6940: 64 6f 77 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  dow..** If the c
6950: 6f 75 6e 74 41 6c 6c 52 6f 77 73 20 61 72 67 75  ountAllRows argu
6960: 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 6e 52  ment is true, nR
6970: 6f 77 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  ow is the total 
6980: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 2a  number of rows.*
6990: 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  * returned by th
69a0: 65 20 71 75 65 72 79 2e 20 4f 74 68 65 72 77 69  e query. Otherwi
69b0: 73 65 2c 20 6e 52 6f 77 20 69 73 20 6f 6e 65 20  se, nRow is one 
69c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
69d0: 20 69 6e 64 65 78 20 6f 66 20 0a 2a 2a 20 74 68   index of .** th
69e0: 65 20 6c 61 73 74 20 72 6f 77 20 63 6f 70 69 65  e last row copie
69f0: 64 20 69 6e 74 6f 20 74 68 65 20 43 75 72 73 6f  d into the Curso
6a00: 72 57 69 6e 64 6f 77 2e 0a 2a 2f 0a 73 74 61 74  rWindow..*/.stat
6a10: 69 63 20 6a 6c 6f 6e 67 20 6e 61 74 69 76 65 45  ic jlong nativeE
6a20: 78 65 63 75 74 65 46 6f 72 43 75 72 73 6f 72 57  xecuteForCursorW
6a30: 69 6e 64 6f 77 28 0a 20 20 4a 4e 49 45 6e 76 20  indow(.  JNIEnv 
6a40: 2a 70 45 6e 76 2c 20 0a 20 20 6a 63 6c 61 73 73  *pEnv, .  jclass
6a50: 20 63 6c 61 7a 7a 2c 0a 20 20 6a 6c 6f 6e 67 20   clazz,.  jlong 
6a60: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 20  connectionPtr,  
6a70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
6a80: 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 43 6f  nter to SQLiteCo
6a90: 6e 6e 65 63 74 69 6f 6e 20 43 2b 2b 20 6f 62 6a  nnection C++ obj
6aa0: 65 63 74 20 2a 2f 0a 20 20 6a 6c 6f 6e 67 20 73  ect */.  jlong s
6ab0: 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 20 20 20  tatementPtr,    
6ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
6ad0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  ter to sqlite3_s
6ae0: 74 6d 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tmt object */.  
6af0: 6a 6f 62 6a 65 63 74 20 77 69 6e 2c 20 20 20 20  jobject win,    
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 2f 2a 20 54 68 65 20 43 75 72 73 6f 72 57 69 6e  /* The CursorWin
6b20: 64 6f 77 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f  dow object to po
6b30: 70 75 6c 61 74 65 20 2a 2f 0a 20 20 6a 69 6e 74  pulate */.  jint
6b40: 20 73 74 61 72 74 50 6f 73 2c 20 20 20 20 20 20   startPos,      
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
6b60: 69 72 73 74 20 72 6f 77 20 74 6f 20 61 64 64 20  irst row to add 
6b70: 28 61 64 76 69 73 6f 72 79 29 20 2a 2f 0a 20 20  (advisory) */.  
6b80: 6a 69 6e 74 20 69 52 6f 77 52 65 71 75 69 72 65  jint iRowRequire
6b90: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
6ba0: 2f 2a 20 52 65 71 75 69 72 65 64 20 72 6f 77 20  /* Required row 
6bb0: 2a 2f 0a 20 20 6a 62 6f 6f 6c 65 61 6e 20 63 6f  */.  jboolean co
6bc0: 75 6e 74 41 6c 6c 52 6f 77 73 0a 29 20 7b 0a 20  untAllRows.) {. 
6bd0: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
6be0: 6e 20 2a 70 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  n *pConnection =
6bf0: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73   reinterpret_cas
6c00: 74 3c 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  t<SQLiteConnecti
6c10: 6f 6e 2a 3e 28 63 6f 6e 6e 65 63 74 69 6f 6e 50  on*>(connectionP
6c20: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  tr);.  sqlite3_s
6c30: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 72 65 69  tmt *pStmt = rei
6c40: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 73 71  nterpret_cast<sq
6c50: 6c 69 74 65 33 5f 73 74 6d 74 2a 3e 28 73 74 61  lite3_stmt*>(sta
6c60: 74 65 6d 65 6e 74 50 74 72 29 3b 0a 0a 20 20 43  tementPtr);..  C
6c70: 57 4d 65 74 68 6f 64 20 61 4d 65 74 68 6f 64 5b  WMethod aMethod[
6c80: 5d 20 3d 20 7b 0a 20 20 20 20 7b 30 2c 20 22 63  ] = {.    {0, "c
6c90: 6c 65 61 72 22 2c 20 20 20 20 20 20 20 20 20 22  lear",         "
6ca0: 28 29 56 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 22  ()V"},.    {0, "
6cb0: 73 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 22 2c 20  setNumColumns", 
6cc0: 22 28 49 29 5a 22 7d 2c 0a 20 20 20 20 7b 30 2c  "(I)Z"},.    {0,
6cd0: 20 22 61 6c 6c 6f 63 52 6f 77 22 2c 20 20 20 20   "allocRow",    
6ce0: 20 20 22 28 29 5a 22 7d 2c 0a 20 20 20 20 7b 30    "()Z"},.    {0
6cf0: 2c 20 22 66 72 65 65 4c 61 73 74 52 6f 77 22 2c  , "freeLastRow",
6d00: 20 20 20 22 28 29 56 22 7d 2c 0a 20 20 20 20 7b     "()V"},.    {
6d10: 30 2c 20 22 70 75 74 4e 75 6c 6c 22 2c 20 20 20  0, "putNull",   
6d20: 20 20 20 20 22 28 49 49 29 5a 22 7d 2c 0a 20 20      "(II)Z"},.  
6d30: 20 20 7b 30 2c 20 22 70 75 74 4c 6f 6e 67 22 2c    {0, "putLong",
6d40: 20 20 20 20 20 20 20 22 28 4a 49 49 29 5a 22 7d         "(JII)Z"}
6d50: 2c 0a 20 20 20 20 7b 30 2c 20 22 70 75 74 44 6f  ,.    {0, "putDo
6d60: 75 62 6c 65 22 2c 20 20 20 20 20 22 28 44 49 49  uble",     "(DII
6d70: 29 5a 22 7d 2c 0a 20 20 20 20 7b 30 2c 20 22 70  )Z"},.    {0, "p
6d80: 75 74 53 74 72 69 6e 67 22 2c 20 20 20 20 20 22  utString",     "
6d90: 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69  (Ljava/lang/Stri
6da0: 6e 67 3b 49 49 29 5a 22 7d 2c 0a 20 20 20 20 7b  ng;II)Z"},.    {
6db0: 30 2c 20 22 70 75 74 42 6c 6f 62 22 2c 20 20 20  0, "putBlob",   
6dc0: 20 20 20 20 22 28 5b 42 49 49 29 5a 22 7d 2c 0a      "([BII)Z"},.
6dd0: 20 20 7d 3b 0a 20 20 6a 63 6c 61 73 73 20 63 6c    };.  jclass cl
6de0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
6df0: 20 20 20 20 20 20 20 2f 2a 20 43 6c 61 73 73 20         /* Class 
6e00: 61 6e 64 72 6f 69 64 2e 64 61 74 61 62 61 73 65  android.database
6e10: 2e 43 75 72 73 6f 72 57 69 6e 64 6f 77 20 2a 2f  .CursorWindow */
6e20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
6e50: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
6e60: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e80: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
6e90: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 53  s returned by pS
6ea0: 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  tmt */.  int nRo
6eb0: 77 3b 0a 20 20 6a 62 6f 6f 6c 65 61 6e 20 62 4f  w;.  jboolean bO
6ec0: 6b 3b 0a 20 20 69 6e 74 20 69 53 74 61 72 74 3b  k;.  int iStart;
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
6ef0: 77 20 63 6f 70 69 65 64 20 74 6f 20 43 75 72 73  w copied to Curs
6f00: 6f 72 57 69 6e 64 6f 77 20 2a 2f 0a 0a 20 20 2f  orWindow */..  /
6f10: 2a 20 4c 6f 63 61 74 65 20 61 6c 6c 20 72 65 71  * Locate all req
6f20: 75 69 72 65 64 20 43 75 72 73 6f 72 57 69 6e 64  uired CursorWind
6f30: 6f 77 20 6d 65 74 68 6f 64 73 2e 20 2a 2f 0a 20  ow methods. */. 
6f40: 20 63 6c 73 20 3d 20 70 45 6e 76 2d 3e 46 69 6e   cls = pEnv->Fin
6f50: 64 43 6c 61 73 73 28 22 61 6e 64 72 6f 69 64 2f  dClass("android/
6f60: 64 61 74 61 62 61 73 65 2f 43 75 72 73 6f 72 57  database/CursorW
6f70: 69 6e 64 6f 77 22 29 3b 0a 20 20 66 6f 72 28 69  indow");.  for(i
6f80: 3d 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 4d  =0; i<(sizeof(aM
6f90: 65 74 68 6f 64 29 2f 73 69 7a 65 6f 66 28 73 74  ethod)/sizeof(st
6fa0: 72 75 63 74 20 43 57 4d 65 74 68 6f 64 29 29 3b  ruct CWMethod));
6fb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 4d 65 74 68   i++){.    aMeth
6fc0: 6f 64 5b 69 5d 2e 69 64 20 3d 20 70 45 6e 76 2d  od[i].id = pEnv-
6fd0: 3e 47 65 74 4d 65 74 68 6f 64 49 44 28 63 6c 73  >GetMethodID(cls
6fe0: 2c 20 61 4d 65 74 68 6f 64 5b 69 5d 2e 7a 4e 61  , aMethod[i].zNa
6ff0: 6d 65 2c 20 61 4d 65 74 68 6f 64 5b 69 5d 2e 7a  me, aMethod[i].z
7000: 53 69 67 29 3b 0a 20 20 20 20 69 66 28 20 61 4d  Sig);.    if( aM
7010: 65 74 68 6f 64 5b 69 5d 2e 69 64 3d 3d 4e 55 4c  ethod[i].id==NUL
7020: 4c 20 29 7b 0a 20 20 20 20 20 20 6a 6e 69 54 68  L ){.      jniTh
7030: 72 6f 77 45 78 63 65 70 74 69 6f 6e 46 6d 74 28  rowExceptionFmt(
7040: 70 45 6e 76 2c 20 22 6a 61 76 61 2f 6c 61 6e 67  pEnv, "java/lang
7050: 2f 45 78 63 65 70 74 69 6f 6e 22 2c 20 0a 20 20  /Exception", .  
7060: 20 20 20 20 20 20 20 20 22 46 61 69 6c 65 64 20          "Failed 
7070: 74 6f 20 66 69 6e 64 20 6d 65 74 68 6f 64 20 43  to find method C
7080: 75 72 73 6f 72 57 69 6e 64 6f 77 2e 25 73 28 29  ursorWindow.%s()
7090: 22 2c 20 61 4d 65 74 68 6f 64 5b 69 5d 2e 7a 4e  ", aMethod[i].zN
70a0: 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
70b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
70c0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 53 65   }.  }...  /* Se
70d0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
70e0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 77  columns in the w
70f0: 69 6e 64 6f 77 20 2a 2f 0a 20 20 62 4f 6b 20 3d  indow */.  bOk =
7100: 20 73 65 74 57 69 6e 64 6f 77 4e 75 6d 43 6f 6c   setWindowNumCol
7110: 75 6d 6e 73 28 70 45 6e 76 2c 20 77 69 6e 2c 20  umns(pEnv, win, 
7120: 70 53 74 6d 74 2c 20 61 4d 65 74 68 6f 64 29 3b  pStmt, aMethod);
7130: 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
7140: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 52 6f  return 0;..  nRo
7150: 77 20 3d 20 30 3b 0a 20 20 69 53 74 61 72 74 20  w = 0;.  iStart 
7160: 3d 20 73 74 61 72 74 50 6f 73 3b 0a 20 20 77 68  = startPos;.  wh
7170: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
7180: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
7190: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  _ROW ){.    /* O
71a0: 6e 6c 79 20 63 6f 70 79 20 69 6e 20 72 6f 77 73  nly copy in rows
71b0: 20 74 68 61 74 20 6f 63 63 75 72 20 61 74 20 6f   that occur at o
71c0: 72 20 61 66 74 65 72 20 72 6f 77 20 69 6e 64 65  r after row inde
71d0: 78 20 69 53 74 61 72 74 2e 20 2a 2f 0a 20 20 20  x iStart. */.   
71e0: 20 69 66 28 20 6e 52 6f 77 3e 3d 69 53 74 61 72   if( nRow>=iStar
71f0: 74 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20  t && bOk ){.    
7200: 20 20 62 4f 6b 20 3d 20 63 6f 70 79 52 6f 77 54    bOk = copyRowT
7210: 6f 57 69 6e 64 6f 77 28 70 45 6e 76 2c 20 77 69  oWindow(pEnv, wi
7220: 6e 2c 20 28 6e 52 6f 77 20 2d 20 69 53 74 61 72  n, (nRow - iStar
7230: 74 29 2c 20 70 53 74 6d 74 2c 20 61 4d 65 74 68  t), pStmt, aMeth
7240: 6f 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  od);.      if( b
7250: 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Ok==0 ){.       
7260: 20 2f 2a 20 54 68 65 20 43 75 72 73 6f 72 57 69   /* The CursorWi
7270: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 61 6e 20  ndow object ran 
7280: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 49  out of memory. I
7290: 66 20 72 6f 77 20 69 52 6f 77 52 65 71 75 69 72  f row iRowRequir
72a0: 65 64 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ed was.        *
72b0: 2a 20 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c  * not successful
72c0: 6c 79 20 61 64 64 65 64 20 62 65 66 6f 72 65 20  ly added before 
72d0: 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 63  this happened, c
72e0: 6c 65 61 72 20 74 68 65 20 43 75 72 73 6f 72 57  lear the CursorW
72f0: 69 6e 64 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  indow.        **
7300: 20 61 6e 64 20 74 72 79 20 74 6f 20 61 64 64 20   and try to add 
7310: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
7320: 61 67 61 69 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  again.  */.     
7330: 20 20 20 69 66 28 20 6e 52 6f 77 3c 3d 69 52 6f     if( nRow<=iRo
7340: 77 52 65 71 75 69 72 65 64 20 29 7b 0a 20 20 20  wRequired ){.   
7350: 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 73 65 74         bOk = set
7360: 57 69 6e 64 6f 77 4e 75 6d 43 6f 6c 75 6d 6e 73  WindowNumColumns
7370: 28 70 45 6e 76 2c 20 77 69 6e 2c 20 70 53 74 6d  (pEnv, win, pStm
7380: 74 2c 20 61 4d 65 74 68 6f 64 29 3b 0a 20 20 20  t, aMethod);.   
7390: 20 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d 3d         if( bOk==
73a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
73b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
73c0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
73d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
73e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
73f0: 20 20 20 69 53 74 61 72 74 20 3d 20 6e 52 6f 77     iStart = nRow
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4f 6b 20  ;.          bOk 
7410: 3d 20 63 6f 70 79 52 6f 77 54 6f 57 69 6e 64 6f  = copyRowToWindo
7420: 77 28 70 45 6e 76 2c 20 77 69 6e 2c 20 28 6e 52  w(pEnv, win, (nR
7430: 6f 77 20 2d 20 69 53 74 61 72 74 29 2c 20 70 53  ow - iStart), pS
7440: 74 6d 74 2c 20 61 4d 65 74 68 6f 64 29 3b 0a 20  tmt, aMethod);. 
7450: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
7460: 20 20 2f 2a 20 49 66 20 74 68 65 20 43 75 72 73    /* If the Curs
7470: 6f 72 57 69 6e 64 6f 77 20 69 73 20 73 74 69 6c  orWindow is stil
7480: 6c 20 66 75 6c 6c 20 61 6e 64 20 74 68 65 20 63  l full and the c
7490: 6f 75 6e 74 41 6c 6c 52 6f 77 73 20 66 6c 61 67  ountAllRows flag
74a0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
74b0: 2a 2a 20 73 65 74 2c 20 62 72 65 61 6b 20 6f 75  ** set, break ou
74c0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 68 65  t of the loop he
74d0: 72 65 2e 20 49 66 20 63 6f 75 6e 74 41 6c 6c 52  re. If countAllR
74e0: 6f 77 73 20 69 73 20 73 65 74 2c 20 63 6f 6e 74  ows is set, cont
74f0: 69 6e 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  inue.        ** 
7500: 73 6f 20 61 73 20 74 6f 20 73 65 74 20 76 61 72  so as to set var
7510: 69 61 62 6c 65 20 6e 52 6f 77 20 63 6f 72 72 65  iable nRow corre
7520: 63 74 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ctly.  */.      
7530: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 26 26 20    if( bOk==0 && 
7540: 63 6f 75 6e 74 41 6c 6c 52 6f 77 73 3d 3d 30 20  countAllRows==0 
7550: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
7560: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 52 6f 77  .    }..    nRow
7570: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ++;.  }..  /* Fi
7580: 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65  nalize the state
7590: 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 20 69 6e  ment. If this in
75a0: 64 69 63 61 74 65 73 20 61 6e 20 65 72 72 6f 72  dicates an error
75b0: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 72 6f 77   occurred, throw
75c0: 20 61 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 45   an.  ** SQLiteE
75d0: 78 63 65 70 74 69 6f 6e 20 65 78 63 65 70 74 69  xception excepti
75e0: 6f 6e 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  on.  */.  int rc
75f0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
7600: 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
7610: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7620: 20 20 20 20 74 68 72 6f 77 5f 73 71 6c 69 74 65      throw_sqlite
7630: 33 5f 65 78 63 65 70 74 69 6f 6e 28 70 45 6e 76  3_exception(pEnv
7640: 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  , sqlite3_db_han
7650: 64 6c 65 28 70 53 74 6d 74 29 29 3b 0a 20 20 20  dle(pStmt));.   
7660: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
7670: 20 20 6a 6c 6f 6e 67 20 6c 52 65 74 20 3d 20 6a    jlong lRet = j
7680: 6c 6f 6e 67 28 69 53 74 61 72 74 29 20 3c 3c 20  long(iStart) << 
7690: 33 32 20 7c 20 6a 6c 6f 6e 67 28 6e 52 6f 77 29  32 | jlong(nRow)
76a0: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 52 65 74 3b  ;.  return lRet;
76b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 6a 69 6e 74 20  .}..static jint 
76c0: 6e 61 74 69 76 65 47 65 74 44 62 4c 6f 6f 6b 61  nativeGetDbLooka
76d0: 73 69 64 65 28 4a 4e 49 45 6e 76 2a 20 65 6e 76  side(JNIEnv* env
76e0: 2c 20 6a 6f 62 6a 65 63 74 20 63 6c 61 7a 7a 2c  , jobject clazz,
76f0: 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   jlong connectio
7700: 6e 50 74 72 29 20 7b 0a 20 20 20 20 53 51 4c 69  nPtr) {.    SQLi
7710: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20 63 6f  teConnection* co
7720: 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69 6e 74  nnection = reint
7730: 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51 4c 69  erpret_cast<SQLi
7740: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e 28 63  teConnection*>(c
7750: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 0a  onnectionPtr);..
7760: 20 20 20 20 69 6e 74 20 63 75 72 20 3d 20 2d 31      int cur = -1
7770: 3b 0a 20 20 20 20 69 6e 74 20 75 6e 75 73 65 64  ;.    int unused
7780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
7790: 5f 73 74 61 74 75 73 28 63 6f 6e 6e 65 63 74 69  _status(connecti
77a0: 6f 6e 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44  on->db, SQLITE_D
77b0: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
77c0: 45 5f 55 53 45 44 2c 20 26 63 75 72 2c 20 26 75  E_USED, &cur, &u
77d0: 6e 75 73 65 64 2c 20 30 29 3b 0a 20 20 20 20 72  nused, 0);.    r
77e0: 65 74 75 72 6e 20 63 75 72 3b 0a 7d 0a 0a 73 74  eturn cur;.}..st
77f0: 61 74 69 63 20 76 6f 69 64 20 6e 61 74 69 76 65  atic void native
7800: 43 61 6e 63 65 6c 28 4a 4e 49 45 6e 76 2a 20 65  Cancel(JNIEnv* e
7810: 6e 76 2c 20 6a 6f 62 6a 65 63 74 20 63 6c 61 7a  nv, jobject claz
7820: 7a 2c 20 6a 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74  z, jlong connect
7830: 69 6f 6e 50 74 72 29 20 7b 0a 20 20 20 20 53 51  ionPtr) {.    SQ
7840: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 20  LiteConnection* 
7850: 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 72 65 69  connection = rei
7860: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 53 51  nterpret_cast<SQ
7870: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 2a 3e  LiteConnection*>
7880: 28 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b  (connectionPtr);
7890: 0a 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d  .    connection-
78a0: 3e 63 61 6e 63 65 6c 65 64 20 3d 20 74 72 75 65  >canceled = true
78b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
78c0: 20 6e 61 74 69 76 65 52 65 73 65 74 43 61 6e 63   nativeResetCanc
78d0: 65 6c 28 4a 4e 49 45 6e 76 2a 20 65 6e 76 2c 20  el(JNIEnv* env, 
78e0: 6a 6f 62 6a 65 63 74 20 63 6c 61 7a 7a 2c 20 6a  jobject clazz, j
78f0: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
7900: 74 72 2c 0a 20 20 20 20 20 20 20 20 6a 62 6f 6f  tr,.        jboo
7910: 6c 65 61 6e 20 63 61 6e 63 65 6c 61 62 6c 65 29  lean cancelable)
7920: 20 7b 0a 20 20 20 20 53 51 4c 69 74 65 43 6f 6e   {.    SQLiteCon
7930: 6e 65 63 74 69 6f 6e 2a 20 63 6f 6e 6e 65 63 74  nection* connect
7940: 69 6f 6e 20 3d 20 72 65 69 6e 74 65 72 70 72 65  ion = reinterpre
7950: 74 5f 63 61 73 74 3c 53 51 4c 69 74 65 43 6f 6e  t_cast<SQLiteCon
7960: 6e 65 63 74 69 6f 6e 2a 3e 28 63 6f 6e 6e 65 63  nection*>(connec
7970: 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 63 6f  tionPtr);.    co
7980: 6e 6e 65 63 74 69 6f 6e 2d 3e 63 61 6e 63 65 6c  nnection->cancel
7990: 65 64 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20  ed = false;..   
79a0: 20 69 66 20 28 63 61 6e 63 65 6c 61 62 6c 65 29   if (cancelable)
79b0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
79c0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
79d0: 6c 65 72 28 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e  ler(connection->
79e0: 64 62 2c 20 34 2c 20 73 71 6c 69 74 65 50 72 6f  db, 4, sqlitePro
79f0: 67 72 65 73 73 48 61 6e 64 6c 65 72 43 61 6c 6c  gressHandlerCall
7a00: 62 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  back,.          
7a10: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
7a20: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
7a30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7a40: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
7a50: 28 63 6f 6e 6e 65 63 74 69 6f 6e 2d 3e 64 62 2c  (connection->db,
7a60: 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b   0, NULL, NULL);
7a70: 0a 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  .    }.}..static
7a80: 20 6a 62 6f 6f 6c 65 61 6e 20 6e 61 74 69 76 65   jboolean native
7a90: 48 61 73 43 6f 64 65 63 28 4a 4e 49 45 6e 76 2a  HasCodec(JNIEnv*
7aa0: 20 65 6e 76 2c 20 6a 6f 62 6a 65 63 74 20 63 6c   env, jobject cl
7ab0: 61 7a 7a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  azz){.#ifdef SQL
7ac0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
7ad0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 23 65 6c  return true;.#el
7ae0: 73 65 0a 20 20 72 65 74 75 72 6e 20 66 61 6c 73  se.  return fals
7af0: 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 73 74  e;.#endif.}...st
7b00: 61 74 69 63 20 4a 4e 49 4e 61 74 69 76 65 4d 65  atic JNINativeMe
7b10: 74 68 6f 64 20 73 4d 65 74 68 6f 64 73 5b 5d 20  thod sMethods[] 
7b20: 3d 0a 7b 0a 20 20 20 20 2f 2a 20 6e 61 6d 65 2c  =.{.    /* name,
7b30: 20 73 69 67 6e 61 74 75 72 65 2c 20 66 75 6e 63   signature, func
7b40: 50 74 72 20 2a 2f 0a 20 20 20 20 7b 20 22 6e 61  Ptr */.    { "na
7b50: 74 69 76 65 4f 70 65 6e 22 2c 20 22 28 4c 6a 61  tiveOpen", "(Lja
7b60: 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 49  va/lang/String;I
7b70: 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e  Ljava/lang/Strin
7b80: 67 3b 5a 5a 29 4a 22 2c 0a 20 20 20 20 20 20 20  g;ZZ)J",.       
7b90: 20 20 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69       (void*)nati
7ba0: 76 65 4f 70 65 6e 20 7d 2c 0a 20 20 20 20 7b 20  veOpen },.    { 
7bb0: 22 6e 61 74 69 76 65 43 6c 6f 73 65 22 2c 20 22  "nativeClose", "
7bc0: 28 4a 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20  (J)V",.         
7bd0: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
7be0: 43 6c 6f 73 65 20 7d 2c 0a 20 20 20 20 7b 20 22  Close },.    { "
7bf0: 6e 61 74 69 76 65 52 65 67 69 73 74 65 72 43 75  nativeRegisterCu
7c00: 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 22 2c 20 22  stomFunction", "
7c10: 28 4a 4c 6f 72 67 2f 73 71 6c 69 74 65 2f 64 61  (JLorg/sqlite/da
7c20: 74 61 62 61 73 65 2f 73 71 6c 69 74 65 2f 53 51  tabase/sqlite/SQ
7c30: 4c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69  LiteCustomFuncti
7c40: 6f 6e 3b 29 56 22 2c 0a 20 20 20 20 20 20 20 20  on;)V",.        
7c50: 20 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76      (void*)nativ
7c60: 65 52 65 67 69 73 74 65 72 43 75 73 74 6f 6d 46  eRegisterCustomF
7c70: 75 6e 63 74 69 6f 6e 20 7d 2c 0a 20 20 20 20 7b  unction },.    {
7c80: 20 22 6e 61 74 69 76 65 52 65 67 69 73 74 65 72   "nativeRegister
7c90: 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f  LocalizedCollato
7ca0: 72 73 22 2c 20 22 28 4a 4c 6a 61 76 61 2f 6c 61  rs", "(JLjava/la
7cb0: 6e 67 2f 53 74 72 69 6e 67 3b 29 56 22 2c 0a 20  ng/String;)V",. 
7cc0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
7cd0: 2a 29 6e 61 74 69 76 65 52 65 67 69 73 74 65 72  *)nativeRegister
7ce0: 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f  LocalizedCollato
7cf0: 72 73 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74  rs },.    { "nat
7d00: 69 76 65 50 72 65 70 61 72 65 53 74 61 74 65 6d  ivePrepareStatem
7d10: 65 6e 74 22 2c 20 22 28 4a 4c 6a 61 76 61 2f 6c  ent", "(JLjava/l
7d20: 61 6e 67 2f 53 74 72 69 6e 67 3b 29 4a 22 2c 0a  ang/String;)J",.
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
7d40: 64 2a 29 6e 61 74 69 76 65 50 72 65 70 61 72 65  d*)nativePrepare
7d50: 53 74 61 74 65 6d 65 6e 74 20 7d 2c 0a 20 20 20  Statement },.   
7d60: 20 7b 20 22 6e 61 74 69 76 65 46 69 6e 61 6c 69   { "nativeFinali
7d70: 7a 65 53 74 61 74 65 6d 65 6e 74 22 2c 20 22 28  zeStatement", "(
7d80: 4a 4a 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20  JJ)V",.         
7d90: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
7da0: 46 69 6e 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e  FinalizeStatemen
7db0: 74 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69  t },.    { "nati
7dc0: 76 65 47 65 74 50 61 72 61 6d 65 74 65 72 43 6f  veGetParameterCo
7dd0: 75 6e 74 22 2c 20 22 28 4a 4a 29 49 22 2c 0a 20  unt", "(JJ)I",. 
7de0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
7df0: 2a 29 6e 61 74 69 76 65 47 65 74 50 61 72 61 6d  *)nativeGetParam
7e00: 65 74 65 72 43 6f 75 6e 74 20 7d 2c 0a 20 20 20  eterCount },.   
7e10: 20 7b 20 22 6e 61 74 69 76 65 49 73 52 65 61 64   { "nativeIsRead
7e20: 4f 6e 6c 79 22 2c 20 22 28 4a 4a 29 5a 22 2c 0a  Only", "(JJ)Z",.
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
7e40: 64 2a 29 6e 61 74 69 76 65 49 73 52 65 61 64 4f  d*)nativeIsReadO
7e50: 6e 6c 79 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61  nly },.    { "na
7e60: 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e 43 6f 75  tiveGetColumnCou
7e70: 6e 74 22 2c 20 22 28 4a 4a 29 49 22 2c 0a 20 20  nt", "(JJ)I",.  
7e80: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
7e90: 29 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e  )nativeGetColumn
7ea0: 43 6f 75 6e 74 20 7d 2c 0a 20 20 20 20 7b 20 22  Count },.    { "
7eb0: 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e 4e  nativeGetColumnN
7ec0: 61 6d 65 22 2c 20 22 28 4a 4a 49 29 4c 6a 61 76  ame", "(JJI)Ljav
7ed0: 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 22 2c  a/lang/String;",
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
7ef0: 69 64 2a 29 6e 61 74 69 76 65 47 65 74 43 6f 6c  id*)nativeGetCol
7f00: 75 6d 6e 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 7b  umnName },.    {
7f10: 20 22 6e 61 74 69 76 65 42 69 6e 64 4e 75 6c 6c   "nativeBindNull
7f20: 22 2c 20 22 28 4a 4a 49 29 56 22 2c 0a 20 20 20  ", "(JJI)V",.   
7f30: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
7f40: 6e 61 74 69 76 65 42 69 6e 64 4e 75 6c 6c 20 7d  nativeBindNull }
7f50: 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 42  ,.    { "nativeB
7f60: 69 6e 64 4c 6f 6e 67 22 2c 20 22 28 4a 4a 49 4a  indLong", "(JJIJ
7f70: 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )V",.           
7f80: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 42 69   (void*)nativeBi
7f90: 6e 64 4c 6f 6e 67 20 7d 2c 0a 20 20 20 20 7b 20  ndLong },.    { 
7fa0: 22 6e 61 74 69 76 65 42 69 6e 64 44 6f 75 62 6c  "nativeBindDoubl
7fb0: 65 22 2c 20 22 28 4a 4a 49 44 29 56 22 2c 0a 20  e", "(JJID)V",. 
7fc0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
7fd0: 2a 29 6e 61 74 69 76 65 42 69 6e 64 44 6f 75 62  *)nativeBindDoub
7fe0: 6c 65 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74  le },.    { "nat
7ff0: 69 76 65 42 69 6e 64 53 74 72 69 6e 67 22 2c 20  iveBindString", 
8000: 22 28 4a 4a 49 4c 6a 61 76 61 2f 6c 61 6e 67 2f  "(JJILjava/lang/
8010: 53 74 72 69 6e 67 3b 29 56 22 2c 0a 20 20 20 20  String;)V",.    
8020: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e          (void*)n
8030: 61 74 69 76 65 42 69 6e 64 53 74 72 69 6e 67 20  ativeBindString 
8040: 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65  },.    { "native
8050: 42 69 6e 64 42 6c 6f 62 22 2c 20 22 28 4a 4a 49  BindBlob", "(JJI
8060: 5b 42 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20  [B)V",.         
8070: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
8080: 42 69 6e 64 42 6c 6f 62 20 7d 2c 0a 20 20 20 20  BindBlob },.    
8090: 7b 20 22 6e 61 74 69 76 65 52 65 73 65 74 53 74  { "nativeResetSt
80a0: 61 74 65 6d 65 6e 74 41 6e 64 43 6c 65 61 72 42  atementAndClearB
80b0: 69 6e 64 69 6e 67 73 22 2c 20 22 28 4a 4a 29 56  indings", "(JJ)V
80c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ",.            (
80d0: 76 6f 69 64 2a 29 6e 61 74 69 76 65 52 65 73 65  void*)nativeRese
80e0: 74 53 74 61 74 65 6d 65 6e 74 41 6e 64 43 6c 65  tStatementAndCle
80f0: 61 72 42 69 6e 64 69 6e 67 73 20 7d 2c 0a 20 20  arBindings },.  
8100: 20 20 7b 20 22 6e 61 74 69 76 65 45 78 65 63 75    { "nativeExecu
8110: 74 65 22 2c 20 22 28 4a 4a 29 56 22 2c 0a 20 20  te", "(JJ)V",.  
8120: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
8130: 29 6e 61 74 69 76 65 45 78 65 63 75 74 65 20 7d  )nativeExecute }
8140: 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 45  ,.    { "nativeE
8150: 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 22 2c 20  xecuteForLong", 
8160: 22 28 4a 4a 29 4a 22 2c 0a 20 20 20 20 20 20 20  "(JJ)J",.       
8170: 20 20 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69       (void*)nati
8180: 76 65 45 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67  veExecuteForLong
8190: 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76   },.    { "nativ
81a0: 65 45 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e  eExecuteForStrin
81b0: 67 22 2c 20 22 28 4a 4a 29 4c 6a 61 76 61 2f 6c  g", "(JJ)Ljava/l
81c0: 61 6e 67 2f 53 74 72 69 6e 67 3b 22 2c 0a 20 20  ang/String;",.  
81d0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
81e0: 29 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f  )nativeExecuteFo
81f0: 72 53 74 72 69 6e 67 20 7d 2c 0a 20 20 20 20 7b  rString },.    {
8200: 20 22 6e 61 74 69 76 65 45 78 65 63 75 74 65 46   "nativeExecuteF
8210: 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69  orBlobFileDescri
8220: 70 74 6f 72 22 2c 20 22 28 4a 4a 29 49 22 2c 0a  ptor", "(JJ)I",.
8230: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
8240: 64 2a 29 6e 61 74 69 76 65 45 78 65 63 75 74 65  d*)nativeExecute
8250: 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72  ForBlobFileDescr
8260: 69 70 74 6f 72 20 7d 2c 0a 20 20 20 20 7b 20 22  iptor },.    { "
8270: 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72  nativeExecuteFor
8280: 43 68 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74 22  ChangedRowCount"
8290: 2c 20 22 28 4a 4a 29 49 22 2c 0a 20 20 20 20 20  , "(JJ)I",.     
82a0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 6e 61         (void*)na
82b0: 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 43 68  tiveExecuteForCh
82c0: 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74 20 7d 2c  angedRowCount },
82d0: 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 45 78  .    { "nativeEx
82e0: 65 63 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65  ecuteForLastInse
82f0: 72 74 65 64 52 6f 77 49 64 22 2c 20 22 28 4a 4a  rtedRowId", "(JJ
8300: 29 4a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )J",.           
8310: 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65 45 78   (void*)nativeEx
8320: 65 63 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65  ecuteForLastInse
8330: 72 74 65 64 52 6f 77 49 64 20 7d 2c 0a 20 20 20  rtedRowId },.   
8340: 20 7b 20 22 6e 61 74 69 76 65 45 78 65 63 75 74   { "nativeExecut
8350: 65 46 6f 72 43 75 72 73 6f 72 57 69 6e 64 6f 77  eForCursorWindow
8360: 22 2c 20 22 28 4a 4a 4c 61 6e 64 72 6f 69 64 2f  ", "(JJLandroid/
8370: 64 61 74 61 62 61 73 65 2f 43 75 72 73 6f 72 57  database/CursorW
8380: 69 6e 64 6f 77 3b 49 49 5a 29 4a 22 2c 0a 20 20  indow;IIZ)J",.  
8390: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
83a0: 29 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f  )nativeExecuteFo
83b0: 72 43 75 72 73 6f 72 57 69 6e 64 6f 77 20 7d 2c  rCursorWindow },
83c0: 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 47 65  .    { "nativeGe
83d0: 74 44 62 4c 6f 6f 6b 61 73 69 64 65 22 2c 20 22  tDbLookaside", "
83e0: 28 4a 29 49 22 2c 0a 20 20 20 20 20 20 20 20 20  (J)I",.         
83f0: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
8400: 47 65 74 44 62 4c 6f 6f 6b 61 73 69 64 65 20 7d  GetDbLookaside }
8410: 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65 43  ,.    { "nativeC
8420: 61 6e 63 65 6c 22 2c 20 22 28 4a 29 56 22 2c 0a  ancel", "(J)V",.
8430: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
8440: 64 2a 29 6e 61 74 69 76 65 43 61 6e 63 65 6c 20  d*)nativeCancel 
8450: 7d 2c 0a 20 20 20 20 7b 20 22 6e 61 74 69 76 65  },.    { "native
8460: 52 65 73 65 74 43 61 6e 63 65 6c 22 2c 20 22 28  ResetCancel", "(
8470: 4a 5a 29 56 22 2c 0a 20 20 20 20 20 20 20 20 20  JZ)V",.         
8480: 20 20 20 28 76 6f 69 64 2a 29 6e 61 74 69 76 65     (void*)native
8490: 52 65 73 65 74 43 61 6e 63 65 6c 20 7d 2c 0a 0a  ResetCancel },..
84a0: 20 20 20 20 7b 20 22 6e 61 74 69 76 65 48 61 73      { "nativeHas
84b0: 43 6f 64 65 63 22 2c 20 22 28 29 5a 22 2c 20 28  Codec", "()Z", (
84c0: 76 6f 69 64 2a 29 6e 61 74 69 76 65 48 61 73 43  void*)nativeHasC
84d0: 6f 64 65 63 20 7d 2c 0a 7d 3b 0a 0a 23 64 65 66  odec },.};..#def
84e0: 69 6e 65 20 46 49 4e 44 5f 43 4c 41 53 53 28 76  ine FIND_CLASS(v
84f0: 61 72 2c 20 63 6c 61 73 73 4e 61 6d 65 29 20 5c  ar, className) \
8500: 0a 20 20 20 20 20 20 20 20 76 61 72 20 3d 20 65  .        var = e
8510: 6e 76 2d 3e 46 69 6e 64 43 6c 61 73 73 28 63 6c  nv->FindClass(cl
8520: 61 73 73 4e 61 6d 65 29 3b 20 5c 0a 20 20 20 20  assName); \.    
8530: 20 20 20 20 4c 4f 47 5f 46 41 54 41 4c 5f 49 46      LOG_FATAL_IF
8540: 28 21 20 76 61 72 2c 20 22 55 6e 61 62 6c 65 20  (! var, "Unable 
8550: 74 6f 20 66 69 6e 64 20 63 6c 61 73 73 20 22 20  to find class " 
8560: 63 6c 61 73 73 4e 61 6d 65 29 3b 0a 0a 23 64 65  className);..#de
8570: 66 69 6e 65 20 47 45 54 5f 4d 45 54 48 4f 44 5f  fine GET_METHOD_
8580: 49 44 28 76 61 72 2c 20 63 6c 61 7a 7a 2c 20 6d  ID(var, clazz, m
8590: 65 74 68 6f 64 4e 61 6d 65 2c 20 66 69 65 6c 64  ethodName, field
85a0: 44 65 73 63 72 69 70 74 6f 72 29 20 5c 0a 20 20  Descriptor) \.  
85b0: 20 20 20 20 20 20 76 61 72 20 3d 20 65 6e 76 2d        var = env-
85c0: 3e 47 65 74 4d 65 74 68 6f 64 49 44 28 63 6c 61  >GetMethodID(cla
85d0: 7a 7a 2c 20 6d 65 74 68 6f 64 4e 61 6d 65 2c 20  zz, methodName, 
85e0: 66 69 65 6c 64 44 65 73 63 72 69 70 74 6f 72 29  fieldDescriptor)
85f0: 3b 20 5c 0a 20 20 20 20 20 20 20 20 4c 4f 47 5f  ; \.        LOG_
8600: 46 41 54 41 4c 5f 49 46 28 21 20 76 61 72 2c 20  FATAL_IF(! var, 
8610: 22 55 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  "Unable to find 
8620: 6d 65 74 68 6f 64 22 20 6d 65 74 68 6f 64 4e 61  method" methodNa
8630: 6d 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 47 45  me);..#define GE
8640: 54 5f 46 49 45 4c 44 5f 49 44 28 76 61 72 2c 20  T_FIELD_ID(var, 
8650: 63 6c 61 7a 7a 2c 20 66 69 65 6c 64 4e 61 6d 65  clazz, fieldName
8660: 2c 20 66 69 65 6c 64 44 65 73 63 72 69 70 74 6f  , fieldDescripto
8670: 72 29 20 5c 0a 20 20 20 20 20 20 20 20 76 61 72  r) \.        var
8680: 20 3d 20 65 6e 76 2d 3e 47 65 74 46 69 65 6c 64   = env->GetField
8690: 49 44 28 63 6c 61 7a 7a 2c 20 66 69 65 6c 64 4e  ID(clazz, fieldN
86a0: 61 6d 65 2c 20 66 69 65 6c 64 44 65 73 63 72 69  ame, fieldDescri
86b0: 70 74 6f 72 29 3b 20 5c 0a 20 20 20 20 20 20 20  ptor); \.       
86c0: 20 4c 4f 47 5f 46 41 54 41 4c 5f 49 46 28 21 20   LOG_FATAL_IF(! 
86d0: 76 61 72 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20  var, "Unable to 
86e0: 66 69 6e 64 20 66 69 65 6c 64 20 22 20 66 69 65  find field " fie
86f0: 6c 64 4e 61 6d 65 29 3b 0a 0a 69 6e 74 20 72 65  ldName);..int re
8700: 67 69 73 74 65 72 5f 61 6e 64 72 6f 69 64 5f 64  gister_android_d
8710: 61 74 61 62 61 73 65 5f 53 51 4c 69 74 65 43 6f  atabase_SQLiteCo
8720: 6e 6e 65 63 74 69 6f 6e 28 4a 4e 49 45 6e 76 20  nnection(JNIEnv 
8730: 2a 65 6e 76 29 0a 7b 0a 20 20 20 20 6a 63 6c 61  *env).{.    jcla
8740: 73 73 20 63 6c 61 7a 7a 3b 0a 20 20 20 20 46 49  ss clazz;.    FI
8750: 4e 44 5f 43 4c 41 53 53 28 63 6c 61 7a 7a 2c 20  ND_CLASS(clazz, 
8760: 22 6f 72 67 2f 73 71 6c 69 74 65 2f 64 61 74 61  "org/sqlite/data
8770: 62 61 73 65 2f 73 71 6c 69 74 65 2f 53 51 4c 69  base/sqlite/SQLi
8780: 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e  teCustomFunction
8790: 22 29 3b 0a 0a 20 20 20 20 47 45 54 5f 46 49 45  ");..    GET_FIE
87a0: 4c 44 5f 49 44 28 67 53 51 4c 69 74 65 43 75 73  LD_ID(gSQLiteCus
87b0: 74 6f 6d 46 75 6e 63 74 69 6f 6e 43 6c 61 73 73  tomFunctionClass
87c0: 49 6e 66 6f 2e 6e 61 6d 65 2c 20 63 6c 61 7a 7a  Info.name, clazz
87d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ,.            "n
87e0: 61 6d 65 22 2c 20 22 4c 6a 61 76 61 2f 6c 61 6e  ame", "Ljava/lan
87f0: 67 2f 53 74 72 69 6e 67 3b 22 29 3b 0a 20 20 20  g/String;");.   
8800: 20 47 45 54 5f 46 49 45 4c 44 5f 49 44 28 67 53   GET_FIELD_ID(gS
8810: 51 4c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74  QLiteCustomFunct
8820: 69 6f 6e 43 6c 61 73 73 49 6e 66 6f 2e 6e 75 6d  ionClassInfo.num
8830: 41 72 67 73 2c 20 63 6c 61 7a 7a 2c 0a 20 20 20  Args, clazz,.   
8840: 20 20 20 20 20 20 20 20 20 22 6e 75 6d 41 72 67           "numArg
8850: 73 22 2c 20 22 49 22 29 3b 0a 20 20 20 20 47 45  s", "I");.    GE
8860: 54 5f 4d 45 54 48 4f 44 5f 49 44 28 67 53 51 4c  T_METHOD_ID(gSQL
8870: 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f  iteCustomFunctio
8880: 6e 43 6c 61 73 73 49 6e 66 6f 2e 64 69 73 70 61  nClassInfo.dispa
8890: 74 63 68 43 61 6c 6c 62 61 63 6b 2c 0a 20 20 20  tchCallback,.   
88a0: 20 20 20 20 20 20 20 20 20 63 6c 61 7a 7a 2c 20           clazz, 
88b0: 22 64 69 73 70 61 74 63 68 43 61 6c 6c 62 61 63  "dispatchCallbac
88c0: 6b 22 2c 20 22 28 5b 4c 6a 61 76 61 2f 6c 61 6e  k", "([Ljava/lan
88d0: 67 2f 53 74 72 69 6e 67 3b 29 56 22 29 3b 0a 0a  g/String;)V");..
88e0: 20 20 20 20 46 49 4e 44 5f 43 4c 41 53 53 28 63      FIND_CLASS(c
88f0: 6c 61 7a 7a 2c 20 22 6a 61 76 61 2f 6c 61 6e 67  lazz, "java/lang
8900: 2f 53 74 72 69 6e 67 22 29 3b 0a 20 20 20 20 67  /String");.    g
8910: 53 74 72 69 6e 67 43 6c 61 73 73 49 6e 66 6f 2e  StringClassInfo.
8920: 63 6c 61 7a 7a 20 3d 20 6a 63 6c 61 73 73 28 65  clazz = jclass(e
8930: 6e 76 2d 3e 4e 65 77 47 6c 6f 62 61 6c 52 65 66  nv->NewGlobalRef
8940: 28 63 6c 61 7a 7a 29 29 3b 0a 0a 20 20 20 20 72  (clazz));..    r
8950: 65 74 75 72 6e 20 6a 6e 69 52 65 67 69 73 74 65  eturn jniRegiste
8960: 72 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 28 65  rNativeMethods(e
8970: 6e 76 2c 20 0a 20 20 20 20 20 20 20 20 22 6f 72  nv, .        "or
8980: 67 2f 73 71 6c 69 74 65 2f 64 61 74 61 62 61 73  g/sqlite/databas
8990: 65 2f 73 71 6c 69 74 65 2f 53 51 4c 69 74 65 43  e/sqlite/SQLiteC
89a0: 6f 6e 6e 65 63 74 69 6f 6e 22 2c 0a 20 20 20 20  onnection",.    
89b0: 20 20 20 20 73 4d 65 74 68 6f 64 73 2c 20 4e 45      sMethods, NE
89c0: 4c 45 4d 28 73 4d 65 74 68 6f 64 73 29 0a 20 20  LEM(sMethods).  
89d0: 20 20 29 3b 0a 7d 0a 0a 65 78 74 65 72 6e 20 69    );.}..extern i
89e0: 6e 74 20 72 65 67 69 73 74 65 72 5f 61 6e 64 72  nt register_andr
89f0: 6f 69 64 5f 64 61 74 61 62 61 73 65 5f 53 51 4c  oid_database_SQL
8a00: 69 74 65 47 6c 6f 62 61 6c 28 4a 4e 49 45 6e 76  iteGlobal(JNIEnv
8a10: 20 2a 65 6e 76 29 3b 0a 65 78 74 65 72 6e 20 69   *env);.extern i
8a20: 6e 74 20 72 65 67 69 73 74 65 72 5f 61 6e 64 72  nt register_andr
8a30: 6f 69 64 5f 64 61 74 61 62 61 73 65 5f 53 51 4c  oid_database_SQL
8a40: 69 74 65 44 65 62 75 67 28 4a 4e 49 45 6e 76 20  iteDebug(JNIEnv 
8a50: 2a 65 6e 76 29 3b 0a 0a 7d 20 2f 2f 20 6e 61 6d  *env);..} // nam
8a60: 65 73 70 61 63 65 20 61 6e 64 72 6f 69 64 0a 0a  espace android..
8a70: 65 78 74 65 72 6e 20 22 43 22 20 4a 4e 49 45 58  extern "C" JNIEX
8a80: 50 4f 52 54 20 6a 69 6e 74 20 4a 4e 49 43 41 4c  PORT jint JNICAL
8a90: 4c 20 4a 4e 49 5f 4f 6e 4c 6f 61 64 28 4a 61 76  L JNI_OnLoad(Jav
8aa0: 61 56 4d 2a 20 76 6d 2c 20 76 6f 69 64 2a 20 72  aVM* vm, void* r
8ab0: 65 73 65 72 76 65 64 29 20 7b 0a 20 20 4a 4e 49  eserved) {.  JNI
8ac0: 45 6e 76 20 2a 65 6e 76 20 3d 20 30 3b 0a 0a 20  Env *env = 0;.. 
8ad0: 20 61 6e 64 72 6f 69 64 3a 3a 67 70 4a 61 76 61   android::gpJava
8ae0: 56 4d 20 3d 20 76 6d 3b 0a 20 20 76 6d 2d 3e 47  VM = vm;.  vm->G
8af0: 65 74 45 6e 76 28 28 76 6f 69 64 2a 2a 29 26 65  etEnv((void**)&e
8b00: 6e 76 2c 20 4a 4e 49 5f 56 45 52 53 49 4f 4e 5f  nv, JNI_VERSION_
8b10: 31 5f 34 29 3b 0a 0a 20 20 61 6e 64 72 6f 69 64  1_4);..  android
8b20: 3a 3a 72 65 67 69 73 74 65 72 5f 61 6e 64 72 6f  ::register_andro
8b30: 69 64 5f 64 61 74 61 62 61 73 65 5f 53 51 4c 69  id_database_SQLi
8b40: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 65 6e 76  teConnection(env
8b50: 29 3b 0a 20 20 61 6e 64 72 6f 69 64 3a 3a 72 65  );.  android::re
8b60: 67 69 73 74 65 72 5f 61 6e 64 72 6f 69 64 5f 64  gister_android_d
8b70: 61 74 61 62 61 73 65 5f 53 51 4c 69 74 65 44 65  atabase_SQLiteDe
8b80: 62 75 67 28 65 6e 76 29 3b 0a 20 20 61 6e 64 72  bug(env);.  andr
8b90: 6f 69 64 3a 3a 72 65 67 69 73 74 65 72 5f 61 6e  oid::register_an
8ba0: 64 72 6f 69 64 5f 64 61 74 61 62 61 73 65 5f 53  droid_database_S
8bb0: 51 4c 69 74 65 47 6c 6f 62 61 6c 28 65 6e 76 29  QLiteGlobal(env)
8bc0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4e 49 5f  ;..  return JNI_
8bd0: 56 45 52 53 49 4f 4e 5f 31 5f 34 3b 0a 7d 0a 0a  VERSION_1_4;.}..
8be0: 0a 0a                                            ..