SQLite Android Bindings

Hex Artifact Content
Login

Artifact 7755fac4940384ad50d5d414c20f67d0d9e68ed0:


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 2f 2a 20 69 6d 70 6f 72 74 20  ite;../* import 
0300: 64 61 6c 76 69 6b 2e 73 79 73 74 65 6d 2e 42 6c  dalvik.system.Bl
0310: 6f 63 6b 47 75 61 72 64 3b 20 2a 2f 0a 0a 69 6d  ockGuard; */..im
0320: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74  port android.dat
0330: 61 62 61 73 65 2e 43 75 72 73 6f 72 3b 0a 69 6d  abase.Cursor;.im
0340: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74  port android.dat
0350: 61 62 61 73 65 2e 43 75 72 73 6f 72 57 69 6e 64  abase.CursorWind
0360: 6f 77 3b 0a 2f 2f 20 57 65 20 75 73 65 20 61 20  ow;.// We use a 
0370: 6c 6f 63 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66  local version of
0380: 20 44 61 74 61 62 61 73 65 55 74 69 6c 73 20 77   DatabaseUtils w
0390: 68 69 63 68 20 69 6d 70 6c 65 6d 65 6e 74 73 20  hich implements 
03a0: 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 76 61 69  methods not avai
03b0: 6c 61 62 6c 65 20 69 6e 20 65 61 72 6c 69 65 72  lable in earlier
03c0: 20 41 50 49 73 0a 2f 2f 69 6d 70 6f 72 74 20 61   APIs.//import a
03d0: 6e 64 72 6f 69 64 2e 64 61 74 61 62 61 73 65 2e  ndroid.database.
03e0: 44 61 74 61 62 61 73 65 55 74 69 6c 73 3b 0a 69  DatabaseUtils;.i
03f0: 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65  mport org.sqlite
0400: 2e 64 61 74 61 62 61 73 65 2e 45 78 74 72 61 55  .database.ExtraU
0410: 74 69 6c 73 3b 0a 69 6d 70 6f 72 74 20 6f 72 67  tils;.import org
0420: 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65  .sqlite.database
0430: 2e 73 71 6c 69 74 65 2e 53 51 4c 69 74 65 44 65  .sqlite.SQLiteDe
0440: 62 75 67 2e 44 62 53 74 61 74 73 3b 0a 69 6d 70  bug.DbStats;.imp
0450: 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 6f  ort org.sqlite.o
0460: 73 2e 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  s.CancellationSi
0470: 67 6e 61 6c 3b 0a 69 6d 70 6f 72 74 20 6f 72 67  gnal;.import org
0480: 2e 73 71 6c 69 74 65 2e 6f 73 2e 4f 70 65 72 61  .sqlite.os.Opera
0490: 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63 65  tionCanceledExce
04a0: 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72 74 20 61 6e  ption;.import an
04b0: 64 72 6f 69 64 2e 6f 73 2e 50 61 72 63 65 6c 46  droid.os.ParcelF
04c0: 69 6c 65 44 65 73 63 72 69 70 74 6f 72 3b 0a 69  ileDescriptor;.i
04d0: 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 75 74  mport android.ut
04e0: 69 6c 2e 4c 6f 67 3b 0a 2f 2f 20 57 65 20 75 73  il.Log;.// We us
04f0: 65 20 61 20 6c 6f 63 61 6c 20 63 6f 70 79 20 6f  e a local copy o
0500: 66 20 4c 72 75 43 61 63 68 65 20 77 68 69 63 68  f LruCache which
0510: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
0520: 68 65 20 27 65 6c 64 65 73 74 27 20 6d 65 74 68  he 'eldest' meth
0530: 6f 64 20 6f 66 20 74 68 65 0a 2f 2f 20 6f 72 69  od of the.// ori
0540: 67 69 6e 61 6c 2c 20 62 75 74 20 75 73 65 73 20  ginal, but uses 
0550: 61 6e 20 69 74 65 72 61 74 6f 72 20 74 6f 20 67  an iterator to g
0560: 65 74 20 66 69 72 73 74 20 65 6e 74 72 79 0a 2f  et first entry./
0570: 2f 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e  /import android.
0580: 75 74 69 6c 2e 4c 72 75 43 61 63 68 65 3b 0a 69  util.LruCache;.i
0590: 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 75 74  mport android.ut
05a0: 69 6c 2e 50 72 69 6e 74 65 72 3b 0a 0a 69 6d 70  il.Printer;..imp
05b0: 6f 72 74 20 6a 61 76 61 2e 74 65 78 74 2e 53 69  ort java.text.Si
05c0: 6d 70 6c 65 44 61 74 65 46 6f 72 6d 61 74 3b 0a  mpleDateFormat;.
05d0: 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c  import java.util
05e0: 2e 41 72 72 61 79 4c 69 73 74 3b 0a 69 6d 70 6f  .ArrayList;.impo
05f0: 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 44 61 74  rt java.util.Dat
0600: 65 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75  e;.import java.u
0610: 74 69 6c 2e 4d 61 70 3b 0a 69 6d 70 6f 72 74 20  til.Map;.import 
0620: 6a 61 76 61 2e 75 74 69 6c 2e 72 65 67 65 78 2e  java.util.regex.
0630: 50 61 74 74 65 72 6e 3b 0a 0a 2f 2a 2a 0a 20 2a  Pattern;../**. *
0640: 20 52 65 70 72 65 73 65 6e 74 73 20 61 20 53 51   Represents a SQ
0650: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  Lite database co
0660: 6e 6e 65 63 74 69 6f 6e 2e 0a 20 2a 20 45 61 63  nnection.. * Eac
0670: 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 61  h connection wra
0680: 70 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ps an instance o
0690: 66 20 61 20 6e 61 74 69 76 65 20 3c 63 6f 64 65  f a native <code
06a0: 3e 73 71 6c 69 74 65 33 3c 2f 63 6f 64 65 3e 20  >sqlite3</code> 
06b0: 6f 62 6a 65 63 74 2e 0a 20 2a 20 3c 70 3e 0a 20  object.. * <p>. 
06c0: 2a 20 57 68 65 6e 20 64 61 74 61 62 61 73 65 20  * When database 
06d0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c 69  connection pooli
06e0: 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ng is enabled, t
06f0: 68 65 72 65 20 63 61 6e 20 62 65 20 6d 75 6c 74  here can be mult
0700: 69 70 6c 65 20 61 63 74 69 76 65 0a 20 2a 20 63  iple active. * c
0710: 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
0720: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
0730: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 72    Otherwise ther
0740: 65 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 6f  e is typically o
0750: 6e 6c 79 20 6f 6e 65 0a 20 2a 20 63 6f 6e 6e 65  nly one. * conne
0760: 63 74 69 6f 6e 20 70 65 72 20 64 61 74 61 62 61  ction per databa
0770: 73 65 2e 0a 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20  se.. * </p><p>. 
0780: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 69 74  * When the SQLit
0790: 65 20 57 41 4c 20 66 65 61 74 75 72 65 20 69 73  e WAL feature is
07a0: 20 65 6e 61 62 6c 65 64 2c 20 6d 75 6c 74 69 70   enabled, multip
07b0: 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 6f  le readers and o
07c0: 6e 65 20 77 72 69 74 65 72 0a 20 2a 20 63 61 6e  ne writer. * can
07d0: 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 61 63   concurrently ac
07e0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
07f0: 65 2e 20 20 57 69 74 68 6f 75 74 20 57 41 4c 2c  e.  Without WAL,
0800: 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
0810: 74 65 72 73 0a 20 2a 20 61 72 65 20 6d 75 74 75  ters. * are mutu
0820: 61 6c 6c 79 20 65 78 63 6c 75 73 69 76 65 2e 0a  ally exclusive..
0830: 20 2a 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 3c 68   * </p>. *. * <h
0840: 32 3e 4f 77 6e 65 72 73 68 69 70 20 61 6e 64 20  2>Ownership and 
0850: 63 6f 6e 63 75 72 72 65 6e 63 79 20 67 75 61 72  concurrency guar
0860: 61 6e 74 65 65 73 3c 2f 68 32 3e 0a 20 2a 20 3c  antees</h2>. * <
0870: 70 3e 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e  p>. * Connection
0880: 20 6f 62 6a 65 63 74 73 20 61 72 65 20 6e 6f 74   objects are not
0890: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 20 20 54   thread-safe.  T
08a0: 68 65 79 20 61 72 65 20 61 63 71 75 69 72 65 64  hey are acquired
08b0: 20 61 73 20 6e 65 65 64 65 64 20 74 6f 0a 20 2a   as needed to. *
08c0: 20 70 65 72 66 6f 72 6d 20 61 20 64 61 74 61 62   perform a datab
08d0: 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  ase operation an
08e0: 64 20 61 72 65 20 74 68 65 6e 20 72 65 74 75 72  d are then retur
08f0: 6e 65 64 20 74 6f 20 74 68 65 20 70 6f 6f 6c 2e  ned to the pool.
0900: 20 20 41 74 20 61 6e 79 0a 20 2a 20 67 69 76 65    At any. * give
0910: 6e 20 74 69 6d 65 2c 20 61 20 63 6f 6e 6e 65 63  n time, a connec
0920: 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6f  tion is either o
0930: 77 6e 65 64 20 61 6e 64 20 75 73 65 64 20 62 79  wned and used by
0940: 20 61 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65   a {@link SQLite
0950: 53 65 73 73 69 6f 6e 7d 0a 20 2a 20 6f 62 6a 65  Session}. * obje
0960: 63 74 20 6f 72 20 74 68 65 20 7b 40 6c 69 6e 6b  ct or the {@link
0970: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
0980: 6e 50 6f 6f 6c 7d 2e 20 20 54 68 6f 73 65 20 63  nPool}.  Those c
0990: 6c 61 73 73 65 73 20 61 72 65 0a 20 2a 20 72 65  lasses are. * re
09a0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
09b0: 72 69 61 6c 69 7a 69 6e 67 20 6f 70 65 72 61 74  rializing operat
09c0: 69 6f 6e 73 20 74 6f 20 67 75 61 72 64 20 61 67  ions to guard ag
09d0: 61 69 6e 73 74 20 63 6f 6e 63 75 72 72 65 6e 74  ainst concurrent
09e0: 0a 20 2a 20 75 73 65 20 6f 66 20 61 20 63 6f 6e  . * use of a con
09f0: 6e 65 63 74 69 6f 6e 2e 0a 20 2a 20 3c 2f 70 3e  nection.. * </p>
0a00: 3c 70 3e 0a 20 2a 20 54 68 65 20 67 75 61 72 61  <p>. * The guara
0a10: 6e 74 65 65 20 6f 66 20 68 61 76 69 6e 67 20 61  ntee of having a
0a20: 20 73 69 6e 67 6c 65 20 6f 77 6e 65 72 20 61 6c   single owner al
0a30: 6c 6f 77 73 20 74 68 69 73 20 63 6c 61 73 73 20  lows this class 
0a40: 74 6f 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  to be implemente
0a50: 64 0a 20 2a 20 77 69 74 68 6f 75 74 20 6c 6f 63  d. * without loc
0a60: 6b 73 20 61 6e 64 20 67 72 65 61 74 6c 79 20 73  ks and greatly s
0a70: 69 6d 70 6c 69 66 69 65 73 20 72 65 73 6f 75 72  implifies resour
0a80: 63 65 20 6d 61 6e 61 67 65 6d 65 6e 74 2e 0a 20  ce management.. 
0a90: 2a 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 3c 68 32  * </p>. *. * <h2
0aa0: 3e 45 6e 63 61 70 73 75 6c 61 74 69 6f 6e 20 67  >Encapsulation g
0ab0: 75 61 72 61 6e 74 65 65 73 3c 2f 68 32 3e 0a 20  uarantees</h2>. 
0ac0: 2a 20 3c 70 3e 0a 20 2a 20 54 68 65 20 63 6f 6e  * <p>. * The con
0ad0: 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 6f  nection object o
0ae0: 62 6a 65 63 74 20 6f 77 6e 73 20 2a 61 6c 6c 2a  bject owns *all*
0af0: 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65 20 72   of the SQLite r
0b00: 65 6c 61 74 65 64 20 6e 61 74 69 76 65 0a 20 2a  elated native. *
0b10: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 61 72   objects that ar
0b20: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
0b30: 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  h the connection
0b40: 2e 20 20 57 68 61 74 27 73 20 6d 6f 72 65 2c 20  .  What's more, 
0b50: 74 68 65 72 65 20 61 72 65 0a 20 2a 20 6e 6f 20  there are. * no 
0b60: 6f 74 68 65 72 20 6f 62 6a 65 63 74 73 20 69 6e  other objects in
0b70: 20 74 68 65 20 73 79 73 74 65 6d 20 74 68 61 74   the system that
0b80: 20 61 72 65 20 63 61 70 61 62 6c 65 20 6f 66 20   are capable of 
0b90: 6f 62 74 61 69 6e 69 6e 67 20 68 61 6e 64 6c 65  obtaining handle
0ba0: 73 20 74 6f 0a 20 2a 20 74 68 6f 73 65 20 6e 61  s to. * those na
0bb0: 74 69 76 65 20 6f 62 6a 65 63 74 73 2e 20 20 43  tive objects.  C
0bc0: 6f 6e 73 65 71 75 65 6e 74 6c 79 2c 20 77 68 65  onsequently, whe
0bd0: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
0be0: 20 69 73 20 63 6c 6f 73 65 64 2c 20 77 65 20 64   is closed, we d
0bf0: 6f 0a 20 2a 20 6e 6f 74 20 68 61 76 65 20 74 6f  o. * not have to
0c00: 20 77 6f 72 72 79 20 61 62 6f 75 74 20 77 68 61   worry about wha
0c10: 74 20 6f 74 68 65 72 20 63 6f 6d 70 6f 6e 65 6e  t other componen
0c20: 74 73 20 6d 69 67 68 74 20 68 61 76 65 20 72 65  ts might have re
0c30: 66 65 72 65 6e 63 65 73 20 74 6f 0a 20 2a 20 69  ferences to. * i
0c40: 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 53 51  ts associated SQ
0c50: 4c 69 74 65 20 73 74 61 74 65 20 2d 2d 20 74 68  Lite state -- th
0c60: 65 72 65 20 61 72 65 20 6e 6f 6e 65 2e 0a 20 2a  ere are none.. *
0c70: 20 3c 2f 70 3e 3c 70 3e 0a 20 2a 20 45 6e 63 61   </p><p>. * Enca
0c80: 70 73 75 6c 61 74 69 6f 6e 20 69 73 20 77 68 61  psulation is wha
0c90: 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  t ensures that t
0ca0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  he connection ob
0cb0: 6a 65 63 74 27 73 0a 20 2a 20 6c 69 66 65 63 79  ject's. * lifecy
0cc0: 63 6c 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 63  cle does not bec
0cd0: 6f 6d 65 20 61 20 74 6f 72 74 75 72 65 64 20 6d  ome a tortured m
0ce0: 65 73 73 20 6f 66 20 66 69 6e 61 6c 69 7a 65 72  ess of finalizer
0cf0: 73 20 61 6e 64 20 72 65 66 65 72 65 6e 63 65 0a  s and reference.
0d00: 20 2a 20 71 75 65 75 65 73 2e 0a 20 2a 20 3c 2f   * queues.. * </
0d10: 70 3e 0a 20 2a 0a 20 2a 20 3c 68 32 3e 52 65 65  p>. *. * <h2>Ree
0d20: 6e 74 72 61 6e 63 65 3c 2f 68 32 3e 0a 20 2a 20  ntrance</h2>. * 
0d30: 3c 70 3e 0a 20 2a 20 54 68 69 73 20 63 6c 61 73  <p>. * This clas
0d40: 73 20 6d 75 73 74 20 74 6f 6c 65 72 61 74 65 20  s must tolerate 
0d50: 72 65 65 6e 74 72 61 6e 74 20 65 78 65 63 75 74  reentrant execut
0d60: 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20 6f 70  ion of SQLite op
0d70: 65 72 61 74 69 6f 6e 73 20 62 65 63 61 75 73 65  erations because
0d80: 0a 20 2a 20 74 72 69 67 67 65 72 73 20 6d 61 79  . * triggers may
0d90: 20 63 61 6c 6c 20 63 75 73 74 6f 6d 20 53 51 4c   call custom SQL
0da0: 69 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ite functions th
0db0: 61 74 20 70 65 72 66 6f 72 6d 20 61 64 64 69 74  at perform addit
0dc0: 69 6f 6e 61 6c 20 71 75 65 72 69 65 73 2e 0a 20  ional queries.. 
0dd0: 2a 20 3c 2f 70 3e 0a 20 2a 0a 20 2a 20 40 68 69  * </p>. *. * @hi
0de0: 64 65 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 66 69  de. */.public fi
0df0: 6e 61 6c 20 63 6c 61 73 73 20 53 51 4c 69 74 65  nal class SQLite
0e00: 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6d 70 6c 65  Connection imple
0e10: 6d 65 6e 74 73 20 43 61 6e 63 65 6c 6c 61 74 69  ments Cancellati
0e20: 6f 6e 53 69 67 6e 61 6c 2e 4f 6e 43 61 6e 63 65  onSignal.OnCance
0e30: 6c 4c 69 73 74 65 6e 65 72 20 7b 0a 20 20 20 20  lListener {.    
0e40: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66  private static f
0e50: 69 6e 61 6c 20 53 74 72 69 6e 67 20 54 41 47 20  inal String TAG 
0e60: 3d 20 22 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  = "SQLiteConnect
0e70: 69 6f 6e 22 3b 0a 20 20 20 20 70 72 69 76 61 74  ion";.    privat
0e80: 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 62  e static final b
0e90: 6f 6f 6c 65 61 6e 20 44 45 42 55 47 20 3d 20 66  oolean DEBUG = f
0ea0: 61 6c 73 65 3b 0a 0a 20 20 20 20 70 72 69 76 61  alse;..    priva
0eb0: 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20  te static final 
0ec0: 53 74 72 69 6e 67 5b 5d 20 45 4d 50 54 59 5f 53  String[] EMPTY_S
0ed0: 54 52 49 4e 47 5f 41 52 52 41 59 20 3d 20 6e 65  TRING_ARRAY = ne
0ee0: 77 20 53 74 72 69 6e 67 5b 30 5d 3b 0a 20 20 20  w String[0];.   
0ef0: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
0f00: 66 69 6e 61 6c 20 62 79 74 65 5b 5d 20 45 4d 50  final byte[] EMP
0f10: 54 59 5f 42 59 54 45 5f 41 52 52 41 59 20 3d 20  TY_BYTE_ARRAY = 
0f20: 6e 65 77 20 62 79 74 65 5b 30 5d 3b 0a 0a 20 20  new byte[0];..  
0f30: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
0f40: 20 66 69 6e 61 6c 20 50 61 74 74 65 72 6e 20 54   final Pattern T
0f50: 52 49 4d 5f 53 51 4c 5f 50 41 54 54 45 52 4e 20  RIM_SQL_PATTERN 
0f60: 3d 20 50 61 74 74 65 72 6e 2e 63 6f 6d 70 69 6c  = Pattern.compil
0f70: 65 28 22 5b 5c 5c 73 5d 2a 5c 5c 6e 2b 5b 5c 5c  e("[\\s]*\\n+[\\
0f80: 73 5d 2a 22 29 3b 0a 0a 20 20 20 20 70 72 69 76  s]*");..    priv
0f90: 61 74 65 20 66 69 6e 61 6c 20 43 6c 6f 73 65 47  ate final CloseG
0fa0: 75 61 72 64 20 6d 43 6c 6f 73 65 47 75 61 72 64  uard mCloseGuard
0fb0: 20 3d 20 43 6c 6f 73 65 47 75 61 72 64 2e 67 65   = CloseGuard.ge
0fc0: 74 28 29 3b 0a 0a 20 20 20 20 70 72 69 76 61 74  t();..    privat
0fd0: 65 20 66 69 6e 61 6c 20 53 51 4c 69 74 65 43 6f  e final SQLiteCo
0fe0: 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20 6d 50 6f  nnectionPool mPo
0ff0: 6f 6c 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20  ol;.    private 
1000: 66 69 6e 61 6c 20 53 51 4c 69 74 65 44 61 74 61  final SQLiteData
1010: 62 61 73 65 43 6f 6e 66 69 67 75 72 61 74 69 6f  baseConfiguratio
1020: 6e 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n mConfiguration
1030: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 66 69  ;.    private fi
1040: 6e 61 6c 20 69 6e 74 20 6d 43 6f 6e 6e 65 63 74  nal int mConnect
1050: 69 6f 6e 49 64 3b 0a 20 20 20 20 70 72 69 76 61  ionId;.    priva
1060: 74 65 20 66 69 6e 61 6c 20 62 6f 6f 6c 65 61 6e  te final boolean
1070: 20 6d 49 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65   mIsPrimaryConne
1080: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 72 69 76 61  ction;.    priva
1090: 74 65 20 66 69 6e 61 6c 20 62 6f 6f 6c 65 61 6e  te final boolean
10a0: 20 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e   mIsReadOnlyConn
10b0: 65 63 74 69 6f 6e 3b 0a 20 20 20 20 70 72 69 76  ection;.    priv
10c0: 61 74 65 20 66 69 6e 61 6c 20 50 72 65 70 61 72  ate final Prepar
10d0: 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65  edStatementCache
10e0: 20 6d 50 72 65 70 61 72 65 64 53 74 61 74 65 6d   mPreparedStatem
10f0: 65 6e 74 43 61 63 68 65 3b 0a 20 20 20 20 70 72  entCache;.    pr
1100: 69 76 61 74 65 20 50 72 65 70 61 72 65 64 53 74  ivate PreparedSt
1110: 61 74 65 6d 65 6e 74 20 6d 50 72 65 70 61 72 65  atement mPrepare
1120: 64 53 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 3b 0a  dStatementPool;.
1130: 0a 20 20 20 20 2f 2f 20 54 68 65 20 72 65 63 65  .    // The rece
1140: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6c 6f  nt operations lo
1150: 67 2e 0a 20 20 20 20 70 72 69 76 61 74 65 20 66  g..    private f
1160: 69 6e 61 6c 20 4f 70 65 72 61 74 69 6f 6e 4c 6f  inal OperationLo
1170: 67 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69  g mRecentOperati
1180: 6f 6e 73 20 3d 20 6e 65 77 20 4f 70 65 72 61 74  ons = new Operat
1190: 69 6f 6e 4c 6f 67 28 29 3b 0a 0a 20 20 20 20 2f  ionLog();..    /
11a0: 2f 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c  / The native SQL
11b0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f  iteConnection po
11c0: 69 6e 74 65 72 2e 20 20 28 46 4f 52 20 49 4e 54  inter.  (FOR INT
11d0: 45 52 4e 41 4c 20 55 53 45 20 4f 4e 4c 59 29 0a  ERNAL USE ONLY).
11e0: 20 20 20 20 70 72 69 76 61 74 65 20 6c 6f 6e 67      private long
11f0: 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 3b   mConnectionPtr;
1200: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f  ..    private bo
1210: 6f 6c 65 61 6e 20 6d 4f 6e 6c 79 41 6c 6c 6f 77  olean mOnlyAllow
1220: 52 65 61 64 4f 6e 6c 79 4f 70 65 72 61 74 69 6f  ReadOnlyOperatio
1230: 6e 73 3b 0a 0a 20 20 20 20 2f 2f 20 54 68 65 20  ns;..    // The 
1240: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
1250: 61 74 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69  attachCancellati
1260: 6f 6e 53 69 67 6e 61 6c 20 68 61 73 20 62 65 65  onSignal has bee
1270: 6e 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2f 2f  n called..    //
1280: 20 42 65 63 61 75 73 65 20 53 51 4c 69 74 65 20   Because SQLite 
1290: 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74  statement execut
12a0: 69 6f 6e 20 63 61 6e 20 62 65 20 72 65 65 6e 74  ion can be reent
12b0: 72 61 6e 74 2c 20 77 65 20 6b 65 65 70 20 74 72  rant, we keep tr
12c0: 61 63 6b 20 6f 66 20 68 6f 77 20 6d 61 6e 79 0a  ack of how many.
12d0: 20 20 20 20 2f 2f 20 74 69 6d 65 73 20 77 65 20      // times we 
12e0: 68 61 76 65 20 61 74 74 65 6d 70 74 65 64 20 74  have attempted t
12f0: 6f 20 61 74 74 61 63 68 20 61 20 63 61 6e 63 65  o attach a cance
1300: 6c 6c 61 74 69 6f 6e 20 73 69 67 6e 61 6c 20 74  llation signal t
1310: 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
1320: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2f 2f 20   so that.    // 
1330: 77 65 20 63 61 6e 20 65 6e 73 75 72 65 20 74 68  we can ensure th
1340: 61 74 20 77 65 20 64 65 74 61 63 68 20 74 68 65  at we detach the
1350: 20 73 69 67 6e 61 6c 20 61 74 20 74 68 65 20 72   signal at the r
1360: 69 67 68 74 20 74 69 6d 65 2e 0a 20 20 20 20 70  ight time..    p
1370: 72 69 76 61 74 65 20 69 6e 74 20 6d 43 61 6e 63  rivate int mCanc
1380: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 41 74  ellationSignalAt
1390: 74 61 63 68 43 6f 75 6e 74 3b 0a 0a 20 20 20 20  tachCount;..    
13a0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e  private static n
13b0: 61 74 69 76 65 20 6c 6f 6e 67 20 6e 61 74 69 76  ative long nativ
13c0: 65 4f 70 65 6e 28 53 74 72 69 6e 67 20 70 61 74  eOpen(String pat
13d0: 68 2c 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  h, int openFlags
13e0: 2c 20 53 74 72 69 6e 67 20 6c 61 62 65 6c 2c 0a  , String label,.
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
1400: 65 61 6e 20 65 6e 61 62 6c 65 54 72 61 63 65 2c  ean enableTrace,
1410: 20 62 6f 6f 6c 65 61 6e 20 65 6e 61 62 6c 65 50   boolean enableP
1420: 72 6f 66 69 6c 65 29 3b 0a 20 20 20 20 70 72 69  rofile);.    pri
1430: 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69  vate static nati
1440: 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65 43 6c  ve void nativeCl
1450: 6f 73 65 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74  ose(long connect
1460: 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 70 72 69  ionPtr);.    pri
1470: 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69  vate static nati
1480: 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65 52 65  ve void nativeRe
1490: 67 69 73 74 65 72 43 75 73 74 6f 6d 46 75 6e 63  gisterCustomFunc
14a0: 74 69 6f 6e 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  tion(long connec
14b0: 74 69 6f 6e 50 74 72 2c 0a 20 20 20 20 20 20 20  tionPtr,.       
14c0: 20 20 20 20 20 53 51 4c 69 74 65 43 75 73 74 6f       SQLiteCusto
14d0: 6d 46 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  mFunction functi
14e0: 6f 6e 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65  on);.    private
14f0: 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76   static native v
1500: 6f 69 64 20 6e 61 74 69 76 65 52 65 67 69 73 74  oid nativeRegist
1510: 65 72 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61  erLocalizedColla
1520: 74 6f 72 73 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  tors(long connec
1530: 74 69 6f 6e 50 74 72 2c 20 53 74 72 69 6e 67 20  tionPtr, String 
1540: 6c 6f 63 61 6c 65 29 3b 0a 20 20 20 20 70 72 69  locale);.    pri
1550: 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69  vate static nati
1560: 76 65 20 6c 6f 6e 67 20 6e 61 74 69 76 65 50 72  ve long nativePr
1570: 65 70 61 72 65 53 74 61 74 65 6d 65 6e 74 28 6c  epareStatement(l
1580: 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ong connectionPt
1590: 72 2c 20 53 74 72 69 6e 67 20 73 71 6c 29 3b 0a  r, String sql);.
15a0: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
15b0: 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e  ic native void n
15c0: 61 74 69 76 65 46 69 6e 61 6c 69 7a 65 53 74 61  ativeFinalizeSta
15d0: 74 65 6d 65 6e 74 28 6c 6f 6e 67 20 63 6f 6e 6e  tement(long conn
15e0: 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20  ectionPtr, long 
15f0: 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20  statementPtr);. 
1600: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
1610: 63 20 6e 61 74 69 76 65 20 69 6e 74 20 6e 61 74  c native int nat
1620: 69 76 65 47 65 74 50 61 72 61 6d 65 74 65 72 43  iveGetParameterC
1630: 6f 75 6e 74 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  ount(long connec
1640: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
1650: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20  atementPtr);.   
1660: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1670: 6e 61 74 69 76 65 20 62 6f 6f 6c 65 61 6e 20 6e  native boolean n
1680: 61 74 69 76 65 49 73 52 65 61 64 4f 6e 6c 79 28  ativeIsReadOnly(
1690: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
16a0: 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  tr, long stateme
16b0: 6e 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76  ntPtr);.    priv
16c0: 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76  ate static nativ
16d0: 65 20 69 6e 74 20 6e 61 74 69 76 65 47 65 74 43  e int nativeGetC
16e0: 6f 6c 75 6d 6e 43 6f 75 6e 74 28 6c 6f 6e 67 20  olumnCount(long 
16f0: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c  connectionPtr, l
1700: 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72  ong statementPtr
1710: 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  );.    private s
1720: 74 61 74 69 63 20 6e 61 74 69 76 65 20 53 74 72  tatic native Str
1730: 69 6e 67 20 6e 61 74 69 76 65 47 65 74 43 6f 6c  ing nativeGetCol
1740: 75 6d 6e 4e 61 6d 65 28 6c 6f 6e 67 20 63 6f 6e  umnName(long con
1750: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67  nectionPtr, long
1760: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 0a 20   statementPtr,. 
1770: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1780: 6e 64 65 78 29 3b 0a 20 20 20 20 70 72 69 76 61  ndex);.    priva
1790: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
17a0: 20 76 6f 69 64 20 6e 61 74 69 76 65 42 69 6e 64   void nativeBind
17b0: 4e 75 6c 6c 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  Null(long connec
17c0: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
17d0: 61 74 65 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20  atementPtr,.    
17e0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 64 65          int inde
17f0: 78 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20  x);.    private 
1800: 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f  static native vo
1810: 69 64 20 6e 61 74 69 76 65 42 69 6e 64 4c 6f 6e  id nativeBindLon
1820: 67 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  g(long connectio
1830: 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65  nPtr, long state
1840: 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20 20 20 20  mentPtr,.       
1850: 20 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20       int index, 
1860: 6c 6f 6e 67 20 76 61 6c 75 65 29 3b 0a 20 20 20  long value);.   
1870: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1880: 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69  native void nati
1890: 76 65 42 69 6e 64 44 6f 75 62 6c 65 28 6c 6f 6e  veBindDouble(lon
18a0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  g connectionPtr,
18b0: 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50   long statementP
18c0: 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
18d0: 69 6e 74 20 69 6e 64 65 78 2c 20 64 6f 75 62 6c  int index, doubl
18e0: 65 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 70 72  e value);.    pr
18f0: 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74  ivate static nat
1900: 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65 42  ive void nativeB
1910: 69 6e 64 53 74 72 69 6e 67 28 6c 6f 6e 67 20 63  indString(long c
1920: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f  onnectionPtr, lo
1930: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c  ng statementPtr,
1940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1950: 20 69 6e 64 65 78 2c 20 53 74 72 69 6e 67 20 76   index, String v
1960: 61 6c 75 65 29 3b 0a 20 20 20 20 70 72 69 76 61  alue);.    priva
1970: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
1980: 20 76 6f 69 64 20 6e 61 74 69 76 65 42 69 6e 64   void nativeBind
1990: 42 6c 6f 62 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  Blob(long connec
19a0: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
19b0: 61 74 65 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20  atementPtr,.    
19c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 64 65          int inde
19d0: 78 2c 20 62 79 74 65 5b 5d 20 76 61 6c 75 65 29  x, byte[] value)
19e0: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
19f0: 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64  atic native void
1a00: 20 6e 61 74 69 76 65 52 65 73 65 74 53 74 61 74   nativeResetStat
1a10: 65 6d 65 6e 74 41 6e 64 43 6c 65 61 72 42 69 6e  ementAndClearBin
1a20: 64 69 6e 67 73 28 0a 20 20 20 20 20 20 20 20 20  dings(.         
1a30: 20 20 20 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69     long connecti
1a40: 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74  onPtr, long stat
1a50: 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 70  ementPtr);.    p
1a60: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61  rivate static na
1a70: 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65  tive void native
1a80: 45 78 65 63 75 74 65 28 6c 6f 6e 67 20 63 6f 6e  Execute(long con
1a90: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67  nectionPtr, long
1aa0: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a   statementPtr);.
1ab0: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1ac0: 69 63 20 6e 61 74 69 76 65 20 6c 6f 6e 67 20 6e  ic native long n
1ad0: 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 4c  ativeExecuteForL
1ae0: 6f 6e 67 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74  ong(long connect
1af0: 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61  ionPtr, long sta
1b00: 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20  tementPtr);.    
1b10: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e  private static n
1b20: 61 74 69 76 65 20 53 74 72 69 6e 67 20 6e 61 74  ative String nat
1b30: 69 76 65 45 78 65 63 75 74 65 46 6f 72 53 74 72  iveExecuteForStr
1b40: 69 6e 67 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74  ing(long connect
1b50: 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61  ionPtr, long sta
1b60: 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20  tementPtr);.    
1b70: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e  private static n
1b80: 61 74 69 76 65 20 69 6e 74 20 6e 61 74 69 76 65  ative int native
1b90: 45 78 65 63 75 74 65 46 6f 72 42 6c 6f 62 46 69  ExecuteForBlobFi
1ba0: 6c 65 44 65 73 63 72 69 70 74 6f 72 28 0a 20 20  leDescriptor(.  
1bb0: 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 63            long c
1bc0: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f  onnectionPtr, lo
1bd0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29  ng statementPtr)
1be0: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
1bf0: 61 74 69 63 20 6e 61 74 69 76 65 20 69 6e 74 20  atic native int 
1c00: 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72  nativeExecuteFor
1c10: 43 68 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74 28  ChangedRowCount(
1c20: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
1c30: 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  tr, long stateme
1c40: 6e 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76  ntPtr);.    priv
1c50: 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76  ate static nativ
1c60: 65 20 6c 6f 6e 67 20 6e 61 74 69 76 65 45 78 65  e long nativeExe
1c70: 63 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72  cuteForLastInser
1c80: 74 65 64 52 6f 77 49 64 28 0a 20 20 20 20 20 20  tedRowId(.      
1c90: 20 20 20 20 20 20 6c 6f 6e 67 20 63 6f 6e 6e 65        long conne
1ca0: 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73  ctionPtr, long s
1cb0: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20  tatementPtr);.  
1cc0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1cd0: 20 6e 61 74 69 76 65 20 6c 6f 6e 67 20 6e 61 74   native long nat
1ce0: 69 76 65 45 78 65 63 75 74 65 46 6f 72 43 75 72  iveExecuteForCur
1cf0: 73 6f 72 57 69 6e 64 6f 77 28 0a 20 20 20 20 20  sorWindow(.     
1d00: 20 20 20 20 20 20 20 6c 6f 6e 67 20 63 6f 6e 6e         long conn
1d10: 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20  ectionPtr, long 
1d20: 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 43 75  statementPtr, Cu
1d30: 72 73 6f 72 57 69 6e 64 6f 77 20 77 69 6e 2c 0a  rsorWindow win,.
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1d50: 73 74 61 72 74 50 6f 73 2c 20 69 6e 74 20 72 65  startPos, int re
1d60: 71 75 69 72 65 64 50 6f 73 2c 20 62 6f 6f 6c 65  quiredPos, boole
1d70: 61 6e 20 63 6f 75 6e 74 41 6c 6c 52 6f 77 73 29  an countAllRows)
1d80: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
1d90: 61 74 69 63 20 6e 61 74 69 76 65 20 69 6e 74 20  atic native int 
1da0: 6e 61 74 69 76 65 47 65 74 44 62 4c 6f 6f 6b 61  nativeGetDbLooka
1db0: 73 69 64 65 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  side(long connec
1dc0: 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 70 72  tionPtr);.    pr
1dd0: 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74  ivate static nat
1de0: 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65 43  ive void nativeC
1df0: 61 6e 63 65 6c 28 6c 6f 6e 67 20 63 6f 6e 6e 65  ancel(long conne
1e00: 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 70  ctionPtr);.    p
1e10: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61  rivate static na
1e20: 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65  tive void native
1e30: 52 65 73 65 74 43 61 6e 63 65 6c 28 6c 6f 6e 67  ResetCancel(long
1e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20   connectionPtr, 
1e50: 62 6f 6f 6c 65 61 6e 20 63 61 6e 63 65 6c 61 62  boolean cancelab
1e60: 6c 65 29 3b 0a 0a 20 20 20 20 70 72 69 76 61 74  le);..    privat
1e70: 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20  e static native 
1e80: 62 6f 6f 6c 65 61 6e 20 6e 61 74 69 76 65 48 61  boolean nativeHa
1e90: 73 43 6f 64 65 63 28 29 3b 0a 20 20 20 20 70 75  sCodec();.    pu
1ea0: 62 6c 69 63 20 73 74 61 74 69 63 20 62 6f 6f 6c  blic static bool
1eb0: 65 61 6e 20 68 61 73 43 6f 64 65 63 28 29 7b 20  ean hasCodec(){ 
1ec0: 72 65 74 75 72 6e 20 6e 61 74 69 76 65 48 61 73  return nativeHas
1ed0: 43 6f 64 65 63 28 29 3b 20 7d 0a 0a 20 20 20 20  Codec(); }..    
1ee0: 70 72 69 76 61 74 65 20 53 51 4c 69 74 65 43 6f  private SQLiteCo
1ef0: 6e 6e 65 63 74 69 6f 6e 28 53 51 4c 69 74 65 43  nnection(SQLiteC
1f00: 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20 70 6f  onnectionPool po
1f10: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
1f20: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 43 6f  SQLiteDatabaseCo
1f30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66  nfiguration conf
1f40: 69 67 75 72 61 74 69 6f 6e 2c 0a 20 20 20 20 20  iguration,.     
1f50: 20 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 6e 65         int conne
1f60: 63 74 69 6f 6e 49 64 2c 20 62 6f 6f 6c 65 61 6e  ctionId, boolean
1f70: 20 70 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69   primaryConnecti
1f80: 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 6d 50  on) {.        mP
1f90: 6f 6f 6c 20 3d 20 70 6f 6f 6c 3b 0a 20 20 20 20  ool = pool;.    
1fa0: 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74 69      mConfigurati
1fb0: 6f 6e 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 44  on = new SQLiteD
1fc0: 61 74 61 62 61 73 65 43 6f 6e 66 69 67 75 72 61  atabaseConfigura
1fd0: 74 69 6f 6e 28 63 6f 6e 66 69 67 75 72 61 74 69  tion(configurati
1fe0: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 6d 43 6f  on);.        mCo
1ff0: 6e 6e 65 63 74 69 6f 6e 49 64 20 3d 20 63 6f 6e  nnectionId = con
2000: 6e 65 63 74 69 6f 6e 49 64 3b 0a 20 20 20 20 20  nectionId;.     
2010: 20 20 20 6d 49 73 50 72 69 6d 61 72 79 43 6f 6e     mIsPrimaryCon
2020: 6e 65 63 74 69 6f 6e 20 3d 20 70 72 69 6d 61 72  nection = primar
2030: 79 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 20 20 20  yConnection;.   
2040: 20 20 20 20 20 6d 49 73 52 65 61 64 4f 6e 6c 79       mIsReadOnly
2050: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 28 63 6f  Connection = (co
2060: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6f 70 65 6e  nfiguration.open
2070: 46 6c 61 67 73 20 26 20 53 51 4c 69 74 65 44 61  Flags & SQLiteDa
2080: 74 61 62 61 73 65 2e 4f 50 45 4e 5f 52 45 41 44  tabase.OPEN_READ
2090: 4f 4e 4c 59 29 20 21 3d 20 30 3b 0a 20 20 20 20  ONLY) != 0;.    
20a0: 20 20 20 20 6d 50 72 65 70 61 72 65 64 53 74 61      mPreparedSta
20b0: 74 65 6d 65 6e 74 43 61 63 68 65 20 3d 20 6e 65  tementCache = ne
20c0: 77 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  w PreparedStatem
20d0: 65 6e 74 43 61 63 68 65 28 0a 20 20 20 20 20 20  entCache(.      
20e0: 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 66 69            mConfi
20f0: 67 75 72 61 74 69 6f 6e 2e 6d 61 78 53 71 6c 43  guration.maxSqlC
2100: 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  acheSize);.     
2110: 20 20 20 6d 43 6c 6f 73 65 47 75 61 72 64 2e 6f     mCloseGuard.o
2120: 70 65 6e 28 22 63 6c 6f 73 65 22 29 3b 0a 20 20  pen("close");.  
2130: 20 20 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72 69    }..    @Overri
2140: 64 65 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64  de.    protected
2150: 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 28 29   void finalize()
2160: 20 74 68 72 6f 77 73 20 54 68 72 6f 77 61 62 6c   throws Throwabl
2170: 65 20 7b 0a 20 20 20 20 20 20 20 20 74 72 79 20  e {.        try 
2180: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2190: 20 28 6d 50 6f 6f 6c 20 21 3d 20 6e 75 6c 6c 20   (mPool != null 
21a0: 26 26 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74  && mConnectionPt
21b0: 72 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  r != 0) {.      
21c0: 20 20 20 20 20 20 20 20 20 20 6d 50 6f 6f 6c 2e            mPool.
21d0: 6f 6e 43 6f 6e 6e 65 63 74 69 6f 6e 4c 65 61 6b  onConnectionLeak
21e0: 65 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed();.          
21f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2200: 20 64 69 73 70 6f 73 65 28 74 72 75 65 29 3b 0a   dispose(true);.
2210: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
2220: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
2230: 73 75 70 65 72 2e 66 69 6e 61 6c 69 7a 65 28 29  super.finalize()
2240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2250: 7d 0a 0a 20 20 20 20 2f 2f 20 43 61 6c 6c 65 64  }..    // Called
2260: 20 62 79 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63   by SQLiteConnec
2270: 74 69 6f 6e 50 6f 6f 6c 20 6f 6e 6c 79 2e 0a 20  tionPool only.. 
2280: 20 20 20 73 74 61 74 69 63 20 53 51 4c 69 74 65     static SQLite
2290: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 28  Connection open(
22a0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
22b0: 50 6f 6f 6c 20 70 6f 6f 6c 2c 0a 20 20 20 20 20  Pool pool,.     
22c0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 44 61 74         SQLiteDat
22d0: 61 62 61 73 65 43 6f 6e 66 69 67 75 72 61 74 69  abaseConfigurati
22e0: 6f 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  on configuration
22f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ,.            in
2300: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 64 2c 20  t connectionId, 
2310: 62 6f 6f 6c 65 61 6e 20 70 72 69 6d 61 72 79 43  boolean primaryC
2320: 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20  onnection) {.   
2330: 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65       SQLiteConne
2340: 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ction connection
2350: 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 43 6f 6e   = new SQLiteCon
2360: 6e 65 63 74 69 6f 6e 28 70 6f 6f 6c 2c 20 63 6f  nection(pool, co
2370: 6e 66 69 67 75 72 61 74 69 6f 6e 2c 0a 20 20 20  nfiguration,.   
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2390: 6e 65 63 74 69 6f 6e 49 64 2c 20 70 72 69 6d 61  nectionId, prima
23a0: 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20  ryConnection);. 
23b0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
23c0: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
23d0: 69 6f 6e 2e 6f 70 65 6e 28 29 3b 0a 20 20 20 20  ion.open();.    
23e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
23f0: 6f 6e 6e 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  onnection;.     
2400: 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69     } catch (SQLi
2410: 74 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20  teException ex) 
2420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2430: 6e 6e 65 63 74 69 6f 6e 2e 64 69 73 70 6f 73 65  nnection.dispose
2440: 28 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  (false);.       
2450: 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20       throw ex;. 
2460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
2470: 20 20 20 20 2f 2f 20 43 61 6c 6c 65 64 20 62 79      // Called by
2480: 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
2490: 6e 50 6f 6f 6c 20 6f 6e 6c 79 2e 0a 20 20 20 20  nPool only..    
24a0: 2f 2f 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61  // Closes the da
24b0: 74 61 62 61 73 65 20 63 6c 6f 73 65 73 20 61 6e  tabase closes an
24c0: 64 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20 6f  d releases all o
24d0: 66 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  f its associated
24e0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
24f0: 2f 2f 20 44 6f 20 6e 6f 74 20 63 61 6c 6c 20 6d  // Do not call m
2500: 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 20 63 6f  ethods on the co
2510: 6e 6e 65 63 74 69 6f 6e 20 61 66 74 65 72 20 69  nnection after i
2520: 74 20 69 73 20 63 6c 6f 73 65 64 2e 20 20 49 74  t is closed.  It
2530: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 63   will probably c
2540: 72 61 73 68 2e 0a 20 20 20 20 76 6f 69 64 20 63  rash..    void c
2550: 6c 6f 73 65 28 29 20 7b 0a 20 20 20 20 20 20 20  lose() {.       
2560: 20 64 69 73 70 6f 73 65 28 66 61 6c 73 65 29 3b   dispose(false);
2570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  .    }..    priv
2580: 61 74 65 20 76 6f 69 64 20 6f 70 65 6e 28 29 20  ate void open() 
2590: 7b 0a 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65  {.        mConne
25a0: 63 74 69 6f 6e 50 74 72 20 3d 20 6e 61 74 69 76  ctionPtr = nativ
25b0: 65 4f 70 65 6e 28 6d 43 6f 6e 66 69 67 75 72 61  eOpen(mConfigura
25c0: 74 69 6f 6e 2e 70 61 74 68 2c 20 6d 43 6f 6e 66  tion.path, mConf
25d0: 69 67 75 72 61 74 69 6f 6e 2e 6f 70 65 6e 46 6c  iguration.openFl
25e0: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
25f0: 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74       mConfigurat
2600: 69 6f 6e 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  ion.label,.     
2610: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
2620: 65 44 65 62 75 67 2e 44 45 42 55 47 5f 53 51 4c  eDebug.DEBUG_SQL
2630: 5f 53 54 41 54 45 4d 45 4e 54 53 2c 20 53 51 4c  _STATEMENTS, SQL
2640: 69 74 65 44 65 62 75 67 2e 44 45 42 55 47 5f 53  iteDebug.DEBUG_S
2650: 51 4c 5f 54 49 4d 45 29 3b 0a 0a 20 20 20 20 20  QL_TIME);..     
2660: 20 20 20 73 65 74 50 61 67 65 53 69 7a 65 28 29     setPageSize()
2670: 3b 0a 20 20 20 20 20 20 20 20 73 65 74 46 6f 72  ;.        setFor
2680: 65 69 67 6e 4b 65 79 4d 6f 64 65 46 72 6f 6d 43  eignKeyModeFromC
2690: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29 3b 0a  onfiguration();.
26a0: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 75 72 6e          setJourn
26b0: 61 6c 53 69 7a 65 4c 69 6d 69 74 28 29 3b 0a 09  alSizeLimit();..
26c0: 73 65 74 41 75 74 6f 43 68 65 63 6b 70 6f 69 6e  setAutoCheckpoin
26d0: 74 49 6e 74 65 72 76 61 6c 28 29 3b 0a 09 69 66  tInterval();..if
26e0: 28 20 21 6e 61 74 69 76 65 48 61 73 43 6f 64 65  ( !nativeHasCode
26f0: 63 28 29 20 29 7b 0a 09 20 20 73 65 74 57 61 6c  c() ){..  setWal
2700: 4d 6f 64 65 46 72 6f 6d 43 6f 6e 66 69 67 75 72  ModeFromConfigur
2710: 61 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20  ation();.       
2720: 20 20 20 73 65 74 4c 6f 63 61 6c 65 46 72 6f 6d     setLocaleFrom
2730: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29 3b  Configuration();
2740: 0a 09 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ..}..        // 
2750: 52 65 67 69 73 74 65 72 20 63 75 73 74 6f 6d 20  Register custom 
2760: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20 20  functions..     
2770: 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 66 75 6e     final int fun
2780: 63 74 69 6f 6e 43 6f 75 6e 74 20 3d 20 6d 43 6f  ctionCount = mCo
2790: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 75 73 74  nfiguration.cust
27a0: 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e 73 69 7a 65  omFunctions.size
27b0: 28 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ();.        for 
27c0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
27d0: 66 75 6e 63 74 69 6f 6e 43 6f 75 6e 74 3b 20 69  functionCount; i
27e0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
27f0: 20 20 53 51 4c 69 74 65 43 75 73 74 6f 6d 46 75    SQLiteCustomFu
2800: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
2810: 3d 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  = mConfiguration
2820: 2e 63 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 73  .customFunctions
2830: 2e 67 65 74 28 69 29 3b 0a 20 20 20 20 20 20 20  .get(i);.       
2840: 20 20 20 20 20 6e 61 74 69 76 65 52 65 67 69 73       nativeRegis
2850: 74 65 72 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f  terCustomFunctio
2860: 6e 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  n(mConnectionPtr
2870: 2c 20 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  , function);.   
2880: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2890: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 64    private void d
28a0: 69 73 70 6f 73 65 28 62 6f 6f 6c 65 61 6e 20 66  ispose(boolean f
28b0: 69 6e 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20  inalized) {.    
28c0: 20 20 20 20 69 66 20 28 6d 43 6c 6f 73 65 47 75      if (mCloseGu
28d0: 61 72 64 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20  ard != null) {. 
28e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66             if (f
28f0: 69 6e 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20  inalized) {.    
2900: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6c 6f              mClo
2910: 73 65 47 75 61 72 64 2e 77 61 72 6e 49 66 4f 70  seGuard.warnIfOp
2920: 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  en();.          
2930: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2940: 6d 43 6c 6f 73 65 47 75 61 72 64 2e 63 6c 6f 73  mCloseGuard.clos
2950: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e();.        }..
2960: 20 20 20 20 20 20 20 20 69 66 20 28 6d 43 6f 6e          if (mCon
2970: 6e 65 63 74 69 6f 6e 50 74 72 20 21 3d 20 30 29  nectionPtr != 0)
2980: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
2990: 69 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20  inal int cookie 
29a0: 3d 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69  = mRecentOperati
29b0: 6f 6e 73 2e 62 65 67 69 6e 4f 70 65 72 61 74 69  ons.beginOperati
29c0: 6f 6e 28 22 63 6c 6f 73 65 22 2c 20 6e 75 6c 6c  on("close", null
29d0: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
29e0: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
29f0: 20 20 20 20 20 20 20 20 20 20 20 6d 50 72 65 70             mPrep
2a00: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63  aredStatementCac
2a10: 68 65 2e 65 76 69 63 74 41 6c 6c 28 29 3b 0a 20  he.evictAll();. 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2a30: 61 74 69 76 65 43 6c 6f 73 65 28 6d 43 6f 6e 6e  ativeClose(mConn
2a40: 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20  ectionPtr);.    
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6e              mCon
2a60: 6e 65 63 74 69 6f 6e 50 74 72 20 3d 20 30 3b 0a  nectionPtr = 0;.
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69              } fi
2a80: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
2a90: 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74 4f          mRecentO
2aa0: 70 65 72 61 74 69 6f 6e 73 2e 65 6e 64 4f 70 65  perations.endOpe
2ab0: 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 29 3b 0a  ration(cookie);.
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2ae0: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
2af0: 73 65 74 50 61 67 65 53 69 7a 65 28 29 20 7b 0a  setPageSize() {.
2b00: 20 20 20 20 20 20 20 20 69 66 20 28 21 6d 43 6f          if (!mCo
2b10: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 69 73 49 6e  nfiguration.isIn
2b20: 4d 65 6d 6f 72 79 44 62 28 29 20 26 26 20 21 6d  MemoryDb() && !m
2b30: 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63  IsReadOnlyConnec
2b40: 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tion) {.        
2b50: 20 20 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20 6e      final long n
2b60: 65 77 56 61 6c 75 65 20 3d 20 53 51 4c 69 74 65  ewValue = SQLite
2b70: 47 6c 6f 62 61 6c 2e 67 65 74 44 65 66 61 75 6c  Global.getDefaul
2b80: 74 50 61 67 65 53 69 7a 65 28 29 3b 0a 20 20 20  tPageSize();.   
2b90: 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 76 61           long va
2ba0: 6c 75 65 20 3d 20 65 78 65 63 75 74 65 46 6f 72  lue = executeFor
2bb0: 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 70 61 67  Long("PRAGMA pag
2bc0: 65 5f 73 69 7a 65 22 2c 20 6e 75 6c 6c 2c 20 6e  e_size", null, n
2bd0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
2be0: 20 20 69 66 20 28 76 61 6c 75 65 20 21 3d 20 6e    if (value != n
2bf0: 65 77 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 20  ewValue) {.     
2c00: 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75             execu
2c10: 74 65 28 22 50 52 41 47 4d 41 20 70 61 67 65 5f  te("PRAGMA page_
2c20: 73 69 7a 65 3d 22 20 2b 20 6e 65 77 56 61 6c 75  size=" + newValu
2c30: 65 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a  e, null, null);.
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c60: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
2c70: 73 65 74 41 75 74 6f 43 68 65 63 6b 70 6f 69 6e  setAutoCheckpoin
2c80: 74 49 6e 74 65 72 76 61 6c 28 29 20 7b 0a 20 20  tInterval() {.  
2c90: 20 20 20 20 20 20 69 66 20 28 21 6d 43 6f 6e 66        if (!mConf
2ca0: 69 67 75 72 61 74 69 6f 6e 2e 69 73 49 6e 4d 65  iguration.isInMe
2cb0: 6d 6f 72 79 44 62 28 29 20 26 26 20 21 6d 49 73  moryDb() && !mIs
2cc0: 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69  ReadOnlyConnecti
2cd0: 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  on) {.          
2ce0: 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20 6e 65 77    final long new
2cf0: 56 61 6c 75 65 20 3d 20 53 51 4c 69 74 65 47 6c  Value = SQLiteGl
2d00: 6f 62 61 6c 2e 67 65 74 57 41 4c 41 75 74 6f 43  obal.getWALAutoC
2d10: 68 65 63 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 20  heckpoint();.   
2d20: 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 76 61           long va
2d30: 6c 75 65 20 3d 20 65 78 65 63 75 74 65 46 6f 72  lue = executeFor
2d40: 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 77 61 6c  Long("PRAGMA wal
2d50: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22  _autocheckpoint"
2d60: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20  , null, null);. 
2d70: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
2d80: 61 6c 75 65 20 21 3d 20 6e 65 77 56 61 6c 75 65  alue != newValue
2d90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2da0: 20 20 20 20 65 78 65 63 75 74 65 46 6f 72 4c 6f      executeForLo
2db0: 6e 67 28 22 50 52 41 47 4d 41 20 77 61 6c 5f 61  ng("PRAGMA wal_a
2dc0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d 22 20  utocheckpoint=" 
2dd0: 2b 20 6e 65 77 56 61 6c 75 65 2c 20 6e 75 6c 6c  + newValue, null
2de0: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
2df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  .    }..    priv
2e10: 61 74 65 20 76 6f 69 64 20 73 65 74 4a 6f 75 72  ate void setJour
2e20: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 29 20 7b  nalSizeLimit() {
2e30: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6d 43  .        if (!mC
2e40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 69 73 49  onfiguration.isI
2e50: 6e 4d 65 6d 6f 72 79 44 62 28 29 20 26 26 20 21  nMemoryDb() && !
2e60: 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65  mIsReadOnlyConne
2e70: 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  ction) {.       
2e80: 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20       final long 
2e90: 6e 65 77 56 61 6c 75 65 20 3d 20 53 51 4c 69 74  newValue = SQLit
2ea0: 65 47 6c 6f 62 61 6c 2e 67 65 74 4a 6f 75 72 6e  eGlobal.getJourn
2eb0: 61 6c 53 69 7a 65 4c 69 6d 69 74 28 29 3b 0a 20  alSizeLimit();. 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20             long 
2ed0: 76 61 6c 75 65 20 3d 20 65 78 65 63 75 74 65 46  value = executeF
2ee0: 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 6a  orLong("PRAGMA j
2ef0: 6f 75 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69  ournal_size_limi
2f00: 74 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  t", null, null);
2f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2f20: 28 76 61 6c 75 65 20 21 3d 20 6e 65 77 56 61 6c  (value != newVal
2f30: 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ue) {.          
2f40: 20 20 20 20 20 20 65 78 65 63 75 74 65 46 6f 72        executeFor
2f50: 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 6a 6f 75  Long("PRAGMA jou
2f60: 72 6e 61 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 3d  rnal_size_limit=
2f70: 22 20 2b 20 6e 65 77 56 61 6c 75 65 2c 20 6e 75  " + newValue, nu
2f80: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
2f90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fa0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
2fb0: 69 76 61 74 65 20 76 6f 69 64 20 73 65 74 46 6f  ivate void setFo
2fc0: 72 65 69 67 6e 4b 65 79 4d 6f 64 65 46 72 6f 6d  reignKeyModeFrom
2fd0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29 20  Configuration() 
2fe0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6d  {.        if (!m
2ff0: 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63  IsReadOnlyConnec
3000: 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tion) {.        
3010: 20 20 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20 6e      final long n
3020: 65 77 56 61 6c 75 65 20 3d 20 6d 43 6f 6e 66 69  ewValue = mConfi
3030: 67 75 72 61 74 69 6f 6e 2e 66 6f 72 65 69 67 6e  guration.foreign
3040: 4b 65 79 43 6f 6e 73 74 72 61 69 6e 74 73 45 6e  KeyConstraintsEn
3050: 61 62 6c 65 64 20 3f 20 31 20 3a 20 30 3b 0a 20  abled ? 1 : 0;. 
3060: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 20             long 
3070: 76 61 6c 75 65 20 3d 20 65 78 65 63 75 74 65 46  value = executeF
3080: 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 66  orLong("PRAGMA f
3090: 6f 72 65 69 67 6e 5f 6b 65 79 73 22 2c 20 6e 75  oreign_keys", nu
30a0: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
30b0: 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
30c0: 20 21 3d 20 6e 65 77 56 61 6c 75 65 29 20 7b 0a   != newValue) {.
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 65 78 65 63 75 74 65 28 22 50 52 41 47 4d 41 20  execute("PRAGMA 
30f0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 22 20 2b  foreign_keys=" +
3100: 20 6e 65 77 56 61 6c 75 65 2c 20 6e 75 6c 6c 2c   newValue, null,
3110: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
3120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3130: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
3140: 74 65 20 76 6f 69 64 20 73 65 74 57 61 6c 4d 6f  te void setWalMo
3150: 64 65 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74  deFromConfigurat
3160: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ion() {.        
3170: 69 66 20 28 21 6d 43 6f 6e 66 69 67 75 72 61 74  if (!mConfigurat
3180: 69 6f 6e 2e 69 73 49 6e 4d 65 6d 6f 72 79 44 62  ion.isInMemoryDb
3190: 28 29 20 26 26 20 21 6d 49 73 52 65 61 64 4f 6e  () && !mIsReadOn
31a0: 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a  lyConnection) {.
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
31c0: 28 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  (mConfiguration.
31d0: 6f 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 69  openFlags & SQLi
31e0: 74 65 44 61 74 61 62 61 73 65 2e 45 4e 41 42 4c  teDatabase.ENABL
31f0: 45 5f 57 52 49 54 45 5f 41 48 45 41 44 5f 4c 4f  E_WRITE_AHEAD_LO
3200: 47 47 49 4e 47 29 20 21 3d 20 30 29 20 7b 0a 20  GGING) != 0) {. 
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3220: 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 22 57  etJournalMode("W
3230: 41 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  AL");.          
3240: 20 20 20 20 20 20 73 65 74 53 79 6e 63 4d 6f 64        setSyncMod
3250: 65 28 53 51 4c 69 74 65 47 6c 6f 62 61 6c 2e 67  e(SQLiteGlobal.g
3260: 65 74 57 41 4c 53 79 6e 63 4d 6f 64 65 28 29 29  etWALSyncMode())
3270: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
3280: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
3290: 20 20 20 20 20 20 20 73 65 74 4a 6f 75 72 6e 61         setJourna
32a0: 6c 4d 6f 64 65 28 53 51 4c 69 74 65 47 6c 6f 62  lMode(SQLiteGlob
32b0: 61 6c 2e 67 65 74 44 65 66 61 75 6c 74 4a 6f 75  al.getDefaultJou
32c0: 72 6e 61 6c 4d 6f 64 65 28 29 29 3b 0a 20 20 20  rnalMode());.   
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
32e0: 53 79 6e 63 4d 6f 64 65 28 53 51 4c 69 74 65 47  SyncMode(SQLiteG
32f0: 6c 6f 62 61 6c 2e 67 65 74 44 65 66 61 75 6c 74  lobal.getDefault
3300: 53 79 6e 63 4d 6f 64 65 28 29 29 3b 0a 20 20 20  SyncMode());.   
3310: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3320: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3330: 70 72 69 76 61 74 65 20 76 6f 69 64 20 73 65 74  private void set
3340: 53 79 6e 63 4d 6f 64 65 28 53 74 72 69 6e 67 20  SyncMode(String 
3350: 6e 65 77 56 61 6c 75 65 29 20 7b 0a 20 20 20 20  newValue) {.    
3360: 20 20 20 20 53 74 72 69 6e 67 20 76 61 6c 75 65      String value
3370: 20 3d 20 65 78 65 63 75 74 65 46 6f 72 53 74 72   = executeForStr
3380: 69 6e 67 28 22 50 52 41 47 4d 41 20 73 79 6e 63  ing("PRAGMA sync
3390: 68 72 6f 6e 6f 75 73 22 2c 20 6e 75 6c 6c 2c 20  hronous", null, 
33a0: 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  null);.        i
33b0: 66 20 28 21 63 61 6e 6f 6e 69 63 61 6c 69 7a 65  f (!canonicalize
33c0: 53 79 6e 63 4d 6f 64 65 28 76 61 6c 75 65 29 2e  SyncMode(value).
33d0: 65 71 75 61 6c 73 49 67 6e 6f 72 65 43 61 73 65  equalsIgnoreCase
33e0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
33f0: 20 20 63 61 6e 6f 6e 69 63 61 6c 69 7a 65 53 79    canonicalizeSy
3400: 6e 63 4d 6f 64 65 28 6e 65 77 56 61 6c 75 65 29  ncMode(newValue)
3410: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
3420: 20 65 78 65 63 75 74 65 28 22 50 52 41 47 4d 41   execute("PRAGMA
3430: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 22 20 2b   synchronous=" +
3440: 20 6e 65 77 56 61 6c 75 65 2c 20 6e 75 6c 6c 2c   newValue, null,
3450: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
3460: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69  }.    }..    pri
3470: 76 61 74 65 20 73 74 61 74 69 63 20 53 74 72 69  vate static Stri
3480: 6e 67 20 63 61 6e 6f 6e 69 63 61 6c 69 7a 65 53  ng canonicalizeS
3490: 79 6e 63 4d 6f 64 65 28 53 74 72 69 6e 67 20 76  yncMode(String v
34a0: 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20  alue) {.        
34b0: 69 66 20 28 76 61 6c 75 65 2e 65 71 75 61 6c 73  if (value.equals
34c0: 28 22 30 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ("0")) {.       
34d0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 4f 46 46       return "OFF
34e0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ";.        } els
34f0: 65 20 69 66 20 28 76 61 6c 75 65 2e 65 71 75 61  e if (value.equa
3500: 6c 73 28 22 31 22 29 29 20 7b 0a 20 20 20 20 20  ls("1")) {.     
3510: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 4e         return "N
3520: 4f 52 4d 41 4c 22 3b 0a 20 20 20 20 20 20 20 20  ORMAL";.        
3530: 7d 20 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65  } else if (value
3540: 2e 65 71 75 61 6c 73 28 22 32 22 29 29 20 7b 0a  .equals("2")) {.
3550: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
3560: 72 6e 20 22 46 55 4c 4c 22 3b 0a 20 20 20 20 20  rn "FULL";.     
3570: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
3580: 75 72 6e 20 76 61 6c 75 65 3b 0a 20 20 20 20 7d  urn value;.    }
3590: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  ..    private vo
35a0: 69 64 20 73 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  id setJournalMod
35b0: 65 28 53 74 72 69 6e 67 20 6e 65 77 56 61 6c 75  e(String newValu
35c0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 53 74 72  e) {.        Str
35d0: 69 6e 67 20 76 61 6c 75 65 20 3d 20 65 78 65 63  ing value = exec
35e0: 75 74 65 46 6f 72 53 74 72 69 6e 67 28 22 50 52  uteForString("PR
35f0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
3600: 65 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  e", null, null);
3610: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 76 61  .        if (!va
3620: 6c 75 65 2e 65 71 75 61 6c 73 49 67 6e 6f 72 65  lue.equalsIgnore
3630: 43 61 73 65 28 6e 65 77 56 61 6c 75 65 29 29 20  Case(newValue)) 
3640: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  {.            tr
3650: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
3660: 20 20 20 20 53 74 72 69 6e 67 20 72 65 73 75 6c      String resul
3670: 74 20 3d 20 65 78 65 63 75 74 65 46 6f 72 53 74  t = executeForSt
3680: 72 69 6e 67 28 22 50 52 41 47 4d 41 20 6a 6f 75  ring("PRAGMA jou
3690: 72 6e 61 6c 5f 6d 6f 64 65 3d 22 20 2b 20 6e 65  rnal_mode=" + ne
36a0: 77 56 61 6c 75 65 2c 20 6e 75 6c 6c 2c 20 6e 75  wValue, null, nu
36b0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
36c0: 20 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 2e       if (result.
36d0: 65 71 75 61 6c 73 49 67 6e 6f 72 65 43 61 73 65  equalsIgnoreCase
36e0: 28 6e 65 77 56 61 6c 75 65 29 29 20 7b 0a 20 20  (newValue)) {.  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
3710: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50              // P
3730: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
3740: 64 65 20 73 69 6c 65 6e 74 6c 79 20 66 61 69 6c  de silently fail
3750: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  s and returns th
3760: 65 20 6f 72 69 67 69 6e 61 6c 20 6a 6f 75 72 6e  e original journ
3770: 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  al.             
3780: 20 20 20 2f 2f 20 6d 6f 64 65 20 69 6e 20 73 6f     // mode in so
3790: 6d 65 20 63 61 73 65 73 20 69 66 20 74 68 65 20  me cases if the 
37a0: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 63 6f 75  journal mode cou
37b0: 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ld not be change
37c0: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  d..            }
37d0: 20 63 61 74 63 68 20 28 53 51 4c 69 74 65 44 61   catch (SQLiteDa
37e0: 74 61 62 61 73 65 4c 6f 63 6b 65 64 45 78 63 65  tabaseLockedExce
37f0: 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20 20  ption ex) {.    
3800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54              // T
3810: 68 69 73 20 65 72 72 6f 72 20 28 53 51 4c 49 54  his error (SQLIT
3820: 45 5f 42 55 53 59 29 20 6f 63 63 75 72 73 20 69  E_BUSY) occurs i
3830: 66 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f one connection
3840: 20 68 61 73 20 74 68 65 20 64 61 74 61 62 61 73   has the databas
3850: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
3860: 20 20 2f 2f 20 6f 70 65 6e 20 69 6e 20 57 41 4c    // open in WAL
3870: 20 6d 6f 64 65 20 61 6e 64 20 61 6e 6f 74 68 65   mode and anothe
3880: 72 20 74 72 69 65 73 20 74 6f 20 63 68 61 6e 67  r tries to chang
3890: 65 20 69 74 20 74 6f 20 6e 6f 6e 2d 57 41 4c 2e  e it to non-WAL.
38a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
38b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 42 65             // Be
38c0: 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
38d0: 64 69 73 61 62 6c 65 20 57 41 4c 20 6d 6f 64 65  disable WAL mode
38e0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
38f0: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
3900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3910: 28 65 76 65 6e 20 69 66 20 77 65 20 69 6e 74 65  (even if we inte
3920: 6e 64 20 74 6f 20 72 65 2d 65 6e 61 62 6c 65 20  nd to re-enable 
3930: 69 74 29 2c 20 77 65 20 63 61 6e 20 65 6e 63 6f  it), we can enco
3940: 75 6e 74 65 72 20 70 72 6f 62 6c 65 6d 73 20 69  unter problems i
3950: 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  f.            //
3960: 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65   there is anothe
3970: 72 20 6f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f  r open connectio
3980: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
3990: 65 20 73 6f 6d 65 77 68 65 72 65 2e 0a 20 20 20  e somewhere..   
39a0: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73           // This
39b0: 20 63 61 6e 20 68 61 70 70 65 6e 20 66 6f 72 20   can happen for 
39c0: 61 20 76 61 72 69 65 74 79 20 6f 66 20 72 65 61  a variety of rea
39d0: 73 6f 6e 73 20 73 75 63 68 20 61 73 20 61 6e 20  sons such as an 
39e0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 70 65 6e  application open
39f0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
3a00: 2f 2f 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  // the same data
3a10: 62 61 73 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65  base in multiple
3a20: 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 74 68   processes at th
3a30: 65 20 73 61 6d 65 20 74 69 6d 65 20 6f 72 20 69  e same time or i
3a40: 66 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 20  f there is a.   
3a50: 20 20 20 20 20 20 20 20 20 2f 2f 20 63 72 61 73           // cras
3a60: 68 69 6e 67 20 63 6f 6e 74 65 6e 74 20 70 72 6f  hing content pro
3a70: 76 69 64 65 72 20 73 65 72 76 69 63 65 20 74 68  vider service th
3a80: 61 74 20 74 68 65 20 41 63 74 69 76 69 74 79 4d  at the ActivityM
3a90: 61 6e 61 67 65 72 20 68 61 73 0a 20 20 20 20 20  anager has.     
3aa0: 20 20 20 20 20 20 20 2f 2f 20 72 65 6d 6f 76 65         // remove
3ab0: 64 20 66 72 6f 6d 20 69 74 73 20 72 65 67 69 73  d from its regis
3ac0: 74 72 79 20 62 75 74 20 77 68 6f 73 65 20 70 72  try but whose pr
3ad0: 6f 63 65 73 73 20 68 61 73 6e 27 74 20 71 75 69  ocess hasn't qui
3ae0: 74 65 20 64 69 65 64 20 79 65 74 0a 20 20 20 20  te died yet.    
3af0: 20 20 20 20 20 20 20 20 2f 2f 20 62 79 20 74 68          // by th
3b00: 65 20 74 69 6d 65 20 69 74 20 69 73 20 72 65 73  e time it is res
3b10: 74 61 72 74 65 64 20 69 6e 20 61 20 6e 65 77 20  tarted in a new 
3b20: 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 20 20 20  process..       
3b30: 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20 20       //.        
3b40: 20 20 20 20 2f 2f 20 49 66 20 77 65 20 64 6f 6e      // If we don
3b50: 27 74 20 63 68 61 6e 67 65 20 74 68 65 20 6a 6f  't change the jo
3b60: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 6e 6f 74 68  urnal mode, noth
3b70: 69 6e 67 20 72 65 61 6c 6c 79 20 62 61 64 20 68  ing really bad h
3b80: 61 70 70 65 6e 73 2e 0a 20 20 20 20 20 20 20 20  appens..        
3b90: 20 20 20 20 2f 2f 20 49 6e 20 74 68 65 20 77 6f      // In the wo
3ba0: 72 73 74 20 63 61 73 65 2c 20 61 6e 20 61 70 70  rst case, an app
3bb0: 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 20 65 6e  lication that en
3bc0: 61 62 6c 65 73 20 57 41 4c 20 6d 69 67 68 74 20  ables WAL might 
3bd0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  not actually.   
3be0: 20 20 20 20 20 20 20 20 20 2f 2f 20 67 65 74 20           // get 
3bf0: 69 74 2c 20 61 6c 74 68 6f 75 67 68 20 69 74 20  it, although it 
3c00: 63 61 6e 20 73 74 69 6c 6c 20 75 73 65 20 63 6f  can still use co
3c10: 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c 69 6e 67  nnection pooling
3c20: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f  ..            Lo
3c30: 67 2e 77 28 54 41 47 2c 20 22 43 6f 75 6c 64 20  g.w(TAG, "Could 
3c40: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  not change the d
3c50: 61 74 61 62 61 73 65 20 6a 6f 75 72 6e 61 6c 20  atabase journal 
3c60: 6d 6f 64 65 20 6f 66 20 27 22 0a 20 20 20 20 20  mode of '".     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
3c80: 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   mConfiguration.
3c90: 6c 61 62 65 6c 20 2b 20 22 27 20 66 72 6f 6d 20  label + "' from 
3ca0: 27 22 20 2b 20 76 61 6c 75 65 20 2b 20 22 27 20  '" + value + "' 
3cb0: 74 6f 20 27 22 20 2b 20 6e 65 77 56 61 6c 75 65  to '" + newValue
3cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3cd0: 20 20 20 20 20 2b 20 22 27 20 62 65 63 61 75 73       + "' becaus
3ce0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  e the database i
3cf0: 73 20 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20  s locked.  This 
3d00: 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
3d10: 61 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  at ".           
3d20: 20 20 20 20 20 20 20 20 20 2b 20 22 74 68 65 72           + "ther
3d30: 65 20 61 72 65 20 6f 74 68 65 72 20 6f 70 65 6e  e are other open
3d40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20   connections to 
3d50: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68 69  the database whi
3d60: 63 68 20 70 72 65 76 65 6e 74 73 20 22 0a 20 20  ch prevents ".  
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 2b 20 22 74 68 65 20 64 61 74 61 62 61 73    + "the databas
3d90: 65 20 66 72 6f 6d 20 65 6e 61 62 6c 69 6e 67 20  e from enabling 
3da0: 6f 72 20 64 69 73 61 62 6c 69 6e 67 20 77 72 69  or disabling wri
3db0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 67 69 6e 67  te-ahead logging
3dc0: 20 6d 6f 64 65 2e 20 20 22 0a 20 20 20 20 20 20   mode.  ".      
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
3de0: 22 50 72 6f 63 65 65 64 69 6e 67 20 77 69 74 68  "Proceeding with
3df0: 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65  out changing the
3e00: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 22 29   journal mode.")
3e10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3e20: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  }..    private v
3e30: 6f 69 64 20 73 65 74 4c 6f 63 61 6c 65 46 72 6f  oid setLocaleFro
3e40: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29  mConfiguration()
3e50: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 28   {.        if ((
3e60: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6f  mConfiguration.o
3e70: 70 65 6e 46 6c 61 67 73 20 26 20 53 51 4c 69 74  penFlags & SQLit
3e80: 65 44 61 74 61 62 61 73 65 2e 4e 4f 5f 4c 4f 43  eDatabase.NO_LOC
3e90: 41 4c 49 5a 45 44 5f 43 4f 4c 4c 41 54 4f 52 53  ALIZED_COLLATORS
3ea0: 29 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  ) != 0) {.      
3eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
3ec0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
3ed0: 20 2f 2f 20 52 65 67 69 73 74 65 72 20 74 68 65   // Register the
3ee0: 20 6c 6f 63 61 6c 69 7a 65 64 20 63 6f 6c 6c 61   localized colla
3ef0: 74 6f 72 73 2e 0a 20 20 20 20 20 20 20 20 66 69  tors..        fi
3f00: 6e 61 6c 20 53 74 72 69 6e 67 20 6e 65 77 4c 6f  nal String newLo
3f10: 63 61 6c 65 20 3d 20 6d 43 6f 6e 66 69 67 75 72  cale = mConfigur
3f20: 61 74 69 6f 6e 2e 6c 6f 63 61 6c 65 2e 74 6f 53  ation.locale.toS
3f30: 74 72 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20  tring();.       
3f40: 20 6e 61 74 69 76 65 52 65 67 69 73 74 65 72 4c   nativeRegisterL
3f50: 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f 72  ocalizedCollator
3f60: 73 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  s(mConnectionPtr
3f70: 2c 20 6e 65 77 4c 6f 63 61 6c 65 29 3b 0a 0a 20  , newLocale);.. 
3f80: 20 20 20 20 20 20 20 2f 2f 20 49 66 20 74 68 65         // If the
3f90: 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
3fa0: 64 2d 6f 6e 6c 79 2c 20 77 65 20 63 61 6e 6e 6f  d-only, we canno
3fb0: 74 20 6d 6f 64 69 66 79 20 74 68 65 20 61 6e 64  t modify the and
3fc0: 72 6f 69 64 20 6d 65 74 61 64 61 74 61 20 74 61  roid metadata ta
3fd0: 62 6c 65 0a 20 20 20 20 20 20 20 20 2f 2f 20 6f  ble.        // o
3fe0: 72 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78  r existing index
3ff0: 65 73 2e 0a 20 20 20 20 20 20 20 20 69 66 20 28  es..        if (
4000: 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65  mIsReadOnlyConne
4010: 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  ction) {.       
4020: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4030: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
4040: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
4050: 20 20 2f 2f 20 45 6e 73 75 72 65 20 74 68 65 20    // Ensure the 
4060: 61 6e 64 72 6f 69 64 20 6d 65 74 61 64 61 74 61  android metadata
4070: 20 74 61 62 6c 65 20 65 78 69 73 74 73 2e 0a 20   table exists.. 
4080: 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75             execu
4090: 74 65 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  te("CREATE TABLE
40a0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 61   IF NOT EXISTS a
40b0: 6e 64 72 6f 69 64 5f 6d 65 74 61 64 61 74 61 20  ndroid_metadata 
40c0: 28 6c 6f 63 61 6c 65 20 54 45 58 54 29 22 2c 20  (locale TEXT)", 
40d0: 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 0a 20 20  null, null);..  
40e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 68 65            // Che
40f0: 63 6b 20 77 68 65 74 68 65 72 20 74 68 65 20 6c  ck whether the l
4100: 6f 63 61 6c 65 20 77 61 73 20 61 63 74 75 61 6c  ocale was actual
4110: 6c 79 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  ly changed..    
4120: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 53 74          final St
4130: 72 69 6e 67 20 6f 6c 64 4c 6f 63 61 6c 65 20 3d  ring oldLocale =
4140: 20 65 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e   executeForStrin
4150: 67 28 22 53 45 4c 45 43 54 20 6c 6f 63 61 6c 65  g("SELECT locale
4160: 20 46 52 4f 4d 20 61 6e 64 72 6f 69 64 5f 6d 65   FROM android_me
4170: 74 61 64 61 74 61 20 22 0a 20 20 20 20 20 20 20  tadata ".       
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22               + "
4190: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 4e 55 4c  UNION SELECT NUL
41a0: 4c 20 4f 52 44 45 52 20 42 59 20 6c 6f 63 61 6c  L ORDER BY local
41b0: 65 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22 2c  e DESC LIMIT 1",
41c0: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20   null, null);.  
41d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 6c            if (ol
41e0: 64 4c 6f 63 61 6c 65 20 21 3d 20 6e 75 6c 6c 20  dLocale != null 
41f0: 26 26 20 6f 6c 64 4c 6f 63 61 6c 65 2e 65 71 75  && oldLocale.equ
4200: 61 6c 73 28 6e 65 77 4c 6f 63 61 6c 65 29 29 20  als(newLocale)) 
4210: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4220: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
4230: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
4240: 20 20 20 20 20 2f 2f 20 47 6f 20 61 68 65 61 64       // Go ahead
4250: 20 61 6e 64 20 75 70 64 61 74 65 20 74 68 65 20   and update the 
4260: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 74 68  indexes using th
4270: 65 20 6e 65 77 20 6c 6f 63 61 6c 65 2e 0a 20 20  e new locale..  
4280: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75 74            execut
4290: 65 28 22 42 45 47 49 4e 22 2c 20 6e 75 6c 6c 2c  e("BEGIN", null,
42a0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
42b0: 20 20 20 20 62 6f 6f 6c 65 61 6e 20 73 75 63 63      boolean succ
42c0: 65 73 73 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  ess = false;.   
42d0: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
42f0: 78 65 63 75 74 65 28 22 44 45 4c 45 54 45 20 46  xecute("DELETE F
4300: 52 4f 4d 20 61 6e 64 72 6f 69 64 5f 6d 65 74 61  ROM android_meta
4310: 64 61 74 61 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  data", null, nul
4320: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
4330: 20 20 20 20 65 78 65 63 75 74 65 28 22 49 4e 53      execute("INS
4340: 45 52 54 20 49 4e 54 4f 20 61 6e 64 72 6f 69 64  ERT INTO android
4350: 5f 6d 65 74 61 64 61 74 61 20 28 6c 6f 63 61 6c  _metadata (local
4360: 65 29 20 56 41 4c 55 45 53 28 3f 29 22 2c 0a 20  e) VALUES(?)",. 
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 20 20 20 6e 65 77 20 4f 62 6a 65 63         new Objec
4390: 74 5b 5d 20 7b 20 6e 65 77 4c 6f 63 61 6c 65 20  t[] { newLocale 
43a0: 7d 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  }, null);.      
43b0: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75 74            execut
43c0: 65 28 22 52 45 49 4e 44 45 58 20 4c 4f 43 41 4c  e("REINDEX LOCAL
43d0: 49 5a 45 44 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  IZED", null, nul
43e0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
43f0: 20 20 20 20 73 75 63 63 65 73 73 20 3d 20 74 72      success = tr
4400: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
4410: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
4420: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63              exec
4430: 75 74 65 28 73 75 63 63 65 73 73 20 3f 20 22 43  ute(success ? "C
4440: 4f 4d 4d 49 54 22 20 3a 20 22 52 4f 4c 4c 42 41  OMMIT" : "ROLLBA
4450: 43 4b 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29  CK", null, null)
4460: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
4470: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
4480: 28 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  (RuntimeExceptio
4490: 6e 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20  n ex) {.        
44a0: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53 51      throw new SQ
44b0: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 22 46  LiteException("F
44c0: 61 69 6c 65 64 20 74 6f 20 63 68 61 6e 67 65 20  ailed to change 
44d0: 6c 6f 63 61 6c 65 20 66 6f 72 20 64 62 20 27 22  locale for db '"
44e0: 20 2b 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f   + mConfiguratio
44f0: 6e 2e 6c 61 62 65 6c 0a 20 20 20 20 20 20 20 20  n.label.        
4500: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 27              + "'
4510: 20 74 6f 20 27 22 20 2b 20 6e 65 77 4c 6f 63 61   to '" + newLoca
4520: 6c 65 20 2b 20 22 27 2e 22 2c 20 65 78 29 3b 0a  le + "'.", ex);.
4530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
4540: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
4550: 20 65 6e 61 62 6c 65 4c 6f 63 61 6c 69 7a 65 64   enableLocalized
4560: 43 6f 6c 6c 61 74 6f 72 73 28 29 7b 0a 20 20 20  Collators(){.   
4570: 20 20 20 69 66 28 20 6e 61 74 69 76 65 48 61 73     if( nativeHas
4580: 43 6f 64 65 63 28 29 20 29 7b 0a 09 73 65 74 4c  Codec() ){..setL
4590: 6f 63 61 6c 65 46 72 6f 6d 43 6f 6e 66 69 67 75  ocaleFromConfigu
45a0: 72 61 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20  ration();.      
45b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  }.    }..    // 
45c0: 43 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65  Called by SQLite
45d0: 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20 6f  ConnectionPool o
45e0: 6e 6c 79 2e 0a 20 20 20 20 76 6f 69 64 20 72 65  nly..    void re
45f0: 63 6f 6e 66 69 67 75 72 65 28 53 51 4c 69 74 65  configure(SQLite
4600: 44 61 74 61 62 61 73 65 43 6f 6e 66 69 67 75 72  DatabaseConfigur
4610: 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61 74  ation configurat
4620: 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 6d  ion) {.        m
4630: 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c  OnlyAllowReadOnl
4640: 79 4f 70 65 72 61 74 69 6f 6e 73 20 3d 20 66 61  yOperations = fa
4650: 6c 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  lse;..        //
4660: 20 52 65 67 69 73 74 65 72 20 63 75 73 74 6f 6d   Register custom
4670: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20   functions..    
4680: 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 66 75      final int fu
4690: 6e 63 74 69 6f 6e 43 6f 75 6e 74 20 3d 20 63 6f  nctionCount = co
46a0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 75 73 74  nfiguration.cust
46b0: 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e 73 69 7a 65  omFunctions.size
46c0: 28 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ();.        for 
46d0: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
46e0: 66 75 6e 63 74 69 6f 6e 43 6f 75 6e 74 3b 20 69  functionCount; i
46f0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
4700: 20 20 53 51 4c 69 74 65 43 75 73 74 6f 6d 46 75    SQLiteCustomFu
4710: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
4720: 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  = configuration.
4730: 63 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e  customFunctions.
4740: 67 65 74 28 69 29 3b 0a 20 20 20 20 20 20 20 20  get(i);.        
4750: 20 20 20 20 69 66 20 28 21 6d 43 6f 6e 66 69 67      if (!mConfig
4760: 75 72 61 74 69 6f 6e 2e 63 75 73 74 6f 6d 46 75  uration.customFu
4770: 6e 63 74 69 6f 6e 73 2e 63 6f 6e 74 61 69 6e 73  nctions.contains
4780: 28 66 75 6e 63 74 69 6f 6e 29 29 20 7b 0a 20 20  (function)) {.  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
47a0: 74 69 76 65 52 65 67 69 73 74 65 72 43 75 73 74  tiveRegisterCust
47b0: 6f 6d 46 75 6e 63 74 69 6f 6e 28 6d 43 6f 6e 6e  omFunction(mConn
47c0: 65 63 74 69 6f 6e 50 74 72 2c 20 66 75 6e 63 74  ectionPtr, funct
47d0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
47e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
47f0: 20 20 20 20 20 20 20 2f 2f 20 52 65 6d 65 6d 62         // Rememb
4800: 65 72 20 77 68 61 74 20 63 68 61 6e 67 65 64 2e  er what changed.
4810: 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e  .        boolean
4820: 20 66 6f 72 65 69 67 6e 4b 65 79 4d 6f 64 65 43   foreignKeyModeC
4830: 68 61 6e 67 65 64 20 3d 20 63 6f 6e 66 69 67 75  hanged = configu
4840: 72 61 74 69 6f 6e 2e 66 6f 72 65 69 67 6e 4b 65  ration.foreignKe
4850: 79 43 6f 6e 73 74 72 61 69 6e 74 73 45 6e 61 62  yConstraintsEnab
4860: 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  led.            
4870: 20 20 20 20 21 3d 20 6d 43 6f 6e 66 69 67 75 72      != mConfigur
4880: 61 74 69 6f 6e 2e 66 6f 72 65 69 67 6e 4b 65 79  ation.foreignKey
4890: 43 6f 6e 73 74 72 61 69 6e 74 73 45 6e 61 62 6c  ConstraintsEnabl
48a0: 65 64 3b 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c  ed;.        bool
48b0: 65 61 6e 20 77 61 6c 4d 6f 64 65 43 68 61 6e 67  ean walModeChang
48c0: 65 64 20 3d 20 28 28 63 6f 6e 66 69 67 75 72 61  ed = ((configura
48d0: 74 69 6f 6e 2e 6f 70 65 6e 46 6c 61 67 73 20 5e  tion.openFlags ^
48e0: 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   mConfiguration.
48f0: 6f 70 65 6e 46 6c 61 67 73 29 0a 20 20 20 20 20  openFlags).     
4900: 20 20 20 20 20 20 20 20 20 20 20 26 20 53 51 4c             & SQL
4910: 69 74 65 44 61 74 61 62 61 73 65 2e 45 4e 41 42  iteDatabase.ENAB
4920: 4c 45 5f 57 52 49 54 45 5f 41 48 45 41 44 5f 4c  LE_WRITE_AHEAD_L
4930: 4f 47 47 49 4e 47 29 20 21 3d 20 30 3b 0a 20 20  OGGING) != 0;.  
4940: 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 6c 6f        boolean lo
4950: 63 61 6c 65 43 68 61 6e 67 65 64 20 3d 20 21 63  caleChanged = !c
4960: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 63  onfiguration.loc
4970: 61 6c 65 2e 65 71 75 61 6c 73 28 6d 43 6f 6e 66  ale.equals(mConf
4980: 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 63 61 6c 65  iguration.locale
4990: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 55  );..        // U
49a0: 70 64 61 74 65 20 63 6f 6e 66 69 67 75 72 61 74  pdate configurat
49b0: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  ion parameters..
49c0: 20 20 20 20 20 20 20 20 6d 43 6f 6e 66 69 67 75          mConfigu
49d0: 72 61 74 69 6f 6e 2e 75 70 64 61 74 65 50 61 72  ration.updatePar
49e0: 61 6d 65 74 65 72 73 46 72 6f 6d 28 63 6f 6e 66  ametersFrom(conf
49f0: 69 67 75 72 61 74 69 6f 6e 29 3b 0a 0a 20 20 20  iguration);..   
4a00: 20 20 20 20 20 2f 2f 20 55 70 64 61 74 65 20 70       // Update p
4a10: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
4a20: 74 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  t cache size..  
4a30: 20 20 20 20 20 20 2f 2a 20 6d 50 72 65 70 61 72        /* mPrepar
4a40: 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65  edStatementCache
4a50: 2e 72 65 73 69 7a 65 28 63 6f 6e 66 69 67 75 72  .resize(configur
4a60: 61 74 69 6f 6e 2e 6d 61 78 53 71 6c 43 61 63 68  ation.maxSqlCach
4a70: 65 53 69 7a 65 29 3b 20 2a 2f 0a 0a 20 20 20 20  eSize); */..    
4a80: 20 20 20 20 2f 2f 20 55 70 64 61 74 65 20 66 6f      // Update fo
4a90: 72 65 69 67 6e 20 6b 65 79 20 6d 6f 64 65 2e 0a  reign key mode..
4aa0: 20 20 20 20 20 20 20 20 69 66 20 28 66 6f 72 65          if (fore
4ab0: 69 67 6e 4b 65 79 4d 6f 64 65 43 68 61 6e 67 65  ignKeyModeChange
4ac0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
4ad0: 20 73 65 74 46 6f 72 65 69 67 6e 4b 65 79 4d 6f   setForeignKeyMo
4ae0: 64 65 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74  deFromConfigurat
4af0: 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  ion();.        }
4b00: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 55 70 64  ..        // Upd
4b10: 61 74 65 20 57 41 4c 2e 0a 20 20 20 20 20 20 20  ate WAL..       
4b20: 20 69 66 20 28 77 61 6c 4d 6f 64 65 43 68 61 6e   if (walModeChan
4b30: 67 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ged) {.         
4b40: 20 20 20 73 65 74 57 61 6c 4d 6f 64 65 46 72 6f     setWalModeFro
4b50: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29  mConfiguration()
4b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
4b70: 20 20 20 20 20 2f 2f 20 55 70 64 61 74 65 20 6c       // Update l
4b80: 6f 63 61 6c 65 2e 0a 20 20 20 20 20 20 20 20 69  ocale..        i
4b90: 66 20 28 6c 6f 63 61 6c 65 43 68 61 6e 67 65 64  f (localeChanged
4ba0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4bb0: 73 65 74 4c 6f 63 61 6c 65 46 72 6f 6d 43 6f 6e  setLocaleFromCon
4bc0: 66 69 67 75 72 61 74 69 6f 6e 28 29 3b 0a 20 20  figuration();.  
4bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
4be0: 20 20 20 2f 2f 20 43 61 6c 6c 65 64 20 62 79 20     // Called by 
4bf0: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
4c00: 50 6f 6f 6c 20 6f 6e 6c 79 2e 0a 20 20 20 20 2f  Pool only..    /
4c10: 2f 20 57 68 65 6e 20 73 65 74 20 74 6f 20 74 72  / When set to tr
4c20: 75 65 2c 20 65 78 65 63 75 74 69 6e 67 20 77 72  ue, executing wr
4c30: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  ite operations w
4c40: 69 6c 6c 20 74 68 72 6f 77 20 53 51 4c 69 74 65  ill throw SQLite
4c50: 45 78 63 65 70 74 69 6f 6e 2e 0a 20 20 20 20 2f  Exception..    /
4c60: 2f 20 50 72 65 70 61 72 69 6e 67 20 73 74 61 74  / Preparing stat
4c70: 65 6d 65 6e 74 73 20 74 68 61 74 20 6d 69 67 68  ements that migh
4c80: 74 20 77 72 69 74 65 20 69 73 20 6f 6b 2c 20 6a  t write is ok, j
4c90: 75 73 74 20 64 6f 6e 27 74 20 65 78 65 63 75 74  ust don't execut
4ca0: 65 20 74 68 65 6d 2e 0a 20 20 20 20 76 6f 69 64  e them..    void
4cb0: 20 73 65 74 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61   setOnlyAllowRea
4cc0: 64 4f 6e 6c 79 4f 70 65 72 61 74 69 6f 6e 73 28  dOnlyOperations(
4cd0: 62 6f 6f 6c 65 61 6e 20 72 65 61 64 4f 6e 6c 79  boolean readOnly
4ce0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6d 4f 6e 6c  ) {.        mOnl
4cf0: 79 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70  yAllowReadOnlyOp
4d00: 65 72 61 74 69 6f 6e 73 20 3d 20 72 65 61 64 4f  erations = readO
4d10: 6e 6c 79 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nly;.    }..    
4d20: 2f 2f 20 43 61 6c 6c 65 64 20 62 79 20 53 51 4c  // Called by SQL
4d30: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f  iteConnectionPoo
4d40: 6c 20 6f 6e 6c 79 2e 0a 20 20 20 20 2f 2f 20 52  l only..    // R
4d50: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
4d60: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
4d70: 65 6d 65 6e 74 20 63 61 63 68 65 20 63 6f 6e 74  ement cache cont
4d80: 61 69 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  ains the specifi
4d90: 65 64 20 53 51 4c 2e 0a 20 20 20 20 62 6f 6f 6c  ed SQL..    bool
4da0: 65 61 6e 20 69 73 50 72 65 70 61 72 65 64 53 74  ean isPreparedSt
4db0: 61 74 65 6d 65 6e 74 49 6e 43 61 63 68 65 28 53  atementInCache(S
4dc0: 74 72 69 6e 67 20 73 71 6c 29 20 7b 0a 20 20 20  tring sql) {.   
4dd0: 20 20 20 20 20 72 65 74 75 72 6e 20 6d 50 72 65       return mPre
4de0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61  paredStatementCa
4df0: 63 68 65 2e 67 65 74 28 73 71 6c 29 20 21 3d 20  che.get(sql) != 
4e00: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  null;.    }..   
4e10: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 47 65 74 73   /**.     * Gets
4e20: 20 74 68 65 20 75 6e 69 71 75 65 20 69 64 20 6f   the unique id o
4e30: 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
4e40: 6e 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72  n..     * @retur
4e50: 6e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n The connection
4e60: 20 69 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20   id..     */.   
4e70: 20 70 75 62 6c 69 63 20 69 6e 74 20 67 65 74 43   public int getC
4e80: 6f 6e 6e 65 63 74 69 6f 6e 49 64 28 29 20 7b 0a  onnectionId() {.
4e90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
4ea0: 43 6f 6e 6e 65 63 74 69 6f 6e 49 64 3b 0a 20 20  ConnectionId;.  
4eb0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
4ec0: 20 20 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65    * Returns true
4ed0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
4ee0: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
4ef0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20   connection..   
4f00: 20 20 2a 20 40 72 65 74 75 72 6e 20 54 72 75 65    * @return True
4f10: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
4f20: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
4f30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20   connection..   
4f40: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
4f50: 62 6f 6f 6c 65 61 6e 20 69 73 50 72 69 6d 61 72  boolean isPrimar
4f60: 79 43 6f 6e 6e 65 63 74 69 6f 6e 28 29 20 7b 0a  yConnection() {.
4f70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
4f80: 49 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74  IsPrimaryConnect
4f90: 69 6f 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ion;.    }..    
4fa0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 72 65 70 61  /**.     * Prepa
4fb0: 72 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  res a statement 
4fc0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  for execution bu
4fd0: 74 20 64 6f 65 73 20 6e 6f 74 20 62 69 6e 64 20  t does not bind 
4fe0: 69 74 73 20 70 61 72 61 6d 65 74 65 72 73 20 6f  its parameters o
4ff0: 72 20 65 78 65 63 75 74 65 20 69 74 2e 0a 20 20  r execute it..  
5000: 20 20 20 2a 20 3c 70 3e 0a 20 20 20 20 20 2a 20     * <p>.     * 
5010: 54 68 69 73 20 6d 65 74 68 6f 64 20 63 61 6e 20  This method can 
5020: 62 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  be used to check
5030: 20 66 6f 72 20 73 79 6e 74 61 78 20 65 72 72 6f   for syntax erro
5040: 72 73 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  rs during compil
5050: 61 74 69 6f 6e 0a 20 20 20 20 20 2a 20 70 72 69  ation.     * pri
5060: 6f 72 20 74 6f 20 65 78 65 63 75 74 69 6f 6e 20  or to execution 
5070: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
5080: 2e 20 20 49 66 20 74 68 65 20 7b 40 63 6f 64 65  .  If the {@code
5090: 20 6f 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66   outStatementInf
50a0: 6f 7d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  o} argument.    
50b0: 20 2a 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20   * is not null, 
50c0: 74 68 65 20 70 72 6f 76 69 64 65 64 20 7b 40 6c  the provided {@l
50d0: 69 6e 6b 20 53 51 4c 69 74 65 53 74 61 74 65 6d  ink SQLiteStatem
50e0: 65 6e 74 49 6e 66 6f 7d 20 6f 62 6a 65 63 74 20  entInfo} object 
50f0: 69 73 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 20  is populated.   
5100: 20 20 2a 20 77 69 74 68 20 69 6e 66 6f 72 6d 61    * with informa
5110: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 73  tion about the s
5120: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 2a  tatement..     *
5130: 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20 20 20 2a 20   </p><p>.     * 
5140: 41 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  A prepared state
5150: 6d 65 6e 74 20 6d 61 6b 65 73 20 6e 6f 20 72 65  ment makes no re
5160: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 61  ference to the a
5170: 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 6d 61  rguments that ma
5180: 79 20 65 76 65 6e 74 75 61 6c 6c 79 0a 20 20 20  y eventually.   
5190: 20 20 2a 20 62 65 20 62 6f 75 6e 64 20 74 6f 20    * be bound to 
51a0: 69 74 2c 20 63 6f 6e 73 65 71 75 65 6e 74 6c 79  it, consequently
51b0: 20 69 74 20 69 74 20 70 6f 73 73 69 62 6c 65 20   it it possible 
51c0: 74 6f 20 63 61 63 68 65 20 63 65 72 74 61 69 6e  to cache certain
51d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
51e0: 65 6e 74 73 0a 20 20 20 20 20 2a 20 73 75 63 68  ents.     * such
51f0: 20 61 73 20 53 45 4c 45 43 54 20 6f 72 20 49 4e   as SELECT or IN
5200: 53 45 52 54 2f 55 50 44 41 54 45 20 73 74 61 74  SERT/UPDATE stat
5210: 65 6d 65 6e 74 73 2e 20 20 49 66 20 74 68 65 20  ements.  If the 
5220: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 63 61 63  statement is cac
5230: 68 65 61 62 6c 65 2c 0a 20 20 20 20 20 2a 20 74  heable,.     * t
5240: 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hen it will be s
5250: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
5260: 68 65 20 66 6f 72 20 6c 61 74 65 72 2e 0a 20 20  he for later..  
5270: 20 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20     * </p><p>.   
5280: 20 20 2a 20 54 6f 20 74 61 6b 65 20 61 64 76 61    * To take adva
5290: 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 62 65  ntage of this be
52a0: 68 61 76 69 6f 72 20 61 73 20 61 6e 20 6f 70 74  havior as an opt
52b0: 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 20 63  imization, the c
52c0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c 0a 20  onnection pool. 
52d0: 20 20 20 20 2a 20 70 72 6f 76 69 64 65 73 20 61      * provides a
52e0: 20 6d 65 74 68 6f 64 20 74 6f 20 61 63 71 75 69   method to acqui
52f0: 72 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  re a connection 
5300: 74 68 61 74 20 61 6c 72 65 61 64 79 20 68 61 73  that already has
5310: 20 61 20 67 69 76 65 6e 20 53 51 4c 20 73 74 61   a given SQL sta
5320: 74 65 6d 65 6e 74 0a 20 20 20 20 20 2a 20 69 6e  tement.     * in
5330: 20 69 74 73 20 70 72 65 70 61 72 65 64 20 73 74   its prepared st
5340: 61 74 65 6d 65 6e 74 20 63 61 63 68 65 20 73 6f  atement cache so
5350: 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 64   that it is read
5360: 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  y for execution.
5370: 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 0a 20 20 20  .     * </p>.   
5380: 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
5390: 6d 20 73 71 6c 20 54 68 65 20 53 51 4c 20 73 74  m sql The SQL st
53a0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 72 65 70 61  atement to prepa
53b0: 72 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  re..     * @para
53c0: 6d 20 6f 75 74 53 74 61 74 65 6d 65 6e 74 49 6e  m outStatementIn
53d0: 66 6f 20 54 68 65 20 7b 40 6c 69 6e 6b 20 53 51  fo The {@link SQ
53e0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 49 6e 66  LiteStatementInf
53f0: 6f 7d 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70  o} object to pop
5400: 75 6c 61 74 65 0a 20 20 20 20 20 2a 20 77 69 74  ulate.     * wit
5410: 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  h information ab
5420: 6f 75 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  out the statemen
5430: 74 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  t, or null if no
5440: 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ne..     *.     
5450: 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65  * @throws SQLite
5460: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20  Exception if an 
5470: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75  error occurs, su
5480: 63 68 20 61 73 20 61 20 73 79 6e 74 61 78 20 65  ch as a syntax e
5490: 72 72 6f 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  rror..     */.  
54a0: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 70 72    public void pr
54b0: 65 70 61 72 65 28 53 74 72 69 6e 67 20 73 71 6c  epare(String sql
54c0: 2c 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  , SQLiteStatemen
54d0: 74 49 6e 66 6f 20 6f 75 74 53 74 61 74 65 6d 65  tInfo outStateme
54e0: 6e 74 49 6e 66 6f 29 20 7b 0a 20 20 20 20 20 20  ntInfo) {.      
54f0: 20 20 69 66 20 28 73 71 6c 20 3d 3d 20 6e 75 6c    if (sql == nul
5500: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
5510: 20 74 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67   throw new Illeg
5520: 61 6c 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  alArgumentExcept
5530: 69 6f 6e 28 22 73 71 6c 20 6d 75 73 74 20 6e 6f  ion("sql must no
5540: 74 20 62 65 20 6e 75 6c 6c 2e 22 29 3b 0a 20 20  t be null.");.  
5550: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
5560: 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b 69   final int cooki
5570: 65 20 3d 20 6d 52 65 63 65 6e 74 4f 70 65 72 61  e = mRecentOpera
5580: 74 69 6f 6e 73 2e 62 65 67 69 6e 4f 70 65 72 61  tions.beginOpera
5590: 74 69 6f 6e 28 22 70 72 65 70 61 72 65 22 2c 20  tion("prepare", 
55a0: 73 71 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  sql, null);.    
55b0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
55c0: 20 20 20 20 20 20 66 69 6e 61 6c 20 50 72 65 70        final Prep
55d0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74  aredStatement st
55e0: 61 74 65 6d 65 6e 74 20 3d 20 61 63 71 75 69 72  atement = acquir
55f0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
5600: 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20  nt(sql);.       
5610: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
5620: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f             if (o
5630: 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 20  utStatementInfo 
5640: 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  != null) {.     
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5660: 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 2e  utStatementInfo.
5670: 6e 75 6d 50 61 72 61 6d 65 74 65 72 73 20 3d 20  numParameters = 
5680: 73 74 61 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61  statement.mNumPa
5690: 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 20 20  rameters;.      
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 75                ou
56b0: 74 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 2e 72  tStatementInfo.r
56c0: 65 61 64 4f 6e 6c 79 20 3d 20 73 74 61 74 65 6d  eadOnly = statem
56d0: 65 6e 74 2e 6d 52 65 61 64 4f 6e 6c 79 3b 0a 0a  ent.mReadOnly;..
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f      final int co
5700: 6c 75 6d 6e 43 6f 75 6e 74 20 3d 20 6e 61 74 69  lumnCount = nati
5710: 76 65 47 65 74 43 6f 6c 75 6d 6e 43 6f 75 6e 74  veGetColumnCount
5720: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 43                mC
5740: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74  onnectionPtr, st
5750: 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65  atement.mStateme
5760: 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  ntPtr);.        
5770: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5780: 63 6f 6c 75 6d 6e 43 6f 75 6e 74 20 3d 3d 20 30  columnCount == 0
5790: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 53              outS
57b0: 74 61 74 65 6d 65 6e 74 49 6e 66 6f 2e 63 6f 6c  tatementInfo.col
57c0: 75 6d 6e 4e 61 6d 65 73 20 3d 20 45 4d 50 54 59  umnNames = EMPTY
57d0: 5f 53 54 52 49 4e 47 5f 41 52 52 41 59 3b 0a 20  _STRING_ARRAY;. 
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 6f 75 74 53 74 61 74 65 6d 65 6e 74      outStatement
5820: 49 6e 66 6f 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 73  Info.columnNames
5830: 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 5b 63 6f   = new String[co
5840: 6c 75 6d 6e 43 6f 75 6e 74 5d 3b 0a 20 20 20 20  lumnCount];.    
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
5870: 20 30 3b 20 69 20 3c 20 63 6f 6c 75 6d 6e 43 6f   0; i < columnCo
5880: 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  unt; i++) {.    
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 20 20 20 20 20 6f 75 74 53 74 61 74 65          outState
58b0: 6d 65 6e 74 49 6e 66 6f 2e 63 6f 6c 75 6d 6e 4e  mentInfo.columnN
58c0: 61 6d 65 73 5b 69 5d 20 3d 20 6e 61 74 69 76 65  ames[i] = native
58d0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 28 0a 20  GetColumnName(. 
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74     mConnectionPt
5910: 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74  r, statement.mSt
5920: 61 74 65 6d 65 6e 74 50 74 72 2c 20 69 29 3b 0a  atementPtr, i);.
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5970: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  }.            } 
5980: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
5990: 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
59a0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
59b0: 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  nt(statement);. 
59c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
59d0: 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75       } catch (Ru
59e0: 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65  ntimeException e
59f0: 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x) {.           
5a00: 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f   mRecentOperatio
5a10: 6e 73 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e  ns.failOperation
5a20: 28 63 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20  (cookie, ex);.  
5a30: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
5a40: 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69  ex;.        } fi
5a50: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
5a60: 20 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61      mRecentOpera
5a70: 74 69 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69  tions.endOperati
5a80: 6f 6e 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  on(cookie);.    
5a90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5aa0: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63   /**.     * Exec
5ab0: 75 74 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  utes a statement
5ac0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
5ad0: 65 74 75 72 6e 20 61 20 72 65 73 75 6c 74 2e 0a  eturn a result..
5ae0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
5af0: 61 72 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c  aram sql The SQL
5b00: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
5b10: 65 63 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70  ecute..     * @p
5b20: 61 72 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68  aram bindArgs Th
5b30: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  e arguments to b
5b40: 69 6e 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20  ind, or null if 
5b50: 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61  none..     * @pa
5b60: 72 61 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  ram cancellation
5b70: 53 69 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20  Signal A signal 
5b80: 74 6f 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70  to cancel the op
5b90: 65 72 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  eration in progr
5ba0: 65 73 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20  ess, or null if 
5bb0: 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20  none..     *.   
5bc0: 20 20 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69    * @throws SQLi
5bd0: 74 65 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61  teException if a
5be0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
5bf0: 73 75 63 68 20 61 73 20 61 20 73 79 6e 74 61 78  such as a syntax
5c00: 20 65 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72   error.     * or
5c10: 20 69 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72 20   invalid number 
5c20: 6f 66 20 62 69 6e 64 20 61 72 67 75 6d 65 6e 74  of bind argument
5c30: 73 2e 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77  s..     * @throw
5c40: 73 20 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65  s OperationCance
5c50: 6c 65 64 45 78 63 65 70 74 69 6f 6e 20 69 66 20  ledException if 
5c60: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61  the operation wa
5c70: 73 20 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20  s canceled..    
5c80: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 76   */.    public v
5c90: 6f 69 64 20 65 78 65 63 75 74 65 28 53 74 72 69  oid execute(Stri
5ca0: 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d  ng sql, Object[]
5cb0: 20 62 69 6e 64 41 72 67 73 2c 0a 20 20 20 20 20   bindArgs,.     
5cc0: 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c 61 74         Cancellat
5cd0: 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c  ionSignal cancel
5ce0: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a  lationSignal) {.
5cf0: 20 20 20 20 20 20 20 20 69 66 20 28 73 71 6c 20          if (sql 
5d00: 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  == null) {.     
5d10: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
5d20: 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74   IllegalArgument
5d30: 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d  Exception("sql m
5d40: 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e  ust not be null.
5d50: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ");.        }.. 
5d60: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74         final int
5d70: 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63 65 6e   cookie = mRecen
5d80: 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65 67 69  tOperations.begi
5d90: 6e 4f 70 65 72 61 74 69 6f 6e 28 22 65 78 65 63  nOperation("exec
5da0: 75 74 65 22 2c 20 73 71 6c 2c 20 62 69 6e 64 41  ute", sql, bindA
5db0: 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 74 72  rgs);.        tr
5dc0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
5dd0: 66 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53 74  final PreparedSt
5de0: 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e  atement statemen
5df0: 74 20 3d 20 61 63 71 75 69 72 65 50 72 65 70 61  t = acquirePrepa
5e00: 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71 6c  redStatement(sql
5e10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
5e20: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
5e30: 20 20 20 20 20 74 68 72 6f 77 49 66 53 74 61 74       throwIfStat
5e40: 65 6d 65 6e 74 46 6f 72 62 69 64 64 65 6e 28 73  ementForbidden(s
5e50: 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
5e60: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 64 41             bindA
5e70: 72 67 75 6d 65 6e 74 73 28 73 74 61 74 65 6d 65  rguments(stateme
5e80: 6e 74 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20  nt, bindArgs);. 
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5ea0: 70 70 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f  pplyBlockGuardPo
5eb0: 6c 69 63 79 28 73 74 61 74 65 6d 65 6e 74 29 3b  licy(statement);
5ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5ed0: 20 61 74 74 61 63 68 43 61 6e 63 65 6c 6c 61 74   attachCancellat
5ee0: 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c  ionSignal(cancel
5ef0: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20  lationSignal);. 
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
5f10: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
5f20: 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 45           nativeE
5f30: 78 65 63 75 74 65 28 6d 43 6f 6e 6e 65 63 74 69  xecute(mConnecti
5f40: 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74  onPtr, statement
5f50: 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b  .mStatementPtr);
5f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f70: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 64 65 74 61 63 68 43 61 6e 63 65 6c 6c 61 74   detachCancellat
5fa0: 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c  ionSignal(cancel
5fb0: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20  lationSignal);. 
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66  .            } f
5fe0: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
5ff0: 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
6000: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
6010: 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  t(statement);.  
6020: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6030: 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e      } catch (Run
6040: 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78  timeException ex
6050: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
6060: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
6070: 73 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28  s.failOperation(
6080: 63 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20  cookie, ex);.   
6090: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65           throw e
60a0: 78 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  x;.        } fin
60b0: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
60c0: 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74     mRecentOperat
60d0: 69 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f  ions.endOperatio
60e0: 6e 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20  n(cookie);.     
60f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
6100: 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75  /**.     * Execu
6110: 74 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  tes a statement 
6120: 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 73  that returns a s
6130: 69 6e 67 6c 65 20 3c 63 6f 64 65 3e 6c 6f 6e 67  ingle <code>long
6140: 3c 2f 63 6f 64 65 3e 20 72 65 73 75 6c 74 2e 0a  </code> result..
6150: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
6160: 61 72 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c  aram sql The SQL
6170: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
6180: 65 63 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70  ecute..     * @p
6190: 61 72 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68  aram bindArgs Th
61a0: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  e arguments to b
61b0: 69 6e 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20  ind, or null if 
61c0: 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61  none..     * @pa
61d0: 72 61 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  ram cancellation
61e0: 53 69 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20  Signal A signal 
61f0: 74 6f 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70  to cancel the op
6200: 65 72 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  eration in progr
6210: 65 73 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20  ess, or null if 
6220: 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40 72 65  none..     * @re
6230: 74 75 72 6e 20 54 68 65 20 76 61 6c 75 65 20 6f  turn The value o
6240: 66 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  f the first colu
6250: 6d 6e 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  mn in the first 
6260: 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
6270: 74 20 73 65 74 0a 20 20 20 20 20 2a 20 61 73 20  t set.     * as 
6280: 61 20 3c 63 6f 64 65 3e 6c 6f 6e 67 3c 2f 63 6f  a <code>long</co
6290: 64 65 3e 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  de>, or zero if 
62a0: 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20  none..     *.   
62b0: 20 20 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69    * @throws SQLi
62c0: 74 65 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61  teException if a
62d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
62e0: 73 75 63 68 20 61 73 20 61 20 73 79 6e 74 61 78  such as a syntax
62f0: 20 65 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72   error.     * or
6300: 20 69 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72 20   invalid number 
6310: 6f 66 20 62 69 6e 64 20 61 72 67 75 6d 65 6e 74  of bind argument
6320: 73 2e 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77  s..     * @throw
6330: 73 20 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65  s OperationCance
6340: 6c 65 64 45 78 63 65 70 74 69 6f 6e 20 69 66 20  ledException if 
6350: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61  the operation wa
6360: 73 20 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20  s canceled..    
6370: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 6c   */.    public l
6380: 6f 6e 67 20 65 78 65 63 75 74 65 46 6f 72 4c 6f  ong executeForLo
6390: 6e 67 28 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f  ng(String sql, O
63a0: 62 6a 65 63 74 5b 5d 20 62 69 6e 64 41 72 67 73  bject[] bindArgs
63b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 61  ,.            Ca
63c0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
63d0: 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67   cancellationSig
63e0: 6e 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 69  nal) {.        i
63f0: 66 20 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20  f (sql == null) 
6400: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  {.            th
6410: 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41  row new IllegalA
6420: 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e  rgumentException
6430: 28 22 73 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62  ("sql must not b
6440: 65 20 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20  e null.");.     
6450: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
6460: 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d  nal int cookie =
6470: 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f   mRecentOperatio
6480: 6e 73 2e 62 65 67 69 6e 4f 70 65 72 61 74 69 6f  ns.beginOperatio
6490: 6e 28 22 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e  n("executeForLon
64a0: 67 22 2c 20 73 71 6c 2c 20 62 69 6e 64 41 72 67  g", sql, bindArg
64b0: 73 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20  s);.        try 
64c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  {.            fi
64d0: 6e 61 6c 20 50 72 65 70 61 72 65 64 53 74 61 74  nal PreparedStat
64e0: 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  ement statement 
64f0: 3d 20 61 63 71 75 69 72 65 50 72 65 70 61 72 65  = acquirePrepare
6500: 64 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b  dStatement(sql);
6510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
6520: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6530: 20 20 20 74 68 72 6f 77 49 66 53 74 61 74 65 6d     throwIfStatem
6540: 65 6e 74 46 6f 72 62 69 64 64 65 6e 28 73 74 61  entForbidden(sta
6550: 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  tement);.       
6560: 20 20 20 20 20 20 20 20 20 62 69 6e 64 41 72 67           bindArg
6570: 75 6d 65 6e 74 73 28 73 74 61 74 65 6d 65 6e 74  uments(statement
6580: 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20  , bindArgs);.   
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
65a0: 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f 6c 69  lyBlockGuardPoli
65b0: 63 79 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  cy(statement);. 
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
65d0: 74 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f  ttachCancellatio
65e0: 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61  nSignal(cancella
65f0: 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20  tionSignal);.   
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
6610: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6620: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 61         return na
6630: 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 4c 6f  tiveExecuteForLo
6640: 6e 67 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74  ng(mConnectionPt
6650: 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74  r, statement.mSt
6660: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20  atementPtr);.   
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66               } f
6680: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 74               det
66a0: 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  achCancellationS
66b0: 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69  ignal(cancellati
66c0: 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20  onSignal);.     
66d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
66e0: 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c           } final
66f0: 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ly {.           
6700: 20 20 20 20 20 72 65 6c 65 61 73 65 50 72 65 70       releasePrep
6710: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74  aredStatement(st
6720: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
6730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6740: 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65  } catch (Runtime
6750: 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a  Exception ex) {.
6760: 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63              mRec
6770: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61  entOperations.fa
6780: 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b  ilOperation(cook
6790: 69 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20  ie, ex);.       
67a0: 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20       throw ex;. 
67b0: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
67c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
67d0: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
67e0: 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f  .endOperation(co
67f0: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  okie);.        }
6800: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
6810: 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 73 20       * Executes 
6820: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  a statement that
6830: 20 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c   returns a singl
6840: 65 20 7b 40 6c 69 6e 6b 20 53 74 72 69 6e 67 7d  e {@link String}
6850: 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 2a 0a   result..     *.
6860: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71       * @param sq
6870: 6c 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  l The SQL statem
6880: 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 0a  ent to execute..
6890: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 62 69       * @param bi
68a0: 6e 64 41 72 67 73 20 54 68 65 20 61 72 67 75 6d  ndArgs The argum
68b0: 65 6e 74 73 20 74 6f 20 62 69 6e 64 2c 20 6f 72  ents to bind, 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 20 40 70 61 72 61 6d 20 63 61 6e      * @param can
68e0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
68f0: 41 20 73 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63  A signal to canc
6900: 65 6c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  el the operation
6910: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6f 72   in progress, or
6920: 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20   null if none.. 
6930: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 54 68      * @return Th
6940: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
6950: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  irst column in t
6960: 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  he first row of 
6970: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20  the result set. 
6980: 20 20 20 20 2a 20 61 73 20 61 20 3c 63 6f 64 65      * as a <code
6990: 3e 53 74 72 69 6e 67 3c 2f 63 6f 64 65 3e 2c 20  >String</code>, 
69a0: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
69b0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
69c0: 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63  throws SQLiteExc
69d0: 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72  eption if an err
69e0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20  or occurs, such 
69f0: 61 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  as a syntax erro
6a00: 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61  r.     * or inva
6a10: 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  lid number of bi
6a20: 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  nd arguments..  
6a30: 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65     * @throws Ope
6a40: 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78  rationCanceledEx
6a50: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f  ception if the o
6a60: 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e  peration was can
6a70: 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20  celed..     */. 
6a80: 20 20 20 70 75 62 6c 69 63 20 53 74 72 69 6e 67     public String
6a90: 20 65 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e   executeForStrin
6aa0: 67 28 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62  g(String sql, Ob
6ab0: 6a 65 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c  ject[] bindArgs,
6ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 61 6e  .            Can
6ad0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
6ae0: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  cancellationSign
6af0: 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  al) {.        if
6b00: 20 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b   (sql == null) {
6b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
6b20: 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72  ow new IllegalAr
6b30: 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28  gumentException(
6b40: 22 73 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65  "sql must not be
6b50: 20 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20   null.");.      
6b60: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e    }..        fin
6b70: 61 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20  al int cookie = 
6b80: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
6b90: 73 2e 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e  s.beginOperation
6ba0: 28 22 65 78 65 63 75 74 65 46 6f 72 53 74 72 69  ("executeForStri
6bb0: 6e 67 22 2c 20 73 71 6c 2c 20 62 69 6e 64 41 72  ng", sql, bindAr
6bc0: 67 73 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79  gs);.        try
6bd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
6be0: 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53 74 61  inal PreparedSta
6bf0: 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  tement statement
6c00: 20 3d 20 61 63 71 75 69 72 65 50 72 65 70 61 72   = acquirePrepar
6c10: 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29  edStatement(sql)
6c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
6c30: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
6c40: 20 20 20 20 74 68 72 6f 77 49 66 53 74 61 74 65      throwIfState
6c50: 6d 65 6e 74 46 6f 72 62 69 64 64 65 6e 28 73 74  mentForbidden(st
6c60: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
6c70: 20 20 20 20 20 20 20 20 20 20 62 69 6e 64 41 72            bindAr
6c80: 67 75 6d 65 6e 74 73 28 73 74 61 74 65 6d 65 6e  guments(statemen
6c90: 74 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20  t, bindArgs);.  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
6cb0: 70 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f 6c  plyBlockGuardPol
6cc0: 69 63 79 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a  icy(statement);.
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 61 74 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69  attachCancellati
6cf0: 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c  onSignal(cancell
6d00: 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20  ationSignal);.  
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
6d20: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
6d30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
6d40: 61 74 69 76 65 45 78 65 63 75 74 65 46 6f 72 53  ativeExecuteForS
6d50: 74 72 69 6e 67 28 6d 43 6f 6e 6e 65 63 74 69 6f  tring(mConnectio
6d60: 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e  nPtr, statement.
6d70: 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a  mStatementPtr);.
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 64 65 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69  detachCancellati
6dc0: 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c  onSignal(cancell
6dd0: 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20  ationSignal);.  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69              } fi
6e00: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
6e10: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
6e20: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
6e30: 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  (statement);.   
6e40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6e50: 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74     } catch (Runt
6e60: 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29  imeException ex)
6e70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
6e80: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
6e90: 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63  .failOperation(c
6ea0: 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20  ookie, ex);.    
6eb0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65 78          throw ex
6ec0: 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61  ;.        } fina
6ed0: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
6ee0: 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69    mRecentOperati
6ef0: 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e  ons.endOperation
6f00: 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20  (cookie);.      
6f10: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
6f20: 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74  **.     * Execut
6f30: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  es a statement t
6f40: 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 73 69  hat returns a si
6f50: 6e 67 6c 65 20 42 4c 4f 42 20 72 65 73 75 6c 74  ngle BLOB result
6f60: 20 61 73 20 61 0a 20 20 20 20 20 2a 20 66 69 6c   as a.     * fil
6f70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
6f80: 61 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  a shared memory 
6f90: 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20  region..     *. 
6fa0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c      * @param sql
6fb0: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
6fc0: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20  nt to execute.. 
6fd0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 62 69 6e      * @param bin
6fe0: 64 41 72 67 73 20 54 68 65 20 61 72 67 75 6d 65  dArgs The argume
6ff0: 6e 74 73 20 74 6f 20 62 69 6e 64 2c 20 6f 72 20  nts to bind, or 
7000: 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20  null if none..  
7010: 20 20 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63     * @param canc
7020: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41  ellationSignal A
7030: 20 73 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65   signal to cance
7040: 6c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  l the operation 
7050: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20  in progress, or 
7060: 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20  null if none..  
7070: 20 20 20 2a 20 40 72 65 74 75 72 6e 20 54 68 65     * @return The
7080: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7090: 20 66 6f 72 20 61 20 73 68 61 72 65 64 20 6d 65   for a shared me
70a0: 6d 6f 72 79 20 72 65 67 69 6f 6e 20 74 68 61 74  mory region that
70b0: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 2a   contains.     *
70c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
70d0: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69  e first column i
70e0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  n the first row 
70f0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
7100: 74 20 61 73 20 61 20 42 4c 4f 42 2c 0a 20 20 20  t as a BLOB,.   
7110: 20 20 2a 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e    * or null if n
7120: 6f 6e 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  one..     *.    
7130: 20 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74   * @throws SQLit
7140: 65 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e  eException if an
7150: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
7160: 75 63 68 20 61 73 20 61 20 73 79 6e 74 61 78 20  uch as a syntax 
7170: 65 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20  error.     * or 
7180: 69 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f  invalid number o
7190: 66 20 62 69 6e 64 20 61 72 67 75 6d 65 6e 74 73  f bind arguments
71a0: 2e 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73  ..     * @throws
71b0: 20 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c   OperationCancel
71c0: 65 64 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74  edException if t
71d0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
71e0: 20 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20   canceled..     
71f0: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 50 61  */.    public Pa
7200: 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69 70 74  rcelFileDescript
7210: 6f 72 20 65 78 65 63 75 74 65 46 6f 72 42 6c 6f  or executeForBlo
7220: 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72 28  bFileDescriptor(
7230: 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65  String sql, Obje
7240: 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20  ct[] bindArgs,. 
7250: 20 20 20 20 20 20 20 20 20 20 20 43 61 6e 63 65             Cance
7260: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61  llationSignal ca
7270: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
7280: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
7290: 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  sql == null) {. 
72a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
72b0: 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75   new IllegalArgu
72c0: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 73  mentException("s
72d0: 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ql must not be n
72e0: 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ull.");.        
72f0: 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  }..        final
7300: 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52   int cookie = mR
7310: 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e  ecentOperations.
7320: 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22  beginOperation("
7330: 65 78 65 63 75 74 65 46 6f 72 42 6c 6f 62 46 69  executeForBlobFi
7340: 6c 65 44 65 73 63 72 69 70 74 6f 72 22 2c 0a 20  leDescriptor",. 
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7360: 71 6c 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20  ql, bindArgs);. 
7370: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
7380: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 50           final P
7390: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
73a0: 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 61 63 71   statement = acq
73b0: 75 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  uirePreparedStat
73c0: 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20  ement(sql);.    
73d0: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
73f0: 72 6f 77 49 66 53 74 61 74 65 6d 65 6e 74 46 6f  rowIfStatementFo
7400: 72 62 69 64 64 65 6e 28 73 74 61 74 65 6d 65 6e  rbidden(statemen
7410: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
7420: 20 20 20 20 62 69 6e 64 41 72 67 75 6d 65 6e 74      bindArgument
7430: 73 28 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  s(statement, bin
7440: 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20  dArgs);.        
7450: 20 20 20 20 20 20 20 20 61 70 70 6c 79 42 6c 6f          applyBlo
7460: 63 6b 47 75 61 72 64 50 6f 6c 69 63 79 28 73 74  ckGuardPolicy(st
7470: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
7480: 20 20 20 20 20 20 20 20 20 20 61 74 74 61 63 68            attach
7490: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
74a0: 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al(cancellationS
74b0: 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  ignal);.        
74c0: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 20 2f 2f 20 54 68 65 20 53 71 6c 69 74 65 20    // The Sqlite 
74f0: 42 69 6e 64 69 6e 67 73 20 76 65 72 73 69 6f 6e  Bindings version
7500: 20 6f 66 20 74 68 69 73 20 63 6f 64 65 20 69 73   of this code is
7510: 20 75 6e 61 62 6c 65 20 74 6f 0a 20 20 20 20 20   unable to.     
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7530: 2f 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d  / use shared mem
7540: 6f 72 79 20 28 74 68 65 20 43 2b 2b 20 63 61 6c  ory (the C++ cal
7550: 6c 20 74 6f 20 63 72 65 61 74 65 41 73 68 6d 65  l to createAshme
7560: 6d 52 65 67 69 6f 6e 57 69 74 68 44 61 74 61 0a  mRegionWithData.
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 2f 2f 20 61 6c 77 61 79 73 20 66 61      // always fa
7590: 69 6c 73 29 2c 20 73 6f 20 77 65 20 6a 75 73 74  ils), so we just
75a0: 20 72 65 74 75 72 6e 20 6e 75 6c 6c 2e 0a 20 20   return null..  
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 2f 2f 69 6e 74 20 66 64 20 3d 20 6e 61 74    //int fd = nat
75d0: 69 76 65 45 78 65 63 75 74 65 46 6f 72 42 6c 6f  iveExecuteForBlo
75e0: 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72 28  bFileDescriptor(
75f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7600: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20 6d       //        m
7610: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73  ConnectionPtr, s
7620: 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d  tatement.mStatem
7630: 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20 20  entPtr);.       
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 72               //r
7650: 65 74 75 72 6e 20 66 64 20 3e 3d 20 30 20 3f 20  eturn fd >= 0 ? 
7660: 50 61 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69  ParcelFileDescri
7670: 70 74 6f 72 2e 61 64 6f 70 74 46 64 28 66 64 29  ptor.adoptFd(fd)
7680: 20 3a 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   : null;.       
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
76a0: 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  urn null;.      
76b0: 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61            } fina
76c0: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
76d0: 20 20 20 20 20 20 20 20 20 20 64 65 74 61 63 68            detach
76e0: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
76f0: 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al(cancellationS
7700: 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  ignal);.        
7710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7720: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
7730: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7740: 20 20 72 65 6c 65 61 73 65 50 72 65 70 61 72 65    releasePrepare
7750: 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74 65  dStatement(state
7760: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
7770: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 63     }.        } c
7780: 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78 63  atch (RuntimeExc
7790: 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20  eption ex) {.   
77a0: 20 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74           mRecent
77b0: 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69 6c 4f  Operations.failO
77c0: 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 2c  peration(cookie,
77d0: 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20   ex);.          
77e0: 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20    throw ex;.    
77f0: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a      } finally {.
7800: 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63              mRec
7810: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65 6e  entOperations.en
7820: 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69  dOperation(cooki
7830: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
7840: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
7850: 20 20 2a 20 45 78 65 63 75 74 65 73 20 61 20 73    * Executes a s
7860: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65  tatement that re
7870: 74 75 72 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  turns a count of
7880: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
7890: 6f 77 73 0a 20 20 20 20 20 2a 20 74 68 61 74 20  ows.     * that 
78a0: 77 65 72 65 20 63 68 61 6e 67 65 64 2e 20 20 55  were changed.  U
78b0: 73 65 20 66 6f 72 20 55 50 44 41 54 45 20 6f 72  se for UPDATE or
78c0: 20 44 45 4c 45 54 45 20 53 51 4c 20 73 74 61 74   DELETE SQL stat
78d0: 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 0a 20  ements..     *. 
78e0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c      * @param sql
78f0: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
7900: 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20  nt to execute.. 
7910: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 62 69 6e      * @param bin
7920: 64 41 72 67 73 20 54 68 65 20 61 72 67 75 6d 65  dArgs The argume
7930: 6e 74 73 20 74 6f 20 62 69 6e 64 2c 20 6f 72 20  nts to bind, or 
7940: 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20  null if none..  
7950: 20 20 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63     * @param canc
7960: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41  ellationSignal A
7970: 20 73 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65   signal to cance
7980: 6c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  l the operation 
7990: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20  in progress, or 
79a0: 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20  null if none..  
79b0: 20 20 20 2a 20 40 72 65 74 75 72 6e 20 54 68 65     * @return The
79c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
79d0: 74 68 61 74 20 77 65 72 65 20 63 68 61 6e 67 65  that were change
79e0: 64 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  d..     *.     *
79f0: 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45   @throws SQLiteE
7a00: 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65  xception if an e
7a10: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63  rror occurs, suc
7a20: 68 20 61 73 20 61 20 73 79 6e 74 61 78 20 65 72  h as a syntax er
7a30: 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e  ror.     * or in
7a40: 76 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20  valid number of 
7a50: 62 69 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a  bind arguments..
7a60: 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f       * @throws O
7a70: 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64  perationCanceled
7a80: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  Exception if the
7a90: 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63   operation was c
7aa0: 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f  anceled..     */
7ab0: 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20  .    public int 
7ac0: 65 78 65 63 75 74 65 46 6f 72 43 68 61 6e 67 65  executeForChange
7ad0: 64 52 6f 77 43 6f 75 6e 74 28 53 74 72 69 6e 67  dRowCount(String
7ae0: 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20 62   sql, Object[] b
7af0: 69 6e 64 41 72 67 73 2c 0a 20 20 20 20 20 20 20  indArgs,.       
7b00: 20 20 20 20 20 43 61 6e 63 65 6c 6c 61 74 69 6f       Cancellatio
7b10: 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61  nSignal cancella
7b20: 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20  tionSignal) {.  
7b30: 20 20 20 20 20 20 69 66 20 28 73 71 6c 20 3d 3d        if (sql ==
7b40: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
7b50: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49       throw new I
7b60: 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45 78  llegalArgumentEx
7b70: 63 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d 75 73  ception("sql mus
7b80: 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e 22 29  t not be null.")
7b90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
7ba0: 20 20 20 20 20 69 6e 74 20 63 68 61 6e 67 65 64       int changed
7bb0: 52 6f 77 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Rows = 0;.      
7bc0: 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b    final int cook
7bd0: 69 65 20 3d 20 6d 52 65 63 65 6e 74 4f 70 65 72  ie = mRecentOper
7be0: 61 74 69 6f 6e 73 2e 62 65 67 69 6e 4f 70 65 72  ations.beginOper
7bf0: 61 74 69 6f 6e 28 22 65 78 65 63 75 74 65 46 6f  ation("executeFo
7c00: 72 43 68 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74  rChangedRowCount
7c10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7c20: 20 20 20 73 71 6c 2c 20 62 69 6e 64 41 72 67 73     sql, bindArgs
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  );.        try {
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e  .            fin
7c50: 61 6c 20 50 72 65 70 61 72 65 64 53 74 61 74 65  al PreparedState
7c60: 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d  ment statement =
7c70: 20 61 63 71 75 69 72 65 50 72 65 70 61 72 65 64   acquirePrepared
7c80: 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a  Statement(sql);.
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
7ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7cb0: 20 20 74 68 72 6f 77 49 66 53 74 61 74 65 6d 65    throwIfStateme
7cc0: 6e 74 46 6f 72 62 69 64 64 65 6e 28 73 74 61 74  ntForbidden(stat
7cd0: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ement);.        
7ce0: 20 20 20 20 20 20 20 20 62 69 6e 64 41 72 67 75          bindArgu
7cf0: 6d 65 6e 74 73 28 73 74 61 74 65 6d 65 6e 74 2c  ments(statement,
7d00: 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20   bindArgs);.    
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 6c              appl
7d20: 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f 6c 69 63  yBlockGuardPolic
7d30: 79 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20  y(statement);.  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
7d50: 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  tachCancellation
7d60: 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74  Signal(cancellat
7d70: 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20  ionSignal);.    
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
7d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7da0: 20 20 20 20 20 20 63 68 61 6e 67 65 64 52 6f 77        changedRow
7db0: 73 20 3d 20 6e 61 74 69 76 65 45 78 65 63 75 74  s = nativeExecut
7dc0: 65 46 6f 72 43 68 61 6e 67 65 64 52 6f 77 43 6f  eForChangedRowCo
7dd0: 75 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  unt(.           
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c   mConnectionPtr,
7e00: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74   statement.mStat
7e10: 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20  ementPtr);.     
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7e30: 65 74 75 72 6e 20 63 68 61 6e 67 65 64 52 6f 77  eturn changedRow
7e40: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s;.             
7e50: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20     } finally {. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 64 65 74 61 63 68 43 61 6e 63 65 6c 6c     detachCancell
7e80: 61 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63  ationSignal(canc
7e90: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b  ellationSignal);
7ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7eb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
7ec0: 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20   finally {.     
7ed0: 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
7ee0: 73 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  sePreparedStatem
7ef0: 65 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a  ent(statement);.
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7f10: 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 52        } catch (R
7f20: 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20  untimeException 
7f30: 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ex) {.          
7f40: 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69    mRecentOperati
7f50: 6f 6e 73 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f  ons.failOperatio
7f60: 6e 28 63 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20  n(cookie, ex);. 
7f70: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
7f80: 20 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 20 66   ex;.        } f
7f90: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
7fa0: 20 20 20 20 20 69 66 20 28 6d 52 65 63 65 6e 74       if (mRecent
7fb0: 4f 70 65 72 61 74 69 6f 6e 73 2e 65 6e 64 4f 70  Operations.endOp
7fc0: 65 72 61 74 69 6f 6e 44 65 66 65 72 4c 6f 67 28  erationDeferLog(
7fd0: 63 6f 6f 6b 69 65 29 29 20 7b 0a 20 20 20 20 20  cookie)) {.     
7fe0: 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65             mRece
7ff0: 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 6c 6f 67  ntOperations.log
8000: 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65  Operation(cookie
8010: 2c 20 22 63 68 61 6e 67 65 64 52 6f 77 73 3d 22  , "changedRows="
8020: 20 2b 20 63 68 61 6e 67 65 64 52 6f 77 73 29 3b   + changedRows);
8030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
8040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
8050: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 45      /**.     * E
8060: 78 65 63 75 74 65 73 20 61 20 73 74 61 74 65 6d  xecutes a statem
8070: 65 6e 74 20 74 68 61 74 20 72 65 74 75 72 6e 73  ent that returns
8080: 20 74 68 65 20 72 6f 77 20 69 64 20 6f 66 20 74   the row id of t
8090: 68 65 20 6c 61 73 74 20 72 6f 77 20 69 6e 73 65  he last row inse
80a0: 72 74 65 64 0a 20 20 20 20 20 2a 20 62 79 20 74  rted.     * by t
80b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 55  he statement.  U
80c0: 73 65 20 66 6f 72 20 49 4e 53 45 52 54 20 53 51  se for INSERT SQ
80d0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  L statements..  
80e0: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
80f0: 61 6d 20 73 71 6c 20 54 68 65 20 53 51 4c 20 73  am sql The SQL s
8100: 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
8110: 75 74 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ute..     * @par
8120: 61 6d 20 62 69 6e 64 41 72 67 73 20 54 68 65 20  am bindArgs The 
8130: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e  arguments to bin
8140: 64 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  d, or null if no
8150: 6e 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ne..     * @para
8160: 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  m cancellationSi
8170: 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20 74 6f  gnal A signal to
8180: 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70 65 72   cancel the oper
8190: 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ation in progres
81a0: 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f  s, or null if no
81b0: 6e 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75  ne..     * @retu
81c0: 72 6e 20 54 68 65 20 72 6f 77 20 69 64 20 6f 66  rn The row id of
81d0: 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20 74 68   the last row th
81e0: 61 74 20 77 61 73 20 69 6e 73 65 72 74 65 64 2c  at was inserted,
81f0: 20 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20   or 0 if none.. 
8200: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 74 68      *.     * @th
8210: 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63 65 70  rows SQLiteExcep
8220: 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  tion if an error
8230: 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20 61 73   occurs, such as
8240: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 0a   a syntax error.
8250: 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61 6c 69       * or invali
8260: 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64  d number of bind
8270: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20   arguments..    
8280: 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65 72 61   * @throws Opera
8290: 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63 65  tionCanceledExce
82a0: 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f 70 65  ption if the ope
82b0: 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e 63 65  ration was cance
82c0: 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  led..     */.   
82d0: 20 70 75 62 6c 69 63 20 6c 6f 6e 67 20 65 78 65   public long exe
82e0: 63 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72  cuteForLastInser
82f0: 74 65 64 52 6f 77 49 64 28 53 74 72 69 6e 67 20  tedRowId(String 
8300: 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20 62 69  sql, Object[] bi
8310: 6e 64 41 72 67 73 2c 0a 20 20 20 20 20 20 20 20  ndArgs,.        
8320: 20 20 20 20 43 61 6e 63 65 6c 6c 61 74 69 6f 6e      Cancellation
8330: 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61 74  Signal cancellat
8340: 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20 20  ionSignal) {.   
8350: 20 20 20 20 20 69 66 20 28 73 71 6c 20 3d 3d 20       if (sql == 
8360: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
8370: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6c      throw new Il
8380: 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45 78 63  legalArgumentExc
8390: 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d 75 73 74  eption("sql must
83a0: 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e 22 29 3b   not be null.");
83b0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
83c0: 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f      final int co
83d0: 6f 6b 69 65 20 3d 20 6d 52 65 63 65 6e 74 4f 70  okie = mRecentOp
83e0: 65 72 61 74 69 6f 6e 73 2e 62 65 67 69 6e 4f 70  erations.beginOp
83f0: 65 72 61 74 69 6f 6e 28 22 65 78 65 63 75 74 65  eration("execute
8400: 46 6f 72 4c 61 73 74 49 6e 73 65 72 74 65 64 52  ForLastInsertedR
8410: 6f 77 49 64 22 2c 0a 20 20 20 20 20 20 20 20 20  owId",.         
8420: 20 20 20 20 20 20 20 73 71 6c 2c 20 62 69 6e 64         sql, bind
8430: 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 74  Args);.        t
8440: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
8450: 20 66 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53   final PreparedS
8460: 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65  tatement stateme
8470: 6e 74 20 3d 20 61 63 71 75 69 72 65 50 72 65 70  nt = acquirePrep
8480: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71  aredStatement(sq
8490: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
84a0: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
84b0: 20 20 20 20 20 20 74 68 72 6f 77 49 66 53 74 61        throwIfSta
84c0: 74 65 6d 65 6e 74 46 6f 72 62 69 64 64 65 6e 28  tementForbidden(
84d0: 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 64              bind
84f0: 41 72 67 75 6d 65 6e 74 73 28 73 74 61 74 65 6d  Arguments(statem
8500: 65 6e 74 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a  ent, bindArgs);.
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 61 70 70 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50  applyBlockGuardP
8530: 6f 6c 69 63 79 28 73 74 61 74 65 6d 65 6e 74 29  olicy(statement)
8540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8550: 20 20 61 74 74 61 63 68 43 61 6e 63 65 6c 6c 61    attachCancella
8560: 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65  tionSignal(cance
8570: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a  llationSignal);.
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
85a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
85b0: 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 46 6f   nativeExecuteFo
85c0: 72 4c 61 73 74 49 6e 73 65 72 74 65 64 52 6f 77  rLastInsertedRow
85d0: 49 64 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id(.            
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20  mConnectionPtr, 
8600: 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65  statement.mState
8610: 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20  mentPtr);.      
8620: 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61            } fina
8630: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
8640: 20 20 20 20 20 20 20 20 20 20 64 65 74 61 63 68            detach
8650: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
8660: 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al(cancellationS
8670: 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  ignal);.        
8680: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8690: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
86a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
86b0: 20 20 72 65 6c 65 61 73 65 50 72 65 70 61 72 65    releasePrepare
86c0: 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74 65  dStatement(state
86d0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
86e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 63     }.        } c
86f0: 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78 63  atch (RuntimeExc
8700: 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20  eption ex) {.   
8710: 20 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74           mRecent
8720: 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69 6c 4f  Operations.failO
8730: 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 2c  peration(cookie,
8740: 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20   ex);.          
8750: 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20    throw ex;.    
8760: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a      } finally {.
8770: 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63              mRec
8780: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65 6e  entOperations.en
8790: 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69  dOperation(cooki
87a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
87b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
87c0: 20 20 2a 20 45 78 65 63 75 74 65 73 20 61 20 73    * Executes a s
87d0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 70 6f 70  tatement and pop
87e0: 75 6c 61 74 65 73 20 74 68 65 20 73 70 65 63 69  ulates the speci
87f0: 66 69 65 64 20 7b 40 6c 69 6e 6b 20 43 75 72 73  fied {@link Curs
8800: 6f 72 57 69 6e 64 6f 77 7d 0a 20 20 20 20 20 2a  orWindow}.     *
8810: 20 77 69 74 68 20 61 20 72 61 6e 67 65 20 6f 66   with a range of
8820: 20 72 65 73 75 6c 74 73 2e 20 20 52 65 74 75 72   results.  Retur
8830: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
8840: 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65 20   rows that were 
8850: 63 6f 75 6e 74 65 64 0a 20 20 20 20 20 2a 20 64  counted.     * d
8860: 75 72 69 6e 67 20 71 75 65 72 79 20 65 78 65 63  uring query exec
8870: 75 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20 20  ution..     *.  
8880: 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20     * @param sql 
8890: 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  The SQL statemen
88a0: 74 20 74 6f 20 65 78 65 63 75 74 65 2e 0a 20 20  t to execute..  
88b0: 20 20 20 2a 20 40 70 61 72 61 6d 20 62 69 6e 64     * @param bind
88c0: 41 72 67 73 20 54 68 65 20 61 72 67 75 6d 65 6e  Args The argumen
88d0: 74 73 20 74 6f 20 62 69 6e 64 2c 20 6f 72 20 6e  ts to bind, or n
88e0: 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20  ull if none..   
88f0: 20 20 2a 20 40 70 61 72 61 6d 20 77 69 6e 64 6f    * @param windo
8900: 77 20 54 68 65 20 63 75 72 73 6f 72 20 77 69 6e  w The cursor win
8910: 64 6f 77 20 74 6f 20 63 6c 65 61 72 20 61 6e 64  dow to clear and
8920: 20 66 69 6c 6c 2e 0a 20 20 20 20 20 2a 20 40 70   fill..     * @p
8930: 61 72 61 6d 20 73 74 61 72 74 50 6f 73 20 54 68  aram startPos Th
8940: 65 20 73 74 61 72 74 20 70 6f 73 69 74 69 6f 6e  e start position
8950: 20 66 6f 72 20 66 69 6c 6c 69 6e 67 20 74 68 65   for filling the
8960: 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a 20   window..     * 
8970: 40 70 61 72 61 6d 20 72 65 71 75 69 72 65 64 50  @param requiredP
8980: 6f 73 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  os The position 
8990: 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 4d 55  of a row that MU
89a0: 53 54 20 62 65 20 69 6e 20 74 68 65 20 77 69 6e  ST be in the win
89b0: 64 6f 77 2e 0a 20 20 20 20 20 2a 20 49 66 20 69  dow..     * If i
89c0: 74 20 77 6f 6e 27 74 20 66 69 74 2c 20 74 68 65  t won't fit, the
89d0: 6e 20 74 68 65 20 71 75 65 72 79 20 73 68 6f 75  n the query shou
89e0: 6c 64 20 64 69 73 63 61 72 64 20 70 61 72 74 20  ld discard part 
89f0: 6f 66 20 77 68 61 74 20 69 74 20 66 69 6c 6c 65  of what it fille
8a00: 64 0a 20 20 20 20 20 2a 20 73 6f 20 74 68 61 74  d.     * so that
8a10: 20 69 74 20 64 6f 65 73 2e 20 20 4d 75 73 74 20   it does.  Must 
8a20: 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
8a30: 6f 72 20 65 71 75 61 6c 20 74 6f 20 3c 63 6f 64  or equal to <cod
8a40: 65 3e 73 74 61 72 74 50 6f 73 3c 2f 63 6f 64 65  e>startPos</code
8a50: 3e 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  >..     * @param
8a60: 20 63 6f 75 6e 74 41 6c 6c 52 6f 77 73 20 54 72   countAllRows Tr
8a70: 75 65 20 74 6f 20 63 6f 75 6e 74 20 61 6c 6c 20  ue to count all 
8a80: 72 6f 77 73 20 74 68 61 74 20 74 68 65 20 71 75  rows that the qu
8a90: 65 72 79 20 77 6f 75 6c 64 20 72 65 74 75 72 6e  ery would return
8aa0: 0a 20 20 20 20 20 2a 20 72 65 67 61 67 6c 65 73  .     * regagles
8ab0: 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
8ac0: 79 20 66 69 74 20 69 6e 20 74 68 65 20 77 69 6e  y fit in the win
8ad0: 64 6f 77 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  dow..     * @par
8ae0: 61 6d 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  am cancellationS
8af0: 69 67 6e 61 6c 20 41 20 73 69 67 6e 61 6c 20 74  ignal A signal t
8b00: 6f 20 63 61 6e 63 65 6c 20 74 68 65 20 6f 70 65  o cancel the ope
8b10: 72 61 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  ration in progre
8b20: 73 73 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e  ss, or null if n
8b30: 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74  one..     * @ret
8b40: 75 72 6e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  urn The number o
8b50: 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 65  f rows that were
8b60: 20 63 6f 75 6e 74 65 64 20 64 75 72 69 6e 67 20   counted during 
8b70: 71 75 65 72 79 20 65 78 65 63 75 74 69 6f 6e 2e  query execution.
8b80: 20 20 4d 69 67 68 74 0a 20 20 20 20 20 2a 20 6e    Might.     * n
8b90: 6f 74 20 62 65 20 61 6c 6c 20 72 6f 77 73 20 69  ot be all rows i
8ba0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8bb0: 20 75 6e 6c 65 73 73 20 3c 63 6f 64 65 3e 63 6f   unless <code>co
8bc0: 75 6e 74 41 6c 6c 52 6f 77 73 3c 2f 63 6f 64 65  untAllRows</code
8bd0: 3e 20 69 73 20 74 72 75 65 2e 0a 20 20 20 20 20  > is true..     
8be0: 2a 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73  *.     * @throws
8bf0: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
8c00: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
8c10: 75 72 73 2c 20 73 75 63 68 20 61 73 20 61 20 73  urs, such as a s
8c20: 79 6e 74 61 78 20 65 72 72 6f 72 0a 20 20 20 20  yntax error.    
8c30: 20 2a 20 6f 72 20 69 6e 76 61 6c 69 64 20 6e 75   * or invalid nu
8c40: 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 61 72 67  mber of bind arg
8c50: 75 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 20 40  uments..     * @
8c60: 74 68 72 6f 77 73 20 4f 70 65 72 61 74 69 6f 6e  throws Operation
8c70: 43 61 6e 63 65 6c 65 64 45 78 63 65 70 74 69 6f  CanceledExceptio
8c80: 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  n if the operati
8c90: 6f 6e 20 77 61 73 20 63 61 6e 63 65 6c 65 64 2e  on was canceled.
8ca0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
8cb0: 6c 69 63 20 69 6e 74 20 65 78 65 63 75 74 65 46  lic int executeF
8cc0: 6f 72 43 75 72 73 6f 72 57 69 6e 64 6f 77 28 53  orCursorWindow(S
8cd0: 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63  tring sql, Objec
8ce0: 74 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20 20  t[] bindArgs,.  
8cf0: 20 20 20 20 20 20 20 20 20 20 43 75 72 73 6f 72            Cursor
8d00: 57 69 6e 64 6f 77 20 77 69 6e 64 6f 77 2c 20 69  Window window, i
8d10: 6e 74 20 73 74 61 72 74 50 6f 73 2c 20 69 6e 74  nt startPos, int
8d20: 20 72 65 71 75 69 72 65 64 50 6f 73 2c 20 62 6f   requiredPos, bo
8d30: 6f 6c 65 61 6e 20 63 6f 75 6e 74 41 6c 6c 52 6f  olean countAllRo
8d40: 77 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws,.            
8d50: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
8d60: 61 6c 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al cancellationS
8d70: 69 67 6e 61 6c 29 20 7b 0a 20 20 20 20 20 20 20  ignal) {.       
8d80: 20 69 66 20 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c   if (sql == null
8d90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8da0: 74 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61  throw new Illega
8db0: 6c 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69  lArgumentExcepti
8dc0: 6f 6e 28 22 73 71 6c 20 6d 75 73 74 20 6e 6f 74  on("sql must not
8dd0: 20 62 65 20 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20   be null.");.   
8de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8df0: 66 20 28 77 69 6e 64 6f 77 20 3d 3d 20 6e 75 6c  f (window == nul
8e00: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
8e10: 20 74 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67   throw new Illeg
8e20: 61 6c 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  alArgumentExcept
8e30: 69 6f 6e 28 22 77 69 6e 64 6f 77 20 6d 75 73 74  ion("window must
8e40: 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e 22 29 3b   not be null.");
8e50: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
8e60: 20 20 20 20 77 69 6e 64 6f 77 2e 61 63 71 75 69      window.acqui
8e70: 72 65 52 65 66 65 72 65 6e 63 65 28 29 3b 0a 20  reReference();. 
8e80: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
8e90: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74           int act
8ea0: 75 61 6c 50 6f 73 20 3d 20 2d 31 3b 0a 20 20 20  ualPos = -1;.   
8eb0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 75           int cou
8ec0: 6e 74 65 64 52 6f 77 73 20 3d 20 2d 31 3b 0a 20  ntedRows = -1;. 
8ed0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
8ee0: 69 6c 6c 65 64 52 6f 77 73 20 3d 20 2d 31 3b 0a  illedRows = -1;.
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
8f00: 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d  l int cookie = m
8f10: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
8f20: 2e 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28  .beginOperation(
8f30: 22 65 78 65 63 75 74 65 46 6f 72 43 75 72 73 6f  "executeForCurso
8f40: 72 57 69 6e 64 6f 77 22 2c 0a 20 20 20 20 20 20  rWindow",.      
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
8f60: 6c 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20  l, bindArgs);.  
8f70: 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 66 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53 74  final PreparedSt
8fa0: 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e  atement statemen
8fb0: 74 20 3d 20 61 63 71 75 69 72 65 50 72 65 70 61  t = acquirePrepa
8fc0: 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71 6c  redStatement(sql
8fd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8fe0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
9000: 6f 77 49 66 53 74 61 74 65 6d 65 6e 74 46 6f 72  owIfStatementFor
9010: 62 69 64 64 65 6e 28 73 74 61 74 65 6d 65 6e 74  bidden(statement
9020: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
9030: 20 20 20 20 20 20 20 62 69 6e 64 41 72 67 75 6d         bindArgum
9040: 65 6e 74 73 28 73 74 61 74 65 6d 65 6e 74 2c 20  ents(statement, 
9050: 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20  bindArgs);.     
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
9070: 70 70 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f  pplyBlockGuardPo
9080: 6c 69 63 79 28 73 74 61 74 65 6d 65 6e 74 29 3b  licy(statement);
9090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
90a0: 20 20 20 20 20 61 74 74 61 63 68 43 61 6e 63 65       attachCance
90b0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61  llationSignal(ca
90c0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
90d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
90e0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20       final long 
9110: 72 65 73 75 6c 74 20 3d 20 6e 61 74 69 76 65 45  result = nativeE
9120: 78 65 63 75 74 65 46 6f 72 43 75 72 73 6f 72 57  xecuteForCursorW
9130: 69 6e 64 6f 77 28 0a 20 20 20 20 20 20 20 20 20  indow(.         
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69         mConnecti
9160: 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74  onPtr, statement
9170: 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 2c 20  .mStatementPtr, 
9180: 77 69 6e 64 6f 77 2c 0a 20 20 20 20 20 20 20 20  window,.        
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 20 20 73 74 61 72 74 50 6f 73          startPos
91b0: 2c 20 72 65 71 75 69 72 65 64 50 6f 73 2c 20 63  , requiredPos, c
91c0: 6f 75 6e 74 41 6c 6c 52 6f 77 73 29 3b 0a 20 20  ountAllRows);.  
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 20 20 61 63 74 75 61 6c 50 6f 73 20        actualPos 
91f0: 3d 20 28 69 6e 74 29 28 72 65 73 75 6c 74 20 3e  = (int)(result >
9200: 3e 20 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20  > 32);.         
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9220: 6f 75 6e 74 65 64 52 6f 77 73 20 3d 20 28 69 6e  ountedRows = (in
9230: 74 29 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  t)result;.      
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 66 69 6c 6c 65 64 52 6f 77 73 20 3d 20 77    filledRows = w
9260: 69 6e 64 6f 77 2e 67 65 74 4e 75 6d 52 6f 77 73  indow.getNumRows
9270: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
9280: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 64              wind
9290: 6f 77 2e 73 65 74 53 74 61 72 74 50 6f 73 69 74  ow.setStartPosit
92a0: 69 6f 6e 28 61 63 74 75 61 6c 50 6f 73 29 3b 0a  ion(actualPos);.
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
92d0: 6f 75 6e 74 65 64 52 6f 77 73 3b 0a 20 20 20 20  ountedRows;.    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9310: 20 20 20 20 64 65 74 61 63 68 43 61 6e 63 65 6c      detachCancel
9320: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e  lationSignal(can
9330: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29  cellationSignal)
9340: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9360: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
9370: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
9380: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
9390: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
93a0: 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  (statement);.   
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
93c0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 63 61 74             } cat
93d0: 63 68 20 28 52 75 6e 74 69 6d 65 45 78 63 65 70  ch (RuntimeExcep
93e0: 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20 20 20  tion ex) {.     
93f0: 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65             mRece
9400: 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69  ntOperations.fai
9410: 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69  lOperation(cooki
9420: 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20  e, ex);.        
9430: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65 78          throw ex
9440: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
9450: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
9460: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 52            if (mR
9470: 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e  ecentOperations.
9480: 65 6e 64 4f 70 65 72 61 74 69 6f 6e 44 65 66 65  endOperationDefe
9490: 72 4c 6f 67 28 63 6f 6f 6b 69 65 29 29 20 7b 0a  rLog(cookie)) {.
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61      mRecentOpera
94c0: 74 69 6f 6e 73 2e 6c 6f 67 4f 70 65 72 61 74 69  tions.logOperati
94d0: 6f 6e 28 63 6f 6f 6b 69 65 2c 20 22 77 69 6e 64  on(cookie, "wind
94e0: 6f 77 3d 27 22 20 2b 20 77 69 6e 64 6f 77 0a 20  ow='" + window. 
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 27 2c             + "',
9510: 20 73 74 61 72 74 50 6f 73 3d 22 20 2b 20 73 74   startPos=" + st
9520: 61 72 74 50 6f 73 0a 20 20 20 20 20 20 20 20 20  artPos.         
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 2b 20 22 2c 20 61 63 74 75 61 6c 50 6f     + ", actualPo
9550: 73 3d 22 20 2b 20 61 63 74 75 61 6c 50 6f 73 0a  s=" + actualPos.
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 2c              + ",
9580: 20 66 69 6c 6c 65 64 52 6f 77 73 3d 22 20 2b 20   filledRows=" + 
9590: 66 69 6c 6c 65 64 52 6f 77 73 0a 20 20 20 20 20  filledRows.     
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 2b 20 22 2c 20 63 6f 75 6e         + ", coun
95c0: 74 65 64 52 6f 77 73 3d 22 20 2b 20 63 6f 75 6e  tedRows=" + coun
95d0: 74 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20 20  tedRows);.      
95e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
95f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9600: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
9610: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
9620: 2e 72 65 6c 65 61 73 65 52 65 66 65 72 65 6e 63  .releaseReferenc
9630: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
9640: 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
9650: 65 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  e PreparedStatem
9660: 65 6e 74 20 61 63 71 75 69 72 65 50 72 65 70 61  ent acquirePrepa
9670: 72 65 64 53 74 61 74 65 6d 65 6e 74 28 53 74 72  redStatement(Str
9680: 69 6e 67 20 73 71 6c 29 20 7b 0a 20 20 20 20 20  ing sql) {.     
9690: 20 20 20 50 72 65 70 61 72 65 64 53 74 61 74 65     PreparedState
96a0: 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d  ment statement =
96b0: 20 6d 50 72 65 70 61 72 65 64 53 74 61 74 65 6d   mPreparedStatem
96c0: 65 6e 74 43 61 63 68 65 2e 67 65 74 28 73 71 6c  entCache.get(sql
96d0: 29 3b 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 65  );.        boole
96e0: 61 6e 20 73 6b 69 70 43 61 63 68 65 20 3d 20 66  an skipCache = f
96f0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 69 66  alse;.        if
9700: 20 28 73 74 61 74 65 6d 65 6e 74 20 21 3d 20 6e   (statement != n
9710: 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ull) {.         
9720: 20 20 20 69 66 20 28 21 73 74 61 74 65 6d 65 6e     if (!statemen
9730: 74 2e 6d 49 6e 55 73 65 29 20 7b 0a 20 20 20 20  t.mInUse) {.    
9740: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
9750: 72 6e 20 73 74 61 74 65 6d 65 6e 74 3b 0a 20 20  rn statement;.  
9760: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9770: 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 73          // The s
9780: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 6c 72 65  tatement is alre
9790: 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
97a0: 20 62 75 74 20 69 73 20 69 6e 20 75 73 65 20 28   but is in use (
97b0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 61  this statement a
97c0: 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 20  ppears.         
97d0: 20 20 20 2f 2f 20 74 6f 20 62 65 20 6e 6f 74 20     // to be not 
97e0: 6f 6e 6c 79 20 72 65 2d 65 6e 74 72 61 6e 74 20  only re-entrant 
97f0: 62 75 74 20 72 65 63 75 72 73 69 76 65 21 29 2e  but recursive!).
9800: 20 20 53 6f 20 70 72 65 70 61 72 65 20 61 20 6e    So prepare a n
9810: 65 77 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 20  ew copy of the. 
9820: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 74             // st
9830: 61 74 65 6d 65 6e 74 20 62 75 74 20 64 6f 20 6e  atement but do n
9840: 6f 74 20 63 61 63 68 65 20 69 74 2e 0a 20 20 20  ot cache it..   
9850: 20 20 20 20 20 20 20 20 20 73 6b 69 70 43 61 63           skipCac
9860: 68 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  he = true;.     
9870: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
9880: 6e 61 6c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  nal long stateme
9890: 6e 74 50 74 72 20 3d 20 6e 61 74 69 76 65 50 72  ntPtr = nativePr
98a0: 65 70 61 72 65 53 74 61 74 65 6d 65 6e 74 28 6d  epareStatement(m
98b0: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73  ConnectionPtr, s
98c0: 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79  ql);.        try
98d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
98e0: 69 6e 61 6c 20 69 6e 74 20 6e 75 6d 50 61 72 61  inal int numPara
98f0: 6d 65 74 65 72 73 20 3d 20 6e 61 74 69 76 65 47  meters = nativeG
9900: 65 74 50 61 72 61 6d 65 74 65 72 43 6f 75 6e 74  etParameterCount
9910: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
9920: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a   statementPtr);.
9930: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
9940: 6c 20 69 6e 74 20 74 79 70 65 20 3d 20 44 61 74  l int type = Dat
9950: 61 62 61 73 65 55 74 69 6c 73 2e 67 65 74 53 71  abaseUtils.getSq
9960: 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65 28 73  lStatementType(s
9970: 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ql);.           
9980: 20 66 69 6e 61 6c 20 62 6f 6f 6c 65 61 6e 20 72   final boolean r
9990: 65 61 64 4f 6e 6c 79 20 3d 20 6e 61 74 69 76 65  eadOnly = native
99a0: 49 73 52 65 61 64 4f 6e 6c 79 28 6d 43 6f 6e 6e  IsReadOnly(mConn
99b0: 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65  ectionPtr, state
99c0: 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20  mentPtr);.      
99d0: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
99e0: 3d 20 6f 62 74 61 69 6e 50 72 65 70 61 72 65 64  = obtainPrepared
99f0: 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 2c 20 73  Statement(sql, s
9a00: 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 6e 75 6d  tatementPtr, num
9a10: 50 61 72 61 6d 65 74 65 72 73 2c 20 74 79 70 65  Parameters, type
9a20: 2c 20 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20  , readOnly);.   
9a30: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 6b           if (!sk
9a40: 69 70 43 61 63 68 65 20 26 26 20 69 73 43 61 63  ipCache && isCac
9a50: 68 65 61 62 6c 65 28 74 79 70 65 29 29 20 7b 0a  heable(type)) {.
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 6d 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  mPreparedStateme
9a80: 6e 74 43 61 63 68 65 2e 70 75 74 28 73 71 6c 2c  ntCache.put(sql,
9a90: 20 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20   statement);.   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
9ab0: 74 65 6d 65 6e 74 2e 6d 49 6e 43 61 63 68 65 20  tement.mInCache 
9ac0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
9ad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
9ae0: 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78  catch (RuntimeEx
9af0: 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
9b00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 69 6e            // Fin
9b10: 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
9b20: 65 6e 74 20 69 66 20 61 6e 20 65 78 63 65 70 74  ent if an except
9b30: 69 6f 6e 20 6f 63 63 75 72 72 65 64 20 61 6e 64  ion occurred and
9b40: 20 77 65 20 64 69 64 20 6e 6f 74 20 61 64 64 0a   we did not add.
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
9b60: 74 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20  t to the cache. 
9b70: 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
9b80: 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
9b90: 74 68 65 6e 20 6c 65 61 76 65 20 69 74 20 74 68  then leave it th
9ba0: 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ere..           
9bb0: 20 69 66 20 28 73 74 61 74 65 6d 65 6e 74 20 3d   if (statement =
9bc0: 3d 20 6e 75 6c 6c 20 7c 7c 20 21 73 74 61 74 65  = null || !state
9bd0: 6d 65 6e 74 2e 6d 49 6e 43 61 63 68 65 29 20 7b  ment.mInCache) {
9be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9bf0: 20 6e 61 74 69 76 65 46 69 6e 61 6c 69 7a 65 53   nativeFinalizeS
9c00: 74 61 74 65 6d 65 6e 74 28 6d 43 6f 6e 6e 65 63  tatement(mConnec
9c10: 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65  tionPtr, stateme
9c20: 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  ntPtr);.        
9c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9c40: 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20    throw ex;.    
9c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74      }.        st
9c60: 61 74 65 6d 65 6e 74 2e 6d 49 6e 55 73 65 20 3d  atement.mInUse =
9c70: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 72   true;.        r
9c80: 65 74 75 72 6e 20 73 74 61 74 65 6d 65 6e 74 3b  eturn statement;
9c90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  .    }..    priv
9ca0: 61 74 65 20 76 6f 69 64 20 72 65 6c 65 61 73 65  ate void release
9cb0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
9cc0: 74 28 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  t(PreparedStatem
9cd0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 29 20 7b  ent statement) {
9ce0: 0a 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65  .        stateme
9cf0: 6e 74 2e 6d 49 6e 55 73 65 20 3d 20 66 61 6c 73  nt.mInUse = fals
9d00: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  e;.        if (s
9d10: 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43 61 63 68  tatement.mInCach
9d20: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
9d30: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
9d40: 20 20 20 20 20 20 20 6e 61 74 69 76 65 52 65 73         nativeRes
9d50: 65 74 53 74 61 74 65 6d 65 6e 74 41 6e 64 43 6c  etStatementAndCl
9d60: 65 61 72 42 69 6e 64 69 6e 67 73 28 6d 43 6f 6e  earBindings(mCon
9d70: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74  nectionPtr, stat
9d80: 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74  ement.mStatement
9d90: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ptr);.          
9da0: 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69 74    } catch (SQLit
9db0: 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b  eException ex) {
9dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9dd0: 20 2f 2f 20 54 68 65 20 73 74 61 74 65 6d 65 6e   // The statemen
9de0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
9df0: 65 73 65 74 20 64 75 65 20 74 6f 20 61 6e 20 65  eset due to an e
9e00: 72 72 6f 72 2e 20 20 52 65 6d 6f 76 65 20 69 74  rror.  Remove it
9e10: 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e   from the cache.
9e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9e30: 20 2f 2f 20 57 68 65 6e 20 72 65 6d 6f 76 65 28   // When remove(
9e40: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
9e50: 20 63 61 63 68 65 20 77 69 6c 6c 20 69 6e 76 6f   cache will invo
9e60: 6b 65 20 69 74 73 20 65 6e 74 72 79 52 65 6d 6f  ke its entryRemo
9e70: 76 65 64 28 29 20 63 61 6c 6c 62 61 63 6b 2c 0a  ved() callback,.
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 2f 2f 20 77 68 69 63 68 20 77 69 6c 6c 20 69 6e  // which will in
9ea0: 20 74 75 72 6e 20 63 61 6c 6c 20 66 69 6e 61 6c   turn call final
9eb0: 69 7a 65 50 72 65 70 61 72 65 64 53 74 61 74 65  izePreparedState
9ec0: 6d 65 6e 74 28 29 20 74 6f 20 66 69 6e 61 6c 69  ment() to finali
9ed0: 7a 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ze and.         
9ee0: 20 20 20 20 20 20 20 2f 2f 20 72 65 63 79 63 6c         // recycl
9ef0: 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  e the statement.
9f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9f10: 20 69 66 20 28 44 45 42 55 47 29 20 7b 0a 20 20   if (DEBUG) {.  
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 4c 6f 67 2e 64 28 54 41 47 2c 20 22 43 6f    Log.d(TAG, "Co
9f40: 75 6c 64 20 6e 6f 74 20 72 65 73 65 74 20 70 72  uld not reset pr
9f50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9f60: 20 64 75 65 20 74 6f 20 61 6e 20 65 78 63 65 70   due to an excep
9f70: 74 69 6f 6e 2e 20 20 22 0a 20 20 20 20 20 20 20  tion.  ".       
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 20 2b 20 22 52 65 6d 6f 76 69 6e 67       + "Removing
9fa0: 20 69 74 20 66 72 6f 6d 20 74 68 65 20 63 61 63   it from the cac
9fb0: 68 65 2e 20 20 53 51 4c 3a 20 22 0a 20 20 20 20  he.  SQL: ".    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 2b 20 74 72 69 6d 53 71          + trimSq
9fe0: 6c 46 6f 72 44 69 73 70 6c 61 79 28 73 74 61 74  lForDisplay(stat
9ff0: 65 6d 65 6e 74 2e 6d 53 71 6c 29 2c 20 65 78 29  ement.mSql), ex)
a000: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a010: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
a020: 20 20 20 20 20 6d 50 72 65 70 61 72 65 64 53 74       mPreparedSt
a030: 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 72 65 6d  atementCache.rem
a040: 6f 76 65 28 73 74 61 74 65 6d 65 6e 74 2e 6d 53  ove(statement.mS
a050: 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ql);.           
a060: 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73   }.        } els
a070: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
a080: 66 69 6e 61 6c 69 7a 65 50 72 65 70 61 72 65 64  finalizePrepared
a090: 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74 65 6d  Statement(statem
a0a0: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ent);.        }.
a0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
a0c0: 74 65 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  te void finalize
a0d0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
a0e0: 74 28 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  t(PreparedStatem
a0f0: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 29 20 7b  ent statement) {
a100: 0a 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 46  .        nativeF
a110: 69 6e 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e 74  inalizeStatement
a120: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
a130: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74   statement.mStat
a140: 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20  ementPtr);.     
a150: 20 20 20 72 65 63 79 63 6c 65 50 72 65 70 61 72     recyclePrepar
a160: 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74  edStatement(stat
a170: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ement);.    }.. 
a180: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
a190: 61 74 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69  attachCancellati
a1a0: 6f 6e 53 69 67 6e 61 6c 28 43 61 6e 63 65 6c 6c  onSignal(Cancell
a1b0: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63  ationSignal canc
a1c0: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20  ellationSignal) 
a1d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 61  {.        if (ca
a1e0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
a1f0: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   != null) {.    
a200: 20 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61          cancella
a210: 74 69 6f 6e 53 69 67 6e 61 6c 2e 74 68 72 6f 77  tionSignal.throw
a220: 49 66 43 61 6e 63 65 6c 65 64 28 29 3b 0a 0a 20  IfCanceled();.. 
a230: 20 20 20 20 20 20 20 20 20 20 20 6d 43 61 6e 63             mCanc
a240: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 41 74  ellationSignalAt
a250: 74 61 63 68 43 6f 75 6e 74 20 2b 3d 20 31 3b 0a  tachCount += 1;.
a260: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a270: 6d 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  mCancellationSig
a280: 6e 61 6c 41 74 74 61 63 68 43 6f 75 6e 74 20 3d  nalAttachCount =
a290: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 1) {.         
a2a0: 20 20 20 20 20 20 20 2f 2f 20 52 65 73 65 74 20         // Reset 
a2b0: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 20 66 6c 61  cancellation fla
a2c0: 67 20 62 65 66 6f 72 65 20 65 78 65 63 75 74 69  g before executi
a2d0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
a2e0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a2f0: 20 20 6e 61 74 69 76 65 52 65 73 65 74 43 61 6e    nativeResetCan
a300: 63 65 6c 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50  cel(mConnectionP
a310: 74 72 2c 20 74 72 75 65 20 2f 2a 63 61 6e 63 65  tr, true /*cance
a320: 6c 61 62 6c 65 2a 2f 29 3b 0a 0a 20 20 20 20 20  lable*/);..     
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 41 66             // Af
a340: 74 65 72 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ter this point, 
a350: 6f 6e 43 61 6e 63 65 6c 28 29 20 6d 61 79 20 62  onCancel() may b
a360: 65 20 63 61 6c 6c 65 64 20 63 6f 6e 63 75 72 72  e called concurr
a370: 65 6e 74 6c 79 2e 0a 20 20 20 20 20 20 20 20 20  ently..         
a380: 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c 61 74         cancellat
a390: 69 6f 6e 53 69 67 6e 61 6c 2e 73 65 74 4f 6e 43  ionSignal.setOnC
a3a0: 61 6e 63 65 6c 4c 69 73 74 65 6e 65 72 28 74 68  ancelListener(th
a3b0: 69 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  is);.           
a3c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a3d0: 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20   }..    private 
a3e0: 76 6f 69 64 20 64 65 74 61 63 68 43 61 6e 63 65  void detachCance
a3f0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 43 61  llationSignal(Ca
a400: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
a410: 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67   cancellationSig
a420: 6e 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 69  nal) {.        i
a430: 66 20 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  f (cancellationS
a440: 69 67 6e 61 6c 20 21 3d 20 6e 75 6c 6c 29 20 7b  ignal != null) {
a450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
a460: 65 72 74 20 6d 43 61 6e 63 65 6c 6c 61 74 69 6f  ert mCancellatio
a470: 6e 53 69 67 6e 61 6c 41 74 74 61 63 68 43 6f 75  nSignalAttachCou
a480: 6e 74 20 3e 20 30 3b 0a 0a 20 20 20 20 20 20 20  nt > 0;..       
a490: 20 20 20 20 20 6d 43 61 6e 63 65 6c 6c 61 74 69       mCancellati
a4a0: 6f 6e 53 69 67 6e 61 6c 41 74 74 61 63 68 43 6f  onSignalAttachCo
a4b0: 75 6e 74 20 2d 3d 20 31 3b 0a 20 20 20 20 20 20  unt -= 1;.      
a4c0: 20 20 20 20 20 20 69 66 20 28 6d 43 61 6e 63 65        if (mCance
a4d0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 41 74 74  llationSignalAtt
a4e0: 61 63 68 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  achCount == 0) {
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a500: 20 2f 2f 20 41 66 74 65 72 20 74 68 69 73 20 70   // After this p
a510: 6f 69 6e 74 2c 20 6f 6e 43 61 6e 63 65 6c 28 29  oint, onCancel()
a520: 20 63 61 6e 6e 6f 74 20 62 65 20 63 61 6c 6c 65   cannot be calle
a530: 64 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 2e 0a  d concurrently..
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  cancellationSign
a560: 61 6c 2e 73 65 74 4f 6e 43 61 6e 63 65 6c 4c 69  al.setOnCancelLi
a570: 73 74 65 6e 65 72 28 6e 75 6c 6c 29 3b 0a 0a 20  stener(null);.. 
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a590: 2f 20 52 65 73 65 74 20 63 61 6e 63 65 6c 6c 61  / Reset cancella
a5a0: 74 69 6f 6e 20 66 6c 61 67 20 61 66 74 65 72 20  tion flag after 
a5b0: 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 73 74  executing the st
a5c0: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
a5d0: 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 52           nativeR
a5e0: 65 73 65 74 43 61 6e 63 65 6c 28 6d 43 6f 6e 6e  esetCancel(mConn
a5f0: 65 63 74 69 6f 6e 50 74 72 2c 20 66 61 6c 73 65  ectionPtr, false
a600: 20 2f 2a 63 61 6e 63 65 6c 61 62 6c 65 2a 2f 29   /*cancelable*/)
a610: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
a620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
a630: 0a 20 20 20 20 2f 2f 20 43 61 6e 63 65 6c 6c 61  .    // Cancella
a640: 74 69 6f 6e 53 69 67 6e 61 6c 2e 4f 6e 43 61 6e  tionSignal.OnCan
a650: 63 65 6c 4c 69 73 74 65 6e 65 72 20 63 61 6c 6c  celListener call
a660: 62 61 63 6b 2e 0a 20 20 20 20 2f 2f 20 54 68 69  back..    // Thi
a670: 73 20 6d 65 74 68 6f 64 20 6d 61 79 20 62 65 20  s method may be 
a680: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 64 69 66 66  called on a diff
a690: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
a6a0: 6e 20 74 68 65 20 65 78 65 63 75 74 69 6e 67 20  n the executing 
a6b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2f  statement..    /
a6c0: 2f 20 48 6f 77 65 76 65 72 2c 20 69 74 20 77 69  / However, it wi
a6d0: 6c 6c 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ll only be calle
a6e0: 64 20 62 65 74 77 65 65 6e 20 63 61 6c 6c 73 20  d between calls 
a6f0: 74 6f 20 61 74 74 61 63 68 43 61 6e 63 65 6c 6c  to attachCancell
a700: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 61 6e 64 0a  ationSignal and.
a710: 20 20 20 20 2f 2f 20 64 65 74 61 63 68 43 61 6e      // detachCan
a720: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 2c  cellationSignal,
a730: 20 77 68 69 6c 65 20 61 20 73 74 61 74 65 6d 65   while a stateme
a740: 6e 74 20 69 73 20 65 78 65 63 75 74 69 6e 67 2e  nt is executing.
a750: 20 20 57 65 20 63 61 6e 20 73 61 66 65 6c 79 20    We can safely 
a760: 61 73 73 75 6d 65 0a 20 20 20 20 2f 2f 20 74 68  assume.    // th
a770: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  at the SQLite co
a780: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 73 74 69 6c  nnection is stil
a790: 6c 20 61 6c 69 76 65 2e 0a 20 20 20 20 40 4f 76  l alive..    @Ov
a7a0: 65 72 72 69 64 65 0a 20 20 20 20 70 75 62 6c 69  erride.    publi
a7b0: 63 20 76 6f 69 64 20 6f 6e 43 61 6e 63 65 6c 28  c void onCancel(
a7c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6e 61 74 69  ) {.        nati
a7d0: 76 65 43 61 6e 63 65 6c 28 6d 43 6f 6e 6e 65 63  veCancel(mConnec
a7e0: 74 69 6f 6e 50 74 72 29 3b 0a 20 20 20 20 7d 0a  tionPtr);.    }.
a7f0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69  .    private voi
a800: 64 20 62 69 6e 64 41 72 67 75 6d 65 6e 74 73 28  d bindArguments(
a810: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
a820: 74 20 73 74 61 74 65 6d 65 6e 74 2c 20 4f 62 6a  t statement, Obj
a830: 65 63 74 5b 5d 20 62 69 6e 64 41 72 67 73 29 20  ect[] bindArgs) 
a840: 7b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20  {.        final 
a850: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 62 69 6e 64  int count = bind
a860: 41 72 67 73 20 21 3d 20 6e 75 6c 6c 20 3f 20 62  Args != null ? b
a870: 69 6e 64 41 72 67 73 2e 6c 65 6e 67 74 68 20 3a  indArgs.length :
a880: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28   0;.        if (
a890: 63 6f 75 6e 74 20 21 3d 20 73 74 61 74 65 6d 65  count != stateme
a8a0: 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d 65 74 65 72  nt.mNumParameter
a8b0: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s) {.           
a8c0: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
a8d0: 65 42 69 6e 64 4f 72 43 6f 6c 75 6d 6e 49 6e 64  eBindOrColumnInd
a8e0: 65 78 4f 75 74 4f 66 52 61 6e 67 65 45 78 63 65  exOutOfRangeExce
a8f0: 70 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 20  ption(.         
a900: 20 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65             "Expe
a910: 63 74 65 64 20 22 20 2b 20 73 74 61 74 65 6d 65  cted " + stateme
a920: 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d 65 74 65 72  nt.mNumParameter
a930: 73 20 2b 20 22 20 62 69 6e 64 20 61 72 67 75 6d  s + " bind argum
a940: 65 6e 74 73 20 62 75 74 20 22 0a 20 20 20 20 20  ents but ".     
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
a960: 20 63 6f 75 6e 74 20 2b 20 22 20 77 65 72 65 20   count + " were 
a970: 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 20 20 20  provided.");.   
a980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a990: 66 20 28 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  f (count == 0) {
a9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
a9b0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  urn;.        }..
a9c0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 6c 6f          final lo
a9d0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72 20  ng statementPtr 
a9e0: 3d 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61  = statement.mSta
a9f0: 74 65 6d 65 6e 74 50 74 72 3b 0a 20 20 20 20 20  tementPtr;.     
aa00: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20     for (int i = 
aa10: 30 3b 20 69 20 3c 20 63 6f 75 6e 74 3b 20 69 2b  0; i < count; i+
aa20: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
aa30: 20 66 69 6e 61 6c 20 4f 62 6a 65 63 74 20 61 72   final Object ar
aa40: 67 20 3d 20 62 69 6e 64 41 72 67 73 5b 69 5d 3b  g = bindArgs[i];
aa50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69  .            swi
aa60: 74 63 68 20 28 45 78 74 72 61 55 74 69 6c 73 2e  tch (ExtraUtils.
aa70: 67 65 74 54 79 70 65 4f 66 4f 62 6a 65 63 74 28  getTypeOfObject(
aa80: 61 72 67 29 29 20 7b 0a 20 20 20 20 20 20 20 20  arg)) {.        
aa90: 20 20 20 20 20 20 20 20 63 61 73 65 20 43 75 72          case Cur
aaa0: 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f 4e  sor.FIELD_TYPE_N
aab0: 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ULL:.           
aac0: 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 42           nativeB
aad0: 69 6e 64 4e 75 6c 6c 28 6d 43 6f 6e 6e 65 63 74  indNull(mConnect
aae0: 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e  ionPtr, statemen
aaf0: 74 50 74 72 2c 20 69 20 2b 20 31 29 3b 0a 20 20  tPtr, i + 1);.  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ab20: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 43 75           case Cu
ab30: 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f  rsor.FIELD_TYPE_
ab40: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20  INTEGER:.       
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 74               nat
ab60: 69 76 65 42 69 6e 64 4c 6f 6e 67 28 6d 43 6f 6e  iveBindLong(mCon
ab70: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74  nectionPtr, stat
ab80: 65 6d 65 6e 74 50 74 72 2c 20 69 20 2b 20 31 2c  ementPtr, i + 1,
ab90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 4e               ((N
abb0: 75 6d 62 65 72 29 61 72 67 29 2e 6c 6f 6e 67 56  umber)arg).longV
abc0: 61 6c 75 65 28 29 29 3b 0a 20 20 20 20 20 20 20  alue());.       
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
abe0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
abf0: 20 20 20 20 63 61 73 65 20 43 75 72 73 6f 72 2e      case Cursor.
ac00: 46 49 45 4c 44 5f 54 59 50 45 5f 46 4c 4f 41 54  FIELD_TYPE_FLOAT
ac10: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
ac20: 20 20 20 20 20 20 6e 61 74 69 76 65 42 69 6e 64        nativeBind
ac30: 44 6f 75 62 6c 65 28 6d 43 6f 6e 6e 65 63 74 69  Double(mConnecti
ac40: 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74  onPtr, statement
ac50: 50 74 72 2c 20 69 20 2b 20 31 2c 0a 20 20 20 20  Ptr, i + 1,.    
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 20 20 20 20 20 20 28 28 4e 75 6d 62 65 72          ((Number
ac80: 29 61 72 67 29 2e 64 6f 75 62 6c 65 56 61 6c 75  )arg).doubleValu
ac90: 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e());.          
aca0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
acb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
acc0: 20 63 61 73 65 20 43 75 72 73 6f 72 2e 46 49 45   case Cursor.FIE
acd0: 4c 44 5f 54 59 50 45 5f 42 4c 4f 42 3a 0a 20 20  LD_TYPE_BLOB:.  
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 6e 61 74 69 76 65 42 69 6e 64 42 6c 6f 62    nativeBindBlob
ad00: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
ad10: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 69   statementPtr, i
ad20: 20 2b 20 31 2c 20 28 62 79 74 65 5b 5d 29 61 72   + 1, (byte[])ar
ad30: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
ad40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
ad60: 61 73 65 20 43 75 72 73 6f 72 2e 46 49 45 4c 44  ase Cursor.FIELD
ad70: 5f 54 59 50 45 5f 53 54 52 49 4e 47 3a 0a 20 20  _TYPE_STRING:.  
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
ad90: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
ada0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61             if (a
adb0: 72 67 20 69 6e 73 74 61 6e 63 65 6f 66 20 42 6f  rg instanceof Bo
adc0: 6f 6c 65 61 6e 29 20 7b 0a 20 20 20 20 20 20 20  olean) {.       
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 2f 2f 20 50 72 6f 76 69 64 65 20 63 6f 6d 70   // Provide comp
adf0: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6c  atibility with l
ae00: 65 67 61 63 79 20 61 70 70 6c 69 63 61 74 69 6f  egacy applicatio
ae10: 6e 73 20 77 68 69 63 68 20 6d 61 79 20 70 61 73  ns which may pas
ae20: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
ae30: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 42 6f 6f            // Boo
ae40: 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 62  lean values in b
ae50: 69 6e 64 20 61 72 67 73 2e 0a 20 20 20 20 20 20  ind args..      
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 6e 61 74 69 76 65 42 69 6e 64 4c 6f 6e 67    nativeBindLong
ae80: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
ae90: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 69   statementPtr, i
aea0: 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   + 1,.          
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 20 20 28 28 42 6f 6f 6c 65 61 6e 29        ((Boolean)
aed0: 61 72 67 29 2e 62 6f 6f 6c 65 61 6e 56 61 6c 75  arg).booleanValu
aee0: 65 28 29 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  e() ? 1 : 0);.  
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 6e 61 74 69 76 65 42 69 6e 64 53 74 72     nativeBindStr
af30: 69 6e 67 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50  ing(mConnectionP
af40: 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 50 74 72  tr, statementPtr
af50: 2c 20 69 20 2b 20 31 2c 20 61 72 67 2e 74 6f 53  , i + 1, arg.toS
af60: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20  tring());.      
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
afa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
afb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
afc0: 69 76 61 74 65 20 76 6f 69 64 20 74 68 72 6f 77  ivate void throw
afd0: 49 66 53 74 61 74 65 6d 65 6e 74 46 6f 72 62 69  IfStatementForbi
afe0: 64 64 65 6e 28 50 72 65 70 61 72 65 64 53 74 61  dden(PreparedSta
aff0: 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  tement statement
b000: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
b010: 6d 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f 6e  mOnlyAllowReadOn
b020: 6c 79 4f 70 65 72 61 74 69 6f 6e 73 20 26 26 20  lyOperations && 
b030: 21 73 74 61 74 65 6d 65 6e 74 2e 6d 52 65 61 64  !statement.mRead
b040: 4f 6e 6c 79 29 20 7b 0a 20 20 20 20 20 20 20 20  Only) {.        
b050: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53 51      throw new SQ
b060: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 28 22 43  LiteException("C
b070: 61 6e 6e 6f 74 20 65 78 65 63 75 74 65 20 74 68  annot execute th
b080: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 62 65 63  is statement bec
b090: 61 75 73 65 20 69 74 20 22 0a 20 20 20 20 20 20  ause it ".      
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
b0b0: 22 6d 69 67 68 74 20 6d 6f 64 69 66 79 20 74 68  "might modify th
b0c0: 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 74  e database but t
b0d0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
b0e0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 22 29 3b 0a 20   read-only.");. 
b0f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
b100: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
b110: 69 63 20 62 6f 6f 6c 65 61 6e 20 69 73 43 61 63  ic boolean isCac
b120: 68 65 61 62 6c 65 28 69 6e 74 20 73 74 61 74 65  heable(int state
b130: 6d 65 6e 74 54 79 70 65 29 20 7b 0a 20 20 20 20  mentType) {.    
b140: 20 20 20 20 69 66 20 28 73 74 61 74 65 6d 65 6e      if (statemen
b150: 74 54 79 70 65 20 3d 3d 20 44 61 74 61 62 61 73  tType == Databas
b160: 65 55 74 69 6c 73 2e 53 54 41 54 45 4d 45 4e 54  eUtils.STATEMENT
b170: 5f 55 50 44 41 54 45 0a 20 20 20 20 20 20 20 20  _UPDATE.        
b180: 20 20 20 20 20 20 20 20 7c 7c 20 73 74 61 74 65          || state
b190: 6d 65 6e 74 54 79 70 65 20 3d 3d 20 44 61 74 61  mentType == Data
b1a0: 62 61 73 65 55 74 69 6c 73 2e 53 54 41 54 45 4d  baseUtils.STATEM
b1b0: 45 4e 54 5f 53 45 4c 45 43 54 29 20 7b 0a 20 20  ENT_SELECT) {.  
b1c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b1d0: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 7d   true;.        }
b1e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b1f0: 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  false;.    }..  
b200: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 61    private void a
b210: 70 70 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50 6f  pplyBlockGuardPo
b220: 6c 69 63 79 28 50 72 65 70 61 72 65 64 53 74 61  licy(PreparedSta
b230: 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  tement statement
b240: 29 20 7b 0a 2f 2a 20 20 20 20 20 20 20 20 69 66  ) {./*        if
b250: 20 28 21 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f   (!mConfiguratio
b260: 6e 2e 69 73 49 6e 4d 65 6d 6f 72 79 44 62 28 29  n.isInMemoryDb()
b270: 29 20 7b 2a 2f 0a 2f 2a 20 20 20 20 20 20 20 20  ) {*/./*        
b280: 20 20 20 20 69 66 20 28 73 74 61 74 65 6d 65 6e      if (statemen
b290: 74 2e 6d 52 65 61 64 4f 6e 6c 79 29 20 7b 2a 2f  t.mReadOnly) {*/
b2a0: 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  ./*             
b2b0: 20 20 20 42 6c 6f 63 6b 47 75 61 72 64 2e 67 65     BlockGuard.ge
b2c0: 74 54 68 72 65 61 64 50 6f 6c 69 63 79 28 29 2e  tThreadPolicy().
b2d0: 6f 6e 52 65 61 64 46 72 6f 6d 44 69 73 6b 28 29  onReadFromDisk()
b2e0: 3b 2a 2f 0a 2f 2a 20 20 20 20 20 20 20 20 20 20  ;*/./*          
b2f0: 20 20 7d 20 65 6c 73 65 20 7b 2a 2f 0a 2f 2a 20    } else {*/./* 
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42                 B
b310: 6c 6f 63 6b 47 75 61 72 64 2e 67 65 74 54 68 72  lockGuard.getThr
b320: 65 61 64 50 6f 6c 69 63 79 28 29 2e 6f 6e 57 72  eadPolicy().onWr
b330: 69 74 65 54 6f 44 69 73 6b 28 29 3b 2a 2f 0a 2f  iteToDisk();*/./
b340: 2a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2a 2f  *            }*/
b350: 0a 2f 2a 20 20 20 20 20 20 20 20 7d 2a 2f 0a 20  ./*        }*/. 
b360: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
b370: 20 20 20 2a 20 44 75 6d 70 73 20 64 65 62 75 67     * Dumps debug
b380: 67 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ging information
b390: 20 61 62 6f 75 74 20 74 68 69 73 20 63 6f 6e 6e   about this conn
b3a0: 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20  ection..     *. 
b3b0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 70 72 69      * @param pri
b3c0: 6e 74 65 72 20 54 68 65 20 70 72 69 6e 74 65 72  nter The printer
b3d0: 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
b3e0: 64 75 6d 70 2c 20 6e 6f 74 20 6e 75 6c 6c 2e 0a  dump, not null..
b3f0: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 76 65       * @param ve
b400: 72 62 6f 73 65 20 54 72 75 65 20 74 6f 20 64 75  rbose True to du
b410: 6d 70 20 6d 6f 72 65 20 76 65 72 62 6f 73 65 20  mp more verbose 
b420: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
b430: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
b440: 76 6f 69 64 20 64 75 6d 70 28 50 72 69 6e 74 65  void dump(Printe
b450: 72 20 70 72 69 6e 74 65 72 2c 20 62 6f 6f 6c 65  r printer, boole
b460: 61 6e 20 76 65 72 62 6f 73 65 29 20 7b 0a 20 20  an verbose) {.  
b470: 20 20 20 20 20 20 64 75 6d 70 55 6e 73 61 66 65        dumpUnsafe
b480: 28 70 72 69 6e 74 65 72 2c 20 76 65 72 62 6f 73  (printer, verbos
b490: 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  e);.    }..    /
b4a0: 2a 2a 0a 20 20 20 20 20 2a 20 44 75 6d 70 73 20  **.     * Dumps 
b4b0: 64 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d  debugging inform
b4c0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
b4d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 6e 20   connection, in 
b4e0: 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 74  the case where t
b4f0: 68 65 0a 20 20 20 20 20 2a 20 63 61 6c 6c 65 72  he.     * caller
b500: 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
b510: 6c 6c 79 20 6f 77 6e 20 74 68 65 20 63 6f 6e 6e  lly own the conn
b520: 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20  ection..     *. 
b530: 20 20 20 20 2a 20 54 68 69 73 20 66 75 6e 63 74      * This funct
b540: 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 20 73  ion is written s
b550: 6f 20 74 68 61 74 20 69 74 20 6d 61 79 20 62 65  o that it may be
b560: 20 63 61 6c 6c 65 64 20 62 79 20 61 20 74 68 72   called by a thr
b570: 65 61 64 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ead that does no
b580: 74 0a 20 20 20 20 20 2a 20 6f 77 6e 20 74 68 65  t.     * own the
b590: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 57 65   connection.  We
b5a0: 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 79   need to be very
b5b0: 20 63 61 72 65 66 75 6c 20 62 65 63 61 75 73 65   careful because
b5c0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
b5d0: 73 74 61 74 65 20 69 73 0a 20 20 20 20 20 2a 20  state is.     * 
b5e0: 6e 6f 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  not synchronized
b5f0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
b600: 41 74 20 77 6f 72 73 74 2c 20 74 68 65 20 6d 65  At worst, the me
b610: 74 68 6f 64 20 6d 61 79 20 72 65 74 75 72 6e 20  thod may return 
b620: 73 74 61 6c 65 20 6f 72 20 73 6c 69 67 68 74 6c  stale or slightl
b630: 79 20 77 72 6f 6e 67 20 64 61 74 61 2c 20 68 6f  y wrong data, ho
b640: 77 65 76 65 72 0a 20 20 20 20 20 2a 20 69 74 20  wever.     * it 
b650: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 72 61 73 68  should not crash
b660: 2e 20 20 54 68 69 73 20 69 73 20 6f 6b 20 61 73  .  This is ok as
b670: 20 69 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   it is only used
b680: 20 66 6f 72 20 64 69 61 67 6e 6f 73 74 69 63 20   for diagnostic 
b690: 70 75 72 70 6f 73 65 73 2e 0a 20 20 20 20 20 2a  purposes..     *
b6a0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 70  .     * @param p
b6b0: 72 69 6e 74 65 72 20 54 68 65 20 70 72 69 6e 74  rinter The print
b6c0: 65 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  er to receive th
b6d0: 65 20 64 75 6d 70 2c 20 6e 6f 74 20 6e 75 6c 6c  e dump, not null
b6e0: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
b6f0: 76 65 72 62 6f 73 65 20 54 72 75 65 20 74 6f 20  verbose True to 
b700: 64 75 6d 70 20 6d 6f 72 65 20 76 65 72 62 6f 73  dump more verbos
b710: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  e information.. 
b720: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
b730: 64 75 6d 70 55 6e 73 61 66 65 28 50 72 69 6e 74  dumpUnsafe(Print
b740: 65 72 20 70 72 69 6e 74 65 72 2c 20 62 6f 6f 6c  er printer, bool
b750: 65 61 6e 20 76 65 72 62 6f 73 65 29 20 7b 0a 20  ean verbose) {. 
b760: 20 20 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70         printer.p
b770: 72 69 6e 74 6c 6e 28 22 43 6f 6e 6e 65 63 74 69  rintln("Connecti
b780: 6f 6e 20 23 22 20 2b 20 6d 43 6f 6e 6e 65 63 74  on #" + mConnect
b790: 69 6f 6e 49 64 20 2b 20 22 3a 22 29 3b 0a 20 20  ionId + ":");.  
b7a0: 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73        if (verbos
b7b0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
b7c0: 20 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e   printer.println
b7d0: 28 22 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ("  connectionPt
b7e0: 72 3a 20 30 78 22 20 2b 20 4c 6f 6e 67 2e 74 6f  r: 0x" + Long.to
b7f0: 48 65 78 53 74 72 69 6e 67 28 6d 43 6f 6e 6e 65  HexString(mConne
b800: 63 74 69 6f 6e 50 74 72 29 29 3b 0a 20 20 20 20  ctionPtr));.    
b810: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 72      }.        pr
b820: 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 22 20  inter.println(" 
b830: 20 69 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63   isPrimaryConnec
b840: 74 69 6f 6e 3a 20 22 20 2b 20 6d 49 73 50 72 69  tion: " + mIsPri
b850: 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 3b  maryConnection);
b860: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 65 72  .        printer
b870: 2e 70 72 69 6e 74 6c 6e 28 22 20 20 6f 6e 6c 79  .println("  only
b880: 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70 65  AllowReadOnlyOpe
b890: 72 61 74 69 6f 6e 73 3a 20 22 20 2b 20 6d 4f 6e  rations: " + mOn
b8a0: 6c 79 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f  lyAllowReadOnlyO
b8b0: 70 65 72 61 74 69 6f 6e 73 29 3b 0a 0a 20 20 20  perations);..   
b8c0: 20 20 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72       mRecentOper
b8d0: 61 74 69 6f 6e 73 2e 64 75 6d 70 28 70 72 69 6e  ations.dump(prin
b8e0: 74 65 72 2c 20 76 65 72 62 6f 73 65 29 3b 0a 0a  ter, verbose);..
b8f0: 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62          if (verb
b900: 6f 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ose) {.         
b910: 20 20 20 6d 50 72 65 70 61 72 65 64 53 74 61 74     mPreparedStat
b920: 65 6d 65 6e 74 43 61 63 68 65 2e 64 75 6d 70 28  ementCache.dump(
b930: 70 72 69 6e 74 65 72 29 3b 0a 20 20 20 20 20 20  printer);.      
b940: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
b950: 2a 2a 0a 20 20 20 20 20 2a 20 44 65 73 63 72 69  **.     * Descri
b960: 62 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 6c  bes the currentl
b970: 79 20 65 78 65 63 75 74 69 6e 67 20 6f 70 65 72  y executing oper
b980: 61 74 69 6f 6e 2c 20 69 6e 20 74 68 65 20 63 61  ation, in the ca
b990: 73 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  se where the.   
b9a0: 20 20 2a 20 63 61 6c 6c 65 72 20 6d 69 67 68 74    * caller might
b9b0: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6f 77   not actually ow
b9c0: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
b9d0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
b9e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b9f0: 20 77 72 69 74 74 65 6e 20 73 6f 20 74 68 61 74   written so that
ba00: 20 69 74 20 6d 61 79 20 62 65 20 63 61 6c 6c 65   it may be calle
ba10: 64 20 62 79 20 61 20 74 68 72 65 61 64 20 74 68  d by a thread th
ba20: 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
ba30: 20 2a 20 6f 77 6e 20 74 68 65 20 63 6f 6e 6e 65   * own the conne
ba40: 63 74 69 6f 6e 2e 20 20 57 65 20 6e 65 65 64 20  ction.  We need 
ba50: 74 6f 20 62 65 20 76 65 72 79 20 63 61 72 65 66  to be very caref
ba60: 75 6c 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ul because the c
ba70: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20  onnection state 
ba80: 69 73 0a 20 20 20 20 20 2a 20 6e 6f 74 20 73 79  is.     * not sy
ba90: 6e 63 68 72 6f 6e 69 7a 65 64 2e 0a 20 20 20 20  nchronized..    
baa0: 20 2a 0a 20 20 20 20 20 2a 20 41 74 20 77 6f 72   *.     * At wor
bab0: 73 74 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 6d  st, the method m
bac0: 61 79 20 72 65 74 75 72 6e 20 73 74 61 6c 65 20  ay return stale 
bad0: 6f 72 20 73 6c 69 67 68 74 6c 79 20 77 72 6f 6e  or slightly wron
bae0: 67 20 64 61 74 61 2c 20 68 6f 77 65 76 65 72 0a  g data, however.
baf0: 20 20 20 20 20 2a 20 69 74 20 73 68 6f 75 6c 64       * it should
bb00: 20 6e 6f 74 20 63 72 61 73 68 2e 20 20 54 68 69   not crash.  Thi
bb10: 73 20 69 73 20 6f 6b 20 61 73 20 69 74 20 69 73  s is ok as it is
bb20: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64   only used for d
bb30: 69 61 67 6e 6f 73 74 69 63 20 70 75 72 70 6f 73  iagnostic purpos
bb40: 65 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  es..     *.     
bb50: 2a 20 40 72 65 74 75 72 6e 20 41 20 64 65 73 63  * @return A desc
bb60: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ription of the c
bb70: 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e  urrent operation
bb80: 20 69 6e 63 6c 75 64 69 6e 67 20 68 6f 77 20 6c   including how l
bb90: 6f 6e 67 20 69 74 20 68 61 73 20 62 65 65 6e 20  ong it has been 
bba0: 72 75 6e 6e 69 6e 67 2c 0a 20 20 20 20 20 2a 20  running,.     * 
bbb0: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
bbc0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 74 72  .     */.    Str
bbd0: 69 6e 67 20 64 65 73 63 72 69 62 65 43 75 72 72  ing describeCurr
bbe0: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 55 6e 73 61  entOperationUnsa
bbf0: 66 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72  fe() {.        r
bc00: 65 74 75 72 6e 20 6d 52 65 63 65 6e 74 4f 70 65  eturn mRecentOpe
bc10: 72 61 74 69 6f 6e 73 2e 64 65 73 63 72 69 62 65  rations.describe
bc20: 43 75 72 72 65 6e 74 4f 70 65 72 61 74 69 6f 6e  CurrentOperation
bc30: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
bc40: 2a 2a 0a 20 20 20 20 20 2a 20 43 6f 6c 6c 65 63  **.     * Collec
bc50: 74 73 20 73 74 61 74 69 73 74 69 63 73 20 61 62  ts statistics ab
bc60: 6f 75 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  out database con
bc70: 6e 65 63 74 69 6f 6e 20 6d 65 6d 6f 72 79 20 75  nection memory u
bc80: 73 61 67 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20  sage..     *.   
bc90: 20 20 2a 20 40 70 61 72 61 6d 20 64 62 53 74 61    * @param dbSta
bca0: 74 73 4c 69 73 74 20 54 68 65 20 6c 69 73 74 20  tsList The list 
bcb0: 74 6f 20 70 6f 70 75 6c 61 74 65 2e 0a 20 20 20  to populate..   
bcc0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 63 6f    */.    void co
bcd0: 6c 6c 65 63 74 44 62 53 74 61 74 73 28 41 72 72  llectDbStats(Arr
bce0: 61 79 4c 69 73 74 3c 44 62 53 74 61 74 73 3e 20  ayList<DbStats> 
bcf0: 64 62 53 74 61 74 73 4c 69 73 74 29 20 7b 0a 20  dbStatsList) {. 
bd00: 20 20 20 20 20 20 20 2f 2f 20 47 65 74 20 69 6e         // Get in
bd10: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
bd20: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
bd30: 65 2e 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  e..        int l
bd40: 6f 6f 6b 61 73 69 64 65 20 3d 20 6e 61 74 69 76  ookaside = nativ
bd50: 65 47 65 74 44 62 4c 6f 6f 6b 61 73 69 64 65 28  eGetDbLookaside(
bd60: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b  mConnectionPtr);
bd70: 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 70 61  .        long pa
bd80: 67 65 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  geCount = 0;.   
bd90: 20 20 20 20 20 6c 6f 6e 67 20 70 61 67 65 53 69       long pageSi
bda0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
bdb0: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
bdc0: 20 20 70 61 67 65 43 6f 75 6e 74 20 3d 20 65 78    pageCount = ex
bdd0: 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52  ecuteForLong("PR
bde0: 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 3b  AGMA page_count;
bdf0: 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a  ", null, null);.
be00: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
be10: 53 69 7a 65 20 3d 20 65 78 65 63 75 74 65 46 6f  Size = executeFo
be20: 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41 20 70 61  rLong("PRAGMA pa
be30: 67 65 5f 73 69 7a 65 3b 22 2c 20 6e 75 6c 6c 2c  ge_size;", null,
be40: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
be50: 7d 20 63 61 74 63 68 20 28 53 51 4c 69 74 65 45  } catch (SQLiteE
be60: 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20  xception ex) {. 
be70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 67             // Ig
be80: 6e 6f 72 65 2e 0a 20 20 20 20 20 20 20 20 7d 0a  nore..        }.
be90: 20 20 20 20 20 20 20 20 64 62 53 74 61 74 73 4c          dbStatsL
bea0: 69 73 74 2e 61 64 64 28 67 65 74 4d 61 69 6e 44  ist.add(getMainD
beb0: 62 53 74 61 74 73 55 6e 73 61 66 65 28 6c 6f 6f  bStatsUnsafe(loo
bec0: 6b 61 73 69 64 65 2c 20 70 61 67 65 43 6f 75 6e  kaside, pageCoun
bed0: 74 2c 20 70 61 67 65 53 69 7a 65 29 29 3b 0a 0a  t, pageSize));..
bee0: 20 20 20 20 20 20 20 20 2f 2f 20 47 65 74 20 69          // Get i
bef0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
bf00: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
bf10: 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20  ses..        // 
bf20: 57 65 20 69 67 6e 6f 72 65 20 74 68 65 20 66 69  We ignore the fi
bf30: 72 73 74 20 72 6f 77 20 69 6e 20 74 68 65 20 64  rst row in the d
bf40: 61 74 61 62 61 73 65 20 6c 69 73 74 20 62 65 63  atabase list bec
bf50: 61 75 73 65 20 69 74 20 63 6f 72 72 65 73 70 6f  ause it correspo
bf60: 6e 64 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2f  nds to.        /
bf70: 2f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  / the main datab
bf80: 61 73 65 20 77 68 69 63 68 20 77 65 20 68 61 76  ase which we hav
bf90: 65 20 61 6c 72 65 61 64 79 20 64 65 73 63 72 69  e already descri
bfa0: 62 65 64 2e 0a 0a 20 20 20 20 20 20 20 20 2f 2f  bed...        //
bfb0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 64 65 20 75   original code u
bfc0: 73 65 64 20 74 68 65 20 6e 65 77 65 72 20 6e 61  sed the newer na
bfd0: 6d 65 64 20 43 75 72 73 6f 72 57 69 6e 64 6f 77  med CursorWindow
bfe0: 73 2c 20 62 75 74 20 6e 6f 74 20 61 76 61 69 6c  s, but not avail
bff0: 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2f 2f 20  able.        // 
c000: 69 6e 20 41 50 49 20 39 20 65 74 63 2e 20 57 61  in API 9 etc. Wa
c010: 73 20 63 61 6c 6c 65 64 20 22 63 6f 6c 6c 65 63  s called "collec
c020: 74 44 62 53 74 61 74 73 22 2c 20 62 75 74 20 6e  tDbStats", but n
c030: 61 6d 65 20 69 73 20 73 65 65 6d 69 6e 67 6c 79  ame is seemingly
c040: 20 6f 6e 6c 79 20 63 6f 73 6d 65 74 69 63 0a 20   only cosmetic. 
c050: 20 20 20 20 20 20 20 43 75 72 73 6f 72 57 69 6e         CursorWin
c060: 64 6f 77 20 77 69 6e 64 6f 77 20 3d 20 6e 65 77  dow window = new
c070: 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 28 74 72   CursorWindow(tr
c080: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79  ue);.        try
c090: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65   {.            e
c0a0: 78 65 63 75 74 65 46 6f 72 43 75 72 73 6f 72 57  xecuteForCursorW
c0b0: 69 6e 64 6f 77 28 22 50 52 41 47 4d 41 20 64 61  indow("PRAGMA da
c0c0: 74 61 62 61 73 65 5f 6c 69 73 74 3b 22 2c 20 6e  tabase_list;", n
c0d0: 75 6c 6c 2c 20 77 69 6e 64 6f 77 2c 20 30 2c 20  ull, window, 0, 
c0e0: 30 2c 20 66 61 6c 73 65 2c 20 6e 75 6c 6c 29 3b  0, false, null);
c0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
c100: 20 28 69 6e 74 20 69 20 3d 20 31 3b 20 69 20 3c   (int i = 1; i <
c110: 20 77 69 6e 64 6f 77 2e 67 65 74 4e 75 6d 52 6f   window.getNumRo
c120: 77 73 28 29 3b 20 69 2b 2b 29 20 7b 0a 20 20 20  ws(); i++) {.   
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72               Str
c140: 69 6e 67 20 6e 61 6d 65 20 3d 20 77 69 6e 64 6f  ing name = windo
c150: 77 2e 67 65 74 53 74 72 69 6e 67 28 69 2c 20 31  w.getString(i, 1
c160: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
c170: 20 20 20 53 74 72 69 6e 67 20 70 61 74 68 20 3d     String path =
c180: 20 77 69 6e 64 6f 77 2e 67 65 74 53 74 72 69 6e   window.getStrin
c190: 67 28 69 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  g(i, 2);.       
c1a0: 20 20 20 20 20 20 20 20 20 70 61 67 65 43 6f 75           pageCou
c1b0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
c1c0: 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
c1d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
c1e0: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 70 61 67 65 43 6f 75 6e 74 20 3d 20 65 78 65 63  pageCount = exec
c210: 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47  uteForLong("PRAG
c220: 4d 41 20 22 20 2b 20 6e 61 6d 65 20 2b 20 22 2e  MA " + name + ".
c230: 70 61 67 65 5f 63 6f 75 6e 74 3b 22 2c 20 6e 75  page_count;", nu
c240: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c260: 61 67 65 53 69 7a 65 20 3d 20 65 78 65 63 75 74  ageSize = execut
c270: 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d 41  eForLong("PRAGMA
c280: 20 22 20 2b 20 6e 61 6d 65 20 2b 20 22 2e 70 61   " + name + ".pa
c290: 67 65 5f 73 69 7a 65 3b 22 2c 20 6e 75 6c 6c 2c  ge_size;", null,
c2a0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
c2b0: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
c2c0: 28 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e  (SQLiteException
c2d0: 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
c2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49 67             // Ig
c2f0: 6e 6f 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  nore..          
c300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c310: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 6c          String l
c320: 61 62 65 6c 20 3d 20 22 20 20 28 61 74 74 61 63  abel = "  (attac
c330: 68 65 64 29 20 22 20 2b 20 6e 61 6d 65 3b 0a 20  hed) " + name;. 
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c350: 66 20 28 21 70 61 74 68 2e 69 73 45 6d 70 74 79  f (!path.isEmpty
c360: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
c370: 20 20 20 20 20 20 20 20 20 20 6c 61 62 65 6c 20            label 
c380: 2b 3d 20 22 3a 20 22 20 2b 20 70 61 74 68 3b 0a  += ": " + path;.
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
c3b0: 20 20 64 62 53 74 61 74 73 4c 69 73 74 2e 61 64    dbStatsList.ad
c3c0: 64 28 6e 65 77 20 44 62 53 74 61 74 73 28 6c 61  d(new DbStats(la
c3d0: 62 65 6c 2c 20 70 61 67 65 43 6f 75 6e 74 2c 20  bel, pageCount, 
c3e0: 70 61 67 65 53 69 7a 65 2c 20 30 2c 20 30 2c 20  pageSize, 0, 0, 
c3f0: 30 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20  0, 0));.        
c400: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
c410: 63 61 74 63 68 20 28 53 51 4c 69 74 65 45 78 63  catch (SQLiteExc
c420: 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20  eption ex) {.   
c430: 20 20 20 20 20 20 20 20 20 2f 2f 20 49 67 6e 6f           // Igno
c440: 72 65 2e 0a 20 20 20 20 20 20 20 20 7d 20 66 69  re..        } fi
c450: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
c460: 20 20 20 20 77 69 6e 64 6f 77 2e 63 6c 6f 73 65      window.close
c470: 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ();.        }.  
c480: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
c490: 20 20 2a 20 43 6f 6c 6c 65 63 74 73 20 73 74 61    * Collects sta
c4a0: 74 69 73 74 69 63 73 20 61 62 6f 75 74 20 64 61  tistics about da
c4b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c4c0: 6e 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20  n memory usage, 
c4d0: 69 6e 20 74 68 65 20 63 61 73 65 20 77 68 65 72  in the case wher
c4e0: 65 20 74 68 65 0a 20 20 20 20 20 2a 20 63 61 6c  e the.     * cal
c4f0: 6c 65 72 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  ler might not ac
c500: 74 75 61 6c 6c 79 20 6f 77 6e 20 74 68 65 20 63  tually own the c
c510: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20  onnection..     
c520: 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e  *.     * @return
c530: 20 54 68 65 20 73 74 61 74 69 73 74 69 63 73 20   The statistics 
c540: 6f 62 6a 65 63 74 2c 20 6e 65 76 65 72 20 6e 75  object, never nu
c550: 6c 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ll..     */.    
c560: 76 6f 69 64 20 63 6f 6c 6c 65 63 74 44 62 53 74  void collectDbSt
c570: 61 74 73 55 6e 73 61 66 65 28 41 72 72 61 79 4c  atsUnsafe(ArrayL
c580: 69 73 74 3c 44 62 53 74 61 74 73 3e 20 64 62 53  ist<DbStats> dbS
c590: 74 61 74 73 4c 69 73 74 29 20 7b 0a 20 20 20 20  tatsList) {.    
c5a0: 20 20 20 20 64 62 53 74 61 74 73 4c 69 73 74 2e      dbStatsList.
c5b0: 61 64 64 28 67 65 74 4d 61 69 6e 44 62 53 74 61  add(getMainDbSta
c5c0: 74 73 55 6e 73 61 66 65 28 30 2c 20 30 2c 20 30  tsUnsafe(0, 0, 0
c5d0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ));.    }..    p
c5e0: 72 69 76 61 74 65 20 44 62 53 74 61 74 73 20 67  rivate DbStats g
c5f0: 65 74 4d 61 69 6e 44 62 53 74 61 74 73 55 6e 73  etMainDbStatsUns
c600: 61 66 65 28 69 6e 74 20 6c 6f 6f 6b 61 73 69 64  afe(int lookasid
c610: 65 2c 20 6c 6f 6e 67 20 70 61 67 65 43 6f 75 6e  e, long pageCoun
c620: 74 2c 20 6c 6f 6e 67 20 70 61 67 65 53 69 7a 65  t, long pageSize
c630: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 54  ) {.        // T
c640: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c650: 65 6d 65 6e 74 20 63 61 63 68 65 20 69 73 20 74  ement cache is t
c660: 68 72 65 61 64 2d 73 61 66 65 20 73 6f 20 77 65  hread-safe so we
c670: 20 63 61 6e 20 61 63 63 65 73 73 20 69 74 73 20   can access its 
c680: 73 74 61 74 69 73 74 69 63 73 0a 20 20 20 20 20  statistics.     
c690: 20 20 20 2f 2f 20 65 76 65 6e 20 69 66 20 77 65     // even if we
c6a0: 20 64 6f 20 6e 6f 74 20 6f 77 6e 20 74 68 65 20   do not own the 
c6b0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
c6c0: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 53 74 72  ion..        Str
c6d0: 69 6e 67 20 6c 61 62 65 6c 20 3d 20 6d 43 6f 6e  ing label = mCon
c6e0: 66 69 67 75 72 61 74 69 6f 6e 2e 70 61 74 68 3b  figuration.path;
c6f0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6d 49  .        if (!mI
c700: 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69  sPrimaryConnecti
c710: 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  on) {.          
c720: 20 20 6c 61 62 65 6c 20 2b 3d 20 22 20 28 22 20    label += " (" 
c730: 2b 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 49 64 20  + mConnectionId 
c740: 2b 20 22 29 22 3b 0a 20 20 20 20 20 20 20 20 7d  + ")";.        }
c750: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c760: 6e 65 77 20 44 62 53 74 61 74 73 28 6c 61 62 65  new DbStats(labe
c770: 6c 2c 20 70 61 67 65 43 6f 75 6e 74 2c 20 70 61  l, pageCount, pa
c780: 67 65 53 69 7a 65 2c 20 6c 6f 6f 6b 61 73 69 64  geSize, lookasid
c790: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
c7a0: 20 20 20 6d 50 72 65 70 61 72 65 64 53 74 61 74     mPreparedStat
c7b0: 65 6d 65 6e 74 43 61 63 68 65 2e 68 69 74 43 6f  ementCache.hitCo
c7c0: 75 6e 74 28 29 2c 0a 20 20 20 20 20 20 20 20 20  unt(),.         
c7d0: 20 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64         mPrepared
c7e0: 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 6d  StatementCache.m
c7f0: 69 73 73 43 6f 75 6e 74 28 29 2c 0a 20 20 20 20  issCount(),.    
c800: 20 20 20 20 20 20 20 20 20 20 20 20 6d 50 72 65              mPre
c810: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61  paredStatementCa
c820: 63 68 65 2e 73 69 7a 65 28 29 29 3b 0a 20 20 20  che.size());.   
c830: 20 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72 69 64   }..    @Overrid
c840: 65 0a 20 20 20 20 70 75 62 6c 69 63 20 53 74 72  e.    public Str
c850: 69 6e 67 20 74 6f 53 74 72 69 6e 67 28 29 20 7b  ing toString() {
c860: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c870: 22 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  "SQLiteConnectio
c880: 6e 3a 20 22 20 2b 20 6d 43 6f 6e 66 69 67 75 72  n: " + mConfigur
c890: 61 74 69 6f 6e 2e 70 61 74 68 20 2b 20 22 20 28  ation.path + " (
c8a0: 22 20 2b 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 49  " + mConnectionI
c8b0: 64 20 2b 20 22 29 22 3b 0a 20 20 20 20 7d 0a 0a  d + ")";.    }..
c8c0: 20 20 20 20 70 72 69 76 61 74 65 20 50 72 65 70      private Prep
c8d0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20 6f 62  aredStatement ob
c8e0: 74 61 69 6e 50 72 65 70 61 72 65 64 53 74 61 74  tainPreparedStat
c8f0: 65 6d 65 6e 74 28 53 74 72 69 6e 67 20 73 71 6c  ement(String sql
c900: 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74  , long statement
c910: 50 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Ptr,.           
c920: 20 69 6e 74 20 6e 75 6d 50 61 72 61 6d 65 74 65   int numParamete
c930: 72 73 2c 20 69 6e 74 20 74 79 70 65 2c 20 62 6f  rs, int type, bo
c940: 6f 6c 65 61 6e 20 72 65 61 64 4f 6e 6c 79 29 20  olean readOnly) 
c950: 7b 0a 20 20 20 20 20 20 20 20 50 72 65 70 61 72  {.        Prepar
c960: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
c970: 65 6d 65 6e 74 20 3d 20 6d 50 72 65 70 61 72 65  ement = mPrepare
c980: 64 53 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 3b 0a  dStatementPool;.
c990: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61 74          if (stat
c9a0: 65 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c 29 20 7b  ement != null) {
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 50 72  .            mPr
c9c0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 50  eparedStatementP
c9d0: 6f 6f 6c 20 3d 20 73 74 61 74 65 6d 65 6e 74 2e  ool = statement.
c9e0: 6d 50 6f 6f 6c 4e 65 78 74 3b 0a 20 20 20 20 20  mPoolNext;.     
c9f0: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
ca00: 2e 6d 50 6f 6f 6c 4e 65 78 74 20 3d 20 6e 75 6c  .mPoolNext = nul
ca10: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  l;.            s
ca20: 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43 61 63 68  tatement.mInCach
ca30: 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  e = false;.     
ca40: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
ca50: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
ca60: 74 20 3d 20 6e 65 77 20 50 72 65 70 61 72 65 64  t = new Prepared
ca70: 53 74 61 74 65 6d 65 6e 74 28 29 3b 0a 20 20 20  Statement();.   
ca80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
ca90: 74 61 74 65 6d 65 6e 74 2e 6d 53 71 6c 20 3d 20  tatement.mSql = 
caa0: 73 71 6c 3b 0a 20 20 20 20 20 20 20 20 73 74 61  sql;.        sta
cab0: 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65 6e  tement.mStatemen
cac0: 74 50 74 72 20 3d 20 73 74 61 74 65 6d 65 6e 74  tPtr = statement
cad0: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 73 74 61  Ptr;.        sta
cae0: 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d  tement.mNumParam
caf0: 65 74 65 72 73 20 3d 20 6e 75 6d 50 61 72 61 6d  eters = numParam
cb00: 65 74 65 72 73 3b 0a 20 20 20 20 20 20 20 20 73  eters;.        s
cb10: 74 61 74 65 6d 65 6e 74 2e 6d 54 79 70 65 20 3d  tatement.mType =
cb20: 20 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 73   type;.        s
cb30: 74 61 74 65 6d 65 6e 74 2e 6d 52 65 61 64 4f 6e  tatement.mReadOn
cb40: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
cb50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 74         return st
cb60: 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 7d 0a 0a  atement;.    }..
cb70: 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64      private void
cb80: 20 72 65 63 79 63 6c 65 50 72 65 70 61 72 65 64   recyclePrepared
cb90: 53 74 61 74 65 6d 65 6e 74 28 50 72 65 70 61 72  Statement(Prepar
cba0: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
cbb0: 65 6d 65 6e 74 29 20 7b 0a 20 20 20 20 20 20 20  ement) {.       
cbc0: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 71 6c 20   statement.mSql 
cbd0: 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  = null;.        
cbe0: 73 74 61 74 65 6d 65 6e 74 2e 6d 50 6f 6f 6c 4e  statement.mPoolN
cbf0: 65 78 74 20 3d 20 6d 50 72 65 70 61 72 65 64 53  ext = mPreparedS
cc00: 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 3b 0a 20 20  tatementPool;.  
cc10: 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64 53        mPreparedS
cc20: 74 61 74 65 6d 65 6e 74 50 6f 6f 6c 20 3d 20 73  tatementPool = s
cc30: 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 7d 0a  tatement;.    }.
cc40: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
cc50: 74 69 63 20 53 74 72 69 6e 67 20 74 72 69 6d 53  tic String trimS
cc60: 71 6c 46 6f 72 44 69 73 70 6c 61 79 28 53 74 72  qlForDisplay(Str
cc70: 69 6e 67 20 73 71 6c 29 20 7b 0a 20 20 20 20 20  ing sql) {.     
cc80: 20 20 20 72 65 74 75 72 6e 20 54 52 49 4d 5f 53     return TRIM_S
cc90: 51 4c 5f 50 41 54 54 45 52 4e 2e 6d 61 74 63 68  QL_PATTERN.match
cca0: 65 72 28 73 71 6c 29 2e 72 65 70 6c 61 63 65 41  er(sql).replaceA
ccb0: 6c 6c 28 22 20 22 29 3b 0a 20 20 20 20 7d 0a 0a  ll(" ");.    }..
ccc0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 48      /**.     * H
ccd0: 6f 6c 64 65 72 20 74 79 70 65 20 66 6f 72 20 61  older type for a
cce0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ccf0: 65 6e 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ent..     *.    
cd00: 20 2a 20 41 6c 74 68 6f 75 67 68 20 74 68 69 73   * Although this
cd10: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61 20   object holds a 
cd20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 61 74  pointer to a nat
cd30: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 62  ive statement ob
cd40: 6a 65 63 74 2c 20 69 74 0a 20 20 20 20 20 2a 20  ject, it.     * 
cd50: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
cd60: 66 69 6e 61 6c 69 7a 65 72 2e 20 20 54 68 69 73  finalizer.  This
cd70: 20 69 73 20 64 65 6c 69 62 65 72 61 74 65 2e 20   is deliberate. 
cd80: 20 54 68 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69   The {@link SQLi
cd90: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 7d 0a 20 20  teConnection}.  
cda0: 20 20 20 2a 20 6f 77 6e 73 20 74 68 65 20 73 74     * owns the st
cdb0: 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63 74 20 61  atement object a
cdc0: 6e 64 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  nd will take car
cdd0: 65 20 6f 66 20 66 72 65 65 69 6e 67 20 69 74 20  e of freeing it 
cde0: 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 20 20 20  when needed..   
cdf0: 20 20 2a 20 49 6e 20 70 61 72 74 69 63 75 6c 61    * In particula
ce00: 72 2c 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 63  r, closing the c
ce10: 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 71 75 69 72  onnection requir
ce20: 65 73 20 61 20 67 75 61 72 61 6e 74 65 65 20 6f  es a guarantee o
ce30: 66 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0a  f deterministic.
ce40: 20 20 20 20 20 2a 20 72 65 73 6f 75 72 63 65 20       * resource 
ce50: 64 69 73 70 6f 73 61 6c 20 62 65 63 61 75 73 65  disposal because
ce60: 20 61 6c 6c 20 6e 61 74 69 76 65 20 73 74 61 74   all native stat
ce70: 65 6d 65 6e 74 20 6f 62 6a 65 63 74 73 20 6d 75  ement objects mu
ce80: 73 74 20 62 65 20 66 72 65 65 64 20 62 65 66 6f  st be freed befo
ce90: 72 65 0a 20 20 20 20 20 2a 20 74 68 65 20 6e 61  re.     * the na
cea0: 74 69 76 65 20 64 61 74 61 62 61 73 65 20 6f 62  tive database ob
ceb0: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 6c 6f 73  ject can be clos
cec0: 65 64 2e 20 20 53 6f 20 6e 6f 20 66 69 6e 61 6c  ed.  So no final
ced0: 69 7a 65 72 73 20 68 65 72 65 2e 0a 20 20 20 20  izers here..    
cee0: 20 2a 2f 0a 20 20 20 20 70 72 69 76 61 74 65 20   */.    private 
cef0: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 63 6c 61  static final cla
cf00: 73 73 20 50 72 65 70 61 72 65 64 53 74 61 74 65  ss PreparedState
cf10: 6d 65 6e 74 20 7b 0a 20 20 20 20 20 20 20 20 2f  ment {.        /
cf20: 2f 20 4e 65 78 74 20 69 74 65 6d 20 69 6e 20 70  / Next item in p
cf30: 6f 6f 6c 2e 0a 20 20 20 20 20 20 20 20 70 75 62  ool..        pub
cf40: 6c 69 63 20 50 72 65 70 61 72 65 64 53 74 61 74  lic PreparedStat
cf50: 65 6d 65 6e 74 20 6d 50 6f 6f 6c 4e 65 78 74 3b  ement mPoolNext;
cf60: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65  ..        // The
cf70: 20 53 51 4c 20 66 72 6f 6d 20 77 68 69 63 68 20   SQL from which 
cf80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  the statement wa
cf90: 73 20 70 72 65 70 61 72 65 64 2e 0a 20 20 20 20  s prepared..    
cfa0: 20 20 20 20 70 75 62 6c 69 63 20 53 74 72 69 6e      public Strin
cfb0: 67 20 6d 53 71 6c 3b 0a 0a 20 20 20 20 20 20 20  g mSql;..       
cfc0: 20 2f 2f 20 54 68 65 20 6e 61 74 69 76 65 20 73   // The native s
cfd0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65  qlite3_stmt obje
cfe0: 63 74 20 70 6f 69 6e 74 65 72 2e 0a 20 20 20 20  ct pointer..    
cff0: 20 20 20 20 2f 2f 20 4c 69 66 65 74 69 6d 65 20      // Lifetime 
d000: 69 73 20 6d 61 6e 61 67 65 64 20 65 78 70 6c 69  is managed expli
d010: 63 69 74 6c 79 20 62 79 20 74 68 65 20 63 6f 6e  citly by the con
d020: 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  nection..       
d030: 20 70 75 62 6c 69 63 20 6c 6f 6e 67 20 6d 53 74   public long mSt
d040: 61 74 65 6d 65 6e 74 50 74 72 3b 0a 0a 20 20 20  atementPtr;..   
d050: 20 20 20 20 20 2f 2f 20 54 68 65 20 6e 75 6d 62       // The numb
d060: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
d070: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
d080: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  ed statement has
d090: 2e 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63  ..        public
d0a0: 20 69 6e 74 20 6d 4e 75 6d 50 61 72 61 6d 65 74   int mNumParamet
d0b0: 65 72 73 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  ers;..        //
d0c0: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   The statement t
d0d0: 79 70 65 2e 0a 20 20 20 20 20 20 20 20 70 75 62  ype..        pub
d0e0: 6c 69 63 20 69 6e 74 20 6d 54 79 70 65 3b 0a 0a  lic int mType;..
d0f0: 20 20 20 20 20 20 20 20 2f 2f 20 54 72 75 65 20          // True 
d100: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
d110: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20   is read-only.. 
d120: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
d130: 6f 6c 65 61 6e 20 6d 52 65 61 64 4f 6e 6c 79 3b  olean mReadOnly;
d140: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 72 75  ..        // Tru
d150: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
d160: 6e 74 20 69 73 20 69 6e 20 74 68 65 20 63 61 63  nt is in the cac
d170: 68 65 2e 0a 20 20 20 20 20 20 20 20 70 75 62 6c  he..        publ
d180: 69 63 20 62 6f 6f 6c 65 61 6e 20 6d 49 6e 43 61  ic boolean mInCa
d190: 63 68 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  che;..        //
d1a0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
d1b0: 74 65 6d 65 6e 74 20 69 73 20 69 6e 20 75 73 65  tement is in use
d1c0: 20 28 63 75 72 72 65 6e 74 6c 79 20 65 78 65 63   (currently exec
d1d0: 75 74 69 6e 67 29 2e 0a 20 20 20 20 20 20 20 20  uting)..        
d1e0: 2f 2f 20 57 65 20 6e 65 65 64 20 74 68 69 73 20  // We need this 
d1f0: 66 6c 61 67 20 62 65 63 61 75 73 65 20 64 75 65  flag because due
d200: 20 74 6f 20 74 68 65 20 75 73 65 20 6f 66 20 63   to the use of c
d210: 75 73 74 6f 6d 20 66 75 6e 63 74 69 6f 6e 73 20  ustom functions 
d220: 69 6e 20 74 72 69 67 67 65 72 73 2c 20 69 74 27  in triggers, it'
d230: 73 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 6f 73  s.        // pos
d240: 73 69 62 6c 65 20 66 6f 72 20 53 51 4c 69 74 65  sible for SQLite
d250: 20 63 61 6c 6c 73 20 74 6f 20 62 65 20 72 65 2d   calls to be re-
d260: 65 6e 74 72 61 6e 74 2e 20 20 43 6f 6e 73 65 71  entrant.  Conseq
d270: 75 65 6e 74 6c 79 20 77 65 20 6e 65 65 64 20 74  uently we need t
d280: 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 20 20  o prevent.      
d290: 20 20 2f 2f 20 69 6e 20 75 73 65 20 73 74 61 74    // in use stat
d2a0: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e  ements from bein
d2b0: 67 20 66 69 6e 61 6c 69 7a 65 64 20 75 6e 74 69  g finalized unti
d2c0: 6c 20 74 68 65 79 20 61 72 65 20 6e 6f 20 6c 6f  l they are no lo
d2d0: 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 20 20 20  nger in use..   
d2e0: 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c       public bool
d2f0: 65 61 6e 20 6d 49 6e 55 73 65 3b 0a 20 20 20 20  ean mInUse;.    
d300: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 66  }..    private f
d310: 69 6e 61 6c 20 63 6c 61 73 73 20 50 72 65 70 61  inal class Prepa
d320: 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68  redStatementCach
d330: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  e.            ex
d340: 74 65 6e 64 73 20 4c 72 75 43 61 63 68 65 3c 53  tends LruCache<S
d350: 74 72 69 6e 67 2c 20 50 72 65 70 61 72 65 64 53  tring, PreparedS
d360: 74 61 74 65 6d 65 6e 74 3e 20 7b 0a 20 20 20 20  tatement> {.    
d370: 20 20 20 20 70 75 62 6c 69 63 20 50 72 65 70 61      public Prepa
d380: 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68  redStatementCach
d390: 65 28 69 6e 74 20 73 69 7a 65 29 20 7b 0a 20 20  e(int size) {.  
d3a0: 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72 28            super(
d3b0: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  size);.        }
d3c0: 0a 0a 20 20 20 20 20 20 20 20 40 4f 76 65 72 72  ..        @Overr
d3d0: 69 64 65 0a 20 20 20 20 20 20 20 20 70 72 6f 74  ide.        prot
d3e0: 65 63 74 65 64 20 76 6f 69 64 20 65 6e 74 72 79  ected void entry
d3f0: 52 65 6d 6f 76 65 64 28 62 6f 6f 6c 65 61 6e 20  Removed(boolean 
d400: 65 76 69 63 74 65 64 2c 20 53 74 72 69 6e 67 20  evicted, String 
d410: 6b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  key,.           
d420: 20 20 20 20 20 50 72 65 70 61 72 65 64 53 74 61       PreparedSta
d430: 74 65 6d 65 6e 74 20 6f 6c 64 56 61 6c 75 65 2c  tement oldValue,
d440: 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65   PreparedStateme
d450: 6e 74 20 6e 65 77 56 61 6c 75 65 29 20 7b 0a 20  nt newValue) {. 
d460: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 56 61             oldVa
d470: 6c 75 65 2e 6d 49 6e 43 61 63 68 65 20 3d 20 66  lue.mInCache = f
d480: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alse;.          
d490: 20 20 69 66 20 28 21 6f 6c 64 56 61 6c 75 65 2e    if (!oldValue.
d4a0: 6d 49 6e 55 73 65 29 20 7b 0a 20 20 20 20 20 20  mInUse) {.      
d4b0: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69            finali
d4c0: 7a 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  zePreparedStatem
d4d0: 65 6e 74 28 6f 6c 64 56 61 6c 75 65 29 3b 0a 20  ent(oldValue);. 
d4e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d4f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
d500: 70 75 62 6c 69 63 20 76 6f 69 64 20 64 75 6d 70  public void dump
d510: 28 50 72 69 6e 74 65 72 20 70 72 69 6e 74 65 72  (Printer printer
d520: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d530: 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28  printer.println(
d540: 22 20 20 50 72 65 70 61 72 65 64 20 73 74 61 74  "  Prepared stat
d550: 65 6d 65 6e 74 20 63 61 63 68 65 3a 22 29 3b 0a  ement cache:");.
d560: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 70 3c              Map<
d570: 53 74 72 69 6e 67 2c 20 50 72 65 70 61 72 65 64  String, Prepared
d580: 53 74 61 74 65 6d 65 6e 74 3e 20 63 61 63 68 65  Statement> cache
d590: 20 3d 20 73 6e 61 70 73 68 6f 74 28 29 3b 0a 20   = snapshot();. 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
d5b0: 63 61 63 68 65 2e 69 73 45 6d 70 74 79 28 29 29  cache.isEmpty())
d5c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
d5d0: 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
d5f0: 72 20 28 4d 61 70 2e 45 6e 74 72 79 3c 53 74 72  r (Map.Entry<Str
d600: 69 6e 67 2c 20 50 72 65 70 61 72 65 64 53 74 61  ing, PreparedSta
d610: 74 65 6d 65 6e 74 3e 20 65 6e 74 72 79 20 3a 20  tement> entry : 
d620: 63 61 63 68 65 2e 65 6e 74 72 79 53 65 74 28 29  cache.entrySet()
d630: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d640: 20 20 20 20 20 20 20 20 50 72 65 70 61 72 65 64          Prepared
d650: 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d  Statement statem
d660: 65 6e 74 20 3d 20 65 6e 74 72 79 2e 67 65 74 56  ent = entry.getV
d670: 61 6c 75 65 28 29 3b 0a 20 20 20 20 20 20 20 20  alue();.        
d680: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
d690: 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43 61 63  statement.mInCac
d6a0: 68 65 29 20 7b 20 2f 2f 20 6d 69 67 68 74 20 62  he) { // might b
d6b0: 65 20 66 61 6c 73 65 20 64 75 65 20 74 6f 20 61  e false due to a
d6c0: 20 72 61 63 65 20 77 69 74 68 20 65 6e 74 72 79   race with entry
d6d0: 52 65 6d 6f 76 65 64 0a 20 20 20 20 20 20 20 20  Removed.        
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 53 74 72 69 6e 67 20 73 71 6c 20 3d 20 65 6e 74  String sql = ent
d700: 72 79 2e 67 65 74 4b 65 79 28 29 3b 0a 20 20 20  ry.getKey();.   
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69       printer.pri
d730: 6e 74 6c 6e 28 22 20 20 20 20 22 20 2b 20 69 20  ntln("    " + i 
d740: 2b 20 22 3a 20 73 74 61 74 65 6d 65 6e 74 50 74  + ": statementPt
d750: 72 3d 30 78 22 0a 20 20 20 20 20 20 20 20 20 20  r=0x".          
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d770: 20 20 20 20 20 20 2b 20 4c 6f 6e 67 2e 74 6f 48        + Long.toH
d780: 65 78 53 74 72 69 6e 67 28 73 74 61 74 65 6d 65  exString(stateme
d790: 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72  nt.mStatementPtr
d7a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 2b 20 22 2c 20 6e 75 6d 50 61 72 61 6d 65    + ", numParame
d7d0: 74 65 72 73 3d 22 20 2b 20 73 74 61 74 65 6d 65  ters=" + stateme
d7e0: 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d 65 74 65 72  nt.mNumParameter
d7f0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 2b 20 22 2c 20 74 79 70 65 3d 22 20 2b 20    + ", type=" + 
d820: 73 74 61 74 65 6d 65 6e 74 2e 6d 54 79 70 65 0a  statement.mType.
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 2b 20 22 2c 20 72 65 61 64 4f 6e 6c 79 3d 22 20  + ", readOnly=" 
d860: 2b 20 73 74 61 74 65 6d 65 6e 74 2e 6d 52 65 61  + statement.mRea
d870: 64 4f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20 20  dOnly.          
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 2b 20 22 2c 20 73 71 6c 3d 5c        + ", sql=\
d8a0: 22 22 20 2b 20 74 72 69 6d 53 71 6c 46 6f 72 44  "" + trimSqlForD
d8b0: 69 73 70 6c 61 79 28 73 71 6c 29 20 2b 20 22 5c  isplay(sql) + "\
d8c0: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "");.           
d8d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d8f0: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20   += 1;.         
d900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d910: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
d930: 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 22 20  inter.println(" 
d940: 20 20 20 3c 6e 6f 6e 65 3e 22 29 3b 0a 20 20 20     <none>");.   
d950: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d960: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d970: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66  private static f
d980: 69 6e 61 6c 20 63 6c 61 73 73 20 4f 70 65 72 61  inal class Opera
d990: 74 69 6f 6e 4c 6f 67 20 7b 0a 20 20 20 20 20 20  tionLog {.      
d9a0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
d9b0: 20 66 69 6e 61 6c 20 69 6e 74 20 4d 41 58 5f 52   final int MAX_R
d9c0: 45 43 45 4e 54 5f 4f 50 45 52 41 54 49 4f 4e 53  ECENT_OPERATIONS
d9d0: 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 70   = 20;.        p
d9e0: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66 69  rivate static fi
d9f0: 6e 61 6c 20 69 6e 74 20 43 4f 4f 4b 49 45 5f 47  nal int COOKIE_G
da00: 45 4e 45 52 41 54 49 4f 4e 5f 53 48 49 46 54 20  ENERATION_SHIFT 
da10: 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 70 72 69  = 8;.        pri
da20: 76 61 74 65 20 73 74 61 74 69 63 20 66 69 6e 61  vate static fina
da30: 6c 20 69 6e 74 20 43 4f 4f 4b 49 45 5f 49 4e 44  l int COOKIE_IND
da40: 45 58 5f 4d 41 53 4b 20 3d 20 30 78 66 66 3b 0a  EX_MASK = 0xff;.
da50: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
da60: 20 66 69 6e 61 6c 20 4f 70 65 72 61 74 69 6f 6e   final Operation
da70: 5b 5d 20 6d 4f 70 65 72 61 74 69 6f 6e 73 20 3d  [] mOperations =
da80: 20 6e 65 77 20 4f 70 65 72 61 74 69 6f 6e 5b 4d   new Operation[M
da90: 41 58 5f 52 45 43 45 4e 54 5f 4f 50 45 52 41 54  AX_RECENT_OPERAT
daa0: 49 4f 4e 53 5d 3b 0a 20 20 20 20 20 20 20 20 70  IONS];.        p
dab0: 72 69 76 61 74 65 20 69 6e 74 20 6d 49 6e 64 65  rivate int mInde
dac0: 78 3b 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  x;.        priva
dad0: 74 65 20 69 6e 74 20 6d 47 65 6e 65 72 61 74 69  te int mGenerati
dae0: 6f 6e 3b 0a 0a 20 20 20 20 20 20 20 20 70 75 62  on;..        pub
daf0: 6c 69 63 20 69 6e 74 20 62 65 67 69 6e 4f 70 65  lic int beginOpe
db00: 72 61 74 69 6f 6e 28 53 74 72 69 6e 67 20 6b 69  ration(String ki
db10: 6e 64 2c 20 53 74 72 69 6e 67 20 73 71 6c 2c 20  nd, String sql, 
db20: 4f 62 6a 65 63 74 5b 5d 20 62 69 6e 64 41 72 67  Object[] bindArg
db30: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s) {.           
db40: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d   synchronized (m
db50: 4f 70 65 72 61 74 69 6f 6e 73 29 20 7b 0a 20 20  Operations) {.  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
db70: 6e 61 6c 20 69 6e 74 20 69 6e 64 65 78 20 3d 20  nal int index = 
db80: 28 6d 49 6e 64 65 78 20 2b 20 31 29 20 25 20 4d  (mIndex + 1) % M
db90: 41 58 5f 52 45 43 45 4e 54 5f 4f 50 45 52 41 54  AX_RECENT_OPERAT
dba0: 49 4f 4e 53 3b 0a 20 20 20 20 20 20 20 20 20 20  IONS;.          
dbb0: 20 20 20 20 20 20 4f 70 65 72 61 74 69 6f 6e 20        Operation 
dbc0: 6f 70 65 72 61 74 69 6f 6e 20 3d 20 6d 4f 70 65  operation = mOpe
dbd0: 72 61 74 69 6f 6e 73 5b 69 6e 64 65 78 5d 3b 0a  rations[index];.
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 69 66 20 28 6f 70 65 72 61 74 69 6f 6e 20 3d 3d  if (operation ==
dc00: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65               ope
dc20: 72 61 74 69 6f 6e 20 3d 20 6e 65 77 20 4f 70 65  ration = new Ope
dc30: 72 61 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20  ration();.      
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 4f                mO
dc50: 70 65 72 61 74 69 6f 6e 73 5b 69 6e 64 65 78 5d  perations[index]
dc60: 20 3d 20 6f 70 65 72 61 74 69 6f 6e 3b 0a 20 20   = operation;.  
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
dc80: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
dc90: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61             opera
dca0: 74 69 6f 6e 2e 6d 46 69 6e 69 73 68 65 64 20 3d  tion.mFinished =
dcb0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72              oper
dcd0: 61 74 69 6f 6e 2e 6d 45 78 63 65 70 74 69 6f 6e  ation.mException
dce0: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   = null;.       
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
dd00: 28 6f 70 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64  (operation.mBind
dd10: 41 72 67 73 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a  Args != null) {.
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
dd40: 6e 2e 6d 42 69 6e 64 41 72 67 73 2e 63 6c 65 61  n.mBindArgs.clea
dd50: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r();.           
dd60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dd70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65               ope
dd90: 72 61 74 69 6f 6e 2e 6d 53 74 61 72 74 54 69 6d  ration.mStartTim
dda0: 65 20 3d 20 53 79 73 74 65 6d 2e 63 75 72 72 65  e = System.curre
ddb0: 6e 74 54 69 6d 65 4d 69 6c 6c 69 73 28 29 3b 0a  ntTimeMillis();.
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 6f 70 65 72 61 74 69 6f 6e 2e 6d 4b 69 6e 64 20  operation.mKind 
dde0: 3d 20 6b 69 6e 64 3b 0a 20 20 20 20 20 20 20 20  = kind;.        
ddf0: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
de00: 6e 2e 6d 53 71 6c 20 3d 20 73 71 6c 3b 0a 20 20  n.mSql = sql;.  
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
de20: 20 28 62 69 6e 64 41 72 67 73 20 21 3d 20 6e 75   (bindArgs != nu
de30: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
de40: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 70            if (op
de50: 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67  eration.mBindArg
de60: 73 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  s == null) {.   
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d       operation.m
de90: 42 69 6e 64 41 72 67 73 20 3d 20 6e 65 77 20 41  BindArgs = new A
dea0: 72 72 61 79 4c 69 73 74 3c 4f 62 6a 65 63 74 3e  rrayList<Object>
deb0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
dec0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dee0: 20 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69           operati
def0: 6f 6e 2e 6d 42 69 6e 64 41 72 67 73 2e 63 6c 65  on.mBindArgs.cle
df00: 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar();.          
df10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
df40: 69 20 3c 20 62 69 6e 64 41 72 67 73 2e 6c 65 6e  i < bindArgs.len
df50: 67 74 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  gth; i++) {.    
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 66 69 6e 61 6c 20 4f 62 6a 65 63 74      final Object
df80: 20 61 72 67 20 3d 20 62 69 6e 64 41 72 67 73 5b   arg = bindArgs[
df90: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
dfb0: 61 72 67 20 21 3d 20 6e 75 6c 6c 20 26 26 20 61  arg != null && a
dfc0: 72 67 20 69 6e 73 74 61 6e 63 65 6f 66 20 62 79  rg instanceof by
dfd0: 74 65 5b 5d 29 20 7b 0a 20 20 20 20 20 20 20 20  te[]) {.        
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 2f 2f 20 44 6f 6e 27 74 20 68 6f 6c      // Don't hol
e000: 64 20 6f 6e 74 6f 20 74 68 65 20 72 65 61 6c 20  d onto the real 
e010: 62 79 74 65 20 61 72 72 61 79 20 6c 6f 6e 67 65  byte array longe
e020: 72 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  r than necessary
e030: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
e050: 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67  eration.mBindArg
e060: 73 2e 61 64 64 28 45 4d 50 54 59 5f 42 59 54 45  s.add(EMPTY_BYTE
e070: 5f 41 52 52 41 59 29 3b 0a 20 20 20 20 20 20 20  _ARRAY);.       
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e        operation.
e0c0: 6d 42 69 6e 64 41 72 67 73 2e 61 64 64 28 61 72  mBindArgs.add(ar
e0d0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
e110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e120: 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e        operation.
e130: 6d 43 6f 6f 6b 69 65 20 3d 20 6e 65 77 4f 70 65  mCookie = newOpe
e140: 72 61 74 69 6f 6e 43 6f 6f 6b 69 65 4c 6f 63 6b  rationCookieLock
e150: 65 64 28 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ed(index);.     
e160: 20 20 20 20 20 20 20 20 20 20 20 6d 49 6e 64 65             mInde
e170: 78 20 3d 20 69 6e 64 65 78 3b 0a 20 20 20 20 20  x = index;.     
e180: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e190: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 43 6f 6f  n operation.mCoo
e1a0: 6b 69 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  kie;.           
e1b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
e1c0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69        public voi
e1d0: 64 20 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28  d failOperation(
e1e0: 69 6e 74 20 63 6f 6f 6b 69 65 2c 20 45 78 63 65  int cookie, Exce
e1f0: 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20 20  ption ex) {.    
e200: 20 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e          synchron
e210: 69 7a 65 64 20 28 6d 4f 70 65 72 61 74 69 6f 6e  ized (mOperation
e220: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s) {.           
e230: 20 20 20 20 20 66 69 6e 61 6c 20 4f 70 65 72 61       final Opera
e240: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 3d  tion operation =
e250: 20 67 65 74 4f 70 65 72 61 74 69 6f 6e 4c 6f 63   getOperationLoc
e260: 6b 65 64 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20  ked(cookie);.   
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
e280: 28 6f 70 65 72 61 74 69 6f 6e 20 21 3d 20 6e 75  (operation != nu
e290: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
e2a0: 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61 74            operat
e2b0: 69 6f 6e 2e 6d 45 78 63 65 70 74 69 6f 6e 20 3d  ion.mException =
e2c0: 20 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ex;.           
e2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e2e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
e2f0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76          public v
e300: 6f 69 64 20 65 6e 64 4f 70 65 72 61 74 69 6f 6e  oid endOperation
e310: 28 69 6e 74 20 63 6f 6f 6b 69 65 29 20 7b 0a 20  (int cookie) {. 
e320: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 68             synch
e330: 72 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61 74  ronized (mOperat
e340: 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ions) {.        
e350: 20 20 20 20 20 20 20 20 69 66 20 28 65 6e 64 4f          if (endO
e360: 70 65 72 61 74 69 6f 6e 44 65 66 65 72 4c 6f 67  perationDeferLog
e370: 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 29 29 20  Locked(cookie)) 
e380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e390: 20 20 20 20 20 20 6c 6f 67 4f 70 65 72 61 74 69        logOperati
e3a0: 6f 6e 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 2c  onLocked(cookie,
e3b0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
e3c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e3e0: 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  }..        publi
e3f0: 63 20 62 6f 6f 6c 65 61 6e 20 65 6e 64 4f 70 65  c boolean endOpe
e400: 72 61 74 69 6f 6e 44 65 66 65 72 4c 6f 67 28 69  rationDeferLog(i
e410: 6e 74 20 63 6f 6f 6b 69 65 29 20 7b 0a 20 20 20  nt cookie) {.   
e420: 20 20 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f           synchro
e430: 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61 74 69 6f  nized (mOperatio
e440: 6e 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ns) {.          
e450: 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 6e 64        return end
e460: 4f 70 65 72 61 74 69 6f 6e 44 65 66 65 72 4c 6f  OperationDeferLo
e470: 67 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 29 3b  gLocked(cookie);
e480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
e490: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e4a0: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 6c 6f    public void lo
e4b0: 67 4f 70 65 72 61 74 69 6f 6e 28 69 6e 74 20 63  gOperation(int c
e4c0: 6f 6f 6b 69 65 2c 20 53 74 72 69 6e 67 20 64 65  ookie, String de
e4d0: 74 61 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  tail) {.        
e4e0: 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64      synchronized
e4f0: 20 28 6d 4f 70 65 72 61 74 69 6f 6e 73 29 20 7b   (mOperations) {
e500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e510: 20 6c 6f 67 4f 70 65 72 61 74 69 6f 6e 4c 6f 63   logOperationLoc
e520: 6b 65 64 28 63 6f 6f 6b 69 65 2c 20 64 65 74 61  ked(cookie, deta
e530: 69 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  il);.           
e540: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
e550: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f        private bo
e560: 6f 6c 65 61 6e 20 65 6e 64 4f 70 65 72 61 74 69  olean endOperati
e570: 6f 6e 44 65 66 65 72 4c 6f 67 4c 6f 63 6b 65 64  onDeferLogLocked
e580: 28 69 6e 74 20 63 6f 6f 6b 69 65 29 20 7b 0a 20  (int cookie) {. 
e590: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
e5a0: 20 4f 70 65 72 61 74 69 6f 6e 20 6f 70 65 72 61   Operation opera
e5b0: 74 69 6f 6e 20 3d 20 67 65 74 4f 70 65 72 61 74  tion = getOperat
e5c0: 69 6f 6e 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65  ionLocked(cookie
e5d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
e5e0: 66 20 28 6f 70 65 72 61 74 69 6f 6e 20 21 3d 20  f (operation != 
e5f0: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
e600: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
e610: 6e 2e 6d 45 6e 64 54 69 6d 65 20 3d 20 53 79 73  n.mEndTime = Sys
e620: 74 65 6d 2e 63 75 72 72 65 6e 74 54 69 6d 65 4d  tem.currentTimeM
e630: 69 6c 6c 69 73 28 29 3b 0a 20 20 20 20 20 20 20  illis();.       
e640: 20 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69           operati
e650: 6f 6e 2e 6d 46 69 6e 69 73 68 65 64 20 3d 20 74  on.mFinished = t
e660: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
e670: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 69       return SQLi
e680: 74 65 44 65 62 75 67 2e 44 45 42 55 47 5f 4c 4f  teDebug.DEBUG_LO
e690: 47 5f 53 4c 4f 57 5f 51 55 45 52 49 45 53 20 26  G_SLOW_QUERIES &
e6a0: 26 20 53 51 4c 69 74 65 44 65 62 75 67 2e 73 68  & SQLiteDebug.sh
e6b0: 6f 75 6c 64 4c 6f 67 53 6c 6f 77 51 75 65 72 79  ouldLogSlowQuery
e6c0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 45 6e 64    operation.mEnd
e6f0: 54 69 6d 65 20 2d 20 6f 70 65 72 61 74 69 6f 6e  Time - operation
e700: 2e 6d 53 74 61 72 74 54 69 6d 65 29 3b 0a 20 20  .mStartTime);.  
e710: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e720: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
e730: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  alse;.        }.
e740: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
e750: 20 76 6f 69 64 20 6c 6f 67 4f 70 65 72 61 74 69   void logOperati
e760: 6f 6e 4c 6f 63 6b 65 64 28 69 6e 74 20 63 6f 6f  onLocked(int coo
e770: 6b 69 65 2c 20 53 74 72 69 6e 67 20 64 65 74 61  kie, String deta
e780: 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  il) {.          
e790: 20 20 66 69 6e 61 6c 20 4f 70 65 72 61 74 69 6f    final Operatio
e7a0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 3d 20 67 65  n operation = ge
e7b0: 74 4f 70 65 72 61 74 69 6f 6e 4c 6f 63 6b 65 64  tOperationLocked
e7c0: 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20  (cookie);.      
e7d0: 20 20 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c        StringBuil
e7e0: 64 65 72 20 6d 73 67 20 3d 20 6e 65 77 20 53 74  der msg = new St
e7f0: 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0a 20  ringBuilder();. 
e800: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61             opera
e810: 74 69 6f 6e 2e 64 65 73 63 72 69 62 65 28 6d 73  tion.describe(ms
e820: 67 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 20  g, false);.     
e830: 20 20 20 20 20 20 20 69 66 20 28 64 65 74 61 69         if (detai
e840: 6c 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  l != null) {.   
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 67               msg
e860: 2e 61 70 70 65 6e 64 28 22 2c 20 22 29 2e 61 70  .append(", ").ap
e870: 70 65 6e 64 28 64 65 74 61 69 6c 29 3b 0a 20 20  pend(detail);.  
e880: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e890: 20 20 20 20 20 20 20 20 4c 6f 67 2e 64 28 54 41          Log.d(TA
e8a0: 47 2c 20 6d 73 67 2e 74 6f 53 74 72 69 6e 67 28  G, msg.toString(
e8b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
e8c0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 69         private i
e8d0: 6e 74 20 6e 65 77 4f 70 65 72 61 74 69 6f 6e 43  nt newOperationC
e8e0: 6f 6f 6b 69 65 4c 6f 63 6b 65 64 28 69 6e 74 20  ookieLocked(int 
e8f0: 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 20 20 20  index) {.       
e900: 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 67       final int g
e910: 65 6e 65 72 61 74 69 6f 6e 20 3d 20 6d 47 65 6e  eneration = mGen
e920: 65 72 61 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20  eration++;.     
e930: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 67 65         return ge
e940: 6e 65 72 61 74 69 6f 6e 20 3c 3c 20 43 4f 4f 4b  neration << COOK
e950: 49 45 5f 47 45 4e 45 52 41 54 49 4f 4e 5f 53 48  IE_GENERATION_SH
e960: 49 46 54 20 7c 20 69 6e 64 65 78 3b 0a 20 20 20  IFT | index;.   
e970: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
e980: 70 72 69 76 61 74 65 20 4f 70 65 72 61 74 69 6f  private Operatio
e990: 6e 20 67 65 74 4f 70 65 72 61 74 69 6f 6e 4c 6f  n getOperationLo
e9a0: 63 6b 65 64 28 69 6e 74 20 63 6f 6f 6b 69 65 29  cked(int cookie)
e9b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
e9c0: 69 6e 61 6c 20 69 6e 74 20 69 6e 64 65 78 20 3d  inal int index =
e9d0: 20 63 6f 6f 6b 69 65 20 26 20 43 4f 4f 4b 49 45   cookie & COOKIE
e9e0: 5f 49 4e 44 45 58 5f 4d 41 53 4b 3b 0a 20 20 20  _INDEX_MASK;.   
e9f0: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 4f           final O
ea00: 70 65 72 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  peration operati
ea10: 6f 6e 20 3d 20 6d 4f 70 65 72 61 74 69 6f 6e 73  on = mOperations
ea20: 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20 20 20 20  [index];.       
ea30: 20 20 20 20 20 72 65 74 75 72 6e 20 6f 70 65 72       return oper
ea40: 61 74 69 6f 6e 2e 6d 43 6f 6f 6b 69 65 20 3d 3d  ation.mCookie ==
ea50: 20 63 6f 6f 6b 69 65 20 3f 20 6f 70 65 72 61 74   cookie ? operat
ea60: 69 6f 6e 20 3a 20 6e 75 6c 6c 3b 0a 20 20 20 20  ion : null;.    
ea70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
ea80: 75 62 6c 69 63 20 53 74 72 69 6e 67 20 64 65 73  ublic String des
ea90: 63 72 69 62 65 43 75 72 72 65 6e 74 4f 70 65 72  cribeCurrentOper
eaa0: 61 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20  ation() {.      
eab0: 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a        synchroniz
eac0: 65 64 20 28 6d 4f 70 65 72 61 74 69 6f 6e 73 29  ed (mOperations)
ead0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
eae0: 20 20 20 66 69 6e 61 6c 20 4f 70 65 72 61 74 69     final Operati
eaf0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 3d 20 6d  on operation = m
eb00: 4f 70 65 72 61 74 69 6f 6e 73 5b 6d 49 6e 64 65  Operations[mInde
eb10: 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x];.            
eb20: 20 20 20 20 69 66 20 28 6f 70 65 72 61 74 69 6f      if (operatio
eb30: 6e 20 21 3d 20 6e 75 6c 6c 20 26 26 20 21 6f 70  n != null && !op
eb40: 65 72 61 74 69 6f 6e 2e 6d 46 69 6e 69 73 68 65  eration.mFinishe
eb50: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
eb60: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 42           StringB
eb70: 75 69 6c 64 65 72 20 6d 73 67 20 3d 20 6e 65 77  uilder msg = new
eb80: 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29   StringBuilder()
eb90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
eba0: 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e        operation.
ebb0: 64 65 73 63 72 69 62 65 28 6d 73 67 2c 20 66 61  describe(msg, fa
ebc0: 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lse);.          
ebd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ebe0: 20 6d 73 67 2e 74 6f 53 74 72 69 6e 67 28 29 3b   msg.toString();
ebf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
ec10: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a     return null;.
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
ec30: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
ec40: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 64 75 6d   public void dum
ec50: 70 28 50 72 69 6e 74 65 72 20 70 72 69 6e 74 65  p(Printer printe
ec60: 72 2c 20 62 6f 6f 6c 65 61 6e 20 76 65 72 62 6f  r, boolean verbo
ec70: 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  se) {.          
ec80: 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28    synchronized (
ec90: 6d 4f 70 65 72 61 74 69 6f 6e 73 29 20 7b 0a 20  mOperations) {. 
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
ecb0: 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 22  rinter.println("
ecc0: 20 20 4d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20    Most recently 
ecd0: 65 78 65 63 75 74 65 64 20 6f 70 65 72 61 74 69  executed operati
ece0: 6f 6e 73 3a 22 29 3b 0a 20 20 20 20 20 20 20 20  ons:");.        
ecf0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 64 65          int inde
ed00: 78 20 3d 20 6d 49 6e 64 65 78 3b 0a 20 20 20 20  x = mIndex;.    
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 72              Oper
ed20: 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
ed30: 3d 20 6d 4f 70 65 72 61 74 69 6f 6e 73 5b 69 6e  = mOperations[in
ed40: 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  dex];.          
ed50: 20 20 20 20 20 20 69 66 20 28 6f 70 65 72 61 74        if (operat
ed60: 69 6f 6e 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20  ion != null) {. 
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 20    do {.         
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
edc0: 74 72 69 6e 67 42 75 69 6c 64 65 72 20 6d 73 67  tringBuilder msg
edd0: 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69   = new StringBui
ede0: 6c 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  lder();.        
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 6d 73 67 2e 61 70 70 65 6e 64 28 22 20 20 20 20  msg.append("    
ee10: 22 29 2e 61 70 70 65 6e 64 28 6e 29 2e 61 70 70  ").append(n).app
ee20: 65 6e 64 28 22 3a 20 5b 22 29 3b 0a 20 20 20 20  end(": [");.    
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 6f      msg.append(o
ee50: 70 65 72 61 74 69 6f 6e 2e 67 65 74 46 6f 72 6d  peration.getForm
ee60: 61 74 74 65 64 53 74 61 72 74 54 69 6d 65 28 29  attedStartTime()
ee70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ee80: 20 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61             msg.a
ee90: 70 70 65 6e 64 28 22 5d 20 22 29 3b 0a 20 20 20  ppend("] ");.   
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 64       operation.d
eec0: 65 73 63 72 69 62 65 28 6d 73 67 2c 20 76 65 72  escribe(msg, ver
eed0: 62 6f 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  bose);.         
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
eef0: 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 6d  rinter.println(m
ef00: 73 67 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a  sg.toString());.
ef10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef20: 20 20 20 20 20 20 20 20 20 69 66 20 28 69 6e 64           if (ind
ef30: 65 78 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20  ex > 0) {.      
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 20 20 20 69 6e 64 65 78 20 2d 3d 20 31        index -= 1
ef60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ef70: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
ef80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
efa0: 6e 64 65 78 20 3d 20 4d 41 58 5f 52 45 43 45 4e  ndex = MAX_RECEN
efb0: 54 5f 4f 50 45 52 41 54 49 4f 4e 53 20 2d 20 31  T_OPERATIONS - 1
efc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
efd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 20 20 20 20 6e 20 2b 3d 20 31 3b 0a 20 20 20 20      n += 1;.    
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 3d 20      operation = 
f020: 6d 4f 70 65 72 61 74 69 6f 6e 73 5b 69 6e 64 65  mOperations[inde
f030: 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x];.            
f040: 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20          } while 
f050: 28 6f 70 65 72 61 74 69 6f 6e 20 21 3d 20 6e 75  (operation != nu
f060: 6c 6c 20 26 26 20 6e 20 3c 20 4d 41 58 5f 52 45  ll && n < MAX_RE
f070: 43 45 4e 54 5f 4f 50 45 52 41 54 49 4f 4e 53 29  CENT_OPERATIONS)
f080: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f090: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f0b0: 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 22  rinter.println("
f0c0: 20 20 20 20 3c 6e 6f 6e 65 3e 22 29 3b 0a 20 20      <none>");.  
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f100: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
f110: 63 20 66 69 6e 61 6c 20 63 6c 61 73 73 20 4f 70  c final class Op
f120: 65 72 61 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  eration {.      
f130: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
f140: 20 66 69 6e 61 6c 20 53 69 6d 70 6c 65 44 61 74   final SimpleDat
f150: 65 46 6f 72 6d 61 74 20 73 44 61 74 65 46 6f 72  eFormat sDateFor
f160: 6d 61 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  mat =.          
f170: 20 20 20 20 20 20 6e 65 77 20 53 69 6d 70 6c 65        new Simple
f180: 44 61 74 65 46 6f 72 6d 61 74 28 22 79 79 79 79  DateFormat("yyyy
f190: 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e  -MM-dd HH:mm:ss.
f1a0: 53 53 53 22 29 3b 0a 0a 20 20 20 20 20 20 20 20  SSS");..        
f1b0: 70 75 62 6c 69 63 20 6c 6f 6e 67 20 6d 53 74 61  public long mSta
f1c0: 72 74 54 69 6d 65 3b 0a 20 20 20 20 20 20 20 20  rtTime;.        
f1d0: 70 75 62 6c 69 63 20 6c 6f 6e 67 20 6d 45 6e 64  public long mEnd
f1e0: 54 69 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 75  Time;.        pu
f1f0: 62 6c 69 63 20 53 74 72 69 6e 67 20 6d 4b 69 6e  blic String mKin
f200: 64 3b 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  d;.        publi
f210: 63 20 53 74 72 69 6e 67 20 6d 53 71 6c 3b 0a 20  c String mSql;. 
f220: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 41 72         public Ar
f230: 72 61 79 4c 69 73 74 3c 4f 62 6a 65 63 74 3e 20  rayList<Object> 
f240: 6d 42 69 6e 64 41 72 67 73 3b 0a 20 20 20 20 20  mBindArgs;.     
f250: 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61     public boolea
f260: 6e 20 6d 46 69 6e 69 73 68 65 64 3b 0a 20 20 20  n mFinished;.   
f270: 20 20 20 20 20 70 75 62 6c 69 63 20 45 78 63 65       public Exce
f280: 70 74 69 6f 6e 20 6d 45 78 63 65 70 74 69 6f 6e  ption mException
f290: 3b 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63  ;.        public
f2a0: 20 69 6e 74 20 6d 43 6f 6f 6b 69 65 3b 0a 0a 20   int mCookie;.. 
f2b0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f         public vo
f2c0: 69 64 20 64 65 73 63 72 69 62 65 28 53 74 72 69  id describe(Stri
f2d0: 6e 67 42 75 69 6c 64 65 72 20 6d 73 67 2c 20 62  ngBuilder msg, b
f2e0: 6f 6f 6c 65 61 6e 20 76 65 72 62 6f 73 65 29 20  oolean verbose) 
f2f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 73  {.            ms
f300: 67 2e 61 70 70 65 6e 64 28 6d 4b 69 6e 64 29 3b  g.append(mKind);
f310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
f320: 28 6d 46 69 6e 69 73 68 65 64 29 20 7b 0a 20 20  (mFinished) {.  
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73                ms
f340: 67 2e 61 70 70 65 6e 64 28 22 20 74 6f 6f 6b 20  g.append(" took 
f350: 22 29 2e 61 70 70 65 6e 64 28 6d 45 6e 64 54 69  ").append(mEndTi
f360: 6d 65 20 2d 20 6d 53 74 61 72 74 54 69 6d 65 29  me - mStartTime)
f370: 2e 61 70 70 65 6e 64 28 22 6d 73 22 29 3b 0a 20  .append("ms");. 
f380: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
f390: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
f3a0: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22      msg.append("
f3b0: 20 73 74 61 72 74 65 64 20 22 29 2e 61 70 70 65   started ").appe
f3c0: 6e 64 28 53 79 73 74 65 6d 2e 63 75 72 72 65 6e  nd(System.curren
f3d0: 74 54 69 6d 65 4d 69 6c 6c 69 73 28 29 20 2d 20  tTimeMillis() - 
f3e0: 6d 53 74 61 72 74 54 69 6d 65 29 0a 20 20 20 20  mStartTime).    
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 2e 61 70 70 65 6e 64 28 22 6d 73 20      .append("ms 
f410: 61 67 6f 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ago");.         
f420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
f430: 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 20 2d 20   msg.append(" - 
f440: 22 29 2e 61 70 70 65 6e 64 28 67 65 74 53 74 61  ").append(getSta
f450: 74 75 73 28 29 29 3b 0a 20 20 20 20 20 20 20 20  tus());.        
f460: 20 20 20 20 69 66 20 28 6d 53 71 6c 20 21 3d 20      if (mSql != 
f470: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
f480: 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65          msg.appe
f490: 6e 64 28 22 2c 20 73 71 6c 3d 5c 22 22 29 2e 61  nd(", sql=\"").a
f4a0: 70 70 65 6e 64 28 74 72 69 6d 53 71 6c 46 6f 72  ppend(trimSqlFor
f4b0: 44 69 73 70 6c 61 79 28 6d 53 71 6c 29 29 2e 61  Display(mSql)).a
f4c0: 70 70 65 6e 64 28 22 5c 22 22 29 3b 0a 20 20 20  ppend("\"");.   
f4d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f4e0: 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f         if (verbo
f4f0: 73 65 20 26 26 20 6d 42 69 6e 64 41 72 67 73 20  se && mBindArgs 
f500: 21 3d 20 6e 75 6c 6c 20 26 26 20 6d 42 69 6e 64  != null && mBind
f510: 41 72 67 73 2e 73 69 7a 65 28 29 20 21 3d 20 30  Args.size() != 0
f520: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
f530: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22      msg.append("
f540: 2c 20 62 69 6e 64 41 72 67 73 3d 5b 22 29 3b 0a  , bindArgs=[");.
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 66 69 6e 61 6c 20 69 6e 74 20 63 6f 75 6e 74 20  final int count 
f570: 3d 20 6d 42 69 6e 64 41 72 67 73 2e 73 69 7a 65  = mBindArgs.size
f580: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
f590: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
f5a0: 20 30 3b 20 69 20 3c 20 63 6f 75 6e 74 3b 20 69   0; i < count; i
f5b0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
f5c0: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20            final 
f5d0: 4f 62 6a 65 63 74 20 61 72 67 20 3d 20 6d 42 69  Object arg = mBi
f5e0: 6e 64 41 72 67 73 2e 67 65 74 28 69 29 3b 0a 20  ndArgs.get(i);. 
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 69 66 20 28 69 20 21 3d 20 30 29 20 7b     if (i != 0) {
f610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f620: 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70           msg.app
f630: 65 6e 64 28 22 2c 20 22 29 3b 0a 20 20 20 20 20  end(", ");.     
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f660: 20 20 20 20 20 69 66 20 28 61 72 67 20 3d 3d 20       if (arg == 
f670: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 6d 73 67 2e 61 70 70 65 6e 64 28 22 6e 75 6c 6c  msg.append("null
f6a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
f6b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
f6c0: 66 20 28 61 72 67 20 69 6e 73 74 61 6e 63 65 6f  f (arg instanceo
f6d0: 66 20 62 79 74 65 5b 5d 29 20 7b 0a 20 20 20 20  f byte[]) {.    
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22      msg.append("
f700: 3c 62 79 74 65 5b 5d 3e 22 29 3b 0a 20 20 20 20  <byte[]>");.    
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 7d 20 65 6c 73 65 20 69 66 20 28 61 72 67 20 69  } else if (arg i
f730: 6e 73 74 61 6e 63 65 6f 66 20 53 74 72 69 6e 67  nstanceof String
f740: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
f750: 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e              msg.
f760: 61 70 70 65 6e 64 28 22 5c 22 22 29 2e 61 70 70  append("\"").app
f770: 65 6e 64 28 28 53 74 72 69 6e 67 29 61 72 67 29  end((String)arg)
f780: 2e 61 70 70 65 6e 64 28 22 5c 22 22 29 3b 0a 20  .append("\"");. 
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 61      msg.append(a
f7d0: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rg);.           
f7e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f7f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73 67               msg
f810: 2e 61 70 70 65 6e 64 28 22 5d 22 29 3b 0a 20 20  .append("]");.  
f820: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f830: 20 20 20 20 20 20 20 20 69 66 20 28 6d 45 78 63          if (mExc
f840: 65 70 74 69 6f 6e 20 21 3d 20 6e 75 6c 6c 29 20  eption != null) 
f850: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
f860: 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 2c 20    msg.append(", 
f870: 65 78 63 65 70 74 69 6f 6e 3d 5c 22 22 29 2e 61  exception=\"").a
f880: 70 70 65 6e 64 28 6d 45 78 63 65 70 74 69 6f 6e  ppend(mException
f890: 2e 67 65 74 4d 65 73 73 61 67 65 28 29 29 2e 61  .getMessage()).a
f8a0: 70 70 65 6e 64 28 22 5c 22 22 29 3b 0a 20 20 20  ppend("\"");.   
f8b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f8c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 72     }..        pr
f8d0: 69 76 61 74 65 20 53 74 72 69 6e 67 20 67 65 74  ivate String get
f8e0: 53 74 61 74 75 73 28 29 20 7b 0a 20 20 20 20 20  Status() {.     
f8f0: 20 20 20 20 20 20 20 69 66 20 28 21 6d 46 69 6e         if (!mFin
f900: 69 73 68 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ished) {.       
f910: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f920: 22 72 75 6e 6e 69 6e 67 22 3b 0a 20 20 20 20 20  "running";.     
f930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f940: 20 20 20 20 20 72 65 74 75 72 6e 20 6d 45 78 63       return mExc
f950: 65 70 74 69 6f 6e 20 21 3d 20 6e 75 6c 6c 20 3f  eption != null ?
f960: 20 22 66 61 69 6c 65 64 22 20 3a 20 22 73 75 63   "failed" : "suc
f970: 63 65 65 64 65 64 22 3b 0a 20 20 20 20 20 20 20  ceeded";.       
f980: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 72 69 76   }..        priv
f990: 61 74 65 20 53 74 72 69 6e 67 20 67 65 74 46 6f  ate String getFo
f9a0: 72 6d 61 74 74 65 64 53 74 61 72 74 54 69 6d 65  rmattedStartTime
f9b0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  () {.           
f9c0: 20 72 65 74 75 72 6e 20 73 44 61 74 65 46 6f 72   return sDateFor
f9d0: 6d 61 74 2e 66 6f 72 6d 61 74 28 6e 65 77 20 44  mat.format(new D
f9e0: 61 74 65 28 6d 53 74 61 72 74 54 69 6d 65 29 29  ate(mStartTime))
f9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fa00: 7d 0a 7d 0a                                      }.}.