SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact b68d317101f7473b2ee303bff0434fc2ed47df92:


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 70 61 63 6b 61 67 65 20 6f 72 67 2e 73 71 6c  .package org.sql
02e0: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
02f0: 69 74 65 3b 0a 0a 69 6d 70 6f 72 74 20 6f 72 67  ite;..import org
0300: 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65  .sqlite.database
0310: 2e 73 71 6c 69 74 65 2e 43 6c 6f 73 65 47 75 61  .sqlite.CloseGua
0320: 72 64 3b 0a 0a 69 6d 70 6f 72 74 20 61 6e 64 72  rd;..import andr
0330: 6f 69 64 2e 64 61 74 61 62 61 73 65 2e 43 75 72  oid.database.Cur
0340: 73 6f 72 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72  sor;.import andr
0350: 6f 69 64 2e 64 61 74 61 62 61 73 65 2e 43 75 72  oid.database.Cur
0360: 73 6f 72 57 69 6e 64 6f 77 3b 0a 69 6d 70 6f 72  sorWindow;.impor
0370: 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74  t org.sqlite.dat
0380: 61 62 61 73 65 2e 44 61 74 61 62 61 73 65 55 74  abase.DatabaseUt
0390: 69 6c 73 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e  ils;.import org.
03a0: 73 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65 2e  sqlite.database.
03b0: 73 71 6c 69 74 65 2e 53 51 4c 69 74 65 44 65 62  sqlite.SQLiteDeb
03c0: 75 67 2e 44 62 53 74 61 74 73 3b 0a 69 6d 70 6f  ug.DbStats;.impo
03d0: 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e 43 61  rt android.os.Ca
03e0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
03f0: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
0400: 2e 6f 73 2e 4f 70 65 72 61 74 69 6f 6e 43 61 6e  .os.OperationCan
0410: 63 65 6c 65 64 45 78 63 65 70 74 69 6f 6e 3b 0a  celedException;.
0420: 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f  import android.o
0430: 73 2e 50 61 72 63 65 6c 46 69 6c 65 44 65 73 63  s.ParcelFileDesc
0440: 72 69 70 74 6f 72 3b 0a 69 6d 70 6f 72 74 20 61  riptor;.import a
0450: 6e 64 72 6f 69 64 2e 6f 73 2e 53 79 73 74 65 6d  ndroid.os.System
0460: 43 6c 6f 63 6b 3b 0a 69 6d 70 6f 72 74 20 61 6e  Clock;.import an
0470: 64 72 6f 69 64 2e 75 74 69 6c 2e 4c 6f 67 3b 0a  droid.util.Log;.
0480: 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 75  import android.u
0490: 74 69 6c 2e 4c 72 75 43 61 63 68 65 3b 0a 69 6d  til.LruCache;.im
04a0: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 75 74 69  port android.uti
04b0: 6c 2e 50 72 69 6e 74 65 72 3b 0a 0a 69 6d 70 6f  l.Printer;..impo
04c0: 72 74 20 6a 61 76 61 2e 74 65 78 74 2e 53 69 6d  rt java.text.Sim
04d0: 70 6c 65 44 61 74 65 46 6f 72 6d 61 74 3b 0a 69  pleDateFormat;.i
04e0: 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e  mport java.util.
04f0: 41 72 72 61 79 4c 69 73 74 3b 0a 69 6d 70 6f 72  ArrayList;.impor
0500: 74 20 6a 61 76 61 2e 75 74 69 6c 2e 44 61 74 65  t java.util.Date
0510: 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74  ;.import java.ut
0520: 69 6c 2e 4d 61 70 3b 0a 69 6d 70 6f 72 74 20 6a  il.Map;.import j
0530: 61 76 61 2e 75 74 69 6c 2e 72 65 67 65 78 2e 50  ava.util.regex.P
0540: 61 74 74 65 72 6e 3b 0a 0a 2f 2a 2a 0a 20 2a 20  attern;../**. * 
0550: 52 65 70 72 65 73 65 6e 74 73 20 61 20 53 51 4c  Represents a SQL
0560: 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ite database con
0570: 6e 65 63 74 69 6f 6e 2e 0a 20 2a 20 45 61 63 68  nection.. * Each
0580: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 61 70   connection wrap
0590: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
05a0: 20 61 20 6e 61 74 69 76 65 20 3c 63 6f 64 65 3e   a native <code>
05b0: 73 71 6c 69 74 65 33 3c 2f 63 6f 64 65 3e 20 6f  sqlite3</code> o
05c0: 62 6a 65 63 74 2e 0a 20 2a 20 3c 70 3e 0a 20 2a  bject.. * <p>. *
05d0: 20 57 68 65 6e 20 64 61 74 61 62 61 73 65 20 63   When database c
05e0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c 69 6e  onnection poolin
05f0: 67 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  g is enabled, th
0600: 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69  ere can be multi
0610: 70 6c 65 20 61 63 74 69 76 65 0a 20 2a 20 63 6f  ple active. * co
0620: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
0630: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
0640: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65   Otherwise there
0650: 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 6f 6e   is typically on
0660: 6c 79 20 6f 6e 65 0a 20 2a 20 63 6f 6e 6e 65 63  ly one. * connec
0670: 74 69 6f 6e 20 70 65 72 20 64 61 74 61 62 61 73  tion per databas
0680: 65 2e 0a 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 2a  e.. * </p><p>. *
0690: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 69 74 65   When the SQLite
06a0: 20 57 41 4c 20 66 65 61 74 75 72 65 20 69 73 20   WAL feature is 
06b0: 65 6e 61 62 6c 65 64 2c 20 6d 75 6c 74 69 70 6c  enabled, multipl
06c0: 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 6f 6e  e readers and on
06d0: 65 20 77 72 69 74 65 72 0a 20 2a 20 63 61 6e 20  e writer. * can 
06e0: 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 61 63 63  concurrently acc
06f0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
0700: 2e 20 20 57 69 74 68 6f 75 74 20 57 41 4c 2c 20  .  Without WAL, 
0710: 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
0720: 65 72 73 0a 20 2a 20 61 72 65 20 6d 75 74 75 61  ers. * are mutua
0730: 6c 6c 79 20 65 78 63 6c 75 73 69 76 65 2e 0a 20  lly exclusive.. 
0740: 2a 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 3c 68 32  * </p>. *. * <h2
0750: 3e 4f 77 6e 65 72 73 68 69 70 20 61 6e 64 20 63  >Ownership and c
0760: 6f 6e 63 75 72 72 65 6e 63 79 20 67 75 61 72 61  oncurrency guara
0770: 6e 74 65 65 73 3c 2f 68 32 3e 0a 20 2a 20 3c 70  ntees</h2>. * <p
0780: 3e 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  >. * Connection 
0790: 6f 62 6a 65 63 74 73 20 61 72 65 20 6e 6f 74 20  objects are not 
07a0: 74 68 72 65 61 64 2d 73 61 66 65 2e 20 20 54 68  thread-safe.  Th
07b0: 65 79 20 61 72 65 20 61 63 71 75 69 72 65 64 20  ey are acquired 
07c0: 61 73 20 6e 65 65 64 65 64 20 74 6f 0a 20 2a 20  as needed to. * 
07d0: 70 65 72 66 6f 72 6d 20 61 20 64 61 74 61 62 61  perform a databa
07e0: 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64  se operation and
07f0: 20 61 72 65 20 74 68 65 6e 20 72 65 74 75 72 6e   are then return
0800: 65 64 20 74 6f 20 74 68 65 20 70 6f 6f 6c 2e 20  ed to the pool. 
0810: 20 41 74 20 61 6e 79 0a 20 2a 20 67 69 76 65 6e   At any. * given
0820: 20 74 69 6d 65 2c 20 61 20 63 6f 6e 6e 65 63 74   time, a connect
0830: 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6f 77  ion is either ow
0840: 6e 65 64 20 61 6e 64 20 75 73 65 64 20 62 79 20  ned and used by 
0850: 61 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65 53  a {@link SQLiteS
0860: 65 73 73 69 6f 6e 7d 0a 20 2a 20 6f 62 6a 65 63  ession}. * objec
0870: 74 20 6f 72 20 74 68 65 20 7b 40 6c 69 6e 6b 20  t or the {@link 
0880: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
0890: 50 6f 6f 6c 7d 2e 20 20 54 68 6f 73 65 20 63 6c  Pool}.  Those cl
08a0: 61 73 73 65 73 20 61 72 65 0a 20 2a 20 72 65 73  asses are. * res
08b0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 72  ponsible for ser
08c0: 69 61 6c 69 7a 69 6e 67 20 6f 70 65 72 61 74 69  ializing operati
08d0: 6f 6e 73 20 74 6f 20 67 75 61 72 64 20 61 67 61  ons to guard aga
08e0: 69 6e 73 74 20 63 6f 6e 63 75 72 72 65 6e 74 0a  inst concurrent.
08f0: 20 2a 20 75 73 65 20 6f 66 20 61 20 63 6f 6e 6e   * use of a conn
0900: 65 63 74 69 6f 6e 2e 0a 20 2a 20 3c 2f 70 3e 3c  ection.. * </p><
0910: 70 3e 0a 20 2a 20 54 68 65 20 67 75 61 72 61 6e  p>. * The guaran
0920: 74 65 65 20 6f 66 20 68 61 76 69 6e 67 20 61 20  tee of having a 
0930: 73 69 6e 67 6c 65 20 6f 77 6e 65 72 20 61 6c 6c  single owner all
0940: 6f 77 73 20 74 68 69 73 20 63 6c 61 73 73 20 74  ows this class t
0950: 6f 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  o be implemented
0960: 0a 20 2a 20 77 69 74 68 6f 75 74 20 6c 6f 63 6b  . * without lock
0970: 73 20 61 6e 64 20 67 72 65 61 74 6c 79 20 73 69  s and greatly si
0980: 6d 70 6c 69 66 69 65 73 20 72 65 73 6f 75 72 63  mplifies resourc
0990: 65 20 6d 61 6e 61 67 65 6d 65 6e 74 2e 0a 20 2a  e management.. *
09a0: 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 3c 68 32 3e   </p>. *. * <h2>
09b0: 45 6e 63 61 70 73 75 6c 61 74 69 6f 6e 20 67 75  Encapsulation gu
09c0: 61 72 61 6e 74 65 65 73 3c 2f 68 32 3e 0a 20 2a  arantees</h2>. *
09d0: 20 3c 70 3e 0a 20 2a 20 54 68 65 20 63 6f 6e 6e   <p>. * The conn
09e0: 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 6f 62  ection object ob
09f0: 6a 65 63 74 20 6f 77 6e 73 20 2a 61 6c 6c 2a 20  ject owns *all* 
0a00: 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 72 65  of the SQLite re
0a10: 6c 61 74 65 64 20 6e 61 74 69 76 65 0a 20 2a 20  lated native. * 
0a20: 6f 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65  objects that are
0a30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
0a40: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e   the connection.
0a50: 20 20 57 68 61 74 27 73 20 6d 6f 72 65 2c 20 74    What's more, t
0a60: 68 65 72 65 20 61 72 65 0a 20 2a 20 6e 6f 20 6f  here are. * no o
0a70: 74 68 65 72 20 6f 62 6a 65 63 74 73 20 69 6e 20  ther objects in 
0a80: 74 68 65 20 73 79 73 74 65 6d 20 74 68 61 74 20  the system that 
0a90: 61 72 65 20 63 61 70 61 62 6c 65 20 6f 66 20 6f  are capable of o
0aa0: 62 74 61 69 6e 69 6e 67 20 68 61 6e 64 6c 65 73  btaining handles
0ab0: 20 74 6f 0a 20 2a 20 74 68 6f 73 65 20 6e 61 74   to. * those nat
0ac0: 69 76 65 20 6f 62 6a 65 63 74 73 2e 20 20 43 6f  ive objects.  Co
0ad0: 6e 73 65 71 75 65 6e 74 6c 79 2c 20 77 68 65 6e  nsequently, when
0ae0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
0af0: 69 73 20 63 6c 6f 73 65 64 2c 20 77 65 20 64 6f  is closed, we do
0b00: 0a 20 2a 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  . * not have to 
0b10: 77 6f 72 72 79 20 61 62 6f 75 74 20 77 68 61 74  worry about what
0b20: 20 6f 74 68 65 72 20 63 6f 6d 70 6f 6e 65 6e 74   other component
0b30: 73 20 6d 69 67 68 74 20 68 61 76 65 20 72 65 66  s might have ref
0b40: 65 72 65 6e 63 65 73 20 74 6f 0a 20 2a 20 69 74  erences to. * it
0b50: 73 20 61 73 73 6f 63 69 61 74 65 64 20 53 51 4c  s associated SQL
0b60: 69 74 65 20 73 74 61 74 65 20 2d 2d 20 74 68 65  ite state -- the
0b70: 72 65 20 61 72 65 20 6e 6f 6e 65 2e 0a 20 2a 20  re are none.. * 
0b80: 3c 2f 70 3e 3c 70 3e 0a 20 2a 20 45 6e 63 61 70  </p><p>. * Encap
0b90: 73 75 6c 61 74 69 6f 6e 20 69 73 20 77 68 61 74  sulation is what
0ba0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
0bb0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a  e connection obj
0bc0: 65 63 74 27 73 0a 20 2a 20 6c 69 66 65 63 79 63  ect's. * lifecyc
0bd0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f  le does not beco
0be0: 6d 65 20 61 20 74 6f 72 74 75 72 65 64 20 6d 65  me a tortured me
0bf0: 73 73 20 6f 66 20 66 69 6e 61 6c 69 7a 65 72 73  ss of finalizers
0c00: 20 61 6e 64 20 72 65 66 65 72 65 6e 63 65 0a 20   and reference. 
0c10: 2a 20 71 75 65 75 65 73 2e 0a 20 2a 20 3c 2f 70  * queues.. * </p
0c20: 3e 0a 20 2a 0a 20 2a 20 3c 68 32 3e 52 65 65 6e  >. *. * <h2>Reen
0c30: 74 72 61 6e 63 65 3c 2f 68 32 3e 0a 20 2a 20 3c  trance</h2>. * <
0c40: 70 3e 0a 20 2a 20 54 68 69 73 20 63 6c 61 73 73  p>. * This class
0c50: 20 6d 75 73 74 20 74 6f 6c 65 72 61 74 65 20 72   must tolerate r
0c60: 65 65 6e 74 72 61 6e 74 20 65 78 65 63 75 74 69  eentrant executi
0c70: 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20 6f 70 65  on of SQLite ope
0c80: 72 61 74 69 6f 6e 73 20 62 65 63 61 75 73 65 0a  rations because.
0c90: 20 2a 20 74 72 69 67 67 65 72 73 20 6d 61 79 20   * triggers may 
0ca0: 63 61 6c 6c 20 63 75 73 74 6f 6d 20 53 51 4c 69  call custom SQLi
0cb0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  te functions tha
0cc0: 74 20 70 65 72 66 6f 72 6d 20 61 64 64 69 74 69  t perform additi
0cd0: 6f 6e 61 6c 20 71 75 65 72 69 65 73 2e 0a 20 2a  onal queries.. *
0ce0: 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 40 68 69 64   </p>. *. * @hid
0cf0: 65 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 66 69 6e  e. */.public fin
0d00: 61 6c 20 63 6c 61 73 73 20 53 51 4c 69 74 65 43  al class SQLiteC
0d10: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6d 70 6c 65 6d  onnection implem
0d20: 65 6e 74 73 20 43 61 6e 63 65 6c 6c 61 74 69 6f  ents Cancellatio
0d30: 6e 53 69 67 6e 61 6c 2e 4f 6e 43 61 6e 63 65 6c  nSignal.OnCancel
0d40: 4c 69 73 74 65 6e 65 72 20 7b 0a 20 20 20 20 70  Listener {.    p
0d50: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66 69  rivate static fi
0d60: 6e 61 6c 20 53 74 72 69 6e 67 20 54 41 47 20 3d  nal String TAG =
0d70: 20 22 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69   "SQLiteConnecti
0d80: 6f 6e 22 3b 0a 20 20 20 20 70 72 69 76 61 74 65  on";.    private
0d90: 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 62 6f   static final bo
0da0: 6f 6c 65 61 6e 20 44 45 42 55 47 20 3d 20 66 61  olean DEBUG = fa
0db0: 6c 73 65 3b 0a 0a 20 20 20 20 70 72 69 76 61 74  lse;..    privat
0dc0: 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 53  e static final S
0dd0: 74 72 69 6e 67 5b 5d 20 45 4d 50 54 59 5f 53 54  tring[] EMPTY_ST
0de0: 52 49 4e 47 5f 41 52 52 41 59 20 3d 20 6e 65 77  RING_ARRAY = new
0df0: 20 53 74 72 69 6e 67 5b 30 5d 3b 0a 20 20 20 20   String[0];.    
0e00: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66  private static f
0e10: 69 6e 61 6c 20 62 79 74 65 5b 5d 20 45 4d 50 54  inal byte[] EMPT
0e20: 59 5f 42 59 54 45 5f 41 52 52 41 59 20 3d 20 6e  Y_BYTE_ARRAY = n
0e30: 65 77 20 62 79 74 65 5b 30 5d 3b 0a 0a 20 20 20  ew byte[0];..   
0e40: 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 43   private final C
0e50: 6c 6f 73 65 47 75 61 72 64 20 6d 43 6c 6f 73 65  loseGuard mClose
0e60: 47 75 61 72 64 20 3d 20 43 6c 6f 73 65 47 75 61  Guard = CloseGua
0e70: 72 64 2e 67 65 74 28 29 3b 0a 0a 20 20 20 20 70  rd.get();..    p
0e80: 72 69 76 61 74 65 20 66 69 6e 61 6c 20 53 51 4c  rivate final SQL
0e90: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f  iteConnectionPoo
0ea0: 6c 20 6d 50 6f 6f 6c 3b 0a 20 20 20 20 70 72 69  l mPool;.    pri
0eb0: 76 61 74 65 20 66 69 6e 61 6c 20 53 51 4c 69 74  vate final SQLit
0ec0: 65 44 61 74 61 62 61 73 65 43 6f 6e 66 69 67 75  eDatabaseConfigu
0ed0: 72 61 74 69 6f 6e 20 6d 43 6f 6e 66 69 67 75 72  ration mConfigur
0ee0: 61 74 69 6f 6e 3b 0a 20 20 20 20 70 72 69 76 61  ation;.    priva
0ef0: 74 65 20 66 69 6e 61 6c 20 69 6e 74 20 6d 43 6f  te final int mCo
0f00: 6e 6e 65 63 74 69 6f 6e 49 64 3b 0a 20 20 20 20  nnectionId;.    
0f10: 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 62 6f  private final bo
0f20: 6f 6c 65 61 6e 20 6d 49 73 50 72 69 6d 61 72 79  olean mIsPrimary
0f30: 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Connection;.    
0f40: 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 62 6f  private final bo
0f50: 6f 6c 65 61 6e 20 6d 49 73 52 65 61 64 4f 6e 6c  olean mIsReadOnl
0f60: 79 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 20 20 20  yConnection;.   
0f70: 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 50   private final P
0f80: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
0f90: 43 61 63 68 65 20 6d 50 72 65 70 61 72 65 64 53  Cache mPreparedS
0fa0: 74 61 74 65 6d 65 6e 74 43 61 63 68 65 3b 0a 20  tatementCache;. 
0fb0: 20 20 20 70 72 69 76 61 74 65 20 50 72 65 70 61     private Prepa
0fc0: 72 65 64 53 74 61 74 65 6d 65 6e 74 20 6d 50 72  redStatement mPr
0fd0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 50  eparedStatementP
0fe0: 6f 6f 6c 3b 0a 0a 20 20 20 20 2f 2f 20 54 68 65  ool;..    // The
0ff0: 20 72 65 63 65 6e 74 20 6f 70 65 72 61 74 69 6f   recent operatio
1000: 6e 73 20 6c 6f 67 2e 0a 20 20 20 20 70 72 69 76  ns log..    priv
1010: 61 74 65 20 66 69 6e 61 6c 20 4f 70 65 72 61 74  ate final Operat
1020: 69 6f 6e 4c 6f 67 20 6d 52 65 63 65 6e 74 4f 70  ionLog mRecentOp
1030: 65 72 61 74 69 6f 6e 73 20 3d 20 6e 65 77 20 4f  erations = new O
1040: 70 65 72 61 74 69 6f 6e 4c 6f 67 28 29 3b 0a 0a  perationLog();..
1050: 20 20 20 20 2f 2f 20 54 68 65 20 6e 61 74 69 76      // The nativ
1060: 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e SQLiteConnecti
1070: 6f 6e 20 70 6f 69 6e 74 65 72 2e 20 20 28 46 4f  on pointer.  (FO
1080: 52 20 49 4e 54 45 52 4e 41 4c 20 55 53 45 20 4f  R INTERNAL USE O
1090: 4e 4c 59 29 0a 20 20 20 20 70 72 69 76 61 74 65  NLY).    private
10a0: 20 6c 6f 6e 67 20 6d 43 6f 6e 6e 65 63 74 69 6f   long mConnectio
10b0: 6e 50 74 72 3b 0a 0a 20 20 20 20 70 72 69 76 61  nPtr;..    priva
10c0: 74 65 20 62 6f 6f 6c 65 61 6e 20 6d 4f 6e 6c 79  te boolean mOnly
10d0: 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70 65  AllowReadOnlyOpe
10e0: 72 61 74 69 6f 6e 73 3b 0a 0a 20 20 20 20 2f 2f  rations;..    //
10f0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
1100: 69 6d 65 73 20 61 74 74 61 63 68 43 61 6e 63 65  imes attachCance
1110: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 68 61  llationSignal ha
1120: 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 0a 20  s been called.. 
1130: 20 20 20 2f 2f 20 42 65 63 61 75 73 65 20 53 51     // Because SQ
1140: 4c 69 74 65 20 73 74 61 74 65 6d 65 6e 74 20 65  Lite statement e
1150: 78 65 63 75 74 69 6f 6e 20 63 61 6e 20 62 65 20  xecution can be 
1160: 72 65 65 6e 74 72 61 6e 74 2c 20 77 65 20 6b 65  reentrant, we ke
1170: 65 70 20 74 72 61 63 6b 20 6f 66 20 68 6f 77 20  ep track of how 
1180: 6d 61 6e 79 0a 20 20 20 20 2f 2f 20 74 69 6d 65  many.    // time
1190: 73 20 77 65 20 68 61 76 65 20 61 74 74 65 6d 70  s we have attemp
11a0: 74 65 64 20 74 6f 20 61 74 74 61 63 68 20 61 20  ted to attach a 
11b0: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 20 73 69 67  cancellation sig
11c0: 6e 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  nal to the conne
11d0: 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 0a 20 20  ction so that.  
11e0: 20 20 2f 2f 20 77 65 20 63 61 6e 20 65 6e 73 75    // we can ensu
11f0: 72 65 20 74 68 61 74 20 77 65 20 64 65 74 61 63  re that we detac
1200: 68 20 74 68 65 20 73 69 67 6e 61 6c 20 61 74 20  h the signal at 
1210: 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 2e 0a  the right time..
1220: 20 20 20 20 70 72 69 76 61 74 65 20 69 6e 74 20      private int 
1230: 6d 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  mCancellationSig
1240: 6e 61 6c 41 74 74 61 63 68 43 6f 75 6e 74 3b 0a  nalAttachCount;.
1250: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
1260: 74 69 63 20 6e 61 74 69 76 65 20 6c 6f 6e 67 20  tic native long 
1270: 6e 61 74 69 76 65 4f 70 65 6e 28 53 74 72 69 6e  nativeOpen(Strin
1280: 67 20 70 61 74 68 2c 20 69 6e 74 20 6f 70 65 6e  g path, int open
1290: 46 6c 61 67 73 2c 20 53 74 72 69 6e 67 20 6c 61  Flags, String la
12a0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  bel,.           
12b0: 20 62 6f 6f 6c 65 61 6e 20 65 6e 61 62 6c 65 54   boolean enableT
12c0: 72 61 63 65 2c 20 62 6f 6f 6c 65 61 6e 20 65 6e  race, boolean en
12d0: 61 62 6c 65 50 72 6f 66 69 6c 65 29 3b 0a 20 20  ableProfile);.  
12e0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
12f0: 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61 74   native void nat
1300: 69 76 65 43 6c 6f 73 65 28 6c 6f 6e 67 20 63 6f  iveClose(long co
1310: 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20  nnectionPtr);.  
1320: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1330: 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61 74   native void nat
1340: 69 76 65 52 65 67 69 73 74 65 72 43 75 73 74 6f  iveRegisterCusto
1350: 6d 46 75 6e 63 74 69 6f 6e 28 6c 6f 6e 67 20 63  mFunction(long c
1360: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 0a 20 20  onnectionPtr,.  
1370: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
1380: 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 20 66  CustomFunction f
1390: 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 70 72  unction);.    pr
13a0: 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74  ivate static nat
13b0: 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65 52  ive void nativeR
13c0: 65 67 69 73 74 65 72 4c 6f 63 61 6c 69 7a 65 64  egisterLocalized
13d0: 43 6f 6c 6c 61 74 6f 72 73 28 6c 6f 6e 67 20 63  Collators(long c
13e0: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 53 74  onnectionPtr, St
13f0: 72 69 6e 67 20 6c 6f 63 61 6c 65 29 3b 0a 20 20  ring locale);.  
1400: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1410: 20 6e 61 74 69 76 65 20 6c 6f 6e 67 20 6e 61 74   native long nat
1420: 69 76 65 50 72 65 70 61 72 65 53 74 61 74 65 6d  ivePrepareStatem
1430: 65 6e 74 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74  ent(long connect
1440: 69 6f 6e 50 74 72 2c 20 53 74 72 69 6e 67 20 73  ionPtr, String s
1450: 71 6c 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65  ql);.    private
1460: 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76   static native v
1470: 6f 69 64 20 6e 61 74 69 76 65 46 69 6e 61 6c 69  oid nativeFinali
1480: 7a 65 53 74 61 74 65 6d 65 6e 74 28 6c 6f 6e 67  zeStatement(long
1490: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20   connectionPtr, 
14a0: 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74  long statementPt
14b0: 72 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20  r);.    private 
14c0: 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 69 6e  static native in
14d0: 74 20 6e 61 74 69 76 65 47 65 74 50 61 72 61 6d  t nativeGetParam
14e0: 65 74 65 72 43 6f 75 6e 74 28 6c 6f 6e 67 20 63  eterCount(long c
14f0: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f  onnectionPtr, lo
1500: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29  ng statementPtr)
1510: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
1520: 61 74 69 63 20 6e 61 74 69 76 65 20 62 6f 6f 6c  atic native bool
1530: 65 61 6e 20 6e 61 74 69 76 65 49 73 52 65 61 64  ean nativeIsRead
1540: 4f 6e 6c 79 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  Only(long connec
1550: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
1560: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20  atementPtr);.   
1570: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1580: 6e 61 74 69 76 65 20 69 6e 74 20 6e 61 74 69 76  native int nativ
1590: 65 47 65 74 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28  eGetColumnCount(
15a0: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
15b0: 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  tr, long stateme
15c0: 6e 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76  ntPtr);.    priv
15d0: 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76  ate static nativ
15e0: 65 20 53 74 72 69 6e 67 20 6e 61 74 69 76 65 47  e String nativeG
15f0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 6c 6f 6e  etColumnName(lon
1600: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  g connectionPtr,
1610: 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50   long statementP
1620: 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
1630: 69 6e 74 20 69 6e 64 65 78 29 3b 0a 20 20 20 20  int index);.    
1640: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e  private static n
1650: 61 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76  ative void nativ
1660: 65 42 69 6e 64 4e 75 6c 6c 28 6c 6f 6e 67 20 63  eBindNull(long c
1670: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f  onnectionPtr, lo
1680: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c  ng statementPtr,
1690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
16a0: 20 69 6e 64 65 78 29 3b 0a 20 20 20 20 70 72 69   index);.    pri
16b0: 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69  vate static nati
16c0: 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65 42 69  ve void nativeBi
16d0: 6e 64 4c 6f 6e 67 28 6c 6f 6e 67 20 63 6f 6e 6e  ndLong(long conn
16e0: 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20  ectionPtr, long 
16f0: 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 0a 20 20  statementPtr,.  
1700: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e            int in
1710: 64 65 78 2c 20 6c 6f 6e 67 20 76 61 6c 75 65 29  dex, long value)
1720: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
1730: 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64  atic native void
1740: 20 6e 61 74 69 76 65 42 69 6e 64 44 6f 75 62 6c   nativeBindDoubl
1750: 65 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  e(long connectio
1760: 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65  nPtr, long state
1770: 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20 20 20 20  mentPtr,.       
1780: 20 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20       int index, 
1790: 64 6f 75 62 6c 65 20 76 61 6c 75 65 29 3b 0a 20  double value);. 
17a0: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
17b0: 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61  c native void na
17c0: 74 69 76 65 42 69 6e 64 53 74 72 69 6e 67 28 6c  tiveBindString(l
17d0: 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ong connectionPt
17e0: 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e  r, long statemen
17f0: 74 50 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  tPtr,.          
1800: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 53 74 72    int index, Str
1810: 69 6e 67 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  ing value);.    
1820: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e  private static n
1830: 61 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76  ative void nativ
1840: 65 42 69 6e 64 42 6c 6f 62 28 6c 6f 6e 67 20 63  eBindBlob(long c
1850: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f  onnectionPtr, lo
1860: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c  ng statementPtr,
1870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1880: 20 69 6e 64 65 78 2c 20 62 79 74 65 5b 5d 20 76   index, byte[] v
1890: 61 6c 75 65 29 3b 0a 20 20 20 20 70 72 69 76 61  alue);.    priva
18a0: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
18b0: 20 76 6f 69 64 20 6e 61 74 69 76 65 52 65 73 65   void nativeRese
18c0: 74 53 74 61 74 65 6d 65 6e 74 41 6e 64 43 6c 65  tStatementAndCle
18d0: 61 72 42 69 6e 64 69 6e 67 73 28 0a 20 20 20 20  arBindings(.    
18e0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 63 6f 6e          long con
18f0: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67  nectionPtr, long
1900: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a   statementPtr);.
1910: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1920: 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e  ic native void n
1930: 61 74 69 76 65 45 78 65 63 75 74 65 28 6c 6f 6e  ativeExecute(lon
1940: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  g connectionPtr,
1950: 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50   long statementP
1960: 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65  tr);.    private
1970: 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 6c   static native l
1980: 6f 6e 67 20 6e 61 74 69 76 65 45 78 65 63 75 74  ong nativeExecut
1990: 65 46 6f 72 4c 6f 6e 67 28 6c 6f 6e 67 20 63 6f  eForLong(long co
19a0: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e  nnectionPtr, lon
19b0: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  g statementPtr);
19c0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
19d0: 74 69 63 20 6e 61 74 69 76 65 20 53 74 72 69 6e  tic native Strin
19e0: 67 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 46  g nativeExecuteF
19f0: 6f 72 53 74 72 69 6e 67 28 6c 6f 6e 67 20 63 6f  orString(long co
1a00: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e  nnectionPtr, lon
1a10: 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  g statementPtr);
1a20: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
1a30: 74 69 63 20 6e 61 74 69 76 65 20 69 6e 74 20 6e  tic native int n
1a40: 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 42  ativeExecuteForB
1a50: 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f  lobFileDescripto
1a60: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  r(.            l
1a70: 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ong connectionPt
1a80: 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e  r, long statemen
1a90: 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61  tPtr);.    priva
1aa0: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
1ab0: 20 69 6e 74 20 6e 61 74 69 76 65 45 78 65 63 75   int nativeExecu
1ac0: 74 65 46 6f 72 43 68 61 6e 67 65 64 52 6f 77 43  teForChangedRowC
1ad0: 6f 75 6e 74 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  ount(long connec
1ae0: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
1af0: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20  atementPtr);.   
1b00: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1b10: 6e 61 74 69 76 65 20 6c 6f 6e 67 20 6e 61 74 69  native long nati
1b20: 76 65 45 78 65 63 75 74 65 46 6f 72 4c 61 73 74  veExecuteForLast
1b30: 49 6e 73 65 72 74 65 64 52 6f 77 49 64 28 0a 20  InsertedRowId(. 
1b40: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20             long 
1b50: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c  connectionPtr, l
1b60: 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72  ong statementPtr
1b70: 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  );.    private s
1b80: 74 61 74 69 63 20 6e 61 74 69 76 65 20 6c 6f 6e  tatic native lon
1b90: 67 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 46  g nativeExecuteF
1ba0: 6f 72 43 75 72 73 6f 72 57 69 6e 64 6f 77 28 0a  orCursorWindow(.
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67              long
1bc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20   connectionPtr, 
1bd0: 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74  long statementPt
1be0: 72 2c 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 20  r, CursorWindow 
1bf0: 77 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  win,.           
1c00: 20 69 6e 74 20 73 74 61 72 74 50 6f 73 2c 20 69   int startPos, i
1c10: 6e 74 20 72 65 71 75 69 72 65 64 50 6f 73 2c 20  nt requiredPos, 
1c20: 62 6f 6f 6c 65 61 6e 20 63 6f 75 6e 74 41 6c 6c  boolean countAll
1c30: 52 6f 77 73 29 3b 0a 20 20 20 20 70 72 69 76 61  Rows);.    priva
1c40: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
1c50: 20 69 6e 74 20 6e 61 74 69 76 65 47 65 74 44 62   int nativeGetDb
1c60: 4c 6f 6f 6b 61 73 69 64 65 28 6c 6f 6e 67 20 63  Lookaside(long c
1c70: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20  onnectionPtr);. 
1c80: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
1c90: 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61  c native void na
1ca0: 74 69 76 65 43 61 6e 63 65 6c 28 6c 6f 6e 67 20  tiveCancel(long 
1cb0: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a  connectionPtr);.
1cc0: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1cd0: 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e  ic native void n
1ce0: 61 74 69 76 65 52 65 73 65 74 43 61 6e 63 65 6c  ativeResetCancel
1cf0: 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  (long connection
1d00: 50 74 72 2c 20 62 6f 6f 6c 65 61 6e 20 63 61 6e  Ptr, boolean can
1d10: 63 65 6c 61 62 6c 65 29 3b 0a 0a 20 20 20 20 70  celable);..    p
1d20: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61  rivate static na
1d30: 74 69 76 65 20 62 6f 6f 6c 65 61 6e 20 6e 61 74  tive boolean nat
1d40: 69 76 65 48 61 73 43 6f 64 65 63 28 29 3b 0a 20  iveHasCodec();. 
1d50: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1d60: 20 62 6f 6f 6c 65 61 6e 20 68 61 73 43 6f 64 65   boolean hasCode
1d70: 63 28 29 7b 20 72 65 74 75 72 6e 20 6e 61 74 69  c(){ return nati
1d80: 76 65 48 61 73 43 6f 64 65 63 28 29 3b 20 7d 0a  veHasCodec(); }.
1d90: 0a 20 20 20 20 70 72 69 76 61 74 65 20 53 51 4c  .    private SQL
1da0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 53 51  iteConnection(SQ
1db0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f  LiteConnectionPo
1dc0: 6f 6c 20 70 6f 6f 6c 2c 0a 20 20 20 20 20 20 20  ol pool,.       
1dd0: 20 20 20 20 20 53 51 4c 69 74 65 44 61 74 61 62       SQLiteDatab
1de0: 61 73 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  aseConfiguration
1df0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 0a   configuration,.
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1e10: 63 6f 6e 6e 65 63 74 69 6f 6e 49 64 2c 20 62 6f  connectionId, bo
1e20: 6f 6c 65 61 6e 20 70 72 69 6d 61 72 79 43 6f 6e  olean primaryCon
1e30: 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20  nection) {.     
1e40: 20 20 20 6d 50 6f 6f 6c 20 3d 20 70 6f 6f 6c 3b     mPool = pool;
1e50: 0a 20 20 20 20 20 20 20 20 6d 43 6f 6e 66 69 67  .        mConfig
1e60: 75 72 61 74 69 6f 6e 20 3d 20 6e 65 77 20 53 51  uration = new SQ
1e70: 4c 69 74 65 44 61 74 61 62 61 73 65 43 6f 6e 66  LiteDatabaseConf
1e80: 69 67 75 72 61 74 69 6f 6e 28 63 6f 6e 66 69 67  iguration(config
1e90: 75 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  uration);.      
1ea0: 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 49 64 20    mConnectionId 
1eb0: 3d 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 64 3b 0a  = connectionId;.
1ec0: 20 20 20 20 20 20 20 20 6d 49 73 50 72 69 6d 61          mIsPrima
1ed0: 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 70  ryConnection = p
1ee0: 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e  rimaryConnection
1ef0: 3b 0a 20 20 20 20 20 20 20 20 6d 49 73 52 65 61  ;.        mIsRea
1f00: 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e 20  dOnlyConnection 
1f10: 3d 20 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  = (configuration
1f20: 2e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c  .openFlags & SQL
1f30: 69 74 65 44 61 74 61 62 61 73 65 2e 4f 50 45 4e  iteDatabase.OPEN
1f40: 5f 52 45 41 44 4f 4e 4c 59 29 20 21 3d 20 30 3b  _READONLY) != 0;
1f50: 0a 20 20 20 20 20 20 20 20 6d 50 72 65 70 61 72  .        mPrepar
1f60: 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65  edStatementCache
1f70: 20 3d 20 6e 65 77 20 50 72 65 70 61 72 65 64 53   = new PreparedS
1f80: 74 61 74 65 6d 65 6e 74 43 61 63 68 65 28 0a 20  tatementCache(. 
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
1fa0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6d 61  Configuration.ma
1fb0: 78 53 71 6c 43 61 63 68 65 53 69 7a 65 29 3b 0a  xSqlCacheSize);.
1fc0: 20 20 20 20 20 20 20 20 6d 43 6c 6f 73 65 47 75          mCloseGu
1fd0: 61 72 64 2e 6f 70 65 6e 28 22 63 6c 6f 73 65 22  ard.open("close"
1fe0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 4f  );.    }..    @O
1ff0: 76 65 72 72 69 64 65 0a 20 20 20 20 70 72 6f 74  verride.    prot
2000: 65 63 74 65 64 20 76 6f 69 64 20 66 69 6e 61 6c  ected void final
2010: 69 7a 65 28 29 20 74 68 72 6f 77 73 20 54 68 72  ize() throws Thr
2020: 6f 77 61 62 6c 65 20 7b 0a 20 20 20 20 20 20 20  owable {.       
2030: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
2040: 20 20 20 69 66 20 28 6d 50 6f 6f 6c 20 21 3d 20     if (mPool != 
2050: 6e 75 6c 6c 20 26 26 20 6d 43 6f 6e 6e 65 63 74  null && mConnect
2060: 69 6f 6e 50 74 72 20 21 3d 20 30 29 20 7b 0a 20  ionPtr != 0) {. 
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
2080: 50 6f 6f 6c 2e 6f 6e 43 6f 6e 6e 65 63 74 69 6f  Pool.onConnectio
2090: 6e 4c 65 61 6b 65 64 28 29 3b 0a 20 20 20 20 20  nLeaked();.     
20a0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20b0: 20 20 20 20 20 20 64 69 73 70 6f 73 65 28 74 72        dispose(tr
20c0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66  ue);.        } f
20d0: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
20e0: 20 20 20 20 20 73 75 70 65 72 2e 66 69 6e 61 6c       super.final
20f0: 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  ize();.        }
2100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 43  .    }..    // C
2110: 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 43  alled by SQLiteC
2120: 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20 6f 6e  onnectionPool on
2130: 6c 79 2e 0a 20 20 20 20 73 74 61 74 69 63 20 53  ly..    static S
2140: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
2150: 6f 70 65 6e 28 53 51 4c 69 74 65 43 6f 6e 6e 65  open(SQLiteConne
2160: 63 74 69 6f 6e 50 6f 6f 6c 20 70 6f 6f 6c 2c 0a  ctionPool pool,.
2170: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69              SQLi
2180: 74 65 44 61 74 61 62 61 73 65 43 6f 6e 66 69 67  teDatabaseConfig
2190: 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72  uration configur
21a0: 61 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ation,.         
21b0: 20 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f     int connectio
21c0: 6e 49 64 2c 20 62 6f 6f 6c 65 61 6e 20 70 72 69  nId, boolean pri
21d0: 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 20  maryConnection) 
21e0: 7b 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  {.        SQLite
21f0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 6e 65  Connection conne
2200: 63 74 69 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69  ction = new SQLi
2210: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 70 6f 6f  teConnection(poo
2220: 6c 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  l, configuration
2230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2240: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 64 2c 20    connectionId, 
2250: 70 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f  primaryConnectio
2260: 6e 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20  n);.        try 
2270: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2280: 6e 6e 65 63 74 69 6f 6e 2e 6f 70 65 6e 28 29 3b  nnection.open();
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22a0: 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 0a  urn connection;.
22b0: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
22c0: 28 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e  (SQLiteException
22d0: 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
22e0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 64 69     connection.di
22f0: 73 70 6f 73 65 28 66 61 6c 73 65 29 3b 0a 20 20  spose(false);.  
2300: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
2310: 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ex;.        }.  
2320: 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 43 61 6c 6c    }..    // Call
2330: 65 64 20 62 79 20 53 51 4c 69 74 65 43 6f 6e 6e  ed by SQLiteConn
2340: 65 63 74 69 6f 6e 50 6f 6f 6c 20 6f 6e 6c 79 2e  ectionPool only.
2350: 0a 20 20 20 20 2f 2f 20 43 6c 6f 73 65 73 20 74  .    // Closes t
2360: 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73  he database clos
2370: 65 73 20 61 6e 64 20 72 65 6c 65 61 73 65 73 20  es and releases 
2380: 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63  all of its assoc
2390: 69 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e  iated resources.
23a0: 0a 20 20 20 20 2f 2f 20 44 6f 20 6e 6f 74 20 63  .    // Do not c
23b0: 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  all methods on t
23c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 66  he connection af
23d0: 74 65 72 20 69 74 20 69 73 20 63 6c 6f 73 65 64  ter it is closed
23e0: 2e 20 20 49 74 20 77 69 6c 6c 20 70 72 6f 62 61  .  It will proba
23f0: 62 6c 79 20 63 72 61 73 68 2e 0a 20 20 20 20 76  bly crash..    v
2400: 6f 69 64 20 63 6c 6f 73 65 28 29 20 7b 0a 20 20  oid close() {.  
2410: 20 20 20 20 20 20 64 69 73 70 6f 73 65 28 66 61        dispose(fa
2420: 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  lse);.    }..   
2430: 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 6f 70   private void op
2440: 65 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d  en() {.        m
2450: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 20 3d 20  ConnectionPtr = 
2460: 6e 61 74 69 76 65 4f 70 65 6e 28 6d 43 6f 6e 66  nativeOpen(mConf
2470: 69 67 75 72 61 74 69 6f 6e 2e 70 61 74 68 2c 20  iguration.path, 
2480: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6f  mConfiguration.o
2490: 70 65 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  penFlags,.      
24a0: 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 66 69            mConfi
24b0: 67 75 72 61 74 69 6f 6e 2e 6c 61 62 65 6c 2c 0a  guration.label,.
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 53 51 4c 69 74 65 44 65 62 75 67 2e 44 45 42 55  SQLiteDebug.DEBU
24e0: 47 5f 53 51 4c 5f 53 54 41 54 45 4d 45 4e 54 53  G_SQL_STATEMENTS
24f0: 2c 20 53 51 4c 69 74 65 44 65 62 75 67 2e 44 45  , SQLiteDebug.DE
2500: 42 55 47 5f 53 51 4c 5f 54 49 4d 45 29 3b 0a 0a  BUG_SQL_TIME);..
2510: 20 20 20 20 20 20 20 20 73 65 74 50 61 67 65 53          setPageS
2520: 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20 73  ize();.        s
2530: 65 74 46 6f 72 65 69 67 6e 4b 65 79 4d 6f 64 65  etForeignKeyMode
2540: 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f  FromConfiguratio
2550: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 73 65 74  n();.        set
2560: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
2570: 28 29 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41  ();.        setA
2580: 75 74 6f 43 68 65 63 6b 70 6f 69 6e 74 49 6e 74  utoCheckpointInt
2590: 65 72 76 61 6c 28 29 3b 0a 20 20 20 20 20 20 20  erval();.       
25a0: 20 69 66 28 20 21 6e 61 74 69 76 65 48 61 73 43   if( !nativeHasC
25b0: 6f 64 65 63 28 29 20 29 7b 0a 20 20 20 20 20 20  odec() ){.      
25c0: 20 20 20 20 20 20 73 65 74 57 61 6c 4d 6f 64 65        setWalMode
25d0: 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f  FromConfiguratio
25e0: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n();.           
25f0: 20 73 65 74 4c 6f 63 61 6c 65 46 72 6f 6d 43 6f   setLocaleFromCo
2600: 6e 66 69 67 75 72 61 74 69 6f 6e 28 29 3b 0a 20  nfiguration();. 
2610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2620: 20 2f 2f 20 52 65 67 69 73 74 65 72 20 63 75 73   // Register cus
2630: 74 6f 6d 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  tom functions.. 
2640: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74         final int
2650: 20 66 75 6e 63 74 69 6f 6e 43 6f 75 6e 74 20 3d   functionCount =
2660: 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   mConfiguration.
2670: 63 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e  customFunctions.
2680: 73 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20  size();.        
2690: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
26a0: 69 20 3c 20 66 75 6e 63 74 69 6f 6e 43 6f 75 6e  i < functionCoun
26b0: 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  t; i++) {.      
26c0: 20 20 20 20 20 20 53 51 4c 69 74 65 43 75 73 74        SQLiteCust
26d0: 6f 6d 46 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74  omFunction funct
26e0: 69 6f 6e 20 3d 20 6d 43 6f 6e 66 69 67 75 72 61  ion = mConfigura
26f0: 74 69 6f 6e 2e 63 75 73 74 6f 6d 46 75 6e 63 74  tion.customFunct
2700: 69 6f 6e 73 2e 67 65 74 28 69 29 3b 0a 20 20 20  ions.get(i);.   
2710: 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 52           nativeR
2720: 65 67 69 73 74 65 72 43 75 73 74 6f 6d 46 75 6e  egisterCustomFun
2730: 63 74 69 6f 6e 28 6d 43 6f 6e 6e 65 63 74 69 6f  ction(mConnectio
2740: 6e 50 74 72 2c 20 66 75 6e 63 74 69 6f 6e 29 3b  nPtr, function);
2750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
2760: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  ..    private vo
2770: 69 64 20 64 69 73 70 6f 73 65 28 62 6f 6f 6c 65  id dispose(boole
2780: 61 6e 20 66 69 6e 61 6c 69 7a 65 64 29 20 7b 0a  an finalized) {.
2790: 20 20 20 20 20 20 20 20 69 66 20 28 6d 43 6c 6f          if (mClo
27a0: 73 65 47 75 61 72 64 20 21 3d 20 6e 75 6c 6c 29  seGuard != null)
27b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
27c0: 66 20 28 66 69 6e 61 6c 69 7a 65 64 29 20 7b 0a  f (finalized) {.
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 6d 43 6c 6f 73 65 47 75 61 72 64 2e 77 61 72 6e  mCloseGuard.warn
27f0: 49 66 4f 70 65 6e 28 29 3b 0a 20 20 20 20 20 20  IfOpen();.      
2800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2810: 20 20 20 20 6d 43 6c 6f 73 65 47 75 61 72 64 2e      mCloseGuard.
2820: 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20  close();.       
2830: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28   }..        if (
2840: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 20 21  mConnectionPtr !
2850: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 0) {.         
2860: 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6f     final int coo
2870: 6b 69 65 20 3d 20 6d 52 65 63 65 6e 74 4f 70 65  kie = mRecentOpe
2880: 72 61 74 69 6f 6e 73 2e 62 65 67 69 6e 4f 70 65  rations.beginOpe
2890: 72 61 74 69 6f 6e 28 22 63 6c 6f 73 65 22 2c 20  ration("close", 
28a0: 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  null, null);.   
28b0: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
28d0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
28e0: 74 43 61 63 68 65 2e 65 76 69 63 74 41 6c 6c 28  tCache.evictAll(
28f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2900: 20 20 20 6e 61 74 69 76 65 43 6c 6f 73 65 28 6d     nativeClose(m
2910: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a  ConnectionPtr);.
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 20 3d  mConnectionPtr =
2940: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2950: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
2960: 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63              mRec
2970: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65 6e  entOperations.en
2980: 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69  dOperation(cooki
2990: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
29a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29b0: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  }..    private v
29c0: 6f 69 64 20 73 65 74 50 61 67 65 53 69 7a 65 28  oid setPageSize(
29d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
29e0: 21 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  !mConfiguration.
29f0: 69 73 49 6e 4d 65 6d 6f 72 79 44 62 28 29 20 26  isInMemoryDb() &
2a00: 26 20 21 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f  & !mIsReadOnlyCo
2a10: 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20  nnection) {.    
2a20: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f          final lo
2a30: 6e 67 20 6e 65 77 56 61 6c 75 65 20 3d 20 53 51  ng newValue = SQ
2a40: 4c 69 74 65 47 6c 6f 62 61 6c 2e 67 65 74 44 65  LiteGlobal.getDe
2a50: 66 61 75 6c 74 50 61 67 65 53 69 7a 65 28 29 3b  faultPageSize();
2a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  .            lon
2a70: 67 20 76 61 6c 75 65 20 3d 20 65 78 65 63 75 74  g value = execut
2a80: 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41  eForLong("PRAGMA
2a90: 20 70 61 67 65 5f 73 69 7a 65 22 2c 20 6e 75 6c   page_size", nul
2aa0: 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  l, null);.      
2ab0: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
2ac0: 21 3d 20 6e 65 77 56 61 6c 75 65 29 20 7b 0a 20  != newValue) {. 
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2ae0: 78 65 63 75 74 65 28 22 50 52 41 47 4d 41 20 70  xecute("PRAGMA p
2af0: 61 67 65 5f 73 69 7a 65 3d 22 20 2b 20 6e 65 77  age_size=" + new
2b00: 56 61 6c 75 65 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  Value, null, nul
2b10: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
2b20: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b30: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  }..    private v
2b40: 6f 69 64 20 73 65 74 41 75 74 6f 43 68 65 63 6b  oid setAutoCheck
2b50: 70 6f 69 6e 74 49 6e 74 65 72 76 61 6c 28 29 20  pointInterval() 
2b60: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6d  {.        if (!m
2b70: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 69 73  Configuration.is
2b80: 49 6e 4d 65 6d 6f 72 79 44 62 28 29 20 26 26 20  InMemoryDb() && 
2b90: 21 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e  !mIsReadOnlyConn
2ba0: 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20  ection) {.      
2bb0: 20 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f 6e 67        final long
2bc0: 20 6e 65 77 56 61 6c 75 65 20 3d 20 53 51 4c 69   newValue = SQLi
2bd0: 74 65 47 6c 6f 62 61 6c 2e 67 65 74 57 41 4c 41  teGlobal.getWALA
2be0: 75 74 6f 43 68 65 63 6b 70 6f 69 6e 74 28 29 3b  utoCheckpoint();
2bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  .            lon
2c00: 67 20 76 61 6c 75 65 20 3d 20 65 78 65 63 75 74  g value = execut
2c10: 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41  eForLong("PRAGMA
2c20: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
2c30: 69 6e 74 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  int", null, null
2c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2c50: 66 20 28 76 61 6c 75 65 20 21 3d 20 6e 65 77 56  f (value != newV
2c60: 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20  alue) {.        
2c70: 20 20 20 20 20 20 20 20 65 78 65 63 75 74 65 46          executeF
2c80: 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 77  orLong("PRAGMA w
2c90: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
2ca0: 74 3d 22 20 2b 20 6e 65 77 56 61 6c 75 65 2c 20  t=" + newValue, 
2cb0: 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  null, null);.   
2cc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2ce0: 70 72 69 76 61 74 65 20 76 6f 69 64 20 73 65 74  private void set
2cf0: 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
2d00: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  () {.        if 
2d10: 28 21 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  (!mConfiguration
2d20: 2e 69 73 49 6e 4d 65 6d 6f 72 79 44 62 28 29 20  .isInMemoryDb() 
2d30: 26 26 20 21 6d 49 73 52 65 61 64 4f 6e 6c 79 43  && !mIsReadOnlyC
2d40: 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20  onnection) {.   
2d50: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 6c           final l
2d60: 6f 6e 67 20 6e 65 77 56 61 6c 75 65 20 3d 20 53  ong newValue = S
2d70: 51 4c 69 74 65 47 6c 6f 62 61 6c 2e 67 65 74 4a  QLiteGlobal.getJ
2d80: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28  ournalSizeLimit(
2d90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
2da0: 6f 6e 67 20 76 61 6c 75 65 20 3d 20 65 78 65 63  ong value = exec
2db0: 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47  uteForLong("PRAG
2dc0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f  MA journal_size_
2dd0: 6c 69 6d 69 74 22 2c 20 6e 75 6c 6c 2c 20 6e 75  limit", null, nu
2de0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
2df0: 20 69 66 20 28 76 61 6c 75 65 20 21 3d 20 6e 65   if (value != ne
2e00: 77 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20  wValue) {.      
2e10: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75 74            execut
2e20: 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41  eForLong("PRAGMA
2e30: 20 6a 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69   journal_size_li
2e40: 6d 69 74 3d 22 20 2b 20 6e 65 77 56 61 6c 75 65  mit=" + newValue
2e50: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20  , null, null);. 
2e60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2e80: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 73    private void s
2e90: 65 74 46 6f 72 65 69 67 6e 4b 65 79 4d 6f 64 65  etForeignKeyMode
2ea0: 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f  FromConfiguratio
2eb0: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  n() {.        if
2ec0: 20 28 21 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f   (!mIsReadOnlyCo
2ed0: 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20  nnection) {.    
2ee0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f          final lo
2ef0: 6e 67 20 6e 65 77 56 61 6c 75 65 20 3d 20 6d 43  ng newValue = mC
2f00: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 66 6f 72  onfiguration.for
2f10: 65 69 67 6e 4b 65 79 43 6f 6e 73 74 72 61 69 6e  eignKeyConstrain
2f20: 74 73 45 6e 61 62 6c 65 64 20 3f 20 31 20 3a 20  tsEnabled ? 1 : 
2f30: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  0;.            l
2f40: 6f 6e 67 20 76 61 6c 75 65 20 3d 20 65 78 65 63  ong value = exec
2f50: 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47  uteForLong("PRAG
2f60: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 22  MA foreign_keys"
2f70: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20  , null, null);. 
2f80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
2f90: 61 6c 75 65 20 21 3d 20 6e 65 77 56 61 6c 75 65  alue != newValue
2fa0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2fb0: 20 20 20 20 65 78 65 63 75 74 65 28 22 50 52 41      execute("PRA
2fc0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
2fd0: 3d 22 20 2b 20 6e 65 77 56 61 6c 75 65 2c 20 6e  =" + newValue, n
2fe0: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
2ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3000: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
3010: 72 69 76 61 74 65 20 76 6f 69 64 20 73 65 74 57  rivate void setW
3020: 61 6c 4d 6f 64 65 46 72 6f 6d 43 6f 6e 66 69 67  alModeFromConfig
3030: 75 72 61 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  uration() {.    
3040: 20 20 20 20 69 66 20 28 21 6d 43 6f 6e 66 69 67      if (!mConfig
3050: 75 72 61 74 69 6f 6e 2e 69 73 49 6e 4d 65 6d 6f  uration.isInMemo
3060: 72 79 44 62 28 29 20 26 26 20 21 6d 49 73 52 65  ryDb() && !mIsRe
3070: 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e  adOnlyConnection
3080: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3090: 69 66 20 28 28 6d 43 6f 6e 66 69 67 75 72 61 74  if ((mConfigurat
30a0: 69 6f 6e 2e 6f 70 65 6e 46 6c 61 67 73 20 26 20  ion.openFlags & 
30b0: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e 45  SQLiteDatabase.E
30c0: 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41 48 45 41  NABLE_WRITE_AHEA
30d0: 44 5f 4c 4f 47 47 49 4e 47 29 20 21 3d 20 30 29  D_LOGGING) != 0)
30e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
30f0: 20 20 20 73 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64     setJournalMod
3100: 65 28 22 57 41 4c 22 29 3b 0a 20 20 20 20 20 20  e("WAL");.      
3110: 20 20 20 20 20 20 20 20 20 20 73 65 74 53 79 6e            setSyn
3120: 63 4d 6f 64 65 28 53 51 4c 69 74 65 47 6c 6f 62  cMode(SQLiteGlob
3130: 61 6c 2e 67 65 74 57 41 4c 53 79 6e 63 4d 6f 64  al.getWALSyncMod
3140: 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e());.          
3150: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
3160: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4a 6f             setJo
3170: 75 72 6e 61 6c 4d 6f 64 65 28 53 51 4c 69 74 65  urnalMode(SQLite
3180: 47 6c 6f 62 61 6c 2e 67 65 74 44 65 66 61 75 6c  Global.getDefaul
3190: 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 29 3b  tJournalMode());
31a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31b0: 20 73 65 74 53 79 6e 63 4d 6f 64 65 28 53 51 4c   setSyncMode(SQL
31c0: 69 74 65 47 6c 6f 62 61 6c 2e 67 65 74 44 65 66  iteGlobal.getDef
31d0: 61 75 6c 74 53 79 6e 63 4d 6f 64 65 28 29 29 3b  aultSyncMode());
31e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
3200: 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64      private void
3210: 20 73 65 74 53 79 6e 63 4d 6f 64 65 28 53 74 72   setSyncMode(Str
3220: 69 6e 67 20 6e 65 77 56 61 6c 75 65 29 20 7b 0a  ing newValue) {.
3230: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 76          String v
3240: 61 6c 75 65 20 3d 20 65 78 65 63 75 74 65 46 6f  alue = executeFo
3250: 72 53 74 72 69 6e 67 28 22 50 52 41 47 4d 41 20  rString("PRAGMA 
3260: 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 6e 75  synchronous", nu
3270: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
3280: 20 20 20 69 66 20 28 21 63 61 6e 6f 6e 69 63 61     if (!canonica
3290: 6c 69 7a 65 53 79 6e 63 4d 6f 64 65 28 76 61 6c  lizeSyncMode(val
32a0: 75 65 29 2e 65 71 75 61 6c 73 49 67 6e 6f 72 65  ue).equalsIgnore
32b0: 43 61 73 65 28 0a 20 20 20 20 20 20 20 20 20 20  Case(.          
32c0: 20 20 20 20 20 20 63 61 6e 6f 6e 69 63 61 6c 69        canonicali
32d0: 7a 65 53 79 6e 63 4d 6f 64 65 28 6e 65 77 56 61  zeSyncMode(newVa
32e0: 6c 75 65 29 29 29 20 7b 0a 20 20 20 20 20 20 20  lue))) {.       
32f0: 20 20 20 20 20 65 78 65 63 75 74 65 28 22 50 52       execute("PR
3300: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
3310: 3d 22 20 2b 20 6e 65 77 56 61 6c 75 65 2c 20 6e  =" + newValue, n
3320: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
3330: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3340: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
3350: 53 74 72 69 6e 67 20 63 61 6e 6f 6e 69 63 61 6c  String canonical
3360: 69 7a 65 53 79 6e 63 4d 6f 64 65 28 53 74 72 69  izeSyncMode(Stri
3370: 6e 67 20 76 61 6c 75 65 29 20 7b 0a 20 20 20 20  ng value) {.    
3380: 20 20 20 20 69 66 20 28 76 61 6c 75 65 2e 65 71      if (value.eq
3390: 75 61 6c 73 28 22 30 22 29 29 20 7b 0a 20 20 20  uals("0")) {.   
33a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
33b0: 22 4f 46 46 22 3b 0a 20 20 20 20 20 20 20 20 7d  "OFF";.        }
33c0: 20 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65 2e   else if (value.
33d0: 65 71 75 61 6c 73 28 22 31 22 29 29 20 7b 0a 20  equals("1")) {. 
33e0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
33f0: 6e 20 22 4e 4f 52 4d 41 4c 22 3b 0a 20 20 20 20  n "NORMAL";.    
3400: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 76      } else if (v
3410: 61 6c 75 65 2e 65 71 75 61 6c 73 28 22 32 22 29  alue.equals("2")
3420: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3430: 72 65 74 75 72 6e 20 22 46 55 4c 4c 22 3b 0a 20  return "FULL";. 
3440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3450: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20   return value;. 
3460: 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
3470: 65 20 76 6f 69 64 20 73 65 74 4a 6f 75 72 6e 61  e void setJourna
3480: 6c 4d 6f 64 65 28 53 74 72 69 6e 67 20 6e 65 77  lMode(String new
3490: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20  Value) {.       
34a0: 20 53 74 72 69 6e 67 20 76 61 6c 75 65 20 3d 20   String value = 
34b0: 65 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67  executeForString
34c0: 28 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  ("PRAGMA journal
34d0: 5f 6d 6f 64 65 22 2c 20 6e 75 6c 6c 2c 20 6e 75  _mode", null, nu
34e0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  ll);.        if 
34f0: 28 21 76 61 6c 75 65 2e 65 71 75 61 6c 73 49 67  (!value.equalsIg
3500: 6e 6f 72 65 43 61 73 65 28 6e 65 77 56 61 6c 75  noreCase(newValu
3510: 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e)) {.          
3520: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
3530: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 72          String r
3540: 65 73 75 6c 74 20 3d 20 65 78 65 63 75 74 65 46  esult = executeF
3550: 6f 72 53 74 72 69 6e 67 28 22 50 52 41 47 4d 41  orString("PRAGMA
3560: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 22 20   journal_mode=" 
3570: 2b 20 6e 65 77 56 61 6c 75 65 2c 20 6e 75 6c 6c  + newValue, null
3580: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
3590: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 73           if (res
35a0: 75 6c 74 2e 65 71 75 61 6c 73 49 67 6e 6f 72 65  ult.equalsIgnore
35b0: 43 61 73 65 28 6e 65 77 56 61 6c 75 65 29 29 20  Case(newValue)) 
35c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35d0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 2f 2f 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  // PRAGMA journa
3610: 6c 5f 6d 6f 64 65 20 73 69 6c 65 6e 74 6c 79 20  l_mode silently 
3620: 66 61 69 6c 73 20 61 6e 64 20 72 65 74 75 72 6e  fails and return
3630: 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6a  s the original j
3640: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
3650: 20 20 20 20 20 20 20 2f 2f 20 6d 6f 64 65 20 69         // mode i
3660: 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 69 66 20  n some cases if 
3670: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  the journal mode
3680: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68   could not be ch
3690: 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 20 20  anged..         
36a0: 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69     } catch (SQLi
36b0: 74 65 44 61 74 61 62 61 73 65 4c 6f 63 6b 65 64  teDatabaseLocked
36c0: 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a  Exception ex) {.
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 2f 2f 20 54 68 69 73 20 65 72 72 6f 72 20 28 53  // This error (S
36f0: 51 4c 49 54 45 5f 42 55 53 59 29 20 6f 63 63 75  QLITE_BUSY) occu
3700: 72 73 20 69 66 20 6f 6e 65 20 63 6f 6e 6e 65 63  rs if one connec
3710: 74 69 6f 6e 20 68 61 73 20 74 68 65 20 64 61 74  tion has the dat
3720: 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20 20  abase.          
3730: 20 20 20 20 20 20 2f 2f 20 6f 70 65 6e 20 69 6e        // open in
3740: 20 57 41 4c 20 6d 6f 64 65 20 61 6e 64 20 61 6e   WAL mode and an
3750: 6f 74 68 65 72 20 74 72 69 65 73 20 74 6f 20 63  other tries to c
3760: 68 61 6e 67 65 20 69 74 20 74 6f 20 6e 6f 6e 2d  hange it to non-
3770: 57 41 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 20  WAL..           
3780: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
3790: 2f 20 42 65 63 61 75 73 65 20 77 65 20 61 6c 77  / Because we alw
37a0: 61 79 73 20 64 69 73 61 62 6c 65 20 57 41 4c 20  ays disable WAL 
37b0: 6d 6f 64 65 20 77 68 65 6e 20 61 20 64 61 74 61  mode when a data
37c0: 62 61 73 65 20 69 73 20 66 69 72 73 74 20 6f 70  base is first op
37d0: 65 6e 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  ened.           
37e0: 20 2f 2f 20 28 65 76 65 6e 20 69 66 20 77 65 20   // (even if we 
37f0: 69 6e 74 65 6e 64 20 74 6f 20 72 65 2d 65 6e 61  intend to re-ena
3800: 62 6c 65 20 69 74 29 2c 20 77 65 20 63 61 6e 20  ble it), we can 
3810: 65 6e 63 6f 75 6e 74 65 72 20 70 72 6f 62 6c 65  encounter proble
3820: 6d 73 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ms if.          
3830: 20 20 2f 2f 20 74 68 65 72 65 20 69 73 20 61 6e    // there is an
3840: 6f 74 68 65 72 20 6f 70 65 6e 20 63 6f 6e 6e 65  other open conne
3850: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74  ction to the dat
3860: 61 62 61 73 65 20 73 6f 6d 65 77 68 65 72 65 2e  abase somewhere.
3870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3880: 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  This can happen 
3890: 66 6f 72 20 61 20 76 61 72 69 65 74 79 20 6f 66  for a variety of
38a0: 20 72 65 61 73 6f 6e 73 20 73 75 63 68 20 61 73   reasons such as
38b0: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   an application 
38c0: 6f 70 65 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  opening.        
38d0: 20 20 20 20 2f 2f 20 74 68 65 20 73 61 6d 65 20      // the same 
38e0: 64 61 74 61 62 61 73 65 20 69 6e 20 6d 75 6c 74  database in mult
38f0: 69 70 6c 65 20 70 72 6f 63 65 73 73 65 73 20 61  iple processes a
3900: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
3910: 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
3920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3930: 63 72 61 73 68 69 6e 67 20 63 6f 6e 74 65 6e 74  crashing content
3940: 20 70 72 6f 76 69 64 65 72 20 73 65 72 76 69 63   provider servic
3950: 65 20 74 68 61 74 20 74 68 65 20 41 63 74 69 76  e that the Activ
3960: 69 74 79 4d 61 6e 61 67 65 72 20 68 61 73 0a 20  ityManager has. 
3970: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65             // re
3980: 6d 6f 76 65 64 20 66 72 6f 6d 20 69 74 73 20 72  moved from its r
3990: 65 67 69 73 74 72 79 20 62 75 74 20 77 68 6f 73  egistry but whos
39a0: 65 20 70 72 6f 63 65 73 73 20 68 61 73 6e 27 74  e process hasn't
39b0: 20 71 75 69 74 65 20 64 69 65 64 20 79 65 74 0a   quite died yet.
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 62              // b
39d0: 79 20 74 68 65 20 74 69 6d 65 20 69 74 20 69 73  y the time it is
39e0: 20 72 65 73 74 61 72 74 65 64 20 69 6e 20 61 20   restarted in a 
39f0: 6e 65 77 20 70 72 6f 63 65 73 73 2e 0a 20 20 20  new process..   
3a00: 20 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20           //.    
3a10: 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 77 65          // If we
3a20: 20 64 6f 6e 27 74 20 63 68 61 6e 67 65 20 74 68   don't change th
3a30: 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  e journal mode, 
3a40: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 62  nothing really b
3a50: 61 64 20 68 61 70 70 65 6e 73 2e 0a 20 20 20 20  ad happens..    
3a60: 20 20 20 20 20 20 20 20 2f 2f 20 49 6e 20 74 68          // In th
3a70: 65 20 77 6f 72 73 74 20 63 61 73 65 2c 20 61 6e  e worst case, an
3a80: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 68 61   application tha
3a90: 74 20 65 6e 61 62 6c 65 73 20 57 41 4c 20 6d 69  t enables WAL mi
3aa0: 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
3ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3ac0: 67 65 74 20 69 74 2c 20 61 6c 74 68 6f 75 67 68  get it, although
3ad0: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 75 73   it can still us
3ae0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f  e connection poo
3af0: 6c 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 20 20  ling..          
3b00: 20 20 4c 6f 67 2e 77 28 54 41 47 2c 20 22 43 6f    Log.w(TAG, "Co
3b10: 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  uld not change t
3b20: 68 65 20 64 61 74 61 62 61 73 65 20 6a 6f 75 72  he database jour
3b30: 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 27 22 0a 20  nal mode of '". 
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 20 20 2b 20 6d 43 6f 6e 66 69 67 75 72 61 74     + mConfigurat
3b60: 69 6f 6e 2e 6c 61 62 65 6c 20 2b 20 22 27 20 66  ion.label + "' f
3b70: 72 6f 6d 20 27 22 20 2b 20 76 61 6c 75 65 20 2b  rom '" + value +
3b80: 20 22 27 20 74 6f 20 27 22 20 2b 20 6e 65 77 56   "' to '" + newV
3b90: 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  alue.           
3ba0: 20 20 20 20 20 20 20 20 20 2b 20 22 27 20 62 65           + "' be
3bb0: 63 61 75 73 65 20 74 68 65 20 64 61 74 61 62 61  cause the databa
3bc0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 54  se is locked.  T
3bd0: 68 69 73 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e  his usually mean
3be0: 73 20 74 68 61 74 20 22 0a 20 20 20 20 20 20 20  s that ".       
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22               + "
3c00: 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
3c10: 6f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  open connections
3c20: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
3c30: 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73 20   which prevents 
3c40: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
3c50: 20 20 20 20 20 20 2b 20 22 74 68 65 20 64 61 74        + "the dat
3c60: 61 62 61 73 65 20 66 72 6f 6d 20 65 6e 61 62 6c  abase from enabl
3c70: 69 6e 67 20 6f 72 20 64 69 73 61 62 6c 69 6e 67  ing or disabling
3c80: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
3c90: 67 69 6e 67 20 6d 6f 64 65 2e 20 20 22 0a 20 20  ging mode.  ".  
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 2b 20 22 50 72 6f 63 65 65 64 69 6e 67 20    + "Proceeding 
3cc0: 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
3cd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   the journal mod
3ce0: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e.");.        }.
3cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
3d00: 74 65 20 76 6f 69 64 20 73 65 74 4c 6f 63 61 6c  te void setLocal
3d10: 65 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69  eFromConfigurati
3d20: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 69  on() {.        i
3d30: 66 20 28 28 6d 43 6f 6e 66 69 67 75 72 61 74 69  f ((mConfigurati
3d40: 6f 6e 2e 6f 70 65 6e 46 6c 61 67 73 20 26 20 53  on.openFlags & S
3d50: 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e 4e 4f  QLiteDatabase.NO
3d60: 5f 4c 4f 43 41 4c 49 5a 45 44 5f 43 4f 4c 4c 41  _LOCALIZED_COLLA
3d70: 54 4f 52 53 29 20 21 3d 20 30 29 20 7b 0a 20 20  TORS) != 0) {.  
3d80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
3da0: 20 20 20 20 20 2f 2f 20 52 65 67 69 73 74 65 72       // Register
3db0: 20 74 68 65 20 6c 6f 63 61 6c 69 7a 65 64 20 63   the localized c
3dc0: 6f 6c 6c 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  ollators..      
3dd0: 20 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 20 6e    final String n
3de0: 65 77 4c 6f 63 61 6c 65 20 3d 20 6d 43 6f 6e 66  ewLocale = mConf
3df0: 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 63 61 6c 65  iguration.locale
3e00: 2e 74 6f 53 74 72 69 6e 67 28 29 3b 0a 20 20 20  .toString();.   
3e10: 20 20 20 20 20 6e 61 74 69 76 65 52 65 67 69 73       nativeRegis
3e20: 74 65 72 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c  terLocalizedColl
3e30: 61 74 6f 72 73 28 6d 43 6f 6e 6e 65 63 74 69 6f  ators(mConnectio
3e40: 6e 50 74 72 2c 20 6e 65 77 4c 6f 63 61 6c 65 29  nPtr, newLocale)
3e50: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66  ;..        // If
3e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
3e70: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 63   read-only, we c
3e80: 61 6e 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65  annot modify the
3e90: 20 61 6e 64 72 6f 69 64 20 6d 65 74 61 64 61 74   android metadat
3ea0: 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
3eb0: 2f 2f 20 6f 72 20 65 78 69 73 74 69 6e 67 20 69  // or existing i
3ec0: 6e 64 65 78 65 73 2e 0a 20 20 20 20 20 20 20 20  ndexes..        
3ed0: 69 66 20 28 6d 49 73 52 65 61 64 4f 6e 6c 79 43  if (mIsReadOnlyC
3ee0: 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20  onnection) {.   
3ef0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
3f00: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
3f10: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
3f20: 20 20 20 20 20 20 2f 2f 20 45 6e 73 75 72 65 20        // Ensure 
3f30: 74 68 65 20 61 6e 64 72 6f 69 64 20 6d 65 74 61  the android meta
3f40: 64 61 74 61 20 74 61 62 6c 65 20 65 78 69 73 74  data table exist
3f50: 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  s..            e
3f60: 78 65 63 75 74 65 28 22 43 52 45 41 54 45 20 54  xecute("CREATE T
3f70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
3f80: 54 53 20 61 6e 64 72 6f 69 64 5f 6d 65 74 61 64  TS android_metad
3f90: 61 74 61 20 28 6c 6f 63 61 6c 65 20 54 45 58 54  ata (locale TEXT
3fa0: 29 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  )", null, null);
3fb0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
3fc0: 20 43 68 65 63 6b 20 77 68 65 74 68 65 72 20 74   Check whether t
3fd0: 68 65 20 6c 6f 63 61 6c 65 20 77 61 73 20 61 63  he locale was ac
3fe0: 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 2e 0a  tually changed..
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
4000: 6c 20 53 74 72 69 6e 67 20 6f 6c 64 4c 6f 63 61  l String oldLoca
4010: 6c 65 20 3d 20 65 78 65 63 75 74 65 46 6f 72 53  le = executeForS
4020: 74 72 69 6e 67 28 22 53 45 4c 45 43 54 20 6c 6f  tring("SELECT lo
4030: 63 61 6c 65 20 46 52 4f 4d 20 61 6e 64 72 6f 69  cale FROM androi
4040: 64 5f 6d 65 74 61 64 61 74 61 20 22 0a 20 20 20  d_metadata ".   
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 2b 20 22 55 4e 49 4f 4e 20 53 45 4c 45 43 54   + "UNION SELECT
4070: 20 4e 55 4c 4c 20 4f 52 44 45 52 20 42 59 20 6c   NULL ORDER BY l
4080: 6f 63 61 6c 65 20 44 45 53 43 20 4c 49 4d 49 54  ocale DESC LIMIT
4090: 20 31 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29   1", null, null)
40a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
40b0: 20 28 6f 6c 64 4c 6f 63 61 6c 65 20 21 3d 20 6e   (oldLocale != n
40c0: 75 6c 6c 20 26 26 20 6f 6c 64 4c 6f 63 61 6c 65  ull && oldLocale
40d0: 2e 65 71 75 61 6c 73 28 6e 65 77 4c 6f 63 61 6c  .equals(newLocal
40e0: 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e)) {.          
40f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4100: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
4110: 20 20 20 20 20 20 20 20 20 2f 2f 20 47 6f 20 61           // Go a
4120: 68 65 61 64 20 61 6e 64 20 75 70 64 61 74 65 20  head and update 
4130: 74 68 65 20 69 6e 64 65 78 65 73 20 75 73 69 6e  the indexes usin
4140: 67 20 74 68 65 20 6e 65 77 20 6c 6f 63 61 6c 65  g the new locale
4150: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ..            ex
4160: 65 63 75 74 65 28 22 42 45 47 49 4e 22 2c 20 6e  ecute("BEGIN", n
4170: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
4180: 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20          boolean 
4190: 73 75 63 63 65 73 73 20 3d 20 66 61 6c 73 65 3b  success = false;
41a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
41b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
41c0: 20 20 20 65 78 65 63 75 74 65 28 22 44 45 4c 45     execute("DELE
41d0: 54 45 20 46 52 4f 4d 20 61 6e 64 72 6f 69 64 5f  TE FROM android_
41e0: 6d 65 74 61 64 61 74 61 22 2c 20 6e 75 6c 6c 2c  metadata", null,
41f0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
4200: 20 20 20 20 20 20 20 20 65 78 65 63 75 74 65 28          execute(
4210: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 6e 64  "INSERT INTO and
4220: 72 6f 69 64 5f 6d 65 74 61 64 61 74 61 20 28 6c  roid_metadata (l
4230: 6f 63 61 6c 65 29 20 56 41 4c 55 45 53 28 3f 29  ocale) VALUES(?)
4240: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4250: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 4f             new O
4260: 62 6a 65 63 74 5b 5d 20 7b 20 6e 65 77 4c 6f 63  bject[] { newLoc
4270: 61 6c 65 20 7d 2c 20 6e 75 6c 6c 29 3b 0a 20 20  ale }, null);.  
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
4290: 65 63 75 74 65 28 22 52 45 49 4e 44 45 58 20 4c  ecute("REINDEX L
42a0: 4f 43 41 4c 49 5a 45 44 22 2c 20 6e 75 6c 6c 2c  OCALIZED", null,
42b0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
42c0: 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 20          success 
42d0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
42e0: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a      } finally {.
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 65 78 65 63 75 74 65 28 73 75 63 63 65 73 73 20  execute(success 
4310: 3f 20 22 43 4f 4d 4d 49 54 22 20 3a 20 22 52 4f  ? "COMMIT" : "RO
4320: 4c 4c 42 41 43 4b 22 2c 20 6e 75 6c 6c 2c 20 6e  LLBACK", null, n
4330: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
4340: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 63 61    }.        } ca
4350: 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78 63 65  tch (RuntimeExce
4360: 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20 20  ption ex) {.    
4370: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
4380: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
4390: 6e 28 22 46 61 69 6c 65 64 20 74 6f 20 63 68 61  n("Failed to cha
43a0: 6e 67 65 20 6c 6f 63 61 6c 65 20 66 6f 72 20 64  nge locale for d
43b0: 62 20 27 22 20 2b 20 6d 43 6f 6e 66 69 67 75 72  b '" + mConfigur
43c0: 61 74 69 6f 6e 2e 6c 61 62 65 6c 0a 20 20 20 20  ation.label.    
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 2b 20 22 27 20 74 6f 20 27 22 20 2b 20 6e 65 77  + "' to '" + new
43f0: 4c 6f 63 61 6c 65 20 2b 20 22 27 2e 22 2c 20 65  Locale + "'.", e
4400: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
4410: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
4420: 76 6f 69 64 20 65 6e 61 62 6c 65 4c 6f 63 61 6c  void enableLocal
4430: 69 7a 65 64 43 6f 6c 6c 61 74 6f 72 73 28 29 7b  izedCollators(){
4440: 0a 20 20 20 20 20 20 69 66 28 20 6e 61 74 69 76  .      if( nativ
4450: 65 48 61 73 43 6f 64 65 63 28 29 20 29 7b 0a 09  eHasCodec() ){..
4460: 73 65 74 4c 6f 63 61 6c 65 46 72 6f 6d 43 6f 6e  setLocaleFromCon
4470: 66 69 67 75 72 61 74 69 6f 6e 28 29 3b 0a 20 20  figuration();.  
4480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
4490: 20 2f 2f 20 43 61 6c 6c 65 64 20 62 79 20 53 51   // Called by SQ
44a0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f  LiteConnectionPo
44b0: 6f 6c 20 6f 6e 6c 79 2e 0a 20 20 20 20 76 6f 69  ol only..    voi
44c0: 64 20 72 65 63 6f 6e 66 69 67 75 72 65 28 53 51  d reconfigure(SQ
44d0: 4c 69 74 65 44 61 74 61 62 61 73 65 43 6f 6e 66  LiteDatabaseConf
44e0: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67  iguration config
44f0: 75 72 61 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20  uration) {.     
4500: 20 20 20 6d 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61     mOnlyAllowRea
4510: 64 4f 6e 6c 79 4f 70 65 72 61 74 69 6f 6e 73 20  dOnlyOperations 
4520: 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20 20 20  = false;..      
4530: 20 20 2f 2f 20 52 65 67 69 73 74 65 72 20 63 75    // Register cu
4540: 73 74 6f 6d 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  stom functions..
4550: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e          final in
4560: 74 20 66 75 6e 63 74 69 6f 6e 43 6f 75 6e 74 20  t functionCount 
4570: 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  = configuration.
4580: 63 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e  customFunctions.
4590: 73 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20  size();.        
45a0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
45b0: 69 20 3c 20 66 75 6e 63 74 69 6f 6e 43 6f 75 6e  i < functionCoun
45c0: 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  t; i++) {.      
45d0: 20 20 20 20 20 20 53 51 4c 69 74 65 43 75 73 74        SQLiteCust
45e0: 6f 6d 46 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74  omFunction funct
45f0: 69 6f 6e 20 3d 20 63 6f 6e 66 69 67 75 72 61 74  ion = configurat
4600: 69 6f 6e 2e 63 75 73 74 6f 6d 46 75 6e 63 74 69  ion.customFuncti
4610: 6f 6e 73 2e 67 65 74 28 69 29 3b 0a 20 20 20 20  ons.get(i);.    
4620: 20 20 20 20 20 20 20 20 69 66 20 28 21 6d 43 6f          if (!mCo
4630: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 75 73 74  nfiguration.cust
4640: 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e 63 6f 6e 74  omFunctions.cont
4650: 61 69 6e 73 28 66 75 6e 63 74 69 6f 6e 29 29 20  ains(function)) 
4660: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4670: 20 20 6e 61 74 69 76 65 52 65 67 69 73 74 65 72    nativeRegister
4680: 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 28 6d  CustomFunction(m
4690: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 66  ConnectionPtr, f
46a0: 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
46b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
46c0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 52 65  }..        // Re
46d0: 6d 65 6d 62 65 72 20 77 68 61 74 20 63 68 61 6e  member what chan
46e0: 67 65 64 2e 0a 20 20 20 20 20 20 20 20 62 6f 6f  ged..        boo
46f0: 6c 65 61 6e 20 66 6f 72 65 69 67 6e 4b 65 79 4d  lean foreignKeyM
4700: 6f 64 65 43 68 61 6e 67 65 64 20 3d 20 63 6f 6e  odeChanged = con
4710: 66 69 67 75 72 61 74 69 6f 6e 2e 66 6f 72 65 69  figuration.forei
4720: 67 6e 4b 65 79 43 6f 6e 73 74 72 61 69 6e 74 73  gnKeyConstraints
4730: 45 6e 61 62 6c 65 64 0a 20 20 20 20 20 20 20 20  Enabled.        
4740: 20 20 20 20 20 20 20 20 21 3d 20 6d 43 6f 6e 66          != mConf
4750: 69 67 75 72 61 74 69 6f 6e 2e 66 6f 72 65 69 67  iguration.foreig
4760: 6e 4b 65 79 43 6f 6e 73 74 72 61 69 6e 74 73 45  nKeyConstraintsE
4770: 6e 61 62 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  nabled;.        
4780: 62 6f 6f 6c 65 61 6e 20 77 61 6c 4d 6f 64 65 43  boolean walModeC
4790: 68 61 6e 67 65 64 20 3d 20 28 28 63 6f 6e 66 69  hanged = ((confi
47a0: 67 75 72 61 74 69 6f 6e 2e 6f 70 65 6e 46 6c 61  guration.openFla
47b0: 67 73 20 5e 20 6d 43 6f 6e 66 69 67 75 72 61 74  gs ^ mConfigurat
47c0: 69 6f 6e 2e 6f 70 65 6e 46 6c 61 67 73 29 0a 20  ion.openFlags). 
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
47e0: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e   SQLiteDatabase.
47f0: 45 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41 48 45  ENABLE_WRITE_AHE
4800: 41 44 5f 4c 4f 47 47 49 4e 47 29 20 21 3d 20 30  AD_LOGGING) != 0
4810: 3b 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61  ;.        boolea
4820: 6e 20 6c 6f 63 61 6c 65 43 68 61 6e 67 65 64 20  n localeChanged 
4830: 3d 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  = !configuration
4840: 2e 6c 6f 63 61 6c 65 2e 65 71 75 61 6c 73 28 6d  .locale.equals(m
4850: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f  Configuration.lo
4860: 63 61 6c 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  cale);..        
4870: 2f 2f 20 55 70 64 61 74 65 20 63 6f 6e 66 69 67  // Update config
4880: 75 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  uration paramete
4890: 72 73 2e 0a 20 20 20 20 20 20 20 20 6d 43 6f 6e  rs..        mCon
48a0: 66 69 67 75 72 61 74 69 6f 6e 2e 75 70 64 61 74  figuration.updat
48b0: 65 50 61 72 61 6d 65 74 65 72 73 46 72 6f 6d 28  eParametersFrom(
48c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 3b 0a  configuration);.
48d0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 55 70 64 61  .        // Upda
48e0: 74 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  te prepared stat
48f0: 65 6d 65 6e 74 20 63 61 63 68 65 20 73 69 7a 65  ement cache size
4900: 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 71 6c  ..        // sql
4910: 69 74 65 2e 6f 72 67 3a 20 61 6e 64 72 6f 69 64  ite.org: android
4920: 2e 75 74 69 6c 2e 4c 72 75 43 61 63 68 65 2e 72  .util.LruCache.r
4930: 65 73 69 7a 65 28 29 20 72 65 71 75 69 72 65 73  esize() requires
4940: 20 41 50 49 20 6c 65 76 65 6c 20 32 31 2e 0a 20   API level 21.. 
4950: 20 20 20 20 20 20 20 2f 2f 20 6d 50 72 65 70 61         // mPrepa
4960: 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68  redStatementCach
4970: 65 2e 72 65 73 69 7a 65 28 63 6f 6e 66 69 67 75  e.resize(configu
4980: 72 61 74 69 6f 6e 2e 6d 61 78 53 71 6c 43 61 63  ration.maxSqlCac
4990: 68 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 20 20  heSize);..      
49a0: 20 20 2f 2f 20 55 70 64 61 74 65 20 66 6f 72 65    // Update fore
49b0: 69 67 6e 20 6b 65 79 20 6d 6f 64 65 2e 0a 20 20  ign key mode..  
49c0: 20 20 20 20 20 20 69 66 20 28 66 6f 72 65 69 67        if (foreig
49d0: 6e 4b 65 79 4d 6f 64 65 43 68 61 6e 67 65 64 29  nKeyModeChanged)
49e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
49f0: 65 74 46 6f 72 65 69 67 6e 4b 65 79 4d 6f 64 65  etForeignKeyMode
4a00: 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f  FromConfiguratio
4a10: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  n();.        }..
4a20: 20 20 20 20 20 20 20 20 2f 2f 20 55 70 64 61 74          // Updat
4a30: 65 20 57 41 4c 2e 0a 20 20 20 20 20 20 20 20 69  e WAL..        i
4a40: 66 20 28 77 61 6c 4d 6f 64 65 43 68 61 6e 67 65  f (walModeChange
4a50: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
4a60: 20 73 65 74 57 61 6c 4d 6f 64 65 46 72 6f 6d 43   setWalModeFromC
4a70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29 3b 0a  onfiguration();.
4a80: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
4a90: 20 20 20 2f 2f 20 55 70 64 61 74 65 20 6c 6f 63     // Update loc
4aa0: 61 6c 65 2e 0a 20 20 20 20 20 20 20 20 69 66 20  ale..        if 
4ab0: 28 6c 6f 63 61 6c 65 43 68 61 6e 67 65 64 29 20  (localeChanged) 
4ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
4ad0: 74 4c 6f 63 61 6c 65 46 72 6f 6d 43 6f 6e 66 69  tLocaleFromConfi
4ae0: 67 75 72 61 74 69 6f 6e 28 29 3b 0a 20 20 20 20  guration();.    
4af0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
4b00: 20 2f 2f 20 43 61 6c 6c 65 64 20 62 79 20 53 51   // Called by SQ
4b10: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f  LiteConnectionPo
4b20: 6f 6c 20 6f 6e 6c 79 2e 0a 20 20 20 20 2f 2f 20  ol only..    // 
4b30: 57 68 65 6e 20 73 65 74 20 74 6f 20 74 72 75 65  When set to true
4b40: 2c 20 65 78 65 63 75 74 69 6e 67 20 77 72 69 74  , executing writ
4b50: 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 6c  e operations wil
4b60: 6c 20 74 68 72 6f 77 20 53 51 4c 69 74 65 45 78  l throw SQLiteEx
4b70: 63 65 70 74 69 6f 6e 2e 0a 20 20 20 20 2f 2f 20  ception..    // 
4b80: 50 72 65 70 61 72 69 6e 67 20 73 74 61 74 65 6d  Preparing statem
4b90: 65 6e 74 73 20 74 68 61 74 20 6d 69 67 68 74 20  ents that might 
4ba0: 77 72 69 74 65 20 69 73 20 6f 6b 2c 20 6a 75 73  write is ok, jus
4bb0: 74 20 64 6f 6e 27 74 20 65 78 65 63 75 74 65 20  t don't execute 
4bc0: 74 68 65 6d 2e 0a 20 20 20 20 76 6f 69 64 20 73  them..    void s
4bd0: 65 74 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f  etOnlyAllowReadO
4be0: 6e 6c 79 4f 70 65 72 61 74 69 6f 6e 73 28 62 6f  nlyOperations(bo
4bf0: 6f 6c 65 61 6e 20 72 65 61 64 4f 6e 6c 79 29 20  olean readOnly) 
4c00: 7b 0a 20 20 20 20 20 20 20 20 6d 4f 6e 6c 79 41  {.        mOnlyA
4c10: 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70 65 72  llowReadOnlyOper
4c20: 61 74 69 6f 6e 73 20 3d 20 72 65 61 64 4f 6e 6c  ations = readOnl
4c30: 79 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f  y;.    }..    //
4c40: 20 43 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74   Called by SQLit
4c50: 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20  eConnectionPool 
4c60: 6f 6e 6c 79 2e 0a 20 20 20 20 2f 2f 20 52 65 74  only..    // Ret
4c70: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
4c80: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
4c90: 65 6e 74 20 63 61 63 68 65 20 63 6f 6e 74 61 69  ent cache contai
4ca0: 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ns the specified
4cb0: 20 53 51 4c 2e 0a 20 20 20 20 62 6f 6f 6c 65 61   SQL..    boolea
4cc0: 6e 20 69 73 50 72 65 70 61 72 65 64 53 74 61 74  n isPreparedStat
4cd0: 65 6d 65 6e 74 49 6e 43 61 63 68 65 28 53 74 72  ementInCache(Str
4ce0: 69 6e 67 20 73 71 6c 29 20 7b 0a 20 20 20 20 20  ing sql) {.     
4cf0: 20 20 20 72 65 74 75 72 6e 20 6d 50 72 65 70 61     return mPrepa
4d00: 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68  redStatementCach
4d10: 65 2e 67 65 74 28 73 71 6c 29 20 21 3d 20 6e 75  e.get(sql) != nu
4d20: 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ll;.    }..    /
4d30: 2a 2a 0a 20 20 20 20 20 2a 20 47 65 74 73 20 74  **.     * Gets t
4d40: 68 65 20 75 6e 69 71 75 65 20 69 64 20 6f 66 20  he unique id of 
4d50: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
4d60: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
4d70: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  The connection i
4d80: 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70  d..     */.    p
4d90: 75 62 6c 69 63 20 69 6e 74 20 67 65 74 43 6f 6e  ublic int getCon
4da0: 6e 65 63 74 69 6f 6e 49 64 28 29 20 7b 0a 20 20  nectionId() {.  
4db0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 43 6f        return mCo
4dc0: 6e 6e 65 63 74 69 6f 6e 49 64 3b 0a 20 20 20 20  nnectionId;.    
4dd0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
4de0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
4df0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 70 72  f this is the pr
4e00: 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 20 63  imary database c
4e10: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20  onnection..     
4e20: 2a 20 40 72 65 74 75 72 6e 20 54 72 75 65 20 69  * @return True i
4e30: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 70 72  f this is the pr
4e40: 69 6d 61 72 79 20 64 61 74 61 62 61 73 65 20 63  imary database c
4e50: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20  onnection..     
4e60: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 62 6f  */.    public bo
4e70: 6f 6c 65 61 6e 20 69 73 50 72 69 6d 61 72 79 43  olean isPrimaryC
4e80: 6f 6e 6e 65 63 74 69 6f 6e 28 29 20 7b 0a 20 20  onnection() {.  
4e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 49 73        return mIs
4ea0: 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f  PrimaryConnectio
4eb0: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  n;.    }..    /*
4ec0: 2a 0a 20 20 20 20 20 2a 20 50 72 65 70 61 72 65  *.     * Prepare
4ed0: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  s a statement fo
4ee0: 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
4ef0: 64 6f 65 73 20 6e 6f 74 20 62 69 6e 64 20 69 74  does not bind it
4f00: 73 20 70 61 72 61 6d 65 74 65 72 73 20 6f 72 20  s parameters or 
4f10: 65 78 65 63 75 74 65 20 69 74 2e 0a 20 20 20 20  execute it..    
4f20: 20 2a 20 3c 70 3e 0a 20 20 20 20 20 2a 20 54 68   * <p>.     * Th
4f30: 69 73 20 6d 65 74 68 6f 64 20 63 61 6e 20 62 65  is method can be
4f40: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 66   used to check f
4f50: 6f 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  or syntax errors
4f60: 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74   during compilat
4f70: 69 6f 6e 0a 20 20 20 20 20 2a 20 70 72 69 6f 72  ion.     * prior
4f80: 20 74 6f 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   to execution of
4f90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
4fa0: 20 49 66 20 74 68 65 20 7b 40 63 6f 64 65 20 6f   If the {@code o
4fb0: 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 7d  utStatementInfo}
4fc0: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 20 2a   argument.     *
4fd0: 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68   is not null, th
4fe0: 65 20 70 72 6f 76 69 64 65 64 20 7b 40 6c 69 6e  e provided {@lin
4ff0: 6b 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  k SQLiteStatemen
5000: 74 49 6e 66 6f 7d 20 6f 62 6a 65 63 74 20 69 73  tInfo} object is
5010: 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 20 20 20   populated.     
5020: 2a 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  * with informati
5030: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 73 74 61  on about the sta
5040: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 2a 20 3c  tement..     * <
5050: 2f 70 3e 3c 70 3e 0a 20 20 20 20 20 2a 20 41 20  /p><p>.     * A 
5060: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
5070: 6e 74 20 6d 61 6b 65 73 20 6e 6f 20 72 65 66 65  nt makes no refe
5080: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 61 72 67  rence to the arg
5090: 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 79 20  uments that may 
50a0: 65 76 65 6e 74 75 61 6c 6c 79 0a 20 20 20 20 20  eventually.     
50b0: 2a 20 62 65 20 62 6f 75 6e 64 20 74 6f 20 69 74  * be bound to it
50c0: 2c 20 63 6f 6e 73 65 71 75 65 6e 74 6c 79 20 69  , consequently i
50d0: 74 20 69 74 20 70 6f 73 73 69 62 6c 65 20 74 6f  t it possible to
50e0: 20 63 61 63 68 65 20 63 65 72 74 61 69 6e 20 70   cache certain p
50f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
5100: 74 73 0a 20 20 20 20 20 2a 20 73 75 63 68 20 61  ts.     * such a
5110: 73 20 53 45 4c 45 43 54 20 6f 72 20 49 4e 53 45  s SELECT or INSE
5120: 52 54 2f 55 50 44 41 54 45 20 73 74 61 74 65 6d  RT/UPDATE statem
5130: 65 6e 74 73 2e 20 20 49 66 20 74 68 65 20 73 74  ents.  If the st
5140: 61 74 65 6d 65 6e 74 20 69 73 20 63 61 63 68 65  atement is cache
5150: 61 62 6c 65 2c 0a 20 20 20 20 20 2a 20 74 68 65  able,.     * the
5160: 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 73 74 6f  n it will be sto
5170: 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
5180: 20 66 6f 72 20 6c 61 74 65 72 2e 0a 20 20 20 20   for later..    
5190: 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20 20 20   * </p><p>.     
51a0: 2a 20 54 6f 20 74 61 6b 65 20 61 64 76 61 6e 74  * To take advant
51b0: 61 67 65 20 6f 66 20 74 68 69 73 20 62 65 68 61  age of this beha
51c0: 76 69 6f 72 20 61 73 20 61 6e 20 6f 70 74 69 6d  vior as an optim
51d0: 69 7a 61 74 69 6f 6e 2c 20 74 68 65 20 63 6f 6e  ization, the con
51e0: 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c 0a 20 20 20  nection pool.   
51f0: 20 20 2a 20 70 72 6f 76 69 64 65 73 20 61 20 6d    * provides a m
5200: 65 74 68 6f 64 20 74 6f 20 61 63 71 75 69 72 65  ethod to acquire
5210: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68   a connection th
5220: 61 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  at already has a
5230: 20 67 69 76 65 6e 20 53 51 4c 20 73 74 61 74 65   given SQL state
5240: 6d 65 6e 74 0a 20 20 20 20 20 2a 20 69 6e 20 69  ment.     * in i
5250: 74 73 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ts prepared stat
5260: 65 6d 65 6e 74 20 63 61 63 68 65 20 73 6f 20 74  ement cache so t
5270: 68 61 74 20 69 74 20 69 73 20 72 65 61 64 79 20  hat it is ready 
5280: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 20  for execution.. 
5290: 20 20 20 20 2a 20 3c 2f 70 3e 0a 20 20 20 20 20      * </p>.     
52a0: 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  *.     * @param 
52b0: 73 71 6c 20 54 68 65 20 53 51 4c 20 73 74 61 74  sql The SQL stat
52c0: 65 6d 65 6e 74 20 74 6f 20 70 72 65 70 61 72 65  ement to prepare
52d0: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
52e0: 6f 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f  outStatementInfo
52f0: 20 54 68 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69   The {@link SQLi
5300: 74 65 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 7d  teStatementInfo}
5310: 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   object to popul
5320: 61 74 65 0a 20 20 20 20 20 2a 20 77 69 74 68 20  ate.     * with 
5330: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5340: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  t the statement,
5350: 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65   or null if none
5360: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
5370: 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45 78  @throws SQLiteEx
5380: 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65 72  ception if an er
5390: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63 68  ror occurs, such
53a0: 20 61 73 20 61 20 73 79 6e 74 61 78 20 65 72 72   as a syntax err
53b0: 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  or..     */.    
53c0: 70 75 62 6c 69 63 20 76 6f 69 64 20 70 72 65 70  public void prep
53d0: 61 72 65 28 53 74 72 69 6e 67 20 73 71 6c 2c 20  are(String sql, 
53e0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 49  SQLiteStatementI
53f0: 6e 66 6f 20 6f 75 74 53 74 61 74 65 6d 65 6e 74  nfo outStatement
5400: 49 6e 66 6f 29 20 7b 0a 20 20 20 20 20 20 20 20  Info) {.        
5410: 69 66 20 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29  if (sql == null)
5420: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
5430: 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c  hrow new Illegal
5440: 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f  ArgumentExceptio
5450: 6e 28 22 73 71 6c 20 6d 75 73 74 20 6e 6f 74 20  n("sql must not 
5460: 62 65 20 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20  be null.");.    
5470: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
5480: 69 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20  inal int cookie 
5490: 3d 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69  = mRecentOperati
54a0: 6f 6e 73 2e 62 65 67 69 6e 4f 70 65 72 61 74 69  ons.beginOperati
54b0: 6f 6e 28 22 70 72 65 70 61 72 65 22 2c 20 73 71  on("prepare", sq
54c0: 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  l, null);.      
54d0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
54e0: 20 20 20 20 66 69 6e 61 6c 20 50 72 65 70 61 72      final Prepar
54f0: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
5500: 65 6d 65 6e 74 20 3d 20 61 63 71 75 69 72 65 50  ement = acquireP
5510: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
5520: 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  (sql);.         
5530: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
5540: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 75 74           if (out
5550: 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 20 21 3d  StatementInfo !=
5560: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74               out
5580: 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 2e 6e 75  StatementInfo.nu
5590: 6d 50 61 72 61 6d 65 74 65 72 73 20 3d 20 73 74  mParameters = st
55a0: 61 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72 61  atement.mNumPara
55b0: 6d 65 74 65 72 73 3b 0a 20 20 20 20 20 20 20 20  meters;.        
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 53              outS
55d0: 74 61 74 65 6d 65 6e 74 49 6e 66 6f 2e 72 65 61  tatementInfo.rea
55e0: 64 4f 6e 6c 79 20 3d 20 73 74 61 74 65 6d 65 6e  dOnly = statemen
55f0: 74 2e 6d 52 65 61 64 4f 6e 6c 79 3b 0a 0a 20 20  t.mReadOnly;..  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6c 75    final int colu
5620: 6d 6e 43 6f 75 6e 74 20 3d 20 6e 61 74 69 76 65  mnCount = native
5630: 47 65 74 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 0a  GetColumnCount(.
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6e              mCon
5660: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74  nectionPtr, stat
5670: 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74  ement.mStatement
5680: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ptr);.          
5690: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f            if (co
56a0: 6c 75 6d 6e 43 6f 75 6e 74 20 3d 3d 20 30 29 20  lumnCount == 0) 
56b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
56c0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 53 74 61            outSta
56d0: 74 65 6d 65 6e 74 49 6e 66 6f 2e 63 6f 6c 75 6d  tementInfo.colum
56e0: 6e 4e 61 6d 65 73 20 3d 20 45 4d 50 54 59 5f 53  nNames = EMPTY_S
56f0: 54 52 49 4e 47 5f 41 52 52 41 59 3b 0a 20 20 20  TRING_ARRAY;.   
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 6f 75 74 53 74 61 74 65 6d 65 6e 74 49 6e    outStatementIn
5740: 66 6f 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 73 20 3d  fo.columnNames =
5750: 20 6e 65 77 20 53 74 72 69 6e 67 5b 63 6f 6c 75   new String[colu
5760: 6d 6e 43 6f 75 6e 74 5d 3b 0a 20 20 20 20 20 20  mnCount];.      
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
5790: 3b 20 69 20 3c 20 63 6f 6c 75 6d 6e 43 6f 75 6e  ; i < columnCoun
57a0: 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  t; i++) {.      
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57c0: 20 20 20 20 20 20 6f 75 74 53 74 61 74 65 6d 65        outStateme
57d0: 6e 74 49 6e 66 6f 2e 63 6f 6c 75 6d 6e 4e 61 6d  ntInfo.columnNam
57e0: 65 73 5b 69 5d 20 3d 20 6e 61 74 69 76 65 47 65  es[i] = nativeGe
57f0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 0a 20 20 20  tColumnName(.   
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c   mConnectionPtr,
5830: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74   statement.mStat
5840: 65 6d 65 6e 74 50 74 72 2c 20 69 29 3b 0a 20 20  ementPtr, i);.  
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5890: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69              } fi
58a0: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
58b0: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
58c0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
58d0: 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  (statement);.   
58e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
58f0: 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74     } catch (Runt
5900: 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29  imeException ex)
5910: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
5920: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
5930: 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63  .failOperation(c
5940: 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20  ookie, ex);.    
5950: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65 78          throw ex
5960: 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61  ;.        } fina
5970: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
5980: 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69    mRecentOperati
5990: 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e  ons.endOperation
59a0: 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20  (cookie);.      
59b0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
59c0: 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74  **.     * Execut
59d0: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  es a statement t
59e0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 74  hat does not ret
59f0: 75 72 6e 20 61 20 72 65 73 75 6c 74 2e 0a 20 20  urn a result..  
5a00: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
5a10: 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c 20 73  am sql The SQL s
5a20: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
5a30: 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ute..     * @par
5a40: 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68 65 20  am bindArgs The 
5a50: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e  arguments to bin
5a60: 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  d, or null if no
5a70: 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ne..     * @para
5a80: 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  m cancellationSi
5a90: 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20 74 6f  gnal A signal to
5aa0: 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70 65 72   cancel the oper
5ab0: 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ation in progres
5ac0: 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  s, or null if no
5ad0: 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ne..     *.     
5ae0: 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65  * @throws SQLite
5af0: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20  Exception if an 
5b00: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75  error occurs, su
5b10: 63 68 20 61 73 20 61 20 73 79 6e 74 61 78 20 65  ch as a syntax e
5b20: 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20 69  rror.     * or i
5b30: 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66  nvalid number of
5b40: 20 62 69 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e   bind arguments.
5b50: 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20  .     * @throws 
5b60: 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65  OperationCancele
5b70: 64 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68  dException if th
5b80: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20  e operation was 
5b90: 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a  canceled..     *
5ba0: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69  /.    public voi
5bb0: 64 20 65 78 65 63 75 74 65 28 53 74 72 69 6e 67  d execute(String
5bc0: 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20 62   sql, Object[] b
5bd0: 69 6e 64 41 72 67 73 2c 0a 20 20 20 20 20 20 20  indArgs,.       
5be0: 20 20 20 20 20 43 61 6e 63 65 6c 6c 61 74 69 6f       Cancellatio
5bf0: 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61  nSignal cancella
5c00: 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20  tionSignal) {.  
5c10: 20 20 20 20 20 20 69 66 20 28 73 71 6c 20 3d 3d        if (sql ==
5c20: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
5c30: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49       throw new I
5c40: 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45 78  llegalArgumentEx
5c50: 63 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d 75 73  ception("sql mus
5c60: 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e 22 29  t not be null.")
5c70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
5c80: 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 63       final int c
5c90: 6f 6f 6b 69 65 20 3d 20 6d 52 65 63 65 6e 74 4f  ookie = mRecentO
5ca0: 70 65 72 61 74 69 6f 6e 73 2e 62 65 67 69 6e 4f  perations.beginO
5cb0: 70 65 72 61 74 69 6f 6e 28 22 65 78 65 63 75 74  peration("execut
5cc0: 65 22 2c 20 73 71 6c 2c 20 62 69 6e 64 41 72 67  e", sql, bindArg
5cd0: 73 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20  s);.        try 
5ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  {.            fi
5cf0: 6e 61 6c 20 50 72 65 70 61 72 65 64 53 74 61 74  nal PreparedStat
5d00: 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  ement statement 
5d10: 3d 20 61 63 71 75 69 72 65 50 72 65 70 61 72 65  = acquirePrepare
5d20: 64 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b  dStatement(sql);
5d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
5d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5d50: 20 20 20 74 68 72 6f 77 49 66 53 74 61 74 65 6d     throwIfStatem
5d60: 65 6e 74 46 6f 72 62 69 64 64 65 6e 28 73 74 61  entForbidden(sta
5d70: 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  tement);.       
5d80: 20 20 20 20 20 20 20 20 20 62 69 6e 64 41 72 67           bindArg
5d90: 75 6d 65 6e 74 73 28 73 74 61 74 65 6d 65 6e 74  uments(statement
5da0: 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20  , bindArgs);.   
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
5dc0: 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f 6c 69  lyBlockGuardPoli
5dd0: 63 79 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  cy(statement);. 
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5df0: 74 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f  ttachCancellatio
5e00: 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61  nSignal(cancella
5e10: 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20  tionSignal);.   
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
5e30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5e40: 20 20 20 20 20 20 20 6e 61 74 69 76 65 45 78 65         nativeExe
5e50: 63 75 74 65 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e  cute(mConnection
5e60: 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d  Ptr, statement.m
5e70: 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20  StatementPtr);. 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5e90: 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20   finally {.     
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5eb0: 65 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f  etachCancellatio
5ec0: 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61  nSignal(cancella
5ed0: 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20  tionSignal);.   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5ef0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e             } fin
5f00: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
5f10: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 72         releasePr
5f20: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28  eparedStatement(
5f30: 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
5f40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5f50: 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69    } catch (Runti
5f60: 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20  meException ex) 
5f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52  {.            mR
5f80: 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e  ecentOperations.
5f90: 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f  failOperation(co
5fa0: 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20 20  okie, ex);.     
5fb0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b         throw ex;
5fc0: 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  .        } final
5fd0: 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ly {.           
5fe0: 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f   mRecentOperatio
5ff0: 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28  ns.endOperation(
6000: 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20  cookie);.       
6010: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
6020: 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74 65  *.     * Execute
6030: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68  s a statement th
6040: 61 74 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e  at returns a sin
6050: 67 6c 65 20 3c 63 6f 64 65 3e 6c 6f 6e 67 3c 2f  gle <code>long</
6060: 63 6f 64 65 3e 20 72 65 73 75 6c 74 2e 0a 20 20  code> result..  
6070: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
6080: 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c 20 73  am sql The SQL s
6090: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
60a0: 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ute..     * @par
60b0: 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68 65 20  am bindArgs The 
60c0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e  arguments to bin
60d0: 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  d, or null if no
60e0: 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ne..     * @para
60f0: 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  m cancellationSi
6100: 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20 74 6f  gnal A signal to
6110: 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70 65 72   cancel the oper
6120: 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ation in progres
6130: 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  s, or null if no
6140: 6e 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75  ne..     * @retu
6150: 72 6e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  rn The value of 
6160: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
6170: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 72 6f   in the first ro
6180: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  w of the result 
6190: 73 65 74 0a 20 20 20 20 20 2a 20 61 73 20 61 20  set.     * as a 
61a0: 3c 63 6f 64 65 3e 6c 6f 6e 67 3c 2f 63 6f 64 65  <code>long</code
61b0: 3e 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  >, or zero if no
61c0: 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ne..     *.     
61d0: 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65  * @throws SQLite
61e0: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20  Exception if an 
61f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75  error occurs, su
6200: 63 68 20 61 73 20 61 20 73 79 6e 74 61 78 20 65  ch as a syntax e
6210: 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20 69  rror.     * or i
6220: 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66  nvalid number of
6230: 20 62 69 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e   bind arguments.
6240: 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20  .     * @throws 
6250: 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65  OperationCancele
6260: 64 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68  dException if th
6270: 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20  e operation was 
6280: 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a  canceled..     *
6290: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 6c 6f 6e  /.    public lon
62a0: 67 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67  g executeForLong
62b0: 28 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a  (String sql, Obj
62c0: 65 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a  ect[] bindArgs,.
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 43 61 6e 63              Canc
62e0: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63  ellationSignal c
62f0: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
6300: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  l) {.        if 
6310: 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  (sql == null) {.
6320: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
6330: 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67  w new IllegalArg
6340: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22  umentException("
6350: 73 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  sql must not be 
6360: 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  null.");.       
6370: 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61   }..        fina
6380: 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d  l int cookie = m
6390: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
63a0: 2e 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28  .beginOperation(
63b0: 22 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 22  "executeForLong"
63c0: 2c 20 73 71 6c 2c 20 62 69 6e 64 41 72 67 73 29  , sql, bindArgs)
63d0: 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a  ;.        try {.
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
63f0: 6c 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  l PreparedStatem
6400: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d 20  ent statement = 
6410: 61 63 71 75 69 72 65 50 72 65 70 61 72 65 64 53  acquirePreparedS
6420: 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20  tatement(sql);. 
6430: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b             try {
6440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6450: 20 74 68 72 6f 77 49 66 53 74 61 74 65 6d 65 6e   throwIfStatemen
6460: 74 46 6f 72 62 69 64 64 65 6e 28 73 74 61 74 65  tForbidden(state
6470: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
6480: 20 20 20 20 20 20 20 62 69 6e 64 41 72 67 75 6d         bindArgum
6490: 65 6e 74 73 28 73 74 61 74 65 6d 65 6e 74 2c 20  ents(statement, 
64a0: 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20  bindArgs);.     
64b0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 6c 79             apply
64c0: 42 6c 6f 63 6b 47 75 61 72 64 50 6f 6c 69 63 79  BlockGuardPolicy
64d0: 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  (statement);.   
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74               att
64f0: 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  achCancellationS
6500: 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69  ignal(cancellati
6510: 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20  onSignal);.     
6520: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b             try {
6530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6540: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 61 74 69       return nati
6550: 76 65 45 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67  veExecuteForLong
6560: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
6570: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74   statement.mStat
6580: 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20  ementPtr);.     
6590: 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e             } fin
65a0: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
65b0: 20 20 20 20 20 20 20 20 20 20 20 64 65 74 61 63             detac
65c0: 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  hCancellationSig
65d0: 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  nal(cancellation
65e0: 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  Signal);.       
65f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6600: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
6610: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6620: 20 20 20 72 65 6c 65 61 73 65 50 72 65 70 61 72     releasePrepar
6630: 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74  edStatement(stat
6640: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ement);.        
6650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
6660: 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78  catch (RuntimeEx
6670: 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
6680: 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e            mRecen
6690: 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69 6c  tOperations.fail
66a0: 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65  Operation(cookie
66b0: 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  , ex);.         
66c0: 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20     throw ex;.   
66d0: 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
66e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65  .            mRe
66f0: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65  centOperations.e
6700: 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b  ndOperation(cook
6710: 69 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ie);.        }. 
6720: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
6730: 20 20 20 2a 20 45 78 65 63 75 74 65 73 20 61 20     * Executes a 
6740: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72  statement that r
6750: 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20  eturns a single 
6760: 7b 40 6c 69 6e 6b 20 53 74 72 69 6e 67 7d 20 72  {@link String} r
6770: 65 73 75 6c 74 2e 0a 20 20 20 20 20 2a 0a 20 20  esult..     *.  
6780: 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20     * @param sql 
6790: 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  The SQL statemen
67a0: 74 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20 20  t to execute..  
67b0: 20 20 20 2a 20 40 70 61 72 61 6d 20 62 69 6e 64     * @param bind
67c0: 41 72 67 73 20 54 68 65 20 61 72 67 75 6d 65 6e  Args The argumen
67d0: 74 73 20 74 6f 20 62 69 6e 64 2c 20 6f 72 20 6e  ts to bind, or n
67e0: 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20  ull if none..   
67f0: 20 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63 65    * @param cance
6800: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20  llationSignal A 
6810: 73 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c  signal to cancel
6820: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
6830: 6e 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e  n progress, or n
6840: 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20  ull if none..   
6850: 20 20 2a 20 40 72 65 74 75 72 6e 20 54 68 65 20    * @return The 
6860: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 72  value of the fir
6870: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  st column in the
6880: 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 74 68   first row of th
6890: 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20  e result set.   
68a0: 20 20 2a 20 61 73 20 61 20 3c 63 6f 64 65 3e 53    * as a <code>S
68b0: 74 72 69 6e 67 3c 2f 63 6f 64 65 3e 2c 20 6f 72  tring</code>, or
68c0: 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20   null if none.. 
68d0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 74 68      *.     * @th
68e0: 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63 65 70  rows SQLiteExcep
68f0: 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  tion if an error
6900: 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20 61 73   occurs, such as
6910: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 0a   a syntax error.
6920: 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61 6c 69       * or invali
6930: 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64  d number of bind
6940: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20   arguments..    
6950: 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65 72 61   * @throws Opera
6960: 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63 65  tionCanceledExce
6970: 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f 70 65  ption if the ope
6980: 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e 63 65  ration was cance
6990: 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  led..     */.   
69a0: 20 70 75 62 6c 69 63 20 53 74 72 69 6e 67 20 65   public String e
69b0: 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67 28  xecuteForString(
69c0: 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65  String sql, Obje
69d0: 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20  ct[] bindArgs,. 
69e0: 20 20 20 20 20 20 20 20 20 20 20 43 61 6e 63 65             Cance
69f0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61  llationSignal ca
6a00: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
6a10: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
6a20: 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  sql == null) {. 
6a30: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
6a40: 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75   new IllegalArgu
6a50: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 73  mentException("s
6a60: 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ql must not be n
6a70: 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ull.");.        
6a80: 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  }..        final
6a90: 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52   int cookie = mR
6aa0: 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e  ecentOperations.
6ab0: 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22  beginOperation("
6ac0: 65 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67  executeForString
6ad0: 22 2c 20 73 71 6c 2c 20 62 69 6e 64 41 72 67 73  ", sql, bindArgs
6ae0: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  );.        try {
6af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e  .            fin
6b00: 61 6c 20 50 72 65 70 61 72 65 64 53 74 61 74 65  al PreparedState
6b10: 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d  ment statement =
6b20: 20 61 63 71 75 69 72 65 50 72 65 70 61 72 65 64   acquirePrepared
6b30: 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a  Statement(sql);.
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
6b50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6b60: 20 20 74 68 72 6f 77 49 66 53 74 61 74 65 6d 65    throwIfStateme
6b70: 6e 74 46 6f 72 62 69 64 64 65 6e 28 73 74 61 74  ntForbidden(stat
6b80: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ement);.        
6b90: 20 20 20 20 20 20 20 20 62 69 6e 64 41 72 67 75          bindArgu
6ba0: 6d 65 6e 74 73 28 73 74 61 74 65 6d 65 6e 74 2c  ments(statement,
6bb0: 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20   bindArgs);.    
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 6c              appl
6bd0: 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f 6c 69 63  yBlockGuardPolic
6be0: 79 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  y(statement);.  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
6c00: 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  tachCancellation
6c10: 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74  Signal(cancellat
6c20: 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20  ionSignal);.    
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
6c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 61 74        return nat
6c60: 69 76 65 45 78 65 63 75 74 65 46 6f 72 53 74 72  iveExecuteForStr
6c70: 69 6e 67 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50  ing(mConnectionP
6c80: 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53  tr, statement.mS
6c90: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20  tatementPtr);.  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
6cb0: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
6cd0: 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  tachCancellation
6ce0: 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74  Signal(cancellat
6cf0: 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20  ionSignal);.    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6d10: 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61            } fina
6d20: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
6d30: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 72 65        releasePre
6d40: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73  paredStatement(s
6d50: 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
6d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6d70: 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d   } catch (Runtim
6d80: 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b  eException ex) {
6d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65  .            mRe
6da0: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66  centOperations.f
6db0: 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f  ailOperation(coo
6dc0: 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20  kie, ex);.      
6dd0: 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a        throw ex;.
6de0: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
6df0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
6e00: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
6e10: 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63  s.endOperation(c
6e20: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20  ookie);.        
6e30: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
6e40: 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 73  .     * Executes
6e50: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61   a statement tha
6e60: 74 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67  t returns a sing
6e70: 6c 65 20 42 4c 4f 42 20 72 65 73 75 6c 74 20 61  le BLOB result a
6e80: 73 20 61 0a 20 20 20 20 20 2a 20 66 69 6c 65 20  s a.     * file 
6e90: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 61 20  descriptor to a 
6ea0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 72 65  shared memory re
6eb0: 67 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20  gion..     *.   
6ec0: 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20 54    * @param sql T
6ed0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6ee0: 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20 20 20   to execute..   
6ef0: 20 20 2a 20 40 70 61 72 61 6d 20 62 69 6e 64 41    * @param bindA
6f00: 72 67 73 20 54 68 65 20 61 72 67 75 6d 65 6e 74  rgs The argument
6f10: 73 20 74 6f 20 62 69 6e 64 2c 20 6f 72 20 6e 75  s to bind, or nu
6f20: 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20  ll if none..    
6f30: 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63 65 6c   * @param cancel
6f40: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73  lationSignal A s
6f50: 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20  ignal to cancel 
6f60: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  the operation in
6f70: 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75   progress, or nu
6f80: 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20  ll if none..    
6f90: 20 2a 20 40 72 65 74 75 72 6e 20 54 68 65 20 66   * @return The f
6fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
6fb0: 6f 72 20 61 20 73 68 61 72 65 64 20 6d 65 6d 6f  or a shared memo
6fc0: 72 79 20 72 65 67 69 6f 6e 20 74 68 61 74 20 63  ry region that c
6fd0: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 2a 20 74  ontains.     * t
6fe0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
6ff0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 20  first column in 
7000: 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66  the first row of
7010: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7020: 61 73 20 61 20 42 4c 4f 42 2c 0a 20 20 20 20 20  as a BLOB,.     
7030: 2a 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e  * or null if non
7040: 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  e..     *.     *
7050: 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45   @throws SQLiteE
7060: 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65  xception if an e
7070: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63  rror occurs, suc
7080: 68 20 61 73 20 61 20 73 79 6e 74 61 78 20 65 72  h as a syntax er
7090: 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e  ror.     * or in
70a0: 76 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20  valid number of 
70b0: 62 69 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a  bind arguments..
70c0: 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f       * @throws O
70d0: 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64  perationCanceled
70e0: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  Exception if the
70f0: 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63   operation was c
7100: 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f  anceled..     */
7110: 0a 20 20 20 20 70 75 62 6c 69 63 20 50 61 72 63  .    public Parc
7120: 65 6c 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72  elFileDescriptor
7130: 20 65 78 65 63 75 74 65 46 6f 72 42 6c 6f 62 46   executeForBlobF
7140: 69 6c 65 44 65 73 63 72 69 70 74 6f 72 28 53 74  ileDescriptor(St
7150: 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74  ring sql, Object
7160: 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20 20 20  [] bindArgs,.   
7170: 20 20 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c           Cancell
7180: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63  ationSignal canc
7190: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20  ellationSignal) 
71a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71  {.        if (sq
71b0: 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  l == null) {.   
71c0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
71d0: 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65  ew IllegalArgume
71e0: 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c  ntException("sql
71f0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c   must not be nul
7200: 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  l.");.        }.
7210: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69  .        final i
7220: 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63  nt cookie = mRec
7230: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65  entOperations.be
7240: 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22 65 78  ginOperation("ex
7250: 65 63 75 74 65 46 6f 72 42 6c 6f 62 46 69 6c 65  ecuteForBlobFile
7260: 44 65 73 63 72 69 70 74 6f 72 22 2c 0a 20 20 20  Descriptor",.   
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7280: 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20  , bindArgs);.   
7290: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
72a0: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 50 72 65         final Pre
72b0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20 73  paredStatement s
72c0: 74 61 74 65 6d 65 6e 74 20 3d 20 61 63 71 75 69  tatement = acqui
72d0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
72e0: 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20 20 20  ent(sql);.      
72f0: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
7300: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
7310: 77 49 66 53 74 61 74 65 6d 65 6e 74 46 6f 72 62  wIfStatementForb
7320: 69 64 64 65 6e 28 73 74 61 74 65 6d 65 6e 74 29  idden(statement)
7330: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7340: 20 20 62 69 6e 64 41 72 67 75 6d 65 6e 74 73 28    bindArguments(
7350: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 41  statement, bindA
7360: 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rgs);.          
7370: 20 20 20 20 20 20 61 70 70 6c 79 42 6c 6f 63 6b        applyBlock
7380: 47 75 61 72 64 50 6f 6c 69 63 79 28 73 74 61 74  GuardPolicy(stat
7390: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ement);.        
73a0: 20 20 20 20 20 20 20 20 61 74 74 61 63 68 43 61          attachCa
73b0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
73c0: 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  (cancellationSig
73d0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
73e0: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 69 6e 74 20 66 64 20 3d 20 6e 61 74 69 76 65 45  int fd = nativeE
7410: 78 65 63 75 74 65 46 6f 72 42 6c 6f 62 46 69 6c  xecuteForBlobFil
7420: 65 44 65 73 63 72 69 70 74 6f 72 28 0a 20 20 20  eDescriptor(.   
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63           mConnec
7450: 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65  tionPtr, stateme
7460: 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72  nt.mStatementPtr
7470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7480: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 64         return fd
7490: 20 3e 3d 20 30 20 3f 20 50 61 72 63 65 6c 46 69   >= 0 ? ParcelFi
74a0: 6c 65 44 65 73 63 72 69 70 74 6f 72 2e 61 64 6f  leDescriptor.ado
74b0: 70 74 46 64 28 66 64 29 20 3a 20 6e 75 6c 6c 3b  ptFd(fd) : null;
74c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74d0: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 64 65 74 61 63 68 43 61 6e 63 65 6c 6c 61 74   detachCancellat
7500: 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c  ionSignal(cancel
7510: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20  lationSignal);. 
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66  .            } f
7540: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
7550: 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
7560: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7570: 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  t(statement);.  
7580: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7590: 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e      } catch (Run
75a0: 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78  timeException ex
75b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
75c0: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
75d0: 73 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28  s.failOperation(
75e0: 63 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20  cookie, ex);.   
75f0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65           throw e
7600: 78 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  x;.        } fin
7610: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
7620: 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74     mRecentOperat
7630: 69 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f  ions.endOperatio
7640: 6e 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20  n(cookie);.     
7650: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
7660: 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75  /**.     * Execu
7670: 74 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  tes a statement 
7680: 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 63  that returns a c
7690: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
76a0: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
76b0: 2a 20 74 68 61 74 20 77 65 72 65 20 63 68 61 6e  * that were chan
76c0: 67 65 64 2e 20 20 55 73 65 20 66 6f 72 20 55 50  ged.  Use for UP
76d0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 53  DATE or DELETE S
76e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  QL statements.. 
76f0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
7700: 72 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c 20  ram sql The SQL 
7710: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  statement to exe
7720: 63 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70 61  cute..     * @pa
7730: 72 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68 65  ram bindArgs The
7740: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 69   arguments to bi
7750: 6e 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e  nd, or null if n
7760: 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  one..     * @par
7770: 61 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  am cancellationS
7780: 69 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20 74  ignal A signal t
7790: 6f 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70 65  o cancel the ope
77a0: 72 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  ration in progre
77b0: 73 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e  ss, or null if n
77c0: 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74  one..     * @ret
77d0: 75 72 6e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  urn The number o
77e0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
77f0: 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a   changed..     *
7800: 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20  .     * @throws 
7810: 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20  SQLiteException 
7820: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
7830: 72 73 2c 20 73 75 63 68 20 61 73 20 61 20 73 79  rs, such as a sy
7840: 6e 74 61 78 20 65 72 72 6f 72 0a 20 20 20 20 20  ntax error.     
7850: 2a 20 6f 72 20 69 6e 76 61 6c 69 64 20 6e 75 6d  * or invalid num
7860: 62 65 72 20 6f 66 20 62 69 6e 64 20 61 72 67 75  ber of bind argu
7870: 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 20 40 74  ments..     * @t
7880: 68 72 6f 77 73 20 4f 70 65 72 61 74 69 6f 6e 43  hrows OperationC
7890: 61 6e 63 65 6c 65 64 45 78 63 65 70 74 69 6f 6e  anceledException
78a0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   if the operatio
78b0: 6e 20 77 61 73 20 63 61 6e 63 65 6c 65 64 2e 0a  n was canceled..
78c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
78d0: 69 63 20 69 6e 74 20 65 78 65 63 75 74 65 46 6f  ic int executeFo
78e0: 72 43 68 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74  rChangedRowCount
78f0: 28 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a  (String sql, Obj
7900: 65 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a  ect[] bindArgs,.
7910: 20 20 20 20 20 20 20 20 20 20 20 20 43 61 6e 63              Canc
7920: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63  ellationSignal c
7930: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
7940: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  l) {.        if 
7950: 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  (sql == null) {.
7960: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
7970: 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67  w new IllegalArg
7980: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22  umentException("
7990: 73 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  sql must not be 
79a0: 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  null.");.       
79b0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 6e 74 20   }..        int 
79c0: 63 68 61 6e 67 65 64 52 6f 77 73 20 3d 20 30 3b  changedRows = 0;
79d0: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69  .        final i
79e0: 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63  nt cookie = mRec
79f0: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65  entOperations.be
7a00: 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22 65 78  ginOperation("ex
7a10: 65 63 75 74 65 46 6f 72 43 68 61 6e 67 65 64 52  ecuteForChangedR
7a20: 6f 77 43 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  owCount",.      
7a30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 2c 20 62            sql, b
7a40: 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20  indArgs);.      
7a50: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
7a60: 20 20 20 20 66 69 6e 61 6c 20 50 72 65 70 61 72      final Prepar
7a70: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
7a80: 65 6d 65 6e 74 20 3d 20 61 63 71 75 69 72 65 50  ement = acquireP
7a90: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
7aa0: 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  (sql);.         
7ab0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
7ac0: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 49 66           throwIf
7ad0: 53 74 61 74 65 6d 65 6e 74 46 6f 72 62 69 64 64  StatementForbidd
7ae0: 65 6e 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  en(statement);. 
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7b00: 69 6e 64 41 72 67 75 6d 65 6e 74 73 28 73 74 61  indArguments(sta
7b10: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 41 72 67 73  tement, bindArgs
7b20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7b30: 20 20 20 61 70 70 6c 79 42 6c 6f 63 6b 47 75 61     applyBlockGua
7b40: 72 64 50 6f 6c 69 63 79 28 73 74 61 74 65 6d 65  rdPolicy(stateme
7b50: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
7b60: 20 20 20 20 20 61 74 74 61 63 68 43 61 6e 63 65       attachCance
7b70: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61  llationSignal(ca
7b80: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
7b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7ba0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61               cha
7bc0: 6e 67 65 64 52 6f 77 73 20 3d 20 6e 61 74 69 76  ngedRows = nativ
7bd0: 65 45 78 65 63 75 74 65 46 6f 72 43 68 61 6e 67  eExecuteForChang
7be0: 65 64 52 6f 77 43 6f 75 6e 74 28 0a 20 20 20 20  edRowCount(.    
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74          mConnect
7c10: 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e  ionPtr, statemen
7c20: 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 29  t.mStatementPtr)
7c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7c40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 68 61        return cha
7c50: 6e 67 65 64 52 6f 77 73 3b 0a 20 20 20 20 20 20  ngedRows;.      
7c60: 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61            } fina
7c70: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
7c80: 20 20 20 20 20 20 20 20 20 20 64 65 74 61 63 68            detach
7c90: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
7ca0: 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al(cancellationS
7cb0: 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  ignal);.        
7cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7cd0: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
7ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7cf0: 20 20 72 65 6c 65 61 73 65 50 72 65 70 61 72 65    releasePrepare
7d00: 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74 65  dStatement(state
7d10: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
7d20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 63     }.        } c
7d30: 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78 63  atch (RuntimeExc
7d40: 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20  eption ex) {.   
7d50: 20 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74           mRecent
7d60: 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69 6c 4f  Operations.failO
7d70: 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 2c  peration(cookie,
7d80: 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20   ex);.          
7d90: 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20    throw ex;.    
7da0: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a      } finally {.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
7dc0: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
7dd0: 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 44 65  s.endOperationDe
7de0: 66 65 72 4c 6f 67 28 63 6f 6f 6b 69 65 29 29 20  ferLog(cookie)) 
7df0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7e00: 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69    mRecentOperati
7e10: 6f 6e 73 2e 6c 6f 67 4f 70 65 72 61 74 69 6f 6e  ons.logOperation
7e20: 28 63 6f 6f 6b 69 65 2c 20 22 63 68 61 6e 67 65  (cookie, "change
7e30: 64 52 6f 77 73 3d 22 20 2b 20 63 68 61 6e 67 65  dRows=" + change
7e40: 64 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 20 20  dRows);.        
7e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7e60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
7e70: 20 20 20 20 2a 20 45 78 65 63 75 74 65 73 20 61      * Executes a
7e80: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
7e90: 72 65 74 75 72 6e 73 20 74 68 65 20 72 6f 77 20  returns the row 
7ea0: 69 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 72  id of the last r
7eb0: 6f 77 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20  ow inserted.    
7ec0: 20 2a 20 62 79 20 74 68 65 20 73 74 61 74 65 6d   * by the statem
7ed0: 65 6e 74 2e 20 20 55 73 65 20 66 6f 72 20 49 4e  ent.  Use for IN
7ee0: 53 45 52 54 20 53 51 4c 20 73 74 61 74 65 6d 65  SERT SQL stateme
7ef0: 6e 74 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  nts..     *.    
7f00: 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20 54 68   * @param sql Th
7f10: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7f20: 74 6f 20 65 78 65 63 75 74 65 2e 0a 20 20 20 20  to execute..    
7f30: 20 2a 20 40 70 61 72 61 6d 20 62 69 6e 64 41 72   * @param bindAr
7f40: 67 73 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  gs The arguments
7f50: 20 74 6f 20 62 69 6e 64 2c 20 6f 72 20 6e 75 6c   to bind, or nul
7f60: 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20  l if none..     
7f70: 2a 20 40 70 61 72 61 6d 20 63 61 6e 63 65 6c 6c  * @param cancell
7f80: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73 69  ationSignal A si
7f90: 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20 74  gnal to cancel t
7fa0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20  he operation in 
7fb0: 70 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75 6c  progress, or nul
7fc0: 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20  l if none..     
7fd0: 2a 20 40 72 65 74 75 72 6e 20 54 68 65 20 72 6f  * @return The ro
7fe0: 77 20 69 64 20 6f 66 20 74 68 65 20 6c 61 73 74  w id of the last
7ff0: 20 72 6f 77 20 74 68 61 74 20 77 61 73 20 69 6e   row that was in
8000: 73 65 72 74 65 64 2c 20 6f 72 20 30 20 69 66 20  serted, or 0 if 
8010: 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20  none..     *.   
8020: 20 20 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69    * @throws SQLi
8030: 74 65 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61  teException if a
8040: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8050: 73 75 63 68 20 61 73 20 61 20 73 79 6e 74 61 78  such as a syntax
8060: 20 65 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72   error.     * or
8070: 20 69 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72 20   invalid number 
8080: 6f 66 20 62 69 6e 64 20 61 72 67 75 6d 65 6e 74  of bind argument
8090: 73 2e 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77  s..     * @throw
80a0: 73 20 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65  s OperationCance
80b0: 6c 65 64 45 78 63 65 70 74 69 6f 6e 20 69 66 20  ledException if 
80c0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61  the operation wa
80d0: 73 20 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20  s canceled..    
80e0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 6c   */.    public l
80f0: 6f 6e 67 20 65 78 65 63 75 74 65 46 6f 72 4c 61  ong executeForLa
8100: 73 74 49 6e 73 65 72 74 65 64 52 6f 77 49 64 28  stInsertedRowId(
8110: 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65  String sql, Obje
8120: 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20  ct[] bindArgs,. 
8130: 20 20 20 20 20 20 20 20 20 20 20 43 61 6e 63 65             Cance
8140: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61  llationSignal ca
8150: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
8160: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
8170: 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  sql == null) {. 
8180: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
8190: 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75   new IllegalArgu
81a0: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 73  mentException("s
81b0: 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ql must not be n
81c0: 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ull.");.        
81d0: 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  }..        final
81e0: 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52   int cookie = mR
81f0: 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e  ecentOperations.
8200: 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22  beginOperation("
8210: 65 78 65 63 75 74 65 46 6f 72 4c 61 73 74 49 6e  executeForLastIn
8220: 73 65 72 74 65 64 52 6f 77 49 64 22 2c 0a 20 20  sertedRowId",.  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
8240: 6c 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20  l, bindArgs);.  
8250: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
8260: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 50 72          final Pr
8270: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20  eparedStatement 
8280: 73 74 61 74 65 6d 65 6e 74 20 3d 20 61 63 71 75  statement = acqu
8290: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
82a0: 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20 20  ment(sql);.     
82b0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
82d0: 6f 77 49 66 53 74 61 74 65 6d 65 6e 74 46 6f 72  owIfStatementFor
82e0: 62 69 64 64 65 6e 28 73 74 61 74 65 6d 65 6e 74  bidden(statement
82f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8300: 20 20 20 62 69 6e 64 41 72 67 75 6d 65 6e 74 73     bindArguments
8310: 28 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64  (statement, bind
8320: 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  Args);.         
8330: 20 20 20 20 20 20 20 61 70 70 6c 79 42 6c 6f 63         applyBloc
8340: 6b 47 75 61 72 64 50 6f 6c 69 63 79 28 73 74 61  kGuardPolicy(sta
8350: 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  tement);.       
8360: 20 20 20 20 20 20 20 20 20 61 74 74 61 63 68 43           attachC
8370: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
8380: 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  l(cancellationSi
8390: 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  gnal);.         
83a0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 72 65 74 75 72 6e 20 6e 61 74 69 76 65 45 78   return nativeEx
83d0: 65 63 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65  ecuteForLastInse
83e0: 72 74 65 64 52 6f 77 49 64 28 0a 20 20 20 20 20  rtedRowId(.     
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69         mConnecti
8410: 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74  onPtr, statement
8420: 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  .mStatementPtr);
8430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8440: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 64 65 74 61 63 68 43 61 6e 63 65 6c 6c 61 74   detachCancellat
8470: 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c  ionSignal(cancel
8480: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20  lationSignal);. 
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
84a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66  .            } f
84b0: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
84c0: 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
84d0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
84e0: 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  t(statement);.  
84f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8500: 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e      } catch (Run
8510: 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78  timeException ex
8520: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8530: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
8540: 73 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28  s.failOperation(
8550: 63 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20  cookie, ex);.   
8560: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65           throw e
8570: 78 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  x;.        } fin
8580: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
8590: 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74     mRecentOperat
85a0: 69 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f  ions.endOperatio
85b0: 6e 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20  n(cookie);.     
85c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
85d0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75  /**.     * Execu
85e0: 74 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  tes a statement 
85f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74 68  and populates th
8600: 65 20 73 70 65 63 69 66 69 65 64 20 7b 40 6c 69  e specified {@li
8610: 6e 6b 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 7d  nk CursorWindow}
8620: 0a 20 20 20 20 20 2a 20 77 69 74 68 20 61 20 72  .     * with a r
8630: 61 6e 67 65 20 6f 66 20 72 65 73 75 6c 74 73 2e  ange of results.
8640: 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75    Returns the nu
8650: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
8660: 74 20 77 65 72 65 20 63 6f 75 6e 74 65 64 0a 20  t were counted. 
8670: 20 20 20 20 2a 20 64 75 72 69 6e 67 20 71 75 65      * during que
8680: 72 79 20 65 78 65 63 75 74 69 6f 6e 2e 0a 20 20  ry execution..  
8690: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
86a0: 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c 20 73  am sql The SQL s
86b0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
86c0: 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ute..     * @par
86d0: 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68 65 20  am bindArgs The 
86e0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e  arguments to bin
86f0: 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  d, or null if no
8700: 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ne..     * @para
8710: 6d 20 77 69 6e 64 6f 77 20 54 68 65 20 63 75 72  m window The cur
8720: 73 6f 72 20 77 69 6e 64 6f 77 20 74 6f 20 63 6c  sor window to cl
8730: 65 61 72 20 61 6e 64 20 66 69 6c 6c 2e 0a 20 20  ear and fill..  
8740: 20 20 20 2a 20 40 70 61 72 61 6d 20 73 74 61 72     * @param star
8750: 74 50 6f 73 20 54 68 65 20 73 74 61 72 74 20 70  tPos The start p
8760: 6f 73 69 74 69 6f 6e 20 66 6f 72 20 66 69 6c 6c  osition for fill
8770: 69 6e 67 20 74 68 65 20 77 69 6e 64 6f 77 2e 0a  ing the window..
8780: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 72 65       * @param re
8790: 71 75 69 72 65 64 50 6f 73 20 54 68 65 20 70 6f  quiredPos The po
87a0: 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 6f 77 20  sition of a row 
87b0: 74 68 61 74 20 4d 55 53 54 20 62 65 20 69 6e 20  that MUST be in 
87c0: 74 68 65 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20  the window..    
87d0: 20 2a 20 49 66 20 69 74 20 77 6f 6e 27 74 20 66   * If it won't f
87e0: 69 74 2c 20 74 68 65 6e 20 74 68 65 20 71 75 65  it, then the que
87f0: 72 79 20 73 68 6f 75 6c 64 20 64 69 73 63 61 72  ry should discar
8800: 64 20 70 61 72 74 20 6f 66 20 77 68 61 74 20 69  d part of what i
8810: 74 20 66 69 6c 6c 65 64 0a 20 20 20 20 20 2a 20  t filled.     * 
8820: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 2e  so that it does.
8830: 20 20 4d 75 73 74 20 62 65 20 67 72 65 61 74 65    Must be greate
8840: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
8850: 74 6f 20 3c 63 6f 64 65 3e 73 74 61 72 74 50 6f  to <code>startPo
8860: 73 3c 2f 63 6f 64 65 3e 2e 0a 20 20 20 20 20 2a  s</code>..     *
8870: 20 40 70 61 72 61 6d 20 63 6f 75 6e 74 41 6c 6c   @param countAll
8880: 52 6f 77 73 20 54 72 75 65 20 74 6f 20 63 6f 75  Rows True to cou
8890: 6e 74 20 61 6c 6c 20 72 6f 77 73 20 74 68 61 74  nt all rows that
88a0: 20 74 68 65 20 71 75 65 72 79 20 77 6f 75 6c 64   the query would
88b0: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 2a 20 72   return.     * r
88c0: 65 67 61 67 6c 65 73 73 20 6f 66 20 77 68 65 74  egagless of whet
88d0: 68 65 72 20 74 68 65 79 20 66 69 74 20 69 6e 20  her they fit in 
88e0: 74 68 65 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20  the window..    
88f0: 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63 65 6c   * @param cancel
8900: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73  lationSignal A s
8910: 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20  ignal to cancel 
8920: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  the operation in
8930: 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75   progress, or nu
8940: 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20  ll if none..    
8950: 20 2a 20 40 72 65 74 75 72 6e 20 54 68 65 20 6e   * @return The n
8960: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
8970: 61 74 20 77 65 72 65 20 63 6f 75 6e 74 65 64 20  at were counted 
8980: 64 75 72 69 6e 67 20 71 75 65 72 79 20 65 78 65  during query exe
8990: 63 75 74 69 6f 6e 2e 20 20 4d 69 67 68 74 0a 20  cution.  Might. 
89a0: 20 20 20 20 2a 20 6e 6f 74 20 62 65 20 61 6c 6c      * not be all
89b0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 73   rows in the res
89c0: 75 6c 74 20 73 65 74 20 75 6e 6c 65 73 73 20 3c  ult set unless <
89d0: 63 6f 64 65 3e 63 6f 75 6e 74 41 6c 6c 52 6f 77  code>countAllRow
89e0: 73 3c 2f 63 6f 64 65 3e 20 69 73 20 74 72 75 65  s</code> is true
89f0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
8a00: 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45 78  @throws SQLiteEx
8a10: 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65 72  ception if an er
8a20: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63 68  ror occurs, such
8a30: 20 61 73 20 61 20 73 79 6e 74 61 78 20 65 72 72   as a syntax err
8a40: 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e 76  or.     * or inv
8a50: 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20 62  alid number of b
8a60: 69 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20  ind arguments.. 
8a70: 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f 70      * @throws Op
8a80: 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45  erationCanceledE
8a90: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20  xception if the 
8aa0: 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63 61  operation was ca
8ab0: 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a  nceled..     */.
8ac0: 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 65      public int e
8ad0: 78 65 63 75 74 65 46 6f 72 43 75 72 73 6f 72 57  xecuteForCursorW
8ae0: 69 6e 64 6f 77 28 53 74 72 69 6e 67 20 73 71 6c  indow(String sql
8af0: 2c 20 4f 62 6a 65 63 74 5b 5d 20 62 69 6e 64 41  , Object[] bindA
8b00: 72 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rgs,.           
8b10: 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 20 77 69   CursorWindow wi
8b20: 6e 64 6f 77 2c 20 69 6e 74 20 73 74 61 72 74 50  ndow, int startP
8b30: 6f 73 2c 20 69 6e 74 20 72 65 71 75 69 72 65 64  os, int required
8b40: 50 6f 73 2c 20 62 6f 6f 6c 65 61 6e 20 63 6f 75  Pos, boolean cou
8b50: 6e 74 41 6c 6c 52 6f 77 73 2c 0a 20 20 20 20 20  ntAllRows,.     
8b60: 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c 61 74         Cancellat
8b70: 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c  ionSignal cancel
8b80: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a  lationSignal) {.
8b90: 20 20 20 20 20 20 20 20 69 66 20 28 73 71 6c 20          if (sql 
8ba0: 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  == null) {.     
8bb0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
8bc0: 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74   IllegalArgument
8bd0: 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d  Exception("sql m
8be0: 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e  ust not be null.
8bf0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
8c00: 20 20 20 20 20 20 69 66 20 28 77 69 6e 64 6f 77        if (window
8c10: 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   == null) {.    
8c20: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
8c30: 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e  w IllegalArgumen
8c40: 74 45 78 63 65 70 74 69 6f 6e 28 22 77 69 6e 64  tException("wind
8c50: 6f 77 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ow must not be n
8c60: 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ull.");.        
8c70: 7d 0a 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  }..        windo
8c80: 77 2e 61 63 71 75 69 72 65 52 65 66 65 72 65 6e  w.acquireReferen
8c90: 63 65 28 29 3b 0a 20 20 20 20 20 20 20 20 74 72  ce();.        tr
8ca0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
8cb0: 69 6e 74 20 61 63 74 75 61 6c 50 6f 73 20 3d 20  int actualPos = 
8cc0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
8cd0: 69 6e 74 20 63 6f 75 6e 74 65 64 52 6f 77 73 20  int countedRows 
8ce0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
8cf0: 20 20 69 6e 74 20 66 69 6c 6c 65 64 52 6f 77 73    int filledRows
8d00: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
8d10: 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6f     final int coo
8d20: 6b 69 65 20 3d 20 6d 52 65 63 65 6e 74 4f 70 65  kie = mRecentOpe
8d30: 72 61 74 69 6f 6e 73 2e 62 65 67 69 6e 4f 70 65  rations.beginOpe
8d40: 72 61 74 69 6f 6e 28 22 65 78 65 63 75 74 65 46  ration("executeF
8d50: 6f 72 43 75 72 73 6f 72 57 69 6e 64 6f 77 22 2c  orCursorWindow",
8d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8d70: 20 20 20 20 20 73 71 6c 2c 20 62 69 6e 64 41 72       sql, bindAr
8d80: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  gs);.           
8d90: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
8da0: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 50 72 65         final Pre
8db0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20 73  paredStatement s
8dc0: 74 61 74 65 6d 65 6e 74 20 3d 20 61 63 71 75 69  tatement = acqui
8dd0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8de0: 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20 20 20  ent(sql);.      
8df0: 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 20 74 68 72 6f 77 49 66 53 74 61 74 65      throwIfState
8e20: 6d 65 6e 74 46 6f 72 62 69 64 64 65 6e 28 73 74  mentForbidden(st
8e30: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
8e50: 6e 64 41 72 67 75 6d 65 6e 74 73 28 73 74 61 74  ndArguments(stat
8e60: 65 6d 65 6e 74 2c 20 62 69 6e 64 41 72 67 73 29  ement, bindArgs)
8e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8e80: 20 20 20 20 20 20 61 70 70 6c 79 42 6c 6f 63 6b        applyBlock
8e90: 47 75 61 72 64 50 6f 6c 69 63 79 28 73 74 61 74  GuardPolicy(stat
8ea0: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ement);.        
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 61              atta
8ec0: 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  chCancellationSi
8ed0: 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f  gnal(cancellatio
8ee0: 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20  nSignal);.      
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
8f00: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
8f20: 6c 20 6c 6f 6e 67 20 72 65 73 75 6c 74 20 3d 20  l long result = 
8f30: 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72  nativeExecuteFor
8f40: 43 75 72 73 6f 72 57 69 6e 64 6f 77 28 0a 20 20  CursorWindow(.  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 43                mC
8f70: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74  onnectionPtr, st
8f80: 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65  atement.mStateme
8f90: 6e 74 50 74 72 2c 20 77 69 6e 64 6f 77 2c 0a 20  ntPtr, window,. 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8fc0: 74 61 72 74 50 6f 73 2c 20 72 65 71 75 69 72 65  tartPos, require
8fd0: 64 50 6f 73 2c 20 63 6f 75 6e 74 41 6c 6c 52 6f  dPos, countAllRo
8fe0: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ws);.           
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74               act
9000: 75 61 6c 50 6f 73 20 3d 20 28 69 6e 74 29 28 72  ualPos = (int)(r
9010: 65 73 75 6c 74 20 3e 3e 20 33 32 29 3b 0a 20 20  esult >> 32);.  
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 20 63 6f 75 6e 74 65 64 52 6f 77        countedRow
9040: 73 20 3d 20 28 69 6e 74 29 72 65 73 75 6c 74 3b  s = (int)result;
9050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9060: 20 20 20 20 20 20 20 20 20 66 69 6c 6c 65 64 52           filledR
9070: 6f 77 73 20 3d 20 77 69 6e 64 6f 77 2e 67 65 74  ows = window.get
9080: 4e 75 6d 52 6f 77 73 28 29 3b 0a 20 20 20 20 20  NumRows();.     
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 77 69 6e 64 6f 77 2e 73 65 74 53 74 61     window.setSta
90b0: 72 74 50 6f 73 69 74 69 6f 6e 28 61 63 74 75 61  rtPosition(actua
90c0: 6c 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lPos);.         
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
90e0: 65 74 75 72 6e 20 63 6f 75 6e 74 65 64 52 6f 77  eturn countedRow
90f0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s;.             
9100: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
9110: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
9120: 20 20 20 20 20 20 20 20 20 20 20 64 65 74 61 63             detac
9130: 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  hCancellationSig
9140: 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  nal(cancellation
9150: 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  Signal);.       
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9180: 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20   finally {.     
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
91a0: 65 6c 65 61 73 65 50 72 65 70 61 72 65 64 53 74  eleasePreparedSt
91b0: 61 74 65 6d 65 6e 74 28 73 74 61 74 65 6d 65 6e  atement(statemen
91c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
91d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
91e0: 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69    } catch (Runti
91f0: 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20  meException ex) 
9200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9210: 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69    mRecentOperati
9220: 6f 6e 73 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f  ons.failOperatio
9230: 6e 28 63 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20  n(cookie, ex);. 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
9250: 68 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20 20  hrow ex;.       
9260: 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
9270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9280: 20 69 66 20 28 6d 52 65 63 65 6e 74 4f 70 65 72   if (mRecentOper
9290: 61 74 69 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74  ations.endOperat
92a0: 69 6f 6e 44 65 66 65 72 4c 6f 67 28 63 6f 6f 6b  ionDeferLog(cook
92b0: 69 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ie)) {.         
92c0: 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65             mRece
92d0: 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 6c 6f 67  ntOperations.log
92e0: 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65  Operation(cookie
92f0: 2c 20 22 77 69 6e 64 6f 77 3d 27 22 20 2b 20 77  , "window='" + w
9300: 69 6e 64 6f 77 0a 20 20 20 20 20 20 20 20 20 20  indow.          
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 2b 20 22 27 2c 20 73 74 61 72 74 50 6f 73    + "', startPos
9330: 3d 22 20 2b 20 73 74 61 72 74 50 6f 73 0a 20 20  =" + startPos.  
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 20 20 20 20 20 20 20 20 20 20 2b 20 22 2c 20 61            + ", a
9360: 63 74 75 61 6c 50 6f 73 3d 22 20 2b 20 61 63 74  ctualPos=" + act
9370: 75 61 6c 50 6f 73 0a 20 20 20 20 20 20 20 20 20  ualPos.         
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9390: 20 20 20 2b 20 22 2c 20 66 69 6c 6c 65 64 52 6f     + ", filledRo
93a0: 77 73 3d 22 20 2b 20 66 69 6c 6c 65 64 52 6f 77  ws=" + filledRow
93b0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
93d0: 22 2c 20 63 6f 75 6e 74 65 64 52 6f 77 73 3d 22  ", countedRows="
93e0: 20 2b 20 63 6f 75 6e 74 65 64 52 6f 77 73 29 3b   + countedRows);
93f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9400: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
9410: 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  .        } final
9420: 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ly {.           
9430: 20 77 69 6e 64 6f 77 2e 72 65 6c 65 61 73 65 52   window.releaseR
9440: 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20  eference();.    
9450: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9460: 20 70 72 69 76 61 74 65 20 50 72 65 70 61 72 65   private Prepare
9470: 64 53 74 61 74 65 6d 65 6e 74 20 61 63 71 75 69  dStatement acqui
9480: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
9490: 65 6e 74 28 53 74 72 69 6e 67 20 73 71 6c 29 20  ent(String sql) 
94a0: 7b 0a 20 20 20 20 20 20 20 20 50 72 65 70 61 72  {.        Prepar
94b0: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
94c0: 65 6d 65 6e 74 20 3d 20 6d 50 72 65 70 61 72 65  ement = mPrepare
94d0: 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e  dStatementCache.
94e0: 67 65 74 28 73 71 6c 29 3b 0a 20 20 20 20 20 20  get(sql);.      
94f0: 20 20 62 6f 6f 6c 65 61 6e 20 73 6b 69 70 43 61    boolean skipCa
9500: 63 68 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  che = false;.   
9510: 20 20 20 20 20 69 66 20 28 73 74 61 74 65 6d 65       if (stateme
9520: 6e 74 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  nt != null) {.  
9530: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
9540: 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 55 73 65 29  tatement.mInUse)
9550: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
9560: 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 6d     return statem
9570: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ent;.           
9580: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
9590: 2f 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20  / The statement 
95a0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
95b0: 65 20 63 61 63 68 65 20 62 75 74 20 69 73 20 69  e cache but is i
95c0: 6e 20 75 73 65 20 28 74 68 69 73 20 73 74 61 74  n use (this stat
95d0: 65 6d 65 6e 74 20 61 70 70 65 61 72 73 0a 20 20  ement appears.  
95e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 6f 20            // to 
95f0: 62 65 20 6e 6f 74 20 6f 6e 6c 79 20 72 65 2d 65  be not only re-e
9600: 6e 74 72 61 6e 74 20 62 75 74 20 72 65 63 75 72  ntrant but recur
9610: 73 69 76 65 21 29 2e 20 20 53 6f 20 70 72 65 70  sive!).  So prep
9620: 61 72 65 20 61 20 6e 65 77 20 63 6f 70 79 20 6f  are a new copy o
9630: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  f the.          
9640: 20 20 2f 2f 20 73 74 61 74 65 6d 65 6e 74 20 62    // statement b
9650: 75 74 20 64 6f 20 6e 6f 74 20 63 61 63 68 65 20  ut do not cache 
9660: 69 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  it..            
9670: 73 6b 69 70 43 61 63 68 65 20 3d 20 74 72 75 65  skipCache = true
9680: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
9690: 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20       final long 
96a0: 73 74 61 74 65 6d 65 6e 74 50 74 72 20 3d 20 6e  statementPtr = n
96b0: 61 74 69 76 65 50 72 65 70 61 72 65 53 74 61 74  ativePrepareStat
96c0: 65 6d 65 6e 74 28 6d 43 6f 6e 6e 65 63 74 69 6f  ement(mConnectio
96d0: 6e 50 74 72 2c 20 73 71 6c 29 3b 0a 20 20 20 20  nPtr, sql);.    
96e0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
96f0: 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20        final int 
9700: 6e 75 6d 50 61 72 61 6d 65 74 65 72 73 20 3d 20  numParameters = 
9710: 6e 61 74 69 76 65 47 65 74 50 61 72 61 6d 65 74  nativeGetParamet
9720: 65 72 43 6f 75 6e 74 28 6d 43 6f 6e 6e 65 63 74  erCount(mConnect
9730: 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e  ionPtr, statemen
9740: 74 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  tPtr);.         
9750: 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 74 79 70     final int typ
9760: 65 20 3d 20 44 61 74 61 62 61 73 65 55 74 69 6c  e = DatabaseUtil
9770: 73 2e 67 65 74 53 71 6c 53 74 61 74 65 6d 65 6e  s.getSqlStatemen
9780: 74 54 79 70 65 28 73 71 6c 29 3b 0a 20 20 20 20  tType(sql);.    
9790: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 62 6f          final bo
97a0: 6f 6c 65 61 6e 20 72 65 61 64 4f 6e 6c 79 20 3d  olean readOnly =
97b0: 20 6e 61 74 69 76 65 49 73 52 65 61 64 4f 6e 6c   nativeIsReadOnl
97c0: 79 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  y(mConnectionPtr
97d0: 2c 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  , statementPtr);
97e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61  .            sta
97f0: 74 65 6d 65 6e 74 20 3d 20 6f 62 74 61 69 6e 50  tement = obtainP
9800: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
9810: 28 73 71 6c 2c 20 73 74 61 74 65 6d 65 6e 74 50  (sql, statementP
9820: 74 72 2c 20 6e 75 6d 50 61 72 61 6d 65 74 65 72  tr, numParameter
9830: 73 2c 20 74 79 70 65 2c 20 72 65 61 64 4f 6e 6c  s, type, readOnl
9840: 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
9850: 69 66 20 28 21 73 6b 69 70 43 61 63 68 65 20 26  if (!skipCache &
9860: 26 20 69 73 43 61 63 68 65 61 62 6c 65 28 74 79  & isCacheable(ty
9870: 70 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  pe)) {.         
9880: 20 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64         mPrepared
9890: 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 70  StatementCache.p
98a0: 75 74 28 73 71 6c 2c 20 73 74 61 74 65 6d 65 6e  ut(sql, statemen
98b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
98c0: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d 49      statement.mI
98d0: 6e 43 61 63 68 65 20 3d 20 74 72 75 65 3b 0a 20  nCache = true;. 
98e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
98f0: 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75       } catch (Ru
9900: 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65  ntimeException e
9910: 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x) {.           
9920: 20 2f 2f 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   // Finalize the
9930: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e   statement if an
9940: 20 65 78 63 65 70 74 69 6f 6e 20 6f 63 63 75 72   exception occur
9950: 72 65 64 20 61 6e 64 20 77 65 20 64 69 64 20 6e  red and we did n
9960: 6f 74 20 61 64 64 0a 20 20 20 20 20 20 20 20 20  ot add.         
9970: 20 20 20 2f 2f 20 69 74 20 74 6f 20 74 68 65 20     // it to the 
9980: 63 61 63 68 65 2e 20 20 49 66 20 69 74 20 69 73  cache.  If it is
9990: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
99a0: 63 61 63 68 65 2c 20 74 68 65 6e 20 6c 65 61 76  cache, then leav
99b0: 65 20 69 74 20 74 68 65 72 65 2e 0a 20 20 20 20  e it there..    
99c0: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61 74          if (stat
99d0: 65 6d 65 6e 74 20 3d 3d 20 6e 75 6c 6c 20 7c 7c  ement == null ||
99e0: 20 21 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43   !statement.mInC
99f0: 61 63 68 65 29 20 7b 0a 20 20 20 20 20 20 20 20  ache) {.        
9a00: 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 46 69          nativeFi
9a10: 6e 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e 74 28  nalizeStatement(
9a20: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20  mConnectionPtr, 
9a30: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20  statementPtr);. 
9a40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9a50: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65           throw e
9a60: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
9a70: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d       statement.m
9a80: 49 6e 55 73 65 20 3d 20 74 72 75 65 3b 0a 20 20  InUse = true;.  
9a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 74 61        return sta
9aa0: 74 65 6d 65 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20  tement;.    }.. 
9ab0: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
9ac0: 72 65 6c 65 61 73 65 50 72 65 70 61 72 65 64 53  releasePreparedS
9ad0: 74 61 74 65 6d 65 6e 74 28 50 72 65 70 61 72 65  tatement(Prepare
9ae0: 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65  dStatement state
9af0: 6d 65 6e 74 29 20 7b 0a 20 20 20 20 20 20 20 20  ment) {.        
9b00: 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 55 73 65  statement.mInUse
9b10: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
9b20: 20 20 69 66 20 28 73 74 61 74 65 6d 65 6e 74 2e    if (statement.
9b30: 6d 49 6e 43 61 63 68 65 29 20 7b 0a 20 20 20 20  mInCache) {.    
9b40: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
9b60: 74 69 76 65 52 65 73 65 74 53 74 61 74 65 6d 65  tiveResetStateme
9b70: 6e 74 41 6e 64 43 6c 65 61 72 42 69 6e 64 69 6e  ntAndClearBindin
9b80: 67 73 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74  gs(mConnectionPt
9b90: 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74  r, statement.mSt
9ba0: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20  atementPtr);.   
9bb0: 20 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68           } catch
9bc0: 20 28 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f   (SQLiteExceptio
9bd0: 6e 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20  n ex) {.        
9be0: 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 73          // The s
9bf0: 74 61 74 65 6d 65 6e 74 20 63 6f 75 6c 64 20 6e  tatement could n
9c00: 6f 74 20 62 65 20 72 65 73 65 74 20 64 75 65 20  ot be reset due 
9c10: 74 6f 20 61 6e 20 65 72 72 6f 72 2e 20 20 52 65  to an error.  Re
9c20: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
9c30: 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20   cache..        
9c40: 20 20 20 20 20 20 20 20 2f 2f 20 57 68 65 6e 20          // When 
9c50: 72 65 6d 6f 76 65 28 29 20 69 73 20 63 61 6c 6c  remove() is call
9c60: 65 64 2c 20 74 68 65 20 63 61 63 68 65 20 77 69  ed, the cache wi
9c70: 6c 6c 20 69 6e 76 6f 6b 65 20 69 74 73 20 65 6e  ll invoke its en
9c80: 74 72 79 52 65 6d 6f 76 65 64 28 29 20 63 61 6c  tryRemoved() cal
9c90: 6c 62 61 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  lback,.         
9ca0: 20 20 20 20 20 20 20 2f 2f 20 77 68 69 63 68 20         // which 
9cb0: 77 69 6c 6c 20 69 6e 20 74 75 72 6e 20 63 61 6c  will in turn cal
9cc0: 6c 20 66 69 6e 61 6c 69 7a 65 50 72 65 70 61 72  l finalizePrepar
9cd0: 65 64 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  edStatement() to
9ce0: 20 66 69 6e 61 6c 69 7a 65 20 61 6e 64 0a 20 20   finalize and.  
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
9d00: 20 72 65 63 79 63 6c 65 20 74 68 65 20 73 74 61   recycle the sta
9d10: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
9d20: 20 20 20 20 20 20 20 20 69 66 20 28 44 45 42 55          if (DEBU
9d30: 47 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  G) {.           
9d40: 20 20 20 20 20 20 20 20 20 4c 6f 67 2e 64 28 54           Log.d(T
9d50: 41 47 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72  AG, "Could not r
9d60: 65 73 65 74 20 70 72 65 70 61 72 65 64 20 73 74  eset prepared st
9d70: 61 74 65 6d 65 6e 74 20 64 75 65 20 74 6f 20 61  atement due to a
9d80: 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 22 0a  n exception.  ".
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 52              + "R
9db0: 65 6d 6f 76 69 6e 67 20 69 74 20 66 72 6f 6d 20  emoving it from 
9dc0: 74 68 65 20 63 61 63 68 65 2e 20 20 53 51 4c 3a  the cache.  SQL:
9dd0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
9df0: 20 74 72 69 6d 53 71 6c 46 6f 72 44 69 73 70 6c   trimSqlForDispl
9e00: 61 79 28 73 74 61 74 65 6d 65 6e 74 2e 6d 53 71  ay(statement.mSq
9e10: 6c 29 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20  l), ex);.       
9e20: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 6d 50 72 65              mPre
9e40: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61  paredStatementCa
9e50: 63 68 65 2e 72 65 6d 6f 76 65 28 73 74 61 74 65  che.remove(state
9e60: 6d 65 6e 74 2e 6d 53 71 6c 29 3b 0a 20 20 20 20  ment.mSql);.    
9e70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9e80: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
9e90: 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 50         finalizeP
9ea0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
9eb0: 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  (statement);.   
9ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9ed0: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 66    private void f
9ee0: 69 6e 61 6c 69 7a 65 50 72 65 70 61 72 65 64 53  inalizePreparedS
9ef0: 74 61 74 65 6d 65 6e 74 28 50 72 65 70 61 72 65  tatement(Prepare
9f00: 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65  dStatement state
9f10: 6d 65 6e 74 29 20 7b 0a 20 20 20 20 20 20 20 20  ment) {.        
9f20: 6e 61 74 69 76 65 46 69 6e 61 6c 69 7a 65 53 74  nativeFinalizeSt
9f30: 61 74 65 6d 65 6e 74 28 6d 43 6f 6e 6e 65 63 74  atement(mConnect
9f40: 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e  ionPtr, statemen
9f50: 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 29  t.mStatementPtr)
9f60: 3b 0a 20 20 20 20 20 20 20 20 72 65 63 79 63 6c  ;.        recycl
9f70: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
9f80: 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  nt(statement);. 
9f90: 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
9fa0: 65 20 76 6f 69 64 20 61 74 74 61 63 68 43 61 6e  e void attachCan
9fb0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28  cellationSignal(
9fc0: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
9fd0: 61 6c 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al cancellationS
9fe0: 69 67 6e 61 6c 29 20 7b 0a 20 20 20 20 20 20 20  ignal) {.       
9ff0: 20 69 66 20 28 63 61 6e 63 65 6c 6c 61 74 69 6f   if (cancellatio
a000: 6e 53 69 67 6e 61 6c 20 21 3d 20 6e 75 6c 6c 29  nSignal != null)
a010: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
a020: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
a030: 6c 2e 74 68 72 6f 77 49 66 43 61 6e 63 65 6c 65  l.throwIfCancele
a040: 64 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d();..          
a050: 20 20 6d 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53    mCancellationS
a060: 69 67 6e 61 6c 41 74 74 61 63 68 43 6f 75 6e 74  ignalAttachCount
a070: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20   += 1;.         
a080: 20 20 20 69 66 20 28 6d 43 61 6e 63 65 6c 6c 61     if (mCancella
a090: 74 69 6f 6e 53 69 67 6e 61 6c 41 74 74 61 63 68  tionSignalAttach
a0a0: 43 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 20 20  Count == 1) {.  
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
a0c0: 20 52 65 73 65 74 20 63 61 6e 63 65 6c 6c 61 74   Reset cancellat
a0d0: 69 6f 6e 20 66 6c 61 67 20 62 65 66 6f 72 65 20  ion flag before 
a0e0: 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 73 74  executing the st
a0f0: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
a100: 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 52           nativeR
a110: 65 73 65 74 43 61 6e 63 65 6c 28 6d 43 6f 6e 6e  esetCancel(mConn
a120: 65 63 74 69 6f 6e 50 74 72 2c 20 74 72 75 65 20  ectionPtr, true 
a130: 2f 2a 63 61 6e 63 65 6c 61 62 6c 65 2a 2f 29 3b  /*cancelable*/);
a140: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a150: 20 20 2f 2f 20 41 66 74 65 72 20 74 68 69 73 20    // After this 
a160: 70 6f 69 6e 74 2c 20 6f 6e 43 61 6e 63 65 6c 28  point, onCancel(
a170: 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
a180: 63 6f 6e 63 75 72 72 65 6e 74 6c 79 2e 0a 20 20  concurrently..  
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
a1a0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
a1b0: 2e 73 65 74 4f 6e 43 61 6e 63 65 6c 4c 69 73 74  .setOnCancelList
a1c0: 65 6e 65 72 28 74 68 69 73 29 3b 0a 20 20 20 20  ener(this);.    
a1d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a1e0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
a1f0: 72 69 76 61 74 65 20 76 6f 69 64 20 64 65 74 61  rivate void deta
a200: 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  chCancellationSi
a210: 67 6e 61 6c 28 43 61 6e 63 65 6c 6c 61 74 69 6f  gnal(Cancellatio
a220: 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61  nSignal cancella
a230: 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20  tionSignal) {.  
a240: 20 20 20 20 20 20 69 66 20 28 63 61 6e 63 65 6c        if (cancel
a250: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 21 3d 20  lationSignal != 
a260: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
a270: 20 20 20 20 61 73 73 65 72 74 20 6d 43 61 6e 63      assert mCanc
a280: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 41 74  ellationSignalAt
a290: 74 61 63 68 43 6f 75 6e 74 20 3e 20 30 3b 0a 0a  tachCount > 0;..
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 61 6e              mCan
a2b0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 41  cellationSignalA
a2c0: 74 74 61 63 68 43 6f 75 6e 74 20 2d 3d 20 31 3b  ttachCount -= 1;
a2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
a2e0: 28 6d 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  (mCancellationSi
a2f0: 67 6e 61 6c 41 74 74 61 63 68 43 6f 75 6e 74 20  gnalAttachCount 
a300: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
a310: 20 20 20 20 20 20 20 20 2f 2f 20 41 66 74 65 72          // After
a320: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6e 43   this point, onC
a330: 61 6e 63 65 6c 28 29 20 63 61 6e 6e 6f 74 20 62  ancel() cannot b
a340: 65 20 63 61 6c 6c 65 64 20 63 6f 6e 63 75 72 72  e called concurr
a350: 65 6e 74 6c 79 2e 0a 20 20 20 20 20 20 20 20 20  ently..         
a360: 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
a370: 69 6f 6e 53 69 67 6e 61 6c 2e 73 65 74 4f 6e 43  ionSignal.setOnC
a380: 61 6e 63 65 6c 4c 69 73 74 65 6e 65 72 28 6e 75  ancelListener(nu
a390: 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ll);..          
a3a0: 20 20 20 20 20 20 2f 2f 20 52 65 73 65 74 20 63        // Reset c
a3b0: 61 6e 63 65 6c 6c 61 74 69 6f 6e 20 66 6c 61 67  ancellation flag
a3c0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6e 67   after executing
a3d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a   the statement..
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 6e 61 74 69 76 65 52 65 73 65 74 43 61 6e 63 65  nativeResetCance
a400: 6c 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  l(mConnectionPtr
a410: 2c 20 66 61 6c 73 65 20 2f 2a 63 61 6e 63 65 6c  , false /*cancel
a420: 61 62 6c 65 2a 2f 29 3b 0a 20 20 20 20 20 20 20  able*/);.       
a430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a440: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 43  .    }..    // C
a450: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
a460: 6c 2e 4f 6e 43 61 6e 63 65 6c 4c 69 73 74 65 6e  l.OnCancelListen
a470: 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 20  er callback..   
a480: 20 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64 20   // This method 
a490: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
a4a0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
a4b0: 65 61 64 20 74 68 61 6e 20 74 68 65 20 65 78 65  ead than the exe
a4c0: 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  cuting statement
a4d0: 2e 0a 20 20 20 20 2f 2f 20 48 6f 77 65 76 65 72  ..    // However
a4e0: 2c 20 69 74 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  , it will only b
a4f0: 65 20 63 61 6c 6c 65 64 20 62 65 74 77 65 65 6e  e called between
a500: 20 63 61 6c 6c 73 20 74 6f 20 61 74 74 61 63 68   calls to attach
a510: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
a520: 61 6c 20 61 6e 64 0a 20 20 20 20 2f 2f 20 64 65  al and.    // de
a530: 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  tachCancellation
a540: 53 69 67 6e 61 6c 2c 20 77 68 69 6c 65 20 61 20  Signal, while a 
a550: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78 65  statement is exe
a560: 63 75 74 69 6e 67 2e 20 20 57 65 20 63 61 6e 20  cuting.  We can 
a570: 73 61 66 65 6c 79 20 61 73 73 75 6d 65 0a 20 20  safely assume.  
a580: 20 20 2f 2f 20 74 68 61 74 20 74 68 65 20 53 51    // that the SQ
a590: 4c 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  Lite connection 
a5a0: 69 73 20 73 74 69 6c 6c 20 61 6c 69 76 65 2e 0a  is still alive..
a5b0: 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20      @Override.  
a5c0: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 6f 6e    public void on
a5d0: 43 61 6e 63 65 6c 28 29 20 7b 0a 20 20 20 20 20  Cancel() {.     
a5e0: 20 20 20 6e 61 74 69 76 65 43 61 6e 63 65 6c 28     nativeCancel(
a5f0: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b  mConnectionPtr);
a600: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  .    }..    priv
a610: 61 74 65 20 76 6f 69 64 20 62 69 6e 64 41 72 67  ate void bindArg
a620: 75 6d 65 6e 74 73 28 50 72 65 70 61 72 65 64 53  uments(PreparedS
a630: 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65  tatement stateme
a640: 6e 74 2c 20 4f 62 6a 65 63 74 5b 5d 20 62 69 6e  nt, Object[] bin
a650: 64 41 72 67 73 29 20 7b 0a 20 20 20 20 20 20 20  dArgs) {.       
a660: 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 75 6e 74   final int count
a670: 20 3d 20 62 69 6e 64 41 72 67 73 20 21 3d 20 6e   = bindArgs != n
a680: 75 6c 6c 20 3f 20 62 69 6e 64 41 72 67 73 2e 6c  ull ? bindArgs.l
a690: 65 6e 67 74 68 20 3a 20 30 3b 0a 20 20 20 20 20  ength : 0;.     
a6a0: 20 20 20 69 66 20 28 63 6f 75 6e 74 20 21 3d 20     if (count != 
a6b0: 73 74 61 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61  statement.mNumPa
a6c0: 72 61 6d 65 74 65 72 73 29 20 7b 0a 20 20 20 20  rameters) {.    
a6d0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
a6e0: 77 20 53 51 4c 69 74 65 42 69 6e 64 4f 72 43 6f  w SQLiteBindOrCo
a6f0: 6c 75 6d 6e 49 6e 64 65 78 4f 75 74 4f 66 52 61  lumnIndexOutOfRa
a700: 6e 67 65 45 78 63 65 70 74 69 6f 6e 28 0a 20 20  ngeException(.  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 22 45 78 70 65 63 74 65 64 20 22 20 2b 20    "Expected " + 
a730: 73 74 61 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61  statement.mNumPa
a740: 72 61 6d 65 74 65 72 73 20 2b 20 22 20 62 69 6e  rameters + " bin
a750: 64 20 61 72 67 75 6d 65 6e 74 73 20 62 75 74 20  d arguments but 
a760: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
a770: 20 20 20 20 20 20 2b 20 63 6f 75 6e 74 20 2b 20        + count + 
a780: 22 20 77 65 72 65 20 70 72 6f 76 69 64 65 64 2e  " were provided.
a790: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
a7a0: 20 20 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20        if (count 
a7b0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
a7c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
a7d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
a7e0: 69 6e 61 6c 20 6c 6f 6e 67 20 73 74 61 74 65 6d  inal long statem
a7f0: 65 6e 74 50 74 72 20 3d 20 73 74 61 74 65 6d 65  entPtr = stateme
a800: 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72  nt.mStatementPtr
a810: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69  ;.        for (i
a820: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 63 6f  nt i = 0; i < co
a830: 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  unt; i++) {.    
a840: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 4f 62          final Ob
a850: 6a 65 63 74 20 61 72 67 20 3d 20 62 69 6e 64 41  ject arg = bindA
a860: 72 67 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rgs[i];.        
a870: 20 20 20 20 73 77 69 74 63 68 20 28 44 61 74 61      switch (Data
a880: 62 61 73 65 55 74 69 6c 73 2e 67 65 74 54 79 70  baseUtils.getTyp
a890: 65 4f 66 4f 62 6a 65 63 74 28 61 72 67 29 29 20  eOfObject(arg)) 
a8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a8b0: 20 20 63 61 73 65 20 43 75 72 73 6f 72 2e 46 49    case Cursor.FI
a8c0: 45 4c 44 5f 54 59 50 45 5f 4e 55 4c 4c 3a 0a 20  ELD_TYPE_NULL:. 
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 6e 61 74 69 76 65 42 69 6e 64 4e 75 6c     nativeBindNul
a8f0: 6c 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  l(mConnectionPtr
a900: 2c 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20  , statementPtr, 
a910: 69 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20  i + 1);.        
a920: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a930: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
a940: 20 20 20 63 61 73 65 20 43 75 72 73 6f 72 2e 46     case Cursor.F
a950: 49 45 4c 44 5f 54 59 50 45 5f 49 4e 54 45 47 45  IELD_TYPE_INTEGE
a960: 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R:.             
a970: 20 20 20 20 20 20 20 6e 61 74 69 76 65 42 69 6e         nativeBin
a980: 64 4c 6f 6e 67 28 6d 43 6f 6e 6e 65 63 74 69 6f  dLong(mConnectio
a990: 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 50  nPtr, statementP
a9a0: 74 72 2c 20 69 20 2b 20 31 2c 0a 20 20 20 20 20  tr, i + 1,.     
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 28 28 4e 75 6d 62 65 72 29         ((Number)
a9d0: 61 72 67 29 2e 6c 6f 6e 67 56 61 6c 75 65 28 29  arg).longValue()
a9e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a9f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
aa10: 73 65 20 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f  se Cursor.FIELD_
aa20: 54 59 50 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  TYPE_FLOAT:.    
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 6e 61 74 69 76 65 42 69 6e 64 44 6f 75 62 6c 65  nativeBindDouble
aa50: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
aa60: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 69   statementPtr, i
aa70: 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   + 1,.          
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 28 28 4e 75 6d 62 65 72 29 61 72 67 29 2e    ((Number)arg).
aaa0: 64 6f 75 62 6c 65 56 61 6c 75 65 28 29 29 3b 0a  doubleValue());.
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aad0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
aae0: 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50  Cursor.FIELD_TYP
aaf0: 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  E_BLOB:.        
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 74 69              nati
ab10: 76 65 42 69 6e 64 42 6c 6f 62 28 6d 43 6f 6e 6e  veBindBlob(mConn
ab20: 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65  ectionPtr, state
ab30: 6d 65 6e 74 50 74 72 2c 20 69 20 2b 20 31 2c 20  mentPtr, i + 1, 
ab40: 28 62 79 74 65 5b 5d 29 61 72 67 29 3b 0a 20 20  (byte[])arg);.  
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ab70: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 43 75           case Cu
ab80: 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f  rsor.FIELD_TYPE_
ab90: 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 20 20  STRING:.        
aba0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
abb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
abc0: 20 20 20 20 20 69 66 20 28 61 72 67 20 69 6e 73       if (arg ins
abd0: 74 61 6e 63 65 6f 66 20 42 6f 6f 6c 65 61 6e 29  tanceof Boolean)
abe0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
abf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50 72             // Pr
ac00: 6f 76 69 64 65 20 63 6f 6d 70 61 74 69 62 69 6c  ovide compatibil
ac10: 69 74 79 20 77 69 74 68 20 6c 65 67 61 63 79 20  ity with legacy 
ac20: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 77 68 69  applications whi
ac30: 63 68 20 6d 61 79 20 70 61 73 73 0a 20 20 20 20  ch may pass.    
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 2f 2f 20 42 6f 6f 6c 65 61 6e 20 76      // Boolean v
ac60: 61 6c 75 65 73 20 69 6e 20 62 69 6e 64 20 61 72  alues in bind ar
ac70: 67 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs..            
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 74 69              nati
ac90: 76 65 42 69 6e 64 4c 6f 6e 67 28 6d 43 6f 6e 6e  veBindLong(mConn
aca0: 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65  ectionPtr, state
acb0: 6d 65 6e 74 50 74 72 2c 20 69 20 2b 20 31 2c 0a  mentPtr, i + 1,.
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 28 28 42 6f 6f 6c 65 61 6e 29 61 72 67 29 2e 62  ((Boolean)arg).b
acf0: 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 29 20 3f 20  ooleanValue() ? 
ad00: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
ad20: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 74               nat
ad40: 69 76 65 42 69 6e 64 53 74 72 69 6e 67 28 6d 43  iveBindString(mC
ad50: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74  onnectionPtr, st
ad60: 61 74 65 6d 65 6e 74 50 74 72 2c 20 69 20 2b 20  atementPtr, i + 
ad70: 31 2c 20 61 72 67 2e 74 6f 53 74 72 69 6e 67 28  1, arg.toString(
ad80: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
ad90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
adb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
adc0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
add0: 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20   }..    private 
ade0: 76 6f 69 64 20 74 68 72 6f 77 49 66 53 74 61 74  void throwIfStat
adf0: 65 6d 65 6e 74 46 6f 72 62 69 64 64 65 6e 28 50  ementForbidden(P
ae00: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
ae10: 20 73 74 61 74 65 6d 65 6e 74 29 20 7b 0a 20 20   statement) {.  
ae20: 20 20 20 20 20 20 69 66 20 28 6d 4f 6e 6c 79 41        if (mOnlyA
ae30: 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70 65 72  llowReadOnlyOper
ae40: 61 74 69 6f 6e 73 20 26 26 20 21 73 74 61 74 65  ations && !state
ae50: 6d 65 6e 74 2e 6d 52 65 61 64 4f 6e 6c 79 29 20  ment.mReadOnly) 
ae60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  {.            th
ae70: 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45 78  row new SQLiteEx
ae80: 63 65 70 74 69 6f 6e 28 22 43 61 6e 6e 6f 74 20  ception("Cannot 
ae90: 65 78 65 63 75 74 65 20 74 68 69 73 20 73 74 61  execute this sta
aea0: 74 65 6d 65 6e 74 20 62 65 63 61 75 73 65 20 69  tement because i
aeb0: 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ".            
aec0: 20 20 20 20 20 20 20 20 2b 20 22 6d 69 67 68 74          + "might
aed0: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
aee0: 62 61 73 65 20 62 75 74 20 74 68 65 20 63 6f 6e  base but the con
aef0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2d  nection is read-
af00: 6f 6e 6c 79 2e 22 29 3b 0a 20 20 20 20 20 20 20  only.");.       
af10: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
af20: 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
af30: 6c 65 61 6e 20 69 73 43 61 63 68 65 61 62 6c 65  lean isCacheable
af40: 28 69 6e 74 20 73 74 61 74 65 6d 65 6e 74 54 79  (int statementTy
af50: 70 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  pe) {.        if
af60: 20 28 73 74 61 74 65 6d 65 6e 74 54 79 70 65 20   (statementType 
af70: 3d 3d 20 44 61 74 61 62 61 73 65 55 74 69 6c 73  == DatabaseUtils
af80: 2e 53 54 41 54 45 4d 45 4e 54 5f 55 50 44 41 54  .STATEMENT_UPDAT
af90: 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
afa0: 20 20 7c 7c 20 73 74 61 74 65 6d 65 6e 74 54 79    || statementTy
afb0: 70 65 20 3d 3d 20 44 61 74 61 62 61 73 65 55 74  pe == DatabaseUt
afc0: 69 6c 73 2e 53 54 41 54 45 4d 45 4e 54 5f 53 45  ils.STATEMENT_SE
afd0: 4c 45 43 54 29 20 7b 0a 20 20 20 20 20 20 20 20  LECT) {.        
afe0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
aff0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b000: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
b010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  .    }..    priv
b020: 61 74 65 20 76 6f 69 64 20 61 70 70 6c 79 42 6c  ate void applyBl
b030: 6f 63 6b 47 75 61 72 64 50 6f 6c 69 63 79 28 50  ockGuardPolicy(P
b040: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
b050: 20 73 74 61 74 65 6d 65 6e 74 29 20 7b 0a 20 20   statement) {.  
b060: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
b070: 20 20 2a 20 44 75 6d 70 73 20 64 65 62 75 67 67    * Dumps debugg
b080: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
b090: 61 62 6f 75 74 20 74 68 69 73 20 63 6f 6e 6e 65  about this conne
b0a0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20 20  ction..     *.  
b0b0: 20 20 20 2a 20 40 70 61 72 61 6d 20 70 72 69 6e     * @param prin
b0c0: 74 65 72 20 54 68 65 20 70 72 69 6e 74 65 72 20  ter The printer 
b0d0: 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 64  to receive the d
b0e0: 75 6d 70 2c 20 6e 6f 74 20 6e 75 6c 6c 2e 0a 20  ump, not null.. 
b0f0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 76 65 72      * @param ver
b100: 62 6f 73 65 20 54 72 75 65 20 74 6f 20 64 75 6d  bose True to dum
b110: 70 20 6d 6f 72 65 20 76 65 72 62 6f 73 65 20 69  p more verbose i
b120: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
b130: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 76   */.    public v
b140: 6f 69 64 20 64 75 6d 70 28 50 72 69 6e 74 65 72  oid dump(Printer
b150: 20 70 72 69 6e 74 65 72 2c 20 62 6f 6f 6c 65 61   printer, boolea
b160: 6e 20 76 65 72 62 6f 73 65 29 20 7b 0a 20 20 20  n verbose) {.   
b170: 20 20 20 20 20 64 75 6d 70 55 6e 73 61 66 65 28       dumpUnsafe(
b180: 70 72 69 6e 74 65 72 2c 20 76 65 72 62 6f 73 65  printer, verbose
b190: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b1a0: 2a 0a 20 20 20 20 20 2a 20 44 75 6d 70 73 20 64  *.     * Dumps d
b1b0: 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61  ebugging informa
b1c0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
b1d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 6e 20 74  connection, in t
b1e0: 68 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68  he case where th
b1f0: 65 0a 20 20 20 20 20 2a 20 63 61 6c 6c 65 72 20  e.     * caller 
b200: 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
b210: 6c 79 20 6f 77 6e 20 74 68 65 20 63 6f 6e 6e 65  ly own the conne
b220: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20 20  ction..     *.  
b230: 20 20 20 2a 20 54 68 69 73 20 66 75 6e 63 74 69     * This functi
b240: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 20 73 6f  on is written so
b250: 20 74 68 61 74 20 69 74 20 6d 61 79 20 62 65 20   that it may be 
b260: 63 61 6c 6c 65 64 20 62 79 20 61 20 74 68 72 65  called by a thre
b270: 61 64 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ad that does not
b280: 0a 20 20 20 20 20 2a 20 6f 77 6e 20 74 68 65 20  .     * own the 
b290: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 57 65 20  connection.  We 
b2a0: 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 79 20  need to be very 
b2b0: 63 61 72 65 66 75 6c 20 62 65 63 61 75 73 65 20  careful because 
b2c0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
b2d0: 74 61 74 65 20 69 73 0a 20 20 20 20 20 2a 20 6e  tate is.     * n
b2e0: 6f 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 2e  ot synchronized.
b2f0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41  .     *.     * A
b300: 74 20 77 6f 72 73 74 2c 20 74 68 65 20 6d 65 74  t worst, the met
b310: 68 6f 64 20 6d 61 79 20 72 65 74 75 72 6e 20 73  hod may return s
b320: 74 61 6c 65 20 6f 72 20 73 6c 69 67 68 74 6c 79  tale or slightly
b330: 20 77 72 6f 6e 67 20 64 61 74 61 2c 20 68 6f 77   wrong data, how
b340: 65 76 65 72 0a 20 20 20 20 20 2a 20 69 74 20 73  ever.     * it s
b350: 68 6f 75 6c 64 20 6e 6f 74 20 63 72 61 73 68 2e  hould not crash.
b360: 20 20 54 68 69 73 20 69 73 20 6f 6b 20 61 73 20    This is ok as 
b370: 69 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  it is only used 
b380: 66 6f 72 20 64 69 61 67 6e 6f 73 74 69 63 20 70  for diagnostic p
b390: 75 72 70 6f 73 65 73 2e 0a 20 20 20 20 20 2a 0a  urposes..     *.
b3a0: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 70 72       * @param pr
b3b0: 69 6e 74 65 72 20 54 68 65 20 70 72 69 6e 74 65  inter The printe
b3c0: 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
b3d0: 20 64 75 6d 70 2c 20 6e 6f 74 20 6e 75 6c 6c 2e   dump, not null.
b3e0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 76  .     * @param v
b3f0: 65 72 62 6f 73 65 20 54 72 75 65 20 74 6f 20 64  erbose True to d
b400: 75 6d 70 20 6d 6f 72 65 20 76 65 72 62 6f 73 65  ump more verbose
b410: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
b420: 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 64     */.    void d
b430: 75 6d 70 55 6e 73 61 66 65 28 50 72 69 6e 74 65  umpUnsafe(Printe
b440: 72 20 70 72 69 6e 74 65 72 2c 20 62 6f 6f 6c 65  r printer, boole
b450: 61 6e 20 76 65 72 62 6f 73 65 29 20 7b 0a 20 20  an verbose) {.  
b460: 20 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72        printer.pr
b470: 69 6e 74 6c 6e 28 22 43 6f 6e 6e 65 63 74 69 6f  intln("Connectio
b480: 6e 20 23 22 20 2b 20 6d 43 6f 6e 6e 65 63 74 69  n #" + mConnecti
b490: 6f 6e 49 64 20 2b 20 22 3a 22 29 3b 0a 20 20 20  onId + ":");.   
b4a0: 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65       if (verbose
b4b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
b4c0: 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28  printer.println(
b4d0: 22 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  "  connectionPtr
b4e0: 3a 20 30 78 22 20 2b 20 4c 6f 6e 67 2e 74 6f 48  : 0x" + Long.toH
b4f0: 65 78 53 74 72 69 6e 67 28 6d 43 6f 6e 6e 65 63  exString(mConnec
b500: 74 69 6f 6e 50 74 72 29 29 3b 0a 20 20 20 20 20  tionPtr));.     
b510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 72 69     }.        pri
b520: 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 22 20 20  nter.println("  
b530: 69 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74  isPrimaryConnect
b540: 69 6f 6e 3a 20 22 20 2b 20 6d 49 73 50 72 69 6d  ion: " + mIsPrim
b550: 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a  aryConnection);.
b560: 20 20 20 20 20 20 20 20 70 72 69 6e 74 65 72 2e          printer.
b570: 70 72 69 6e 74 6c 6e 28 22 20 20 6f 6e 6c 79 41  println("  onlyA
b580: 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70 65 72  llowReadOnlyOper
b590: 61 74 69 6f 6e 73 3a 20 22 20 2b 20 6d 4f 6e 6c  ations: " + mOnl
b5a0: 79 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70  yAllowReadOnlyOp
b5b0: 65 72 61 74 69 6f 6e 73 29 3b 0a 0a 20 20 20 20  erations);..    
b5c0: 20 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61      mRecentOpera
b5d0: 74 69 6f 6e 73 2e 64 75 6d 70 28 70 72 69 6e 74  tions.dump(print
b5e0: 65 72 2c 20 76 65 72 62 6f 73 65 29 3b 0a 0a 20  er, verbose);.. 
b5f0: 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f         if (verbo
b600: 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  se) {.          
b610: 20 20 6d 50 72 65 70 61 72 65 64 53 74 61 74 65    mPreparedState
b620: 6d 65 6e 74 43 61 63 68 65 2e 64 75 6d 70 28 70  mentCache.dump(p
b630: 72 69 6e 74 65 72 29 3b 0a 20 20 20 20 20 20 20  rinter);.       
b640: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
b650: 2a 0a 20 20 20 20 20 2a 20 44 65 73 63 72 69 62  *.     * Describ
b660: 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  es the currently
b670: 20 65 78 65 63 75 74 69 6e 67 20 6f 70 65 72 61   executing opera
b680: 74 69 6f 6e 2c 20 69 6e 20 74 68 65 20 63 61 73  tion, in the cas
b690: 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
b6a0: 20 2a 20 63 61 6c 6c 65 72 20 6d 69 67 68 74 20   * caller might 
b6b0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6f 77 6e  not actually own
b6c0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e   the connection.
b6d0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54  .     *.     * T
b6e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b6f0: 77 72 69 74 74 65 6e 20 73 6f 20 74 68 61 74 20  written so that 
b700: 69 74 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  it may be called
b710: 20 62 79 20 61 20 74 68 72 65 61 64 20 74 68 61   by a thread tha
b720: 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  t does not.     
b730: 2a 20 6f 77 6e 20 74 68 65 20 63 6f 6e 6e 65 63  * own the connec
b740: 74 69 6f 6e 2e 20 20 57 65 20 6e 65 65 64 20 74  tion.  We need t
b750: 6f 20 62 65 20 76 65 72 79 20 63 61 72 65 66 75  o be very carefu
b760: 6c 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  l because the co
b770: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69  nnection state i
b780: 73 0a 20 20 20 20 20 2a 20 6e 6f 74 20 73 79 6e  s.     * not syn
b790: 63 68 72 6f 6e 69 7a 65 64 2e 0a 20 20 20 20 20  chronized..     
b7a0: 2a 0a 20 20 20 20 20 2a 20 41 74 20 77 6f 72 73  *.     * At wors
b7b0: 74 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 6d 61  t, the method ma
b7c0: 79 20 72 65 74 75 72 6e 20 73 74 61 6c 65 20 6f  y return stale o
b7d0: 72 20 73 6c 69 67 68 74 6c 79 20 77 72 6f 6e 67  r slightly wrong
b7e0: 20 64 61 74 61 2c 20 68 6f 77 65 76 65 72 0a 20   data, however. 
b7f0: 20 20 20 20 2a 20 69 74 20 73 68 6f 75 6c 64 20      * it should 
b800: 6e 6f 74 20 63 72 61 73 68 2e 20 20 54 68 69 73  not crash.  This
b810: 20 69 73 20 6f 6b 20 61 73 20 69 74 20 69 73 20   is ok as it is 
b820: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64 69  only used for di
b830: 61 67 6e 6f 73 74 69 63 20 70 75 72 70 6f 73 65  agnostic purpose
b840: 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  s..     *.     *
b850: 20 40 72 65 74 75 72 6e 20 41 20 64 65 73 63 72   @return A descr
b860: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75  iption of the cu
b870: 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrent operation 
b880: 69 6e 63 6c 75 64 69 6e 67 20 68 6f 77 20 6c 6f  including how lo
b890: 6e 67 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  ng it has been r
b8a0: 75 6e 6e 69 6e 67 2c 0a 20 20 20 20 20 2a 20 6f  unning,.     * o
b8b0: 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a  r null if none..
b8c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 74 72 69       */.    Stri
b8d0: 6e 67 20 64 65 73 63 72 69 62 65 43 75 72 72 65  ng describeCurre
b8e0: 6e 74 4f 70 65 72 61 74 69 6f 6e 55 6e 73 61 66  ntOperationUnsaf
b8f0: 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  e() {.        re
b900: 74 75 72 6e 20 6d 52 65 63 65 6e 74 4f 70 65 72  turn mRecentOper
b910: 61 74 69 6f 6e 73 2e 64 65 73 63 72 69 62 65 43  ations.describeC
b920: 75 72 72 65 6e 74 4f 70 65 72 61 74 69 6f 6e 28  urrentOperation(
b930: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b940: 2a 0a 20 20 20 20 20 2a 20 43 6f 6c 6c 65 63 74  *.     * Collect
b950: 73 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f  s statistics abo
b960: 75 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ut database conn
b970: 65 63 74 69 6f 6e 20 6d 65 6d 6f 72 79 20 75 73  ection memory us
b980: 61 67 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  age..     *.    
b990: 20 2a 20 40 70 61 72 61 6d 20 64 62 53 74 61 74   * @param dbStat
b9a0: 73 4c 69 73 74 20 54 68 65 20 6c 69 73 74 20 74  sList The list t
b9b0: 6f 20 70 6f 70 75 6c 61 74 65 2e 0a 20 20 20 20  o populate..    
b9c0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 63 6f 6c   */.    void col
b9d0: 6c 65 63 74 44 62 53 74 61 74 73 28 41 72 72 61  lectDbStats(Arra
b9e0: 79 4c 69 73 74 3c 44 62 53 74 61 74 73 3e 20 64  yList<DbStats> d
b9f0: 62 53 74 61 74 73 4c 69 73 74 29 20 7b 0a 20 20  bStatsList) {.  
ba00: 20 20 20 20 20 20 2f 2f 20 47 65 74 20 69 6e 66        // Get inf
ba10: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
ba20: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
ba30: 2e 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 6f  ..        int lo
ba40: 6f 6b 61 73 69 64 65 20 3d 20 6e 61 74 69 76 65  okaside = native
ba50: 47 65 74 44 62 4c 6f 6f 6b 61 73 69 64 65 28 6d  GetDbLookaside(m
ba60: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a  ConnectionPtr);.
ba70: 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 70 61 67          long pag
ba80: 65 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  eCount = 0;.    
ba90: 20 20 20 20 6c 6f 6e 67 20 70 61 67 65 53 69 7a      long pageSiz
baa0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74  e = 0;.        t
bab0: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
bac0: 20 70 61 67 65 43 6f 75 6e 74 20 3d 20 65 78 65   pageCount = exe
bad0: 63 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41  cuteForLong("PRA
bae0: 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 3b 22  GMA page_count;"
baf0: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20  , null, null);. 
bb00: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
bb10: 69 7a 65 20 3d 20 65 78 65 63 75 74 65 46 6f 72  ize = executeFor
bb20: 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 70 61 67  Long("PRAGMA pag
bb30: 65 5f 73 69 7a 65 3b 22 2c 20 6e 75 6c 6c 2c 20  e_size;", null, 
bb40: 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  null);.        }
bb50: 20 63 61 74 63 68 20 28 53 51 4c 69 74 65 45 78   catch (SQLiteEx
bb60: 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
bb70: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 67 6e            // Ign
bb80: 6f 72 65 2e 0a 20 20 20 20 20 20 20 20 7d 0a 20  ore..        }. 
bb90: 20 20 20 20 20 20 20 64 62 53 74 61 74 73 4c 69         dbStatsLi
bba0: 73 74 2e 61 64 64 28 67 65 74 4d 61 69 6e 44 62  st.add(getMainDb
bbb0: 53 74 61 74 73 55 6e 73 61 66 65 28 6c 6f 6f 6b  StatsUnsafe(look
bbc0: 61 73 69 64 65 2c 20 70 61 67 65 43 6f 75 6e 74  aside, pageCount
bbd0: 2c 20 70 61 67 65 53 69 7a 65 29 29 3b 0a 0a 20  , pageSize));.. 
bbe0: 20 20 20 20 20 20 20 2f 2f 20 47 65 74 20 69 6e         // Get in
bbf0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
bc00: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
bc10: 65 73 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 57  es..        // W
bc20: 65 20 69 67 6e 6f 72 65 20 74 68 65 20 66 69 72  e ignore the fir
bc30: 73 74 20 72 6f 77 20 69 6e 20 74 68 65 20 64 61  st row in the da
bc40: 74 61 62 61 73 65 20 6c 69 73 74 20 62 65 63 61  tabase list beca
bc50: 75 73 65 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  use it correspon
bc60: 64 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2f 2f  ds to.        //
bc70: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
bc80: 73 65 20 77 68 69 63 68 20 77 65 20 68 61 76 65  se which we have
bc90: 20 61 6c 72 65 61 64 79 20 64 65 73 63 72 69 62   already describ
bca0: 65 64 2e 0a 20 20 20 20 20 20 20 20 43 75 72 73  ed..        Curs
bcb0: 6f 72 57 69 6e 64 6f 77 20 77 69 6e 64 6f 77 20  orWindow window 
bcc0: 3d 20 6e 65 77 20 43 75 72 73 6f 72 57 69 6e 64  = new CursorWind
bcd0: 6f 77 28 22 63 6f 6c 6c 65 63 74 44 62 53 74 61  ow("collectDbSta
bce0: 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 74 72  ts");.        tr
bcf0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
bd00: 65 78 65 63 75 74 65 46 6f 72 43 75 72 73 6f 72  executeForCursor
bd10: 57 69 6e 64 6f 77 28 22 50 52 41 47 4d 41 20 64  Window("PRAGMA d
bd20: 61 74 61 62 61 73 65 5f 6c 69 73 74 3b 22 2c 20  atabase_list;", 
bd30: 6e 75 6c 6c 2c 20 77 69 6e 64 6f 77 2c 20 30 2c  null, window, 0,
bd40: 20 30 2c 20 66 61 6c 73 65 2c 20 6e 75 6c 6c 29   0, false, null)
bd50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
bd60: 72 20 28 69 6e 74 20 69 20 3d 20 31 3b 20 69 20  r (int i = 1; i 
bd70: 3c 20 77 69 6e 64 6f 77 2e 67 65 74 4e 75 6d 52  < window.getNumR
bd80: 6f 77 73 28 29 3b 20 69 2b 2b 29 20 7b 0a 20 20  ows(); i++) {.  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
bda0: 72 69 6e 67 20 6e 61 6d 65 20 3d 20 77 69 6e 64  ring name = wind
bdb0: 6f 77 2e 67 65 74 53 74 72 69 6e 67 28 69 2c 20  ow.getString(i, 
bdc0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
bdd0: 20 20 20 20 53 74 72 69 6e 67 20 70 61 74 68 20      String path 
bde0: 3d 20 77 69 6e 64 6f 77 2e 67 65 74 53 74 72 69  = window.getStri
bdf0: 6e 67 28 69 2c 20 32 29 3b 0a 20 20 20 20 20 20  ng(i, 2);.      
be00: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 43 6f            pageCo
be10: 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unt = 0;.       
be20: 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
be30: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
be40: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 70 61 67 65 43 6f 75 6e 74 20 3d 20 65 78 65   pageCount = exe
be70: 63 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41  cuteForLong("PRA
be80: 47 4d 41 20 22 20 2b 20 6e 61 6d 65 20 2b 20 22  GMA " + name + "
be90: 2e 70 61 67 65 5f 63 6f 75 6e 74 3b 22 2c 20 6e  .page_count;", n
bea0: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 70 61 67 65 53 69 7a 65 20 3d 20 65 78 65 63 75  pageSize = execu
bed0: 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d  teForLong("PRAGM
bee0: 41 20 22 20 2b 20 6e 61 6d 65 20 2b 20 22 2e 70  A " + name + ".p
bef0: 61 67 65 5f 73 69 7a 65 3b 22 2c 20 6e 75 6c 6c  age_size;", null
bf00: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
bf10: 20 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68           } catch
bf20: 20 28 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f   (SQLiteExceptio
bf30: 6e 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20  n ex) {.        
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49              // I
bf50: 67 6e 6f 72 65 2e 0a 20 20 20 20 20 20 20 20 20  gnore..         
bf60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bf70: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20           String 
bf80: 6c 61 62 65 6c 20 3d 20 22 20 20 28 61 74 74 61  label = "  (atta
bf90: 63 68 65 64 29 20 22 20 2b 20 6e 61 6d 65 3b 0a  ched) " + name;.
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 69 66 20 28 21 70 61 74 68 2e 69 73 45 6d 70 74  if (!path.isEmpt
bfc0: 79 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  y()) {.         
bfd0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c             label
bfe0: 20 2b 3d 20 22 3a 20 22 20 2b 20 70 61 74 68 3b   += ": " + path;
bff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c000: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
c010: 20 20 20 64 62 53 74 61 74 73 4c 69 73 74 2e 61     dbStatsList.a
c020: 64 64 28 6e 65 77 20 44 62 53 74 61 74 73 28 6c  dd(new DbStats(l
c030: 61 62 65 6c 2c 20 70 61 67 65 43 6f 75 6e 74 2c  abel, pageCount,
c040: 20 70 61 67 65 53 69 7a 65 2c 20 30 2c 20 30 2c   pageSize, 0, 0,
c050: 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20   0, 0));.       
c060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c070: 20 63 61 74 63 68 20 28 53 51 4c 69 74 65 45 78   catch (SQLiteEx
c080: 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
c090: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 67 6e            // Ign
c0a0: 6f 72 65 2e 0a 20 20 20 20 20 20 20 20 7d 20 66  ore..        } f
c0b0: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
c0c0: 20 20 20 20 20 77 69 6e 64 6f 77 2e 63 6c 6f 73       window.clos
c0d0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
c0e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
c0f0: 20 20 20 2a 20 43 6f 6c 6c 65 63 74 73 20 73 74     * Collects st
c100: 61 74 69 73 74 69 63 73 20 61 62 6f 75 74 20 64  atistics about d
c110: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c120: 6f 6e 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  on memory usage,
c130: 20 69 6e 20 74 68 65 20 63 61 73 65 20 77 68 65   in the case whe
c140: 72 65 20 74 68 65 0a 20 20 20 20 20 2a 20 63 61  re the.     * ca
c150: 6c 6c 65 72 20 6d 69 67 68 74 20 6e 6f 74 20 61  ller might not a
c160: 63 74 75 61 6c 6c 79 20 6f 77 6e 20 74 68 65 20  ctually own the 
c170: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20  connection..    
c180: 20 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72   *.     * @retur
c190: 6e 20 54 68 65 20 73 74 61 74 69 73 74 69 63 73  n The statistics
c1a0: 20 6f 62 6a 65 63 74 2c 20 6e 65 76 65 72 20 6e   object, never n
c1b0: 75 6c 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ull..     */.   
c1c0: 20 76 6f 69 64 20 63 6f 6c 6c 65 63 74 44 62 53   void collectDbS
c1d0: 74 61 74 73 55 6e 73 61 66 65 28 41 72 72 61 79  tatsUnsafe(Array
c1e0: 4c 69 73 74 3c 44 62 53 74 61 74 73 3e 20 64 62  List<DbStats> db
c1f0: 53 74 61 74 73 4c 69 73 74 29 20 7b 0a 20 20 20  StatsList) {.   
c200: 20 20 20 20 20 64 62 53 74 61 74 73 4c 69 73 74       dbStatsList
c210: 2e 61 64 64 28 67 65 74 4d 61 69 6e 44 62 53 74  .add(getMainDbSt
c220: 61 74 73 55 6e 73 61 66 65 28 30 2c 20 30 2c 20  atsUnsafe(0, 0, 
c230: 30 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  0));.    }..    
c240: 70 72 69 76 61 74 65 20 44 62 53 74 61 74 73 20  private DbStats 
c250: 67 65 74 4d 61 69 6e 44 62 53 74 61 74 73 55 6e  getMainDbStatsUn
c260: 73 61 66 65 28 69 6e 74 20 6c 6f 6f 6b 61 73 69  safe(int lookasi
c270: 64 65 2c 20 6c 6f 6e 67 20 70 61 67 65 43 6f 75  de, long pageCou
c280: 6e 74 2c 20 6c 6f 6e 67 20 70 61 67 65 53 69 7a  nt, long pageSiz
c290: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  e) {.        // 
c2a0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
c2b0: 74 65 6d 65 6e 74 20 63 61 63 68 65 20 69 73 20  tement cache is 
c2c0: 74 68 72 65 61 64 2d 73 61 66 65 20 73 6f 20 77  thread-safe so w
c2d0: 65 20 63 61 6e 20 61 63 63 65 73 73 20 69 74 73  e can access its
c2e0: 20 73 74 61 74 69 73 74 69 63 73 0a 20 20 20 20   statistics.    
c2f0: 20 20 20 20 2f 2f 20 65 76 65 6e 20 69 66 20 77      // even if w
c300: 65 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68 65  e do not own the
c310: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
c320: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 53 74  tion..        St
c330: 72 69 6e 67 20 6c 61 62 65 6c 20 3d 20 6d 43 6f  ring label = mCo
c340: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 70 61 74 68  nfiguration.path
c350: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6d  ;.        if (!m
c360: 49 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74  IsPrimaryConnect
c370: 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ion) {.         
c380: 20 20 20 6c 61 62 65 6c 20 2b 3d 20 22 20 28 22     label += " ("
c390: 20 2b 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 49 64   + mConnectionId
c3a0: 20 2b 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20   + ")";.        
c3b0: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
c3c0: 20 6e 65 77 20 44 62 53 74 61 74 73 28 6c 61 62   new DbStats(lab
c3d0: 65 6c 2c 20 70 61 67 65 43 6f 75 6e 74 2c 20 70  el, pageCount, p
c3e0: 61 67 65 53 69 7a 65 2c 20 6c 6f 6f 6b 61 73 69  ageSize, lookasi
c3f0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
c400: 20 20 20 20 6d 50 72 65 70 61 72 65 64 53 74 61      mPreparedSta
c410: 74 65 6d 65 6e 74 43 61 63 68 65 2e 68 69 74 43  tementCache.hitC
c420: 6f 75 6e 74 28 29 2c 0a 20 20 20 20 20 20 20 20  ount(),.        
c430: 20 20 20 20 20 20 20 20 6d 50 72 65 70 61 72 65          mPrepare
c440: 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e  dStatementCache.
c450: 6d 69 73 73 43 6f 75 6e 74 28 29 2c 0a 20 20 20  missCount(),.   
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 50 72               mPr
c470: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43  eparedStatementC
c480: 61 63 68 65 2e 73 69 7a 65 28 29 29 3b 0a 20 20  ache.size());.  
c490: 20 20 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72 69    }..    @Overri
c4a0: 64 65 0a 20 20 20 20 70 75 62 6c 69 63 20 53 74  de.    public St
c4b0: 72 69 6e 67 20 74 6f 53 74 72 69 6e 67 28 29 20  ring toString() 
c4c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c4d0: 20 22 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69   "SQLiteConnecti
c4e0: 6f 6e 3a 20 22 20 2b 20 6d 43 6f 6e 66 69 67 75  on: " + mConfigu
c4f0: 72 61 74 69 6f 6e 2e 70 61 74 68 20 2b 20 22 20  ration.path + " 
c500: 28 22 20 2b 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e  (" + mConnection
c510: 49 64 20 2b 20 22 29 22 3b 0a 20 20 20 20 7d 0a  Id + ")";.    }.
c520: 0a 20 20 20 20 70 72 69 76 61 74 65 20 50 72 65  .    private Pre
c530: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20 6f  paredStatement o
c540: 62 74 61 69 6e 50 72 65 70 61 72 65 64 53 74 61  btainPreparedSta
c550: 74 65 6d 65 6e 74 28 53 74 72 69 6e 67 20 73 71  tement(String sq
c560: 6c 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e  l, long statemen
c570: 74 50 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  tPtr,.          
c580: 20 20 69 6e 74 20 6e 75 6d 50 61 72 61 6d 65 74    int numParamet
c590: 65 72 73 2c 20 69 6e 74 20 74 79 70 65 2c 20 62  ers, int type, b
c5a0: 6f 6f 6c 65 61 6e 20 72 65 61 64 4f 6e 6c 79 29  oolean readOnly)
c5b0: 20 7b 0a 20 20 20 20 20 20 20 20 50 72 65 70 61   {.        Prepa
c5c0: 72 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61  redStatement sta
c5d0: 74 65 6d 65 6e 74 20 3d 20 6d 50 72 65 70 61 72  tement = mPrepar
c5e0: 65 64 53 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 3b  edStatementPool;
c5f0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61  .        if (sta
c600: 74 65 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c 29 20  tement != null) 
c610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 50  {.            mP
c620: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
c630: 50 6f 6f 6c 20 3d 20 73 74 61 74 65 6d 65 6e 74  Pool = statement
c640: 2e 6d 50 6f 6f 6c 4e 65 78 74 3b 0a 20 20 20 20  .mPoolNext;.    
c650: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
c660: 74 2e 6d 50 6f 6f 6c 4e 65 78 74 20 3d 20 6e 75  t.mPoolNext = nu
c670: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
c680: 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43 61 63  statement.mInCac
c690: 68 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  he = false;.    
c6a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
c6b0: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
c6c0: 6e 74 20 3d 20 6e 65 77 20 50 72 65 70 61 72 65  nt = new Prepare
c6d0: 64 53 74 61 74 65 6d 65 6e 74 28 29 3b 0a 20 20  dStatement();.  
c6e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c6f0: 73 74 61 74 65 6d 65 6e 74 2e 6d 53 71 6c 20 3d  statement.mSql =
c700: 20 73 71 6c 3b 0a 20 20 20 20 20 20 20 20 73 74   sql;.        st
c710: 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65  atement.mStateme
c720: 6e 74 50 74 72 20 3d 20 73 74 61 74 65 6d 65 6e  ntPtr = statemen
c730: 74 50 74 72 3b 0a 20 20 20 20 20 20 20 20 73 74  tPtr;.        st
c740: 61 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72 61  atement.mNumPara
c750: 6d 65 74 65 72 73 20 3d 20 6e 75 6d 50 61 72 61  meters = numPara
c760: 6d 65 74 65 72 73 3b 0a 20 20 20 20 20 20 20 20  meters;.        
c770: 73 74 61 74 65 6d 65 6e 74 2e 6d 54 79 70 65 20  statement.mType 
c780: 3d 20 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20  = type;.        
c790: 73 74 61 74 65 6d 65 6e 74 2e 6d 52 65 61 64 4f  statement.mReadO
c7a0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
c7b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
c7c0: 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 7d 0a  tatement;.    }.
c7d0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69  .    private voi
c7e0: 64 20 72 65 63 79 63 6c 65 50 72 65 70 61 72 65  d recyclePrepare
c7f0: 64 53 74 61 74 65 6d 65 6e 74 28 50 72 65 70 61  dStatement(Prepa
c800: 72 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61  redStatement sta
c810: 74 65 6d 65 6e 74 29 20 7b 0a 20 20 20 20 20 20  tement) {.      
c820: 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 71 6c    statement.mSql
c830: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   = null;.       
c840: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 50 6f 6f 6c   statement.mPool
c850: 4e 65 78 74 20 3d 20 6d 50 72 65 70 61 72 65 64  Next = mPrepared
c860: 53 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 3b 0a 20  StatementPool;. 
c870: 20 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64         mPrepared
c880: 53 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 20 3d 20  StatementPool = 
c890: 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 7d  statement;.    }
c8a0: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
c8b0: 61 74 69 63 20 53 74 72 69 6e 67 20 74 72 69 6d  atic String trim
c8c0: 53 71 6c 46 6f 72 44 69 73 70 6c 61 79 28 53 74  SqlForDisplay(St
c8d0: 72 69 6e 67 20 73 71 6c 29 20 7b 0a 20 20 20 20  ring sql) {.    
c8e0: 20 20 20 20 2f 2f 20 4e 6f 74 65 3a 20 43 72 65      // Note: Cre
c8f0: 61 74 69 6e 67 20 61 6e 64 20 63 61 63 68 69 6e  ating and cachin
c900: 67 20 61 20 72 65 67 75 6c 61 72 20 65 78 70 72  g a regular expr
c910: 65 73 73 69 6f 6e 20 69 73 20 65 78 70 65 6e 73  ession is expens
c920: 69 76 65 20 61 74 20 70 72 65 6c 6f 61 64 2d 74  ive at preload-t
c930: 69 6d 65 0a 20 20 20 20 20 20 20 20 2f 2f 20 20  ime.        //  
c940: 20 20 20 20 20 61 6e 64 20 73 74 6f 70 73 20 63       and stops c
c950: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 69 6e 69 74  ompile-time init
c960: 69 61 6c 69 7a 61 74 69 6f 6e 2e 20 54 68 69 73  ialization. This
c970: 20 70 61 74 74 65 72 6e 20 69 73 20 6f 6e 6c 79   pattern is only
c980: 20 75 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20   used when.     
c990: 20 20 20 2f 2f 20 20 20 20 20 20 20 64 75 6d 70     //       dump
c9a0: 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ing the connecti
c9b0: 6f 6e 2c 20 77 68 69 63 68 20 69 73 20 61 20 72  on, which is a r
c9c0: 61 72 65 20 28 6d 61 69 6e 6c 79 20 65 72 72 6f  are (mainly erro
c9d0: 72 29 20 63 61 73 65 2e 20 53 6f 3a 0a 20 20 20  r) case. So:.   
c9e0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 44 4f       //       DO
c9f0: 20 4e 4f 54 20 43 41 43 48 45 2e 0a 20 20 20 20   NOT CACHE..    
ca00: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 2e 72      return sql.r
ca10: 65 70 6c 61 63 65 41 6c 6c 28 22 5b 5c 5c 73 5d  eplaceAll("[\\s]
ca20: 2a 5c 5c 6e 2b 5b 5c 5c 73 5d 2a 22 2c 20 22 20  *\\n+[\\s]*", " 
ca30: 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ");.    }..    /
ca40: 2a 2a 0a 20 20 20 20 20 2a 20 48 6f 6c 64 65 72  **.     * Holder
ca50: 20 74 79 70 65 20 66 6f 72 20 61 20 70 72 65 70   type for a prep
ca60: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
ca70: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c       *.     * Al
ca80: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 62 6a 65  though this obje
ca90: 63 74 20 68 6f 6c 64 73 20 61 20 70 6f 69 6e 74  ct holds a point
caa0: 65 72 20 74 6f 20 61 20 6e 61 74 69 76 65 20 73  er to a native s
cab0: 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 2c  tatement object,
cac0: 20 69 74 0a 20 20 20 20 20 2a 20 64 6f 65 73 20   it.     * does 
cad0: 6e 6f 74 20 68 61 76 65 20 61 20 66 69 6e 61 6c  not have a final
cae0: 69 7a 65 72 2e 20 20 54 68 69 73 20 69 73 20 64  izer.  This is d
caf0: 65 6c 69 62 65 72 61 74 65 2e 20 20 54 68 65 20  eliberate.  The 
cb00: 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65 43 6f 6e  {@link SQLiteCon
cb10: 6e 65 63 74 69 6f 6e 7d 0a 20 20 20 20 20 2a 20  nection}.     * 
cb20: 6f 77 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  owns the stateme
cb30: 6e 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 77 69  nt object and wi
cb40: 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  ll take care of 
cb50: 66 72 65 65 69 6e 67 20 69 74 20 77 68 65 6e 20  freeing it when 
cb60: 6e 65 65 64 65 64 2e 0a 20 20 20 20 20 2a 20 49  needed..     * I
cb70: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 63 6c  n particular, cl
cb80: 6f 73 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  osing the connec
cb90: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 20  tion requires a 
cba0: 67 75 61 72 61 6e 74 65 65 20 6f 66 20 64 65 74  guarantee of det
cbb0: 65 72 6d 69 6e 69 73 74 69 63 0a 20 20 20 20 20  erministic.     
cbc0: 2a 20 72 65 73 6f 75 72 63 65 20 64 69 73 70 6f  * resource dispo
cbd0: 73 61 6c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  sal because all 
cbe0: 6e 61 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  native statement
cbf0: 20 6f 62 6a 65 63 74 73 20 6d 75 73 74 20 62 65   objects must be
cc00: 20 66 72 65 65 64 20 62 65 66 6f 72 65 0a 20 20   freed before.  
cc10: 20 20 20 2a 20 74 68 65 20 6e 61 74 69 76 65 20     * the native 
cc20: 64 61 74 61 62 61 73 65 20 6f 62 6a 65 63 74 20  database object 
cc30: 63 61 6e 20 62 65 20 63 6c 6f 73 65 64 2e 20 20  can be closed.  
cc40: 53 6f 20 6e 6f 20 66 69 6e 61 6c 69 7a 65 72 73  So no finalizers
cc50: 20 68 65 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 20   here..     */. 
cc60: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
cc70: 63 20 66 69 6e 61 6c 20 63 6c 61 73 73 20 50 72  c final class Pr
cc80: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20  eparedStatement 
cc90: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e 65 78  {.        // Nex
cca0: 74 20 69 74 65 6d 20 69 6e 20 70 6f 6f 6c 2e 0a  t item in pool..
ccb0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 50          public P
ccc0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
ccd0: 20 6d 50 6f 6f 6c 4e 65 78 74 3b 0a 0a 20 20 20   mPoolNext;..   
cce0: 20 20 20 20 20 2f 2f 20 54 68 65 20 53 51 4c 20       // The SQL 
ccf0: 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20 73  from which the s
cd00: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 70 72 65  tatement was pre
cd10: 70 61 72 65 64 2e 0a 20 20 20 20 20 20 20 20 70  pared..        p
cd20: 75 62 6c 69 63 20 53 74 72 69 6e 67 20 6d 53 71  ublic String mSq
cd30: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54  l;..        // T
cd40: 68 65 20 6e 61 74 69 76 65 20 73 71 6c 69 74 65  he native sqlite
cd50: 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 20 70 6f  3_stmt object po
cd60: 69 6e 74 65 72 2e 0a 20 20 20 20 20 20 20 20 2f  inter..        /
cd70: 2f 20 4c 69 66 65 74 69 6d 65 20 69 73 20 6d 61  / Lifetime is ma
cd80: 6e 61 67 65 64 20 65 78 70 6c 69 63 69 74 6c 79  naged explicitly
cd90: 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
cda0: 6f 6e 2e 0a 20 20 20 20 20 20 20 20 70 75 62 6c  on..        publ
cdb0: 69 63 20 6c 6f 6e 67 20 6d 53 74 61 74 65 6d 65  ic long mStateme
cdc0: 6e 74 50 74 72 3b 0a 0a 20 20 20 20 20 20 20 20  ntPtr;..        
cdd0: 2f 2f 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  // The number of
cde0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
cdf0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
ce00: 61 74 65 6d 65 6e 74 20 68 61 73 2e 0a 20 20 20  atement has..   
ce10: 20 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20       public int 
ce20: 6d 4e 75 6d 50 61 72 61 6d 65 74 65 72 73 3b 0a  mNumParameters;.
ce30: 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20  .        // The 
ce40: 73 74 61 74 65 6d 65 6e 74 20 74 79 70 65 2e 0a  statement type..
ce50: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 69          public i
ce60: 6e 74 20 6d 54 79 70 65 3b 0a 0a 20 20 20 20 20  nt mType;..     
ce70: 20 20 20 2f 2f 20 54 72 75 65 20 69 66 20 74 68     // True if th
ce80: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
ce90: 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ead-only..      
cea0: 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e    public boolean
ceb0: 20 6d 52 65 61 64 4f 6e 6c 79 3b 0a 0a 20 20 20   mReadOnly;..   
cec0: 20 20 20 20 20 2f 2f 20 54 72 75 65 20 69 66 20       // True if 
ced0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
cee0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
cef0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
cf00: 6f 6c 65 61 6e 20 6d 49 6e 43 61 63 68 65 3b 0a  olean mInCache;.
cf10: 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 72 75 65  .        // True
cf20: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
cf30: 74 20 69 73 20 69 6e 20 75 73 65 20 28 63 75 72  t is in use (cur
cf40: 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
cf50: 29 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65  )..        // We
cf60: 20 6e 65 65 64 20 74 68 69 73 20 66 6c 61 67 20   need this flag 
cf70: 62 65 63 61 75 73 65 20 64 75 65 20 74 6f 20 74  because due to t
cf80: 68 65 20 75 73 65 20 6f 66 20 63 75 73 74 6f 6d  he use of custom
cf90: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 72   functions in tr
cfa0: 69 67 67 65 72 73 2c 20 69 74 27 73 0a 20 20 20  iggers, it's.   
cfb0: 20 20 20 20 20 2f 2f 20 70 6f 73 73 69 62 6c 65       // possible
cfc0: 20 66 6f 72 20 53 51 4c 69 74 65 20 63 61 6c 6c   for SQLite call
cfd0: 73 20 74 6f 20 62 65 20 72 65 2d 65 6e 74 72 61  s to be re-entra
cfe0: 6e 74 2e 20 20 43 6f 6e 73 65 71 75 65 6e 74 6c  nt.  Consequentl
cff0: 79 20 77 65 20 6e 65 65 64 20 74 6f 20 70 72 65  y we need to pre
d000: 76 65 6e 74 0a 20 20 20 20 20 20 20 20 2f 2f 20  vent.        // 
d010: 69 6e 20 75 73 65 20 73 74 61 74 65 6d 65 6e 74  in use statement
d020: 73 20 66 72 6f 6d 20 62 65 69 6e 67 20 66 69 6e  s from being fin
d030: 61 6c 69 7a 65 64 20 75 6e 74 69 6c 20 74 68 65  alized until the
d040: 79 20 61 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  y are no longer 
d050: 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20  in use..        
d060: 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 6d  public boolean m
d070: 49 6e 55 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  InUse;.    }..  
d080: 20 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20    private final 
d090: 63 6c 61 73 73 20 50 72 65 70 61 72 65 64 53 74  class PreparedSt
d0a0: 61 74 65 6d 65 6e 74 43 61 63 68 65 0a 20 20 20  atementCache.   
d0b0: 20 20 20 20 20 20 20 20 20 65 78 74 65 6e 64 73           extends
d0c0: 20 4c 72 75 43 61 63 68 65 3c 53 74 72 69 6e 67   LruCache<String
d0d0: 2c 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  , PreparedStatem
d0e0: 65 6e 74 3e 20 7b 0a 20 20 20 20 20 20 20 20 70  ent> {.        p
d0f0: 75 62 6c 69 63 20 50 72 65 70 61 72 65 64 53 74  ublic PreparedSt
d100: 61 74 65 6d 65 6e 74 43 61 63 68 65 28 69 6e 74  atementCache(int
d110: 20 73 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 20   size) {.       
d120: 20 20 20 20 20 73 75 70 65 72 28 73 69 7a 65 29       super(size)
d130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
d140: 20 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20       @Override. 
d150: 20 20 20 20 20 20 20 70 72 6f 74 65 63 74 65 64         protected
d160: 20 76 6f 69 64 20 65 6e 74 72 79 52 65 6d 6f 76   void entryRemov
d170: 65 64 28 62 6f 6f 6c 65 61 6e 20 65 76 69 63 74  ed(boolean evict
d180: 65 64 2c 20 53 74 72 69 6e 67 20 6b 65 79 2c 0a  ed, String key,.
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
d1b0: 74 20 6f 6c 64 56 61 6c 75 65 2c 20 50 72 65 70  t oldValue, Prep
d1c0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20 6e 65  aredStatement ne
d1d0: 77 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20  wValue) {.      
d1e0: 20 20 20 20 20 20 6f 6c 64 56 61 6c 75 65 2e 6d        oldValue.m
d1f0: 49 6e 43 61 63 68 65 20 3d 20 66 61 6c 73 65 3b  InCache = false;
d200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
d210: 28 21 6f 6c 64 56 61 6c 75 65 2e 6d 49 6e 55 73  (!oldValue.mInUs
d220: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
d230: 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 50 72 65       finalizePre
d240: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 6f  paredStatement(o
d250: 6c 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  ldValue);.      
d260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d270: 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  }..        publi
d280: 63 20 76 6f 69 64 20 64 75 6d 70 28 50 72 69 6e  c void dump(Prin
d290: 74 65 72 20 70 72 69 6e 74 65 72 29 20 7b 0a 20  ter printer) {. 
d2a0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
d2b0: 65 72 2e 70 72 69 6e 74 6c 6e 28 22 20 20 50 72  er.println("  Pr
d2c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
d2d0: 20 63 61 63 68 65 3a 22 29 3b 0a 20 20 20 20 20   cache:");.     
d2e0: 20 20 20 20 20 20 20 4d 61 70 3c 53 74 72 69 6e         Map<Strin
d2f0: 67 2c 20 50 72 65 70 61 72 65 64 53 74 61 74 65  g, PreparedState
d300: 6d 65 6e 74 3e 20 63 61 63 68 65 20 3d 20 73 6e  ment> cache = sn
d310: 61 70 73 68 6f 74 28 29 3b 0a 20 20 20 20 20 20  apshot();.      
d320: 20 20 20 20 20 20 69 66 20 28 21 63 61 63 68 65        if (!cache
d330: 2e 69 73 45 6d 70 74 79 28 29 29 20 7b 0a 20 20  .isEmpty()) {.  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d350: 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t i = 0;.       
d360: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 4d 61           for (Ma
d370: 70 2e 45 6e 74 72 79 3c 53 74 72 69 6e 67 2c 20  p.Entry<String, 
d380: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
d390: 74 3e 20 65 6e 74 72 79 20 3a 20 63 61 63 68 65  t> entry : cache
d3a0: 2e 65 6e 74 72 79 53 65 74 28 29 29 20 7b 0a 20  .entrySet()) {. 
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 20 50 72 65 70 61 72 65 64 53 74 61 74 65     PreparedState
d3d0: 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d  ment statement =
d3e0: 20 65 6e 74 72 79 2e 67 65 74 56 61 6c 75 65 28   entry.getValue(
d3f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d400: 20 20 20 20 20 20 20 69 66 20 28 73 74 61 74 65         if (state
d410: 6d 65 6e 74 2e 6d 49 6e 43 61 63 68 65 29 20 7b  ment.mInCache) {
d420: 20 2f 2f 20 6d 69 67 68 74 20 62 65 20 66 61 6c   // might be fal
d430: 73 65 20 64 75 65 20 74 6f 20 61 20 72 61 63 65  se due to a race
d440: 20 77 69 74 68 20 65 6e 74 72 79 52 65 6d 6f 76   with entryRemov
d450: 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
d460: 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e             Strin
d470: 67 20 73 71 6c 20 3d 20 65 6e 74 72 79 2e 67 65  g sql = entry.ge
d480: 74 4b 65 79 28 29 3b 0a 20 20 20 20 20 20 20 20  tKey();.        
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28  printer.println(
d4b0: 22 20 20 20 20 22 20 2b 20 69 20 2b 20 22 3a 20  "    " + i + ": 
d4c0: 73 74 61 74 65 6d 65 6e 74 50 74 72 3d 30 78 22  statementPtr=0x"
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 20 2b 20 4c 6f 6e 67 2e 74 6f 48 65 78 53 74 72   + Long.toHexStr
d500: 69 6e 67 28 73 74 61 74 65 6d 65 6e 74 2e 6d 53  ing(statement.mS
d510: 74 61 74 65 6d 65 6e 74 50 74 72 29 0a 20 20 20  tatementPtr).   
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22               + "
d540: 2c 20 6e 75 6d 50 61 72 61 6d 65 74 65 72 73 3d  , numParameters=
d550: 22 20 2b 20 73 74 61 74 65 6d 65 6e 74 2e 6d 4e  " + statement.mN
d560: 75 6d 50 61 72 61 6d 65 74 65 72 73 0a 20 20 20  umParameters.   
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22               + "
d590: 2c 20 74 79 70 65 3d 22 20 2b 20 73 74 61 74 65  , type=" + state
d5a0: 6d 65 6e 74 2e 6d 54 79 70 65 0a 20 20 20 20 20  ment.mType.     
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 2c 20             + ", 
d5d0: 72 65 61 64 4f 6e 6c 79 3d 22 20 2b 20 73 74 61  readOnly=" + sta
d5e0: 74 65 6d 65 6e 74 2e 6d 52 65 61 64 4f 6e 6c 79  tement.mReadOnly
d5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 2b 20 22 2c 20 73 71 6c 3d 5c 22 22 20 2b 20   + ", sql=\"" + 
d620: 74 72 69 6d 53 71 6c 46 6f 72 44 69 73 70 6c 61  trimSqlForDispla
d630: 79 28 73 71 6c 29 20 2b 20 22 5c 22 22 29 3b 0a  y(sql) + "\"");.
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d660: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31            i += 1
d670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d680: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d690: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
d6a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 65 72           printer
d6b0: 2e 70 72 69 6e 74 6c 6e 28 22 20 20 20 20 3c 6e  .println("    <n
d6c0: 6f 6e 65 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  one>");.        
d6d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
d6f0: 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20  te static final 
d700: 63 6c 61 73 73 20 4f 70 65 72 61 74 69 6f 6e 4c  class OperationL
d710: 6f 67 20 7b 0a 20 20 20 20 20 20 20 20 70 72 69  og {.        pri
d720: 76 61 74 65 20 73 74 61 74 69 63 20 66 69 6e 61  vate static fina
d730: 6c 20 69 6e 74 20 4d 41 58 5f 52 45 43 45 4e 54  l int MAX_RECENT
d740: 5f 4f 50 45 52 41 54 49 4f 4e 53 20 3d 20 32 30  _OPERATIONS = 20
d750: 3b 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ;.        privat
d760: 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69  e static final i
d770: 6e 74 20 43 4f 4f 4b 49 45 5f 47 45 4e 45 52 41  nt COOKIE_GENERA
d780: 54 49 4f 4e 5f 53 48 49 46 54 20 3d 20 38 3b 0a  TION_SHIFT = 8;.
d790: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
d7a0: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74  static final int
d7b0: 20 43 4f 4f 4b 49 45 5f 49 4e 44 45 58 5f 4d 41   COOKIE_INDEX_MA
d7c0: 53 4b 20 3d 20 30 78 66 66 3b 0a 0a 20 20 20 20  SK = 0xff;..    
d7d0: 20 20 20 20 70 72 69 76 61 74 65 20 66 69 6e 61      private fina
d7e0: 6c 20 4f 70 65 72 61 74 69 6f 6e 5b 5d 20 6d 4f  l Operation[] mO
d7f0: 70 65 72 61 74 69 6f 6e 73 20 3d 20 6e 65 77 20  perations = new 
d800: 4f 70 65 72 61 74 69 6f 6e 5b 4d 41 58 5f 52 45  Operation[MAX_RE
d810: 43 45 4e 54 5f 4f 50 45 52 41 54 49 4f 4e 53 5d  CENT_OPERATIONS]
d820: 3b 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ;.        privat
d830: 65 20 69 6e 74 20 6d 49 6e 64 65 78 3b 0a 20 20  e int mIndex;.  
d840: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 69 6e        private in
d850: 74 20 6d 47 65 6e 65 72 61 74 69 6f 6e 3b 0a 0a  t mGeneration;..
d860: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 69          public i
d870: 6e 74 20 62 65 67 69 6e 4f 70 65 72 61 74 69 6f  nt beginOperatio
d880: 6e 28 53 74 72 69 6e 67 20 6b 69 6e 64 2c 20 53  n(String kind, S
d890: 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63  tring sql, Objec
d8a0: 74 5b 5d 20 62 69 6e 64 41 72 67 73 29 20 7b 0a  t[] bindArgs) {.
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
d8c0: 68 72 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61  hronized (mOpera
d8d0: 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20  tions) {.       
d8e0: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69           final i
d8f0: 6e 74 20 69 6e 64 65 78 20 3d 20 28 6d 49 6e 64  nt index = (mInd
d900: 65 78 20 2b 20 31 29 20 25 20 4d 41 58 5f 52 45  ex + 1) % MAX_RE
d910: 43 45 4e 54 5f 4f 50 45 52 41 54 49 4f 4e 53 3b  CENT_OPERATIONS;
d920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d930: 20 4f 70 65 72 61 74 69 6f 6e 20 6f 70 65 72 61   Operation opera
d940: 74 69 6f 6e 20 3d 20 6d 4f 70 65 72 61 74 69 6f  tion = mOperatio
d950: 6e 73 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20 20  ns[index];.     
d960: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f             if (o
d970: 70 65 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c  peration == null
d980: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d990: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
d9a0: 6e 20 3d 20 6e 65 77 20 4f 70 65 72 61 74 69 6f  n = new Operatio
d9b0: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n();.           
d9c0: 20 20 20 20 20 20 20 20 20 6d 4f 70 65 72 61 74           mOperat
d9d0: 69 6f 6e 73 5b 69 6e 64 65 78 5d 20 3d 20 6f 70  ions[index] = op
d9e0: 65 72 61 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  eration;.       
d9f0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
da00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
da10: 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e        operation.
da20: 6d 46 69 6e 69 73 68 65 64 20 3d 20 66 61 6c 73  mFinished = fals
da30: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
da40: 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e         operation
da50: 2e 6d 45 78 63 65 70 74 69 6f 6e 20 3d 20 6e 75  .mException = nu
da60: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
da70: 20 20 20 20 20 20 20 20 69 66 20 28 6f 70 65 72          if (oper
da80: 61 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67 73 20  ation.mBindArgs 
da90: 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  != null) {.     
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 42 69     operation.mBi
dac0: 6e 64 41 72 67 73 2e 63 6c 65 61 72 28 29 3b 0a  ndArgs.clear();.
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
daf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db00: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
db10: 6e 2e 6d 53 74 61 72 74 57 61 6c 6c 54 69 6d 65  n.mStartWallTime
db20: 20 3d 20 53 79 73 74 65 6d 2e 63 75 72 72 65 6e   = System.curren
db30: 74 54 69 6d 65 4d 69 6c 6c 69 73 28 29 3b 0a 20  tTimeMillis();. 
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
db50: 70 65 72 61 74 69 6f 6e 2e 6d 53 74 61 72 74 54  peration.mStartT
db60: 69 6d 65 20 3d 20 53 79 73 74 65 6d 43 6c 6f 63  ime = SystemCloc
db70: 6b 2e 75 70 74 69 6d 65 4d 69 6c 6c 69 73 28 29  k.uptimeMillis()
db80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
db90: 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 4b 69 6e    operation.mKin
dba0: 64 20 3d 20 6b 69 6e 64 3b 0a 20 20 20 20 20 20  d = kind;.      
dbb0: 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61 74            operat
dbc0: 69 6f 6e 2e 6d 53 71 6c 20 3d 20 73 71 6c 3b 0a  ion.mSql = sql;.
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 69 66 20 28 62 69 6e 64 41 72 67 73 20 21 3d 20  if (bindArgs != 
dbf0: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
dc10: 6f 70 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64 41  operation.mBindA
dc20: 72 67 73 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  rgs == null) {. 
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e         operation
dc50: 2e 6d 42 69 6e 64 41 72 67 73 20 3d 20 6e 65 77  .mBindArgs = new
dc60: 20 41 72 72 61 79 4c 69 73 74 3c 4f 62 6a 65 63   ArrayList<Objec
dc70: 74 3e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t>();.          
dc80: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
dc90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
dca0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61             opera
dcb0: 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67 73 2e 63  tion.mBindArgs.c
dcc0: 6c 65 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20  lear();.        
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
dd00: 3b 20 69 20 3c 20 62 69 6e 64 41 72 67 73 2e 6c  ; i < bindArgs.l
dd10: 65 6e 67 74 68 3b 20 69 2b 2b 29 20 7b 0a 20 20  ength; i++) {.  
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 66 69 6e 61 6c 20 4f 62 6a 65        final Obje
dd40: 63 74 20 61 72 67 20 3d 20 62 69 6e 64 41 72 67  ct arg = bindArg
dd50: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
dd70: 20 28 61 72 67 20 21 3d 20 6e 75 6c 6c 20 26 26   (arg != null &&
dd80: 20 61 72 67 20 69 6e 73 74 61 6e 63 65 6f 66 20   arg instanceof 
dd90: 62 79 74 65 5b 5d 29 20 7b 0a 20 20 20 20 20 20  byte[]) {.      
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 2f 2f 20 44 6f 6e 27 74 20 68        // Don't h
ddc0: 6f 6c 64 20 6f 6e 74 6f 20 74 68 65 20 72 65 61  old onto the rea
ddd0: 6c 20 62 79 74 65 20 61 72 72 61 79 20 6c 6f 6e  l byte array lon
dde0: 67 65 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ger than necessa
ddf0: 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 6f 70 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64 41  operation.mBindA
de20: 72 67 73 2e 61 64 64 28 45 4d 50 54 59 5f 42 59  rgs.add(EMPTY_BY
de30: 54 45 5f 41 52 52 41 59 29 3b 0a 20 20 20 20 20  TE_ARRAY);.     
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
de80: 6e 2e 6d 42 69 6e 64 41 72 67 73 2e 61 64 64 28  n.mBindArgs.add(
de90: 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  arg);.          
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ded0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dee0: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
def0: 6e 2e 6d 43 6f 6f 6b 69 65 20 3d 20 6e 65 77 4f  n.mCookie = newO
df00: 70 65 72 61 74 69 6f 6e 43 6f 6f 6b 69 65 4c 6f  perationCookieLo
df10: 63 6b 65 64 28 69 6e 64 65 78 29 3b 0a 20 20 20  cked(index);.   
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 49 6e               mIn
df30: 64 65 78 20 3d 20 69 6e 64 65 78 3b 0a 20 20 20  dex = index;.   
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
df50: 75 72 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 43  urn operation.mC
df60: 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 20 20 20  ookie;.         
df70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
df80: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76          public v
df90: 6f 69 64 20 66 61 69 6c 4f 70 65 72 61 74 69 6f  oid failOperatio
dfa0: 6e 28 69 6e 74 20 63 6f 6f 6b 69 65 2c 20 45 78  n(int cookie, Ex
dfb0: 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
dfc0: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 68 72            synchr
dfd0: 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61 74 69  onized (mOperati
dfe0: 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ons) {.         
dff0: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 4f 70 65         final Ope
e000: 72 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  ration operation
e010: 20 3d 20 67 65 74 4f 70 65 72 61 74 69 6f 6e 4c   = getOperationL
e020: 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 29 3b 0a 20  ocked(cookie);. 
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e040: 66 20 28 6f 70 65 72 61 74 69 6f 6e 20 21 3d 20  f (operation != 
e050: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
e060: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72              oper
e070: 61 74 69 6f 6e 2e 6d 45 78 63 65 70 74 69 6f 6e  ation.mException
e080: 20 3d 20 65 78 3b 0a 20 20 20 20 20 20 20 20 20   = ex;.         
e090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e0b0: 0a 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63  ..        public
e0c0: 20 76 6f 69 64 20 65 6e 64 4f 70 65 72 61 74 69   void endOperati
e0d0: 6f 6e 28 69 6e 74 20 63 6f 6f 6b 69 65 29 20 7b  on(int cookie) {
e0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e  .            syn
e0f0: 63 68 72 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72  chronized (mOper
e100: 61 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20  ations) {.      
e110: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65 6e            if (en
e120: 64 4f 70 65 72 61 74 69 6f 6e 44 65 66 65 72 4c  dOperationDeferL
e130: 6f 67 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 29  ogLocked(cookie)
e140: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
e150: 20 20 20 20 20 20 20 20 6c 6f 67 4f 70 65 72 61          logOpera
e160: 74 69 6f 6e 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69  tionLocked(cooki
e170: 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  e, null);.      
e180: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e1a0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 62    }..        pub
e1b0: 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 65 6e 64 4f  lic boolean endO
e1c0: 70 65 72 61 74 69 6f 6e 44 65 66 65 72 4c 6f 67  perationDeferLog
e1d0: 28 69 6e 74 20 63 6f 6f 6b 69 65 29 20 7b 0a 20  (int cookie) {. 
e1e0: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 68             synch
e1f0: 72 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61 74  ronized (mOperat
e200: 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ions) {.        
e210: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
e220: 6e 64 4f 70 65 72 61 74 69 6f 6e 44 65 66 65 72  ndOperationDefer
e230: 4c 6f 67 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65  LogLocked(cookie
e240: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
e250: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
e260: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
e270: 6c 6f 67 4f 70 65 72 61 74 69 6f 6e 28 69 6e 74  logOperation(int
e280: 20 63 6f 6f 6b 69 65 2c 20 53 74 72 69 6e 67 20   cookie, String 
e290: 64 65 74 61 69 6c 29 20 7b 0a 20 20 20 20 20 20  detail) {.      
e2a0: 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a        synchroniz
e2b0: 65 64 20 28 6d 4f 70 65 72 61 74 69 6f 6e 73 29  ed (mOperations)
e2c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
e2d0: 20 20 20 6c 6f 67 4f 70 65 72 61 74 69 6f 6e 4c     logOperationL
e2e0: 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 2c 20 64 65  ocked(cookie, de
e2f0: 74 61 69 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tail);.         
e300: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
e310: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
e320: 62 6f 6f 6c 65 61 6e 20 65 6e 64 4f 70 65 72 61  boolean endOpera
e330: 74 69 6f 6e 44 65 66 65 72 4c 6f 67 4c 6f 63 6b  tionDeferLogLock
e340: 65 64 28 69 6e 74 20 63 6f 6f 6b 69 65 29 20 7b  ed(int cookie) {
e350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e  .            fin
e360: 61 6c 20 4f 70 65 72 61 74 69 6f 6e 20 6f 70 65  al Operation ope
e370: 72 61 74 69 6f 6e 20 3d 20 67 65 74 4f 70 65 72  ration = getOper
e380: 61 74 69 6f 6e 4c 6f 63 6b 65 64 28 63 6f 6f 6b  ationLocked(cook
e390: 69 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ie);.           
e3a0: 20 69 66 20 28 6f 70 65 72 61 74 69 6f 6e 20 21   if (operation !
e3b0: 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  = null) {.      
e3c0: 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61 74            operat
e3d0: 69 6f 6e 2e 6d 45 6e 64 54 69 6d 65 20 3d 20 53  ion.mEndTime = S
e3e0: 79 73 74 65 6d 43 6c 6f 63 6b 2e 75 70 74 69 6d  ystemClock.uptim
e3f0: 65 4d 69 6c 6c 69 73 28 29 3b 0a 20 20 20 20 20  eMillis();.     
e400: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61             opera
e410: 74 69 6f 6e 2e 6d 46 69 6e 69 73 68 65 64 20 3d  tion.mFinished =
e420: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
e430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e440: 4c 69 74 65 44 65 62 75 67 2e 44 45 42 55 47 5f  LiteDebug.DEBUG_
e450: 4c 4f 47 5f 53 4c 4f 57 5f 51 55 45 52 49 45 53  LOG_SLOW_QUERIES
e460: 20 26 26 20 53 51 4c 69 74 65 44 65 62 75 67 2e   && SQLiteDebug.
e470: 73 68 6f 75 6c 64 4c 6f 67 53 6c 6f 77 51 75 65  shouldLogSlowQue
e480: 72 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry(.            
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 45      operation.mE
e4b0: 6e 64 54 69 6d 65 20 2d 20 6f 70 65 72 61 74 69  ndTime - operati
e4c0: 6f 6e 2e 6d 53 74 61 72 74 54 69 6d 65 29 3b 0a  on.mStartTime);.
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e4e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e4f0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
e500: 7d 0a 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  }..        priva
e510: 74 65 20 76 6f 69 64 20 6c 6f 67 4f 70 65 72 61  te void logOpera
e520: 74 69 6f 6e 4c 6f 63 6b 65 64 28 69 6e 74 20 63  tionLocked(int c
e530: 6f 6f 6b 69 65 2c 20 53 74 72 69 6e 67 20 64 65  ookie, String de
e540: 74 61 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  tail) {.        
e550: 20 20 20 20 66 69 6e 61 6c 20 4f 70 65 72 61 74      final Operat
e560: 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 3d 20  ion operation = 
e570: 67 65 74 4f 70 65 72 61 74 69 6f 6e 4c 6f 63 6b  getOperationLock
e580: 65 64 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  ed(cookie);.    
e590: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 42 75          StringBu
e5a0: 69 6c 64 65 72 20 6d 73 67 20 3d 20 6e 65 77 20  ilder msg = new 
e5b0: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b  StringBuilder();
e5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65  .            ope
e5d0: 72 61 74 69 6f 6e 2e 64 65 73 63 72 69 62 65 28  ration.describe(
e5e0: 6d 73 67 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20  msg, false);.   
e5f0: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 65 74           if (det
e600: 61 69 6c 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20  ail != null) {. 
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
e620: 73 67 2e 61 70 70 65 6e 64 28 22 2c 20 22 29 2e  sg.append(", ").
e630: 61 70 70 65 6e 64 28 64 65 74 61 69 6c 29 3b 0a  append(detail);.
e640: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e650: 20 20 20 20 20 20 20 20 20 20 4c 6f 67 2e 64 28            Log.d(
e660: 54 41 47 2c 20 6d 73 67 2e 74 6f 53 74 72 69 6e  TAG, msg.toStrin
e670: 67 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g());.        }.
e680: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
e690: 20 69 6e 74 20 6e 65 77 4f 70 65 72 61 74 69 6f   int newOperatio
e6a0: 6e 43 6f 6f 6b 69 65 4c 6f 63 6b 65 64 28 69 6e  nCookieLocked(in
e6b0: 74 20 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 20  t index) {.     
e6c0: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74         final int
e6d0: 20 67 65 6e 65 72 61 74 69 6f 6e 20 3d 20 6d 47   generation = mG
e6e0: 65 6e 65 72 61 74 69 6f 6e 2b 2b 3b 0a 20 20 20  eneration++;.   
e6f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e700: 67 65 6e 65 72 61 74 69 6f 6e 20 3c 3c 20 43 4f  generation << CO
e710: 4f 4b 49 45 5f 47 45 4e 45 52 41 54 49 4f 4e 5f  OKIE_GENERATION_
e720: 53 48 49 46 54 20 7c 20 69 6e 64 65 78 3b 0a 20  SHIFT | index;. 
e730: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e740: 20 20 70 72 69 76 61 74 65 20 4f 70 65 72 61 74    private Operat
e750: 69 6f 6e 20 67 65 74 4f 70 65 72 61 74 69 6f 6e  ion getOperation
e760: 4c 6f 63 6b 65 64 28 69 6e 74 20 63 6f 6f 6b 69  Locked(int cooki
e770: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
e780: 20 66 69 6e 61 6c 20 69 6e 74 20 69 6e 64 65 78   final int index
e790: 20 3d 20 63 6f 6f 6b 69 65 20 26 20 43 4f 4f 4b   = cookie & COOK
e7a0: 49 45 5f 49 4e 44 45 58 5f 4d 41 53 4b 3b 0a 20  IE_INDEX_MASK;. 
e7b0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
e7c0: 20 4f 70 65 72 61 74 69 6f 6e 20 6f 70 65 72 61   Operation opera
e7d0: 74 69 6f 6e 20 3d 20 6d 4f 70 65 72 61 74 69 6f  tion = mOperatio
e7e0: 6e 73 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20 20  ns[index];.     
e7f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 70         return op
e800: 65 72 61 74 69 6f 6e 2e 6d 43 6f 6f 6b 69 65 20  eration.mCookie 
e810: 3d 3d 20 63 6f 6f 6b 69 65 20 3f 20 6f 70 65 72  == cookie ? oper
e820: 61 74 69 6f 6e 20 3a 20 6e 75 6c 6c 3b 0a 20 20  ation : null;.  
e830: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e840: 20 70 75 62 6c 69 63 20 53 74 72 69 6e 67 20 64   public String d
e850: 65 73 63 72 69 62 65 43 75 72 72 65 6e 74 4f 70  escribeCurrentOp
e860: 65 72 61 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  eration() {.    
e870: 20 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e          synchron
e880: 69 7a 65 64 20 28 6d 4f 70 65 72 61 74 69 6f 6e  ized (mOperation
e890: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s) {.           
e8a0: 20 20 20 20 20 66 69 6e 61 6c 20 4f 70 65 72 61       final Opera
e8b0: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 3d  tion operation =
e8c0: 20 6d 4f 70 65 72 61 74 69 6f 6e 73 5b 6d 49 6e   mOperations[mIn
e8d0: 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  dex];.          
e8e0: 20 20 20 20 20 20 69 66 20 28 6f 70 65 72 61 74        if (operat
e8f0: 69 6f 6e 20 21 3d 20 6e 75 6c 6c 20 26 26 20 21  ion != null && !
e900: 6f 70 65 72 61 74 69 6f 6e 2e 6d 46 69 6e 69 73  operation.mFinis
e910: 68 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  hed) {.         
e920: 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e             Strin
e930: 67 42 75 69 6c 64 65 72 20 6d 73 67 20 3d 20 6e  gBuilder msg = n
e940: 65 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72  ew StringBuilder
e950: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
e960: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
e970: 6e 2e 64 65 73 63 72 69 62 65 28 6d 73 67 2c 20  n.describe(msg, 
e980: 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20  false);.        
e990: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e9a0: 72 6e 20 6d 73 67 2e 74 6f 53 74 72 69 6e 67 28  rn msg.toString(
e9b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e9c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
e9d0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
e9e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e9f0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
ea00: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 64     public void d
ea10: 75 6d 70 28 50 72 69 6e 74 65 72 20 70 72 69 6e  ump(Printer prin
ea20: 74 65 72 2c 20 62 6f 6f 6c 65 61 6e 20 76 65 72  ter, boolean ver
ea30: 62 6f 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20  bose) {.        
ea40: 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64      synchronized
ea50: 20 28 6d 4f 70 65 72 61 74 69 6f 6e 73 29 20 7b   (mOperations) {
ea60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea70: 20 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e   printer.println
ea80: 28 22 20 20 4d 6f 73 74 20 72 65 63 65 6e 74 6c  ("  Most recentl
ea90: 79 20 65 78 65 63 75 74 65 64 20 6f 70 65 72 61  y executed opera
eaa0: 74 69 6f 6e 73 3a 22 29 3b 0a 20 20 20 20 20 20  tions:");.      
eab0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e            int in
eac0: 64 65 78 20 3d 20 6d 49 6e 64 65 78 3b 0a 20 20  dex = mIndex;.  
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70                Op
eae0: 65 72 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  eration operatio
eaf0: 6e 20 3d 20 6d 4f 70 65 72 61 74 69 6f 6e 73 5b  n = mOperations[
eb00: 69 6e 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20  index];.        
eb10: 20 20 20 20 20 20 20 20 69 66 20 28 6f 70 65 72          if (oper
eb20: 61 74 69 6f 6e 20 21 3d 20 6e 75 6c 6c 29 20 7b  ation != null) {
eb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eb40: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 6d   StringBuilder m
eb90: 73 67 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42  sg = new StringB
eba0: 75 69 6c 64 65 72 28 29 3b 0a 20 20 20 20 20 20  uilder();.      
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 20 20    msg.append("  
ebd0: 20 20 22 29 2e 61 70 70 65 6e 64 28 6e 29 2e 61    ").append(n).a
ebe0: 70 70 65 6e 64 28 22 3a 20 5b 22 29 3b 0a 20 20  ppend(": [");.  
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64        msg.append
ec10: 28 6f 70 65 72 61 74 69 6f 6e 2e 67 65 74 46 6f  (operation.getFo
ec20: 72 6d 61 74 74 65 64 53 74 61 72 74 54 69 6d 65  rmattedStartTime
ec30: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ());.           
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 67               msg
ec50: 2e 61 70 70 65 6e 64 28 22 5d 20 22 29 3b 0a 20  .append("] ");. 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e         operation
ec80: 2e 64 65 73 63 72 69 62 65 28 6d 73 67 2c 20 76  .describe(msg, v
ec90: 65 72 62 6f 73 65 29 3b 0a 20 20 20 20 20 20 20  erbose);.       
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e   printer.println
ecc0: 28 6d 73 67 2e 74 6f 53 74 72 69 6e 67 28 29 29  (msg.toString())
ecd0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
ece0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 69             if (i
ecf0: 6e 64 65 78 20 3e 20 30 29 20 7b 0a 20 20 20 20  ndex > 0) {.    
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 2d 3d          index -=
ed20: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
ed40: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 69 6e 64 65 78 20 3d 20 4d 41 58 5f 52 45 43   index = MAX_REC
ed70: 45 4e 54 5f 4f 50 45 52 41 54 49 4f 4e 53 20 2d  ENT_OPERATIONS -
ed80: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 6e 20 2b 3d 20 31 3b 0a 20 20        n += 1;.  
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 20        operation 
ede0: 3d 20 6d 4f 70 65 72 61 74 69 6f 6e 73 5b 69 6e  = mOperations[in
edf0: 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  dex];.          
ee00: 20 20 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c            } whil
ee10: 65 20 28 6f 70 65 72 61 74 69 6f 6e 20 21 3d 20  e (operation != 
ee20: 6e 75 6c 6c 20 26 26 20 6e 20 3c 20 4d 41 58 5f  null && n < MAX_
ee30: 52 45 43 45 4e 54 5f 4f 50 45 52 41 54 49 4f 4e  RECENT_OPERATION
ee40: 53 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  S);.            
ee50: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e   printer.println
ee80: 28 22 20 20 20 20 3c 6e 6f 6e 65 3e 22 29 3b 0a  ("    <none>");.
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
eeb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
eec0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
eed0: 74 69 63 20 66 69 6e 61 6c 20 63 6c 61 73 73 20  tic final class 
eee0: 4f 70 65 72 61 74 69 6f 6e 20 7b 0a 20 20 20 20  Operation {.    
eef0: 20 20 20 20 2f 2f 20 54 72 69 6d 20 61 6c 6c 20      // Trim all 
ef00: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74  SQL statements t
ef10: 6f 20 32 35 36 20 63 68 61 72 61 63 74 65 72 73  o 256 characters
ef20: 20 69 6e 73 69 64 65 20 74 68 65 20 74 72 61 63   inside the trac
ef30: 65 20 6d 61 72 6b 65 72 2e 0a 20 20 20 20 20 20  e marker..      
ef40: 20 20 2f 2f 20 54 68 69 73 20 6c 69 6d 69 74 20    // This limit 
ef50: 67 69 76 65 73 20 70 6c 65 6e 74 79 20 6f 66 20  gives plenty of 
ef60: 63 6f 6e 74 65 78 74 20 77 68 69 6c 65 20 6c 65  context while le
ef70: 61 76 69 6e 67 20 73 70 61 63 65 20 66 6f 72 20  aving space for 
ef80: 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2f 2f  other.        //
ef90: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
efa0: 74 72 61 63 65 20 62 75 66 66 65 72 20 28 61 6e  trace buffer (an
efb0: 64 20 65 6e 73 75 72 65 73 20 61 74 72 61 63 65  d ensures atrace
efc0: 20 64 6f 65 73 6e 27 74 20 74 72 75 6e 63 61 74   doesn't truncat
efd0: 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2f 2f  e the.        //
efe0: 20 6d 61 72 6b 65 72 20 66 6f 72 20 75 73 2c 20   marker for us, 
eff0: 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 6f 73 69  potentially losi
f000: 6e 67 20 6d 65 74 61 64 61 74 61 20 69 6e 20 74  ng metadata in t
f010: 68 65 20 70 72 6f 63 65 73 73 29 2e 0a 20 20 20  he process)..   
f020: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
f030: 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 4d 41  tic final int MA
f040: 58 5f 54 52 41 43 45 5f 4d 45 54 48 4f 44 5f 4e  X_TRACE_METHOD_N
f050: 41 4d 45 5f 4c 45 4e 20 3d 20 32 35 36 3b 0a 0a  AME_LEN = 256;..
f060: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 6c          public l
f070: 6f 6e 67 20 6d 53 74 61 72 74 57 61 6c 6c 54 69  ong mStartWallTi
f080: 6d 65 3b 20 2f 2f 20 69 6e 20 53 79 73 74 65 6d  me; // in System
f090: 2e 63 75 72 72 65 6e 74 54 69 6d 65 4d 69 6c 6c  .currentTimeMill
f0a0: 69 73 28 29 0a 20 20 20 20 20 20 20 20 70 75 62  is().        pub
f0b0: 6c 69 63 20 6c 6f 6e 67 20 6d 53 74 61 72 74 54  lic long mStartT
f0c0: 69 6d 65 3b 20 2f 2f 20 69 6e 20 53 79 73 74 65  ime; // in Syste
f0d0: 6d 43 6c 6f 63 6b 2e 75 70 74 69 6d 65 4d 69 6c  mClock.uptimeMil
f0e0: 6c 69 73 28 29 3b 0a 20 20 20 20 20 20 20 20 70  lis();.        p
f0f0: 75 62 6c 69 63 20 6c 6f 6e 67 20 6d 45 6e 64 54  ublic long mEndT
f100: 69 6d 65 3b 20 2f 2f 20 69 6e 20 53 79 73 74 65  ime; // in Syste
f110: 6d 43 6c 6f 63 6b 2e 75 70 74 69 6d 65 4d 69 6c  mClock.uptimeMil
f120: 6c 69 73 28 29 3b 0a 20 20 20 20 20 20 20 20 70  lis();.        p
f130: 75 62 6c 69 63 20 53 74 72 69 6e 67 20 6d 4b 69  ublic String mKi
f140: 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 75 62 6c  nd;.        publ
f150: 69 63 20 53 74 72 69 6e 67 20 6d 53 71 6c 3b 0a  ic String mSql;.
f160: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 41          public A
f170: 72 72 61 79 4c 69 73 74 3c 4f 62 6a 65 63 74 3e  rrayList<Object>
f180: 20 6d 42 69 6e 64 41 72 67 73 3b 0a 20 20 20 20   mBindArgs;.    
f190: 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65      public boole
f1a0: 61 6e 20 6d 46 69 6e 69 73 68 65 64 3b 0a 20 20  an mFinished;.  
f1b0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 45 78 63        public Exc
f1c0: 65 70 74 69 6f 6e 20 6d 45 78 63 65 70 74 69 6f  eption mExceptio
f1d0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  n;.        publi
f1e0: 63 20 69 6e 74 20 6d 43 6f 6f 6b 69 65 3b 0a 0a  c int mCookie;..
f1f0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76          public v
f200: 6f 69 64 20 64 65 73 63 72 69 62 65 28 53 74 72  oid describe(Str
f210: 69 6e 67 42 75 69 6c 64 65 72 20 6d 73 67 2c 20  ingBuilder msg, 
f220: 62 6f 6f 6c 65 61 6e 20 76 65 72 62 6f 73 65 29  boolean verbose)
f230: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
f240: 73 67 2e 61 70 70 65 6e 64 28 6d 4b 69 6e 64 29  sg.append(mKind)
f250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f260: 20 28 6d 46 69 6e 69 73 68 65 64 29 20 7b 0a 20   (mFinished) {. 
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
f280: 73 67 2e 61 70 70 65 6e 64 28 22 20 74 6f 6f 6b  sg.append(" took
f290: 20 22 29 2e 61 70 70 65 6e 64 28 6d 45 6e 64 54   ").append(mEndT
f2a0: 69 6d 65 20 2d 20 6d 53 74 61 72 74 54 69 6d 65  ime - mStartTime
f2b0: 29 2e 61 70 70 65 6e 64 28 22 6d 73 22 29 3b 0a  ).append("ms");.
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
f2d0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
f2e0: 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28       msg.append(
f2f0: 22 20 73 74 61 72 74 65 64 20 22 29 2e 61 70 70  " started ").app
f300: 65 6e 64 28 53 79 73 74 65 6d 2e 63 75 72 72 65  end(System.curre
f310: 6e 74 54 69 6d 65 4d 69 6c 6c 69 73 28 29 20 2d  ntTimeMillis() -
f320: 20 6d 53 74 61 72 74 57 61 6c 6c 54 69 6d 65 29   mStartWallTime)
f330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f340: 20 20 20 20 20 20 20 20 20 2e 61 70 70 65 6e 64           .append
f350: 28 22 6d 73 20 61 67 6f 22 29 3b 0a 20 20 20 20  ("ms ago");.    
f360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f370: 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64        msg.append
f380: 28 22 20 2d 20 22 29 2e 61 70 70 65 6e 64 28 67  (" - ").append(g
f390: 65 74 53 74 61 74 75 73 28 29 29 3b 0a 20 20 20  etStatus());.   
f3a0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 53 71           if (mSq
f3b0: 6c 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  l != null) {.   
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 67               msg
f3d0: 2e 61 70 70 65 6e 64 28 22 2c 20 73 71 6c 3d 5c  .append(", sql=\
f3e0: 22 22 29 2e 61 70 70 65 6e 64 28 74 72 69 6d 53  "").append(trimS
f3f0: 71 6c 46 6f 72 44 69 73 70 6c 61 79 28 6d 53 71  qlForDisplay(mSq
f400: 6c 29 29 2e 61 70 70 65 6e 64 28 22 5c 22 22 29  l)).append("\"")
f410: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
f420: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
f430: 76 65 72 62 6f 73 65 20 26 26 20 6d 42 69 6e 64  verbose && mBind
f440: 41 72 67 73 20 21 3d 20 6e 75 6c 6c 20 26 26 20  Args != null && 
f450: 6d 42 69 6e 64 41 72 67 73 2e 73 69 7a 65 28 29  mBindArgs.size()
f460: 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20   != 0) {.       
f470: 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70           msg.app
f480: 65 6e 64 28 22 2c 20 62 69 6e 64 41 72 67 73 3d  end(", bindArgs=
f490: 5b 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [");.           
f4a0: 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 63       final int c
f4b0: 6f 75 6e 74 20 3d 20 6d 42 69 6e 64 41 72 67 73  ount = mBindArgs
f4c0: 2e 73 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20  .size();.       
f4d0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
f4e0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 63 6f 75  t i = 0; i < cou
f4f0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20  nt; i++) {.     
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
f510: 69 6e 61 6c 20 4f 62 6a 65 63 74 20 61 72 67 20  inal Object arg 
f520: 3d 20 6d 42 69 6e 64 41 72 67 73 2e 67 65 74 28  = mBindArgs.get(
f530: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
f540: 20 20 20 20 20 20 20 20 69 66 20 28 69 20 21 3d          if (i !=
f550: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73                ms
f570: 67 2e 61 70 70 65 6e 64 28 22 2c 20 22 29 3b 0a  g.append(", ");.
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f5a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72            if (ar
f5b0: 67 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  g == null) {.   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28       msg.append(
f5e0: 22 6e 75 6c 6c 22 29 3b 0a 20 20 20 20 20 20 20  "null");.       
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
f600: 6c 73 65 20 69 66 20 28 61 72 67 20 69 6e 73 74  lse if (arg inst
f610: 61 6e 63 65 6f 66 20 62 79 74 65 5b 5d 29 20 7b  anceof byte[]) {
f620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f630: 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70           msg.app
f640: 65 6e 64 28 22 3c 62 79 74 65 5b 5d 3e 22 29 3b  end("<byte[]>");
f650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f660: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
f670: 61 72 67 20 69 6e 73 74 61 6e 63 65 6f 66 20 53  arg instanceof S
f680: 74 72 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20  tring) {.       
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 5c 22 22   msg.append("\""
f6b0: 29 2e 61 70 70 65 6e 64 28 28 53 74 72 69 6e 67  ).append((String
f6c0: 29 61 72 67 29 2e 61 70 70 65 6e 64 28 22 5c 22  )arg).append("\"
f6d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
f6e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f700: 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70           msg.app
f710: 65 6e 64 28 61 72 67 29 3b 0a 20 20 20 20 20 20  end(arg);.      
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
f750: 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 5d 22    msg.append("]"
f760: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
f770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
f780: 28 6d 45 78 63 65 70 74 69 6f 6e 20 21 3d 20 6e  (mException != n
f790: 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ull) {.         
f7a0: 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e         msg.appen
f7b0: 64 28 22 2c 20 65 78 63 65 70 74 69 6f 6e 3d 5c  d(", exception=\
f7c0: 22 22 29 2e 61 70 70 65 6e 64 28 6d 45 78 63 65  "").append(mExce
f7d0: 70 74 69 6f 6e 2e 67 65 74 4d 65 73 73 61 67 65  ption.getMessage
f7e0: 28 29 29 2e 61 70 70 65 6e 64 28 22 5c 22 22 29  ()).append("\"")
f7f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
f800: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f810: 20 20 20 70 72 69 76 61 74 65 20 53 74 72 69 6e     private Strin
f820: 67 20 67 65 74 53 74 61 74 75 73 28 29 20 7b 0a  g getStatus() {.
f830: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
f840: 21 6d 46 69 6e 69 73 68 65 64 29 20 7b 0a 20 20  !mFinished) {.  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
f860: 74 75 72 6e 20 22 72 75 6e 6e 69 6e 67 22 3b 0a  turn "running";.
f870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f880: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f890: 20 6d 45 78 63 65 70 74 69 6f 6e 20 21 3d 20 6e   mException != n
f8a0: 75 6c 6c 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  ull ? "failed" :
f8b0: 20 22 73 75 63 63 65 65 64 65 64 22 3b 0a 20 20   "succeeded";.  
f8c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
f8d0: 20 70 72 69 76 61 74 65 20 53 74 72 69 6e 67 20   private String 
f8e0: 67 65 74 54 72 61 63 65 4d 65 74 68 6f 64 4e 61  getTraceMethodNa
f8f0: 6d 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  me() {.         
f900: 20 20 20 53 74 72 69 6e 67 20 6d 65 74 68 6f 64     String method
f910: 4e 61 6d 65 20 3d 20 6d 4b 69 6e 64 20 2b 20 22  Name = mKind + "
f920: 20 22 20 2b 20 6d 53 71 6c 3b 0a 20 20 20 20 20   " + mSql;.     
f930: 20 20 20 20 20 20 20 69 66 20 28 6d 65 74 68 6f         if (metho
f940: 64 4e 61 6d 65 2e 6c 65 6e 67 74 68 28 29 20 3e  dName.length() >
f950: 20 4d 41 58 5f 54 52 41 43 45 5f 4d 45 54 48 4f   MAX_TRACE_METHO
f960: 44 5f 4e 41 4d 45 5f 4c 45 4e 29 0a 20 20 20 20  D_NAME_LEN).    
f970: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
f980: 72 6e 20 6d 65 74 68 6f 64 4e 61 6d 65 2e 73 75  rn methodName.su
f990: 62 73 74 72 69 6e 67 28 30 2c 20 4d 41 58 5f 54  bstring(0, MAX_T
f9a0: 52 41 43 45 5f 4d 45 54 48 4f 44 5f 4e 41 4d 45  RACE_METHOD_NAME
f9b0: 5f 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 20  _LEN);.         
f9c0: 20 20 20 72 65 74 75 72 6e 20 6d 65 74 68 6f 64     return method
f9d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
f9e0: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
f9f0: 20 53 74 72 69 6e 67 20 67 65 74 46 6f 72 6d 61   String getForma
fa00: 74 74 65 64 53 74 61 72 74 54 69 6d 65 28 29 20  ttedStartTime() 
fa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
fa20: 20 4e 6f 74 65 3a 20 53 69 6d 70 6c 65 44 61 74   Note: SimpleDat
fa30: 65 46 6f 72 6d 61 74 20 69 73 20 6e 6f 74 20 74  eFormat is not t
fa40: 68 72 65 61 64 2d 73 61 66 65 2c 20 63 61 6e 6e  hread-safe, cann
fa50: 6f 74 20 62 65 20 63 6f 6d 70 69 6c 65 2d 74 69  ot be compile-ti
fa60: 6d 65 20 63 72 65 61 74 65 64 2c 20 61 6e 64 20  me created, and 
fa70: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  is.            /
fa80: 2f 20 20 20 20 20 20 20 72 65 6c 61 74 69 76 65  /       relative
fa90: 6c 79 20 65 78 70 65 6e 73 69 76 65 20 74 6f 20  ly expensive to 
faa0: 63 72 65 61 74 65 20 64 75 72 69 6e 67 20 70 72  create during pr
fab0: 65 6c 6f 61 64 69 6e 67 2e 20 54 68 69 73 20 6d  eloading. This m
fac0: 65 74 68 6f 64 20 69 73 20 6f 6e 6c 79 20 75 73  ethod is only us
fad0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ed.            /
fae0: 2f 20 20 20 20 20 20 20 77 68 65 6e 20 64 75 6d  /       when dum
faf0: 70 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ping a connectio
fb00: 6e 2c 20 77 68 69 63 68 20 69 73 20 61 20 72 61  n, which is a ra
fb10: 72 65 20 28 6d 61 69 6e 6c 79 20 65 72 72 6f 72  re (mainly error
fb20: 29 20 63 61 73 65 2e 20 53 6f 3a 0a 20 20 20 20  ) case. So:.    
fb30: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
fb40: 20 44 4f 20 4e 4f 54 20 43 41 43 48 45 2e 0a 20   DO NOT CACHE.. 
fb50: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
fb60: 6e 20 6e 65 77 20 53 69 6d 70 6c 65 44 61 74 65  n new SimpleDate
fb70: 46 6f 72 6d 61 74 28 22 79 79 79 79 2d 4d 4d 2d  Format("yyyy-MM-
fb80: 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 53 53 53 22  dd HH:mm:ss.SSS"
fb90: 29 2e 66 6f 72 6d 61 74 28 6e 65 77 20 44 61 74  ).format(new Dat
fba0: 65 28 6d 53 74 61 72 74 57 61 6c 6c 54 69 6d 65  e(mStartWallTime
fbb0: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
fbc0: 20 20 7d 0a 7d 0a                                  }.}.