SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact 596857dd548fa0daed0caaba9fdb2d086e1ea40d:


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 69 6d 70  ockGuard; */.imp
0320: 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64  ort org.sqlite.d
0330: 61 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 43  atabase.sqlite.C
0340: 6c 6f 73 65 47 75 61 72 64 3b 0a 0a 69 6d 70 6f  loseGuard;..impo
0350: 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74 61 62  rt android.datab
0360: 61 73 65 2e 43 75 72 73 6f 72 3b 0a 69 6d 70 6f  ase.Cursor;.impo
0370: 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74 61 62  rt android.datab
0380: 61 73 65 2e 43 75 72 73 6f 72 57 69 6e 64 6f 77  ase.CursorWindow
0390: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
03a0: 2e 64 61 74 61 62 61 73 65 2e 44 61 74 61 62 61  .database.Databa
03b0: 73 65 55 74 69 6c 73 3b 0a 69 6d 70 6f 72 74 20  seUtils;.import 
03c0: 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62  org.sqlite.datab
03d0: 61 73 65 2e 45 78 74 72 61 55 74 69 6c 73 3b 0a  ase.ExtraUtils;.
03e0: 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74  import org.sqlit
03f0: 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c 69 74  e.database.sqlit
0400: 65 2e 53 51 4c 69 74 65 44 65 62 75 67 2e 44 62  e.SQLiteDebug.Db
0410: 53 74 61 74 73 3b 0a 69 6d 70 6f 72 74 20 61 6e  Stats;.import an
0420: 64 72 6f 69 64 2e 6f 73 2e 43 61 6e 63 65 6c 6c  droid.os.Cancell
0430: 61 74 69 6f 6e 53 69 67 6e 61 6c 3b 0a 69 6d 70  ationSignal;.imp
0440: 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e 4f  ort android.os.O
0450: 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64  perationCanceled
0460: 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72  Exception;.impor
0470: 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e 50 61 72  t android.os.Par
0480: 63 65 6c 46 69 6c 65 44 65 73 63 72 69 70 74 6f  celFileDescripto
0490: 72 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69  r;.import androi
04a0: 64 2e 75 74 69 6c 2e 4c 6f 67 3b 0a 69 6d 70 6f  d.util.Log;.impo
04b0: 72 74 20 61 6e 64 72 6f 69 64 2e 75 74 69 6c 2e  rt android.util.
04c0: 4c 72 75 43 61 63 68 65 3b 0a 69 6d 70 6f 72 74  LruCache;.import
04d0: 20 61 6e 64 72 6f 69 64 2e 75 74 69 6c 2e 50 72   android.util.Pr
04e0: 69 6e 74 65 72 3b 0a 0a 69 6d 70 6f 72 74 20 6a  inter;..import j
04f0: 61 76 61 2e 74 65 78 74 2e 53 69 6d 70 6c 65 44  ava.text.SimpleD
0500: 61 74 65 46 6f 72 6d 61 74 3b 0a 69 6d 70 6f 72  ateFormat;.impor
0510: 74 20 6a 61 76 61 2e 75 74 69 6c 2e 41 72 72 61  t java.util.Arra
0520: 79 4c 69 73 74 3b 0a 69 6d 70 6f 72 74 20 6a 61  yList;.import ja
0530: 76 61 2e 75 74 69 6c 2e 44 61 74 65 3b 0a 69 6d  va.util.Date;.im
0540: 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 4d  port java.util.M
0550: 61 70 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e  ap;.import java.
0560: 75 74 69 6c 2e 72 65 67 65 78 2e 50 61 74 74 65  util.regex.Patte
0570: 72 6e 3b 0a 0a 2f 2a 2a 0a 20 2a 20 52 65 70 72  rn;../**. * Repr
0580: 65 73 65 6e 74 73 20 61 20 53 51 4c 69 74 65 20  esents a SQLite 
0590: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
05a0: 69 6f 6e 2e 0a 20 2a 20 45 61 63 68 20 63 6f 6e  ion.. * Each con
05b0: 6e 65 63 74 69 6f 6e 20 77 72 61 70 73 20 61 6e  nection wraps an
05c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 6e   instance of a n
05d0: 61 74 69 76 65 20 3c 63 6f 64 65 3e 73 71 6c 69  ative <code>sqli
05e0: 74 65 33 3c 2f 63 6f 64 65 3e 20 6f 62 6a 65 63  te3</code> objec
05f0: 74 2e 0a 20 2a 20 3c 70 3e 0a 20 2a 20 57 68 65  t.. * <p>. * Whe
0600: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
0610: 63 74 69 6f 6e 20 70 6f 6f 6c 69 6e 67 20 69 73  ction pooling is
0620: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 72 65 20   enabled, there 
0630: 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  can be multiple 
0640: 61 63 74 69 76 65 0a 20 2a 20 63 6f 6e 6e 65 63  active. * connec
0650: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
0660: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68  e database.  Oth
0670: 65 72 77 69 73 65 20 74 68 65 72 65 20 69 73 20  erwise there is 
0680: 74 79 70 69 63 61 6c 6c 79 20 6f 6e 6c 79 20 6f  typically only o
0690: 6e 65 0a 20 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  ne. * connection
06a0: 20 70 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20   per database.. 
06b0: 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 2a 20 57 68 65  * </p><p>. * Whe
06c0: 6e 20 74 68 65 20 53 51 4c 69 74 65 20 57 41 4c  n the SQLite WAL
06d0: 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62   feature is enab
06e0: 6c 65 64 2c 20 6d 75 6c 74 69 70 6c 65 20 72 65  led, multiple re
06f0: 61 64 65 72 73 20 61 6e 64 20 6f 6e 65 20 77 72  aders and one wr
0700: 69 74 65 72 0a 20 2a 20 63 61 6e 20 63 6f 6e 63  iter. * can conc
0710: 75 72 72 65 6e 74 6c 79 20 61 63 63 65 73 73 20  urrently access 
0720: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  the database.  W
0730: 69 74 68 6f 75 74 20 57 41 4c 2c 20 72 65 61 64  ithout WAL, read
0740: 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a  ers and writers.
0750: 20 2a 20 61 72 65 20 6d 75 74 75 61 6c 6c 79 20   * are mutually 
0760: 65 78 63 6c 75 73 69 76 65 2e 0a 20 2a 20 3c 2f  exclusive.. * </
0770: 70 3e 0a 20 2a 0a 20 2a 20 3c 68 32 3e 4f 77 6e  p>. *. * <h2>Own
0780: 65 72 73 68 69 70 20 61 6e 64 20 63 6f 6e 63 75  ership and concu
0790: 72 72 65 6e 63 79 20 67 75 61 72 61 6e 74 65 65  rrency guarantee
07a0: 73 3c 2f 68 32 3e 0a 20 2a 20 3c 70 3e 0a 20 2a  s</h2>. * <p>. *
07b0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65   Connection obje
07c0: 63 74 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  cts are not thre
07d0: 61 64 2d 73 61 66 65 2e 20 20 54 68 65 79 20 61  ad-safe.  They a
07e0: 72 65 20 61 63 71 75 69 72 65 64 20 61 73 20 6e  re acquired as n
07f0: 65 65 64 65 64 20 74 6f 0a 20 2a 20 70 65 72 66  eeded to. * perf
0800: 6f 72 6d 20 61 20 64 61 74 61 62 61 73 65 20 6f  orm a database o
0810: 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 61 72 65  peration and are
0820: 20 74 68 65 6e 20 72 65 74 75 72 6e 65 64 20 74   then returned t
0830: 6f 20 74 68 65 20 70 6f 6f 6c 2e 20 20 41 74 20  o the pool.  At 
0840: 61 6e 79 0a 20 2a 20 67 69 76 65 6e 20 74 69 6d  any. * given tim
0850: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
0860: 69 73 20 65 69 74 68 65 72 20 6f 77 6e 65 64 20  is either owned 
0870: 61 6e 64 20 75 73 65 64 20 62 79 20 61 20 7b 40  and used by a {@
0880: 6c 69 6e 6b 20 53 51 4c 69 74 65 53 65 73 73 69  link SQLiteSessi
0890: 6f 6e 7d 0a 20 2a 20 6f 62 6a 65 63 74 20 6f 72  on}. * object or
08a0: 20 74 68 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69   the {@link SQLi
08b0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c  teConnectionPool
08c0: 7d 2e 20 20 54 68 6f 73 65 20 63 6c 61 73 73 65  }.  Those classe
08d0: 73 20 61 72 65 0a 20 2a 20 72 65 73 70 6f 6e 73  s are. * respons
08e0: 69 62 6c 65 20 66 6f 72 20 73 65 72 69 61 6c 69  ible for seriali
08f0: 7a 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  zing operations 
0900: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
0910: 20 63 6f 6e 63 75 72 72 65 6e 74 0a 20 2a 20 75   concurrent. * u
0920: 73 65 20 6f 66 20 61 20 63 6f 6e 6e 65 63 74 69  se of a connecti
0930: 6f 6e 2e 0a 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20  on.. * </p><p>. 
0940: 2a 20 54 68 65 20 67 75 61 72 61 6e 74 65 65 20  * The guarantee 
0950: 6f 66 20 68 61 76 69 6e 67 20 61 20 73 69 6e 67  of having a sing
0960: 6c 65 20 6f 77 6e 65 72 20 61 6c 6c 6f 77 73 20  le owner allows 
0970: 74 68 69 73 20 63 6c 61 73 73 20 74 6f 20 62 65  this class to be
0980: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 20 2a 20   implemented. * 
0990: 77 69 74 68 6f 75 74 20 6c 6f 63 6b 73 20 61 6e  without locks an
09a0: 64 20 67 72 65 61 74 6c 79 20 73 69 6d 70 6c 69  d greatly simpli
09b0: 66 69 65 73 20 72 65 73 6f 75 72 63 65 20 6d 61  fies resource ma
09c0: 6e 61 67 65 6d 65 6e 74 2e 0a 20 2a 20 3c 2f 70  nagement.. * </p
09d0: 3e 0a 20 2a 0a 20 2a 20 3c 68 32 3e 45 6e 63 61  >. *. * <h2>Enca
09e0: 70 73 75 6c 61 74 69 6f 6e 20 67 75 61 72 61 6e  psulation guaran
09f0: 74 65 65 73 3c 2f 68 32 3e 0a 20 2a 20 3c 70 3e  tees</h2>. * <p>
0a00: 0a 20 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  . * The connecti
0a10: 6f 6e 20 6f 62 6a 65 63 74 20 6f 62 6a 65 63 74  on object object
0a20: 20 6f 77 6e 73 20 2a 61 6c 6c 2a 20 6f 66 20 74   owns *all* of t
0a30: 68 65 20 53 51 4c 69 74 65 20 72 65 6c 61 74 65  he SQLite relate
0a40: 64 20 6e 61 74 69 76 65 0a 20 2a 20 6f 62 6a 65  d native. * obje
0a50: 63 74 73 20 74 68 61 74 20 61 72 65 20 61 73 73  cts that are ass
0a60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
0a70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 57 68   connection.  Wh
0a80: 61 74 27 73 20 6d 6f 72 65 2c 20 74 68 65 72 65  at's more, there
0a90: 20 61 72 65 0a 20 2a 20 6e 6f 20 6f 74 68 65 72   are. * no other
0aa0: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
0ab0: 73 79 73 74 65 6d 20 74 68 61 74 20 61 72 65 20  system that are 
0ac0: 63 61 70 61 62 6c 65 20 6f 66 20 6f 62 74 61 69  capable of obtai
0ad0: 6e 69 6e 67 20 68 61 6e 64 6c 65 73 20 74 6f 0a  ning handles to.
0ae0: 20 2a 20 74 68 6f 73 65 20 6e 61 74 69 76 65 20   * those native 
0af0: 6f 62 6a 65 63 74 73 2e 20 20 43 6f 6e 73 65 71  objects.  Conseq
0b00: 75 65 6e 74 6c 79 2c 20 77 68 65 6e 20 74 68 65  uently, when the
0b10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
0b20: 6c 6f 73 65 64 2c 20 77 65 20 64 6f 0a 20 2a 20  losed, we do. * 
0b30: 6e 6f 74 20 68 61 76 65 20 74 6f 20 77 6f 72 72  not have to worr
0b40: 79 20 61 62 6f 75 74 20 77 68 61 74 20 6f 74 68  y about what oth
0b50: 65 72 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6d 69  er components mi
0b60: 67 68 74 20 68 61 76 65 20 72 65 66 65 72 65 6e  ght have referen
0b70: 63 65 73 20 74 6f 0a 20 2a 20 69 74 73 20 61 73  ces to. * its as
0b80: 73 6f 63 69 61 74 65 64 20 53 51 4c 69 74 65 20  sociated SQLite 
0b90: 73 74 61 74 65 20 2d 2d 20 74 68 65 72 65 20 61  state -- there a
0ba0: 72 65 20 6e 6f 6e 65 2e 0a 20 2a 20 3c 2f 70 3e  re none.. * </p>
0bb0: 3c 70 3e 0a 20 2a 20 45 6e 63 61 70 73 75 6c 61  <p>. * Encapsula
0bc0: 74 69 6f 6e 20 69 73 20 77 68 61 74 20 65 6e 73  tion is what ens
0bd0: 75 72 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ures that the co
0be0: 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 27  nnection object'
0bf0: 73 0a 20 2a 20 6c 69 66 65 63 79 63 6c 65 20 64  s. * lifecycle d
0c00: 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65 20 61  oes not become a
0c10: 20 74 6f 72 74 75 72 65 64 20 6d 65 73 73 20 6f   tortured mess o
0c20: 66 20 66 69 6e 61 6c 69 7a 65 72 73 20 61 6e 64  f finalizers and
0c30: 20 72 65 66 65 72 65 6e 63 65 0a 20 2a 20 71 75   reference. * qu
0c40: 65 75 65 73 2e 0a 20 2a 20 3c 2f 70 3e 0a 20 2a  eues.. * </p>. *
0c50: 0a 20 2a 20 3c 68 32 3e 52 65 65 6e 74 72 61 6e  . * <h2>Reentran
0c60: 63 65 3c 2f 68 32 3e 0a 20 2a 20 3c 70 3e 0a 20  ce</h2>. * <p>. 
0c70: 2a 20 54 68 69 73 20 63 6c 61 73 73 20 6d 75 73  * This class mus
0c80: 74 20 74 6f 6c 65 72 61 74 65 20 72 65 65 6e 74  t tolerate reent
0c90: 72 61 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 6f  rant execution o
0ca0: 66 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  f SQLite operati
0cb0: 6f 6e 73 20 62 65 63 61 75 73 65 0a 20 2a 20 74  ons because. * t
0cc0: 72 69 67 67 65 72 73 20 6d 61 79 20 63 61 6c 6c  riggers may call
0cd0: 20 63 75 73 74 6f 6d 20 53 51 4c 69 74 65 20 66   custom SQLite f
0ce0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 70 65  unctions that pe
0cf0: 72 66 6f 72 6d 20 61 64 64 69 74 69 6f 6e 61 6c  rform additional
0d00: 20 71 75 65 72 69 65 73 2e 0a 20 2a 20 3c 2f 70   queries.. * </p
0d10: 3e 0a 20 2a 0a 20 2a 20 40 68 69 64 65 0a 20 2a  >. *. * @hide. *
0d20: 2f 0a 70 75 62 6c 69 63 20 66 69 6e 61 6c 20 63  /.public final c
0d30: 6c 61 73 73 20 53 51 4c 69 74 65 43 6f 6e 6e 65  lass SQLiteConne
0d40: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73  ction implements
0d50: 20 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67   CancellationSig
0d60: 6e 61 6c 2e 4f 6e 43 61 6e 63 65 6c 4c 69 73 74  nal.OnCancelList
0d70: 65 6e 65 72 20 7b 0a 20 20 20 20 70 72 69 76 61  ener {.    priva
0d80: 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20  te static final 
0d90: 53 74 72 69 6e 67 20 54 41 47 20 3d 20 22 53 51  String TAG = "SQ
0da0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 22 3b  LiteConnection";
0db0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
0dc0: 74 69 63 20 66 69 6e 61 6c 20 62 6f 6f 6c 65 61  tic final boolea
0dd0: 6e 20 44 45 42 55 47 20 3d 20 66 61 6c 73 65 3b  n DEBUG = false;
0de0: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
0df0: 61 74 69 63 20 66 69 6e 61 6c 20 53 74 72 69 6e  atic final Strin
0e00: 67 5b 5d 20 45 4d 50 54 59 5f 53 54 52 49 4e 47  g[] EMPTY_STRING
0e10: 5f 41 52 52 41 59 20 3d 20 6e 65 77 20 53 74 72  _ARRAY = new Str
0e20: 69 6e 67 5b 30 5d 3b 0a 20 20 20 20 70 72 69 76  ing[0];.    priv
0e30: 61 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c  ate static final
0e40: 20 62 79 74 65 5b 5d 20 45 4d 50 54 59 5f 42 59   byte[] EMPTY_BY
0e50: 54 45 5f 41 52 52 41 59 20 3d 20 6e 65 77 20 62  TE_ARRAY = new b
0e60: 79 74 65 5b 30 5d 3b 0a 0a 20 20 20 20 70 72 69  yte[0];..    pri
0e70: 76 61 74 65 20 73 74 61 74 69 63 20 66 69 6e 61  vate static fina
0e80: 6c 20 50 61 74 74 65 72 6e 20 54 52 49 4d 5f 53  l Pattern TRIM_S
0e90: 51 4c 5f 50 41 54 54 45 52 4e 20 3d 20 50 61 74  QL_PATTERN = Pat
0ea0: 74 65 72 6e 2e 63 6f 6d 70 69 6c 65 28 22 5b 5c  tern.compile("[\
0eb0: 5c 73 5d 2a 5c 5c 6e 2b 5b 5c 5c 73 5d 2a 22 29  \s]*\\n+[\\s]*")
0ec0: 3b 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 66  ;..    private f
0ed0: 69 6e 61 6c 20 43 6c 6f 73 65 47 75 61 72 64 20  inal CloseGuard 
0ee0: 6d 43 6c 6f 73 65 47 75 61 72 64 20 3d 20 43 6c  mCloseGuard = Cl
0ef0: 6f 73 65 47 75 61 72 64 2e 67 65 74 28 29 3b 0a  oseGuard.get();.
0f00: 0a 20 20 20 20 70 72 69 76 61 74 65 20 66 69 6e  .    private fin
0f10: 61 6c 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  al SQLiteConnect
0f20: 69 6f 6e 50 6f 6f 6c 20 6d 50 6f 6f 6c 3b 0a 20  ionPool mPool;. 
0f30: 20 20 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c     private final
0f40: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 43   SQLiteDatabaseC
0f50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6d 43 6f  onfiguration mCo
0f60: 6e 66 69 67 75 72 61 74 69 6f 6e 3b 0a 20 20 20  nfiguration;.   
0f70: 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 69   private final i
0f80: 6e 74 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 49 64  nt mConnectionId
0f90: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 66 69  ;.    private fi
0fa0: 6e 61 6c 20 62 6f 6f 6c 65 61 6e 20 6d 49 73 50  nal boolean mIsP
0fb0: 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e  rimaryConnection
0fc0: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 66 69  ;.    private fi
0fd0: 6e 61 6c 20 62 6f 6f 6c 65 61 6e 20 6d 49 73 52  nal boolean mIsR
0fe0: 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f  eadOnlyConnectio
0ff0: 6e 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 66  n;.    private f
1000: 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53 74 61  inal PreparedSta
1010: 74 65 6d 65 6e 74 43 61 63 68 65 20 6d 50 72 65  tementCache mPre
1020: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61  paredStatementCa
1030: 63 68 65 3b 0a 20 20 20 20 70 72 69 76 61 74 65  che;.    private
1040: 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65   PreparedStateme
1050: 6e 74 20 6d 50 72 65 70 61 72 65 64 53 74 61 74  nt mPreparedStat
1060: 65 6d 65 6e 74 50 6f 6f 6c 3b 0a 0a 20 20 20 20  ementPool;..    
1070: 2f 2f 20 54 68 65 20 72 65 63 65 6e 74 20 6f 70  // The recent op
1080: 65 72 61 74 69 6f 6e 73 20 6c 6f 67 2e 0a 20 20  erations log..  
1090: 20 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20    private final 
10a0: 4f 70 65 72 61 74 69 6f 6e 4c 6f 67 20 6d 52 65  OperationLog mRe
10b0: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 20 3d  centOperations =
10c0: 20 6e 65 77 20 4f 70 65 72 61 74 69 6f 6e 4c 6f   new OperationLo
10d0: 67 28 29 3b 0a 0a 20 20 20 20 2f 2f 20 54 68 65  g();..    // The
10e0: 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 43 6f   native SQLiteCo
10f0: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
1100: 2e 20 20 28 46 4f 52 20 49 4e 54 45 52 4e 41 4c  .  (FOR INTERNAL
1110: 20 55 53 45 20 4f 4e 4c 59 29 0a 20 20 20 20 70   USE ONLY).    p
1120: 72 69 76 61 74 65 20 6c 6f 6e 67 20 6d 43 6f 6e  rivate long mCon
1130: 6e 65 63 74 69 6f 6e 50 74 72 3b 0a 0a 20 20 20  nectionPtr;..   
1140: 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 65 61 6e   private boolean
1150: 20 6d 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f   mOnlyAllowReadO
1160: 6e 6c 79 4f 70 65 72 61 74 69 6f 6e 73 3b 0a 0a  nlyOperations;..
1170: 20 20 20 20 2f 2f 20 54 68 65 20 6e 75 6d 62 65      // The numbe
1180: 72 20 6f 66 20 74 69 6d 65 73 20 61 74 74 61 63  r of times attac
1190: 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  hCancellationSig
11a0: 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 63 61 6c  nal has been cal
11b0: 6c 65 64 2e 0a 20 20 20 20 2f 2f 20 42 65 63 61  led..    // Beca
11c0: 75 73 65 20 53 51 4c 69 74 65 20 73 74 61 74 65  use SQLite state
11d0: 6d 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 63  ment execution c
11e0: 61 6e 20 62 65 20 72 65 65 6e 74 72 61 6e 74 2c  an be reentrant,
11f0: 20 77 65 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   we keep track o
1200: 66 20 68 6f 77 20 6d 61 6e 79 0a 20 20 20 20 2f  f how many.    /
1210: 2f 20 74 69 6d 65 73 20 77 65 20 68 61 76 65 20  / times we have 
1220: 61 74 74 65 6d 70 74 65 64 20 74 6f 20 61 74 74  attempted to att
1230: 61 63 68 20 61 20 63 61 6e 63 65 6c 6c 61 74 69  ach a cancellati
1240: 6f 6e 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65  on signal to the
1250: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 20 74   connection so t
1260: 68 61 74 0a 20 20 20 20 2f 2f 20 77 65 20 63 61  hat.    // we ca
1270: 6e 20 65 6e 73 75 72 65 20 74 68 61 74 20 77 65  n ensure that we
1280: 20 64 65 74 61 63 68 20 74 68 65 20 73 69 67 6e   detach the sign
1290: 61 6c 20 61 74 20 74 68 65 20 72 69 67 68 74 20  al at the right 
12a0: 74 69 6d 65 2e 0a 20 20 20 20 70 72 69 76 61 74  time..    privat
12b0: 65 20 69 6e 74 20 6d 43 61 6e 63 65 6c 6c 61 74  e int mCancellat
12c0: 69 6f 6e 53 69 67 6e 61 6c 41 74 74 61 63 68 43  ionSignalAttachC
12d0: 6f 75 6e 74 3b 0a 0a 20 20 20 20 70 72 69 76 61  ount;..    priva
12e0: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
12f0: 20 6c 6f 6e 67 20 6e 61 74 69 76 65 4f 70 65 6e   long nativeOpen
1300: 28 53 74 72 69 6e 67 20 70 61 74 68 2c 20 69 6e  (String path, in
1310: 74 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 74 72  t openFlags, Str
1320: 69 6e 67 20 6c 61 62 65 6c 2c 0a 20 20 20 20 20  ing label,.     
1330: 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 65         boolean e
1340: 6e 61 62 6c 65 54 72 61 63 65 2c 20 62 6f 6f 6c  nableTrace, bool
1350: 65 61 6e 20 65 6e 61 62 6c 65 50 72 6f 66 69 6c  ean enableProfil
1360: 65 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20  e);.    private 
1370: 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f  static native vo
1380: 69 64 20 6e 61 74 69 76 65 43 6c 6f 73 65 28 6c  id nativeClose(l
1390: 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ong connectionPt
13a0: 72 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20  r);.    private 
13b0: 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f  static native vo
13c0: 69 64 20 6e 61 74 69 76 65 52 65 67 69 73 74 65  id nativeRegiste
13d0: 72 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 28  rCustomFunction(
13e0: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
13f0: 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
1400: 53 51 4c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63  SQLiteCustomFunc
1410: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 29 3b 0a  tion function);.
1420: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1430: 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e  ic native void n
1440: 61 74 69 76 65 52 65 67 69 73 74 65 72 4c 6f 63  ativeRegisterLoc
1450: 61 6c 69 7a 65 64 43 6f 6c 6c 61 74 6f 72 73 28  alizedCollators(
1460: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
1470: 74 72 2c 20 53 74 72 69 6e 67 20 6c 6f 63 61 6c  tr, String local
1480: 65 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20  e);.    private 
1490: 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 6c 6f  static native lo
14a0: 6e 67 20 6e 61 74 69 76 65 50 72 65 70 61 72 65  ng nativePrepare
14b0: 53 74 61 74 65 6d 65 6e 74 28 6c 6f 6e 67 20 63  Statement(long c
14c0: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 53 74  onnectionPtr, St
14d0: 72 69 6e 67 20 73 71 6c 29 3b 0a 20 20 20 20 70  ring sql);.    p
14e0: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61  rivate static na
14f0: 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69 76 65  tive void native
1500: 46 69 6e 61 6c 69 7a 65 53 74 61 74 65 6d 65 6e  FinalizeStatemen
1510: 74 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  t(long connectio
1520: 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65  nPtr, long state
1530: 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 70 72  mentPtr);.    pr
1540: 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74  ivate static nat
1550: 69 76 65 20 69 6e 74 20 6e 61 74 69 76 65 47 65  ive int nativeGe
1560: 74 50 61 72 61 6d 65 74 65 72 43 6f 75 6e 74 28  tParameterCount(
1570: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
1580: 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  tr, long stateme
1590: 6e 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76  ntPtr);.    priv
15a0: 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76  ate static nativ
15b0: 65 20 62 6f 6f 6c 65 61 6e 20 6e 61 74 69 76 65  e boolean native
15c0: 49 73 52 65 61 64 4f 6e 6c 79 28 6c 6f 6e 67 20  IsReadOnly(long 
15d0: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c  connectionPtr, l
15e0: 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72  ong statementPtr
15f0: 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  );.    private s
1600: 74 61 74 69 63 20 6e 61 74 69 76 65 20 69 6e 74  tatic native int
1610: 20 6e 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e   nativeGetColumn
1620: 43 6f 75 6e 74 28 6c 6f 6e 67 20 63 6f 6e 6e 65  Count(long conne
1630: 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73  ctionPtr, long s
1640: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20  tatementPtr);.  
1650: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1660: 20 6e 61 74 69 76 65 20 53 74 72 69 6e 67 20 6e   native String n
1670: 61 74 69 76 65 47 65 74 43 6f 6c 75 6d 6e 4e 61  ativeGetColumnNa
1680: 6d 65 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69  me(long connecti
1690: 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74  onPtr, long stat
16a0: 65 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20 20 20  ementPtr,.      
16b0: 20 20 20 20 20 20 69 6e 74 20 69 6e 64 65 78 29        int index)
16c0: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
16d0: 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64  atic native void
16e0: 20 6e 61 74 69 76 65 42 69 6e 64 4e 75 6c 6c 28   nativeBindNull(
16f0: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
1700: 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  tr, long stateme
1710: 6e 74 50 74 72 2c 0a 20 20 20 20 20 20 20 20 20  ntPtr,.         
1720: 20 20 20 69 6e 74 20 69 6e 64 65 78 29 3b 0a 20     int index);. 
1730: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
1740: 63 20 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61  c native void na
1750: 74 69 76 65 42 69 6e 64 4c 6f 6e 67 28 6c 6f 6e  tiveBindLong(lon
1760: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  g connectionPtr,
1770: 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50   long statementP
1780: 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tr,.            
1790: 69 6e 74 20 69 6e 64 65 78 2c 20 6c 6f 6e 67 20  int index, long 
17a0: 76 61 6c 75 65 29 3b 0a 20 20 20 20 70 72 69 76  value);.    priv
17b0: 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76  ate static nativ
17c0: 65 20 76 6f 69 64 20 6e 61 74 69 76 65 42 69 6e  e void nativeBin
17d0: 64 44 6f 75 62 6c 65 28 6c 6f 6e 67 20 63 6f 6e  dDouble(long con
17e0: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67  nectionPtr, long
17f0: 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 0a 20   statementPtr,. 
1800: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1810: 6e 64 65 78 2c 20 64 6f 75 62 6c 65 20 76 61 6c  ndex, double val
1820: 75 65 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65  ue);.    private
1830: 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76   static native v
1840: 6f 69 64 20 6e 61 74 69 76 65 42 69 6e 64 53 74  oid nativeBindSt
1850: 72 69 6e 67 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63  ring(long connec
1860: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
1870: 61 74 65 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20  atementPtr,.    
1880: 20 20 20 20 20 20 20 20 69 6e 74 20 69 6e 64 65          int inde
1890: 78 2c 20 53 74 72 69 6e 67 20 76 61 6c 75 65 29  x, String value)
18a0: 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ;.    private st
18b0: 61 74 69 63 20 6e 61 74 69 76 65 20 76 6f 69 64  atic native void
18c0: 20 6e 61 74 69 76 65 42 69 6e 64 42 6c 6f 62 28   nativeBindBlob(
18d0: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
18e0: 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65  tr, long stateme
18f0: 6e 74 50 74 72 2c 0a 20 20 20 20 20 20 20 20 20  ntPtr,.         
1900: 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 62 79     int index, by
1910: 74 65 5b 5d 20 76 61 6c 75 65 29 3b 0a 20 20 20  te[] value);.   
1920: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1930: 6e 61 74 69 76 65 20 76 6f 69 64 20 6e 61 74 69  native void nati
1940: 76 65 52 65 73 65 74 53 74 61 74 65 6d 65 6e 74  veResetStatement
1950: 41 6e 64 43 6c 65 61 72 42 69 6e 64 69 6e 67 73  AndClearBindings
1960: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  (.            lo
1970: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  ng connectionPtr
1980: 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74  , long statement
1990: 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61 74  Ptr);.    privat
19a0: 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20  e static native 
19b0: 76 6f 69 64 20 6e 61 74 69 76 65 45 78 65 63 75  void nativeExecu
19c0: 74 65 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69  te(long connecti
19d0: 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74  onPtr, long stat
19e0: 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 70  ementPtr);.    p
19f0: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6e 61  rivate static na
1a00: 74 69 76 65 20 6c 6f 6e 67 20 6e 61 74 69 76 65  tive long native
1a10: 45 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 6c  ExecuteForLong(l
1a20: 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ong connectionPt
1a30: 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e  r, long statemen
1a40: 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61  tPtr);.    priva
1a50: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
1a60: 20 53 74 72 69 6e 67 20 6e 61 74 69 76 65 45 78   String nativeEx
1a70: 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67 28 6c  ecuteForString(l
1a80: 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50 74  ong connectionPt
1a90: 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e  r, long statemen
1aa0: 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61  tPtr);.    priva
1ab0: 74 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65  te static native
1ac0: 20 69 6e 74 20 6e 61 74 69 76 65 45 78 65 63 75   int nativeExecu
1ad0: 74 65 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73  teForBlobFileDes
1ae0: 63 72 69 70 74 6f 72 28 0a 20 20 20 20 20 20 20  criptor(.       
1af0: 20 20 20 20 20 6c 6f 6e 67 20 63 6f 6e 6e 65 63       long connec
1b00: 74 69 6f 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74  tionPtr, long st
1b10: 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20  atementPtr);.   
1b20: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1b30: 6e 61 74 69 76 65 20 69 6e 74 20 6e 61 74 69 76  native int nativ
1b40: 65 45 78 65 63 75 74 65 46 6f 72 43 68 61 6e 67  eExecuteForChang
1b50: 65 64 52 6f 77 43 6f 75 6e 74 28 6c 6f 6e 67 20  edRowCount(long 
1b60: 63 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6c  connectionPtr, l
1b70: 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74 50 74 72  ong statementPtr
1b80: 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  );.    private s
1b90: 74 61 74 69 63 20 6e 61 74 69 76 65 20 6c 6f 6e  tatic native lon
1ba0: 67 20 6e 61 74 69 76 65 45 78 65 63 75 74 65 46  g nativeExecuteF
1bb0: 6f 72 4c 61 73 74 49 6e 73 65 72 74 65 64 52 6f  orLastInsertedRo
1bc0: 77 49 64 28 0a 20 20 20 20 20 20 20 20 20 20 20  wId(.           
1bd0: 20 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e   long connection
1be0: 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65 6d  Ptr, long statem
1bf0: 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 70 72 69  entPtr);.    pri
1c00: 76 61 74 65 20 73 74 61 74 69 63 20 6e 61 74 69  vate static nati
1c10: 76 65 20 6c 6f 6e 67 20 6e 61 74 69 76 65 45 78  ve long nativeEx
1c20: 65 63 75 74 65 46 6f 72 43 75 72 73 6f 72 57 69  ecuteForCursorWi
1c30: 6e 64 6f 77 28 0a 20 20 20 20 20 20 20 20 20 20  ndow(.          
1c40: 20 20 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f    long connectio
1c50: 6e 50 74 72 2c 20 6c 6f 6e 67 20 73 74 61 74 65  nPtr, long state
1c60: 6d 65 6e 74 50 74 72 2c 20 43 75 72 73 6f 72 57  mentPtr, CursorW
1c70: 69 6e 64 6f 77 20 77 69 6e 2c 0a 20 20 20 20 20  indow win,.     
1c80: 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74         int start
1c90: 50 6f 73 2c 20 69 6e 74 20 72 65 71 75 69 72 65  Pos, int require
1ca0: 64 50 6f 73 2c 20 62 6f 6f 6c 65 61 6e 20 63 6f  dPos, boolean co
1cb0: 75 6e 74 41 6c 6c 52 6f 77 73 29 3b 0a 20 20 20  untAllRows);.   
1cc0: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1cd0: 6e 61 74 69 76 65 20 69 6e 74 20 6e 61 74 69 76  native int nativ
1ce0: 65 47 65 74 44 62 4c 6f 6f 6b 61 73 69 64 65 28  eGetDbLookaside(
1cf0: 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 50  long connectionP
1d00: 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61 74 65  tr);.    private
1d10: 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20 76   static native v
1d20: 6f 69 64 20 6e 61 74 69 76 65 43 61 6e 63 65 6c  oid nativeCancel
1d30: 28 6c 6f 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  (long connection
1d40: 50 74 72 29 3b 0a 20 20 20 20 70 72 69 76 61 74  Ptr);.    privat
1d50: 65 20 73 74 61 74 69 63 20 6e 61 74 69 76 65 20  e static native 
1d60: 76 6f 69 64 20 6e 61 74 69 76 65 52 65 73 65 74  void nativeReset
1d70: 43 61 6e 63 65 6c 28 6c 6f 6e 67 20 63 6f 6e 6e  Cancel(long conn
1d80: 65 63 74 69 6f 6e 50 74 72 2c 20 62 6f 6f 6c 65  ectionPtr, boole
1d90: 61 6e 20 63 61 6e 63 65 6c 61 62 6c 65 29 3b 0a  an cancelable);.
1da0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
1db0: 74 69 63 20 6e 61 74 69 76 65 20 62 6f 6f 6c 65  tic native boole
1dc0: 61 6e 20 6e 61 74 69 76 65 48 61 73 43 6f 64 65  an nativeHasCode
1dd0: 63 28 29 3b 0a 20 20 20 20 70 75 62 6c 69 63 20  c();.    public 
1de0: 73 74 61 74 69 63 20 62 6f 6f 6c 65 61 6e 20 68  static boolean h
1df0: 61 73 43 6f 64 65 63 28 29 7b 20 72 65 74 75 72  asCodec(){ retur
1e00: 6e 20 6e 61 74 69 76 65 48 61 73 43 6f 64 65 63  n nativeHasCodec
1e10: 28 29 3b 20 7d 0a 0a 20 20 20 20 70 72 69 76 61  (); }..    priva
1e20: 74 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te SQLiteConnect
1e30: 69 6f 6e 28 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ion(SQLiteConnec
1e40: 74 69 6f 6e 50 6f 6f 6c 20 70 6f 6f 6c 2c 0a 20  tionPool pool,. 
1e50: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
1e60: 65 44 61 74 61 62 61 73 65 43 6f 6e 66 69 67 75  eDatabaseConfigu
1e70: 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61  ration configura
1e80: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
1e90: 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    int connection
1ea0: 49 64 2c 20 62 6f 6f 6c 65 61 6e 20 70 72 69 6d  Id, boolean prim
1eb0: 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b  aryConnection) {
1ec0: 0a 20 20 20 20 20 20 20 20 6d 50 6f 6f 6c 20 3d  .        mPool =
1ed0: 20 70 6f 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6d   pool;.        m
1ee0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 20  Configuration = 
1ef0: 6e 65 77 20 53 51 4c 69 74 65 44 61 74 61 62 61  new SQLiteDataba
1f00: 73 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28  seConfiguration(
1f10: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 3b 0a  configuration);.
1f20: 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74          mConnect
1f30: 69 6f 6e 49 64 20 3d 20 63 6f 6e 6e 65 63 74 69  ionId = connecti
1f40: 6f 6e 49 64 3b 0a 20 20 20 20 20 20 20 20 6d 49  onId;.        mI
1f50: 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69  sPrimaryConnecti
1f60: 6f 6e 20 3d 20 70 72 69 6d 61 72 79 43 6f 6e 6e  on = primaryConn
1f70: 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
1f80: 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e 6e 65  mIsReadOnlyConne
1f90: 63 74 69 6f 6e 20 3d 20 28 63 6f 6e 66 69 67 75  ction = (configu
1fa0: 72 61 74 69 6f 6e 2e 6f 70 65 6e 46 6c 61 67 73  ration.openFlags
1fb0: 20 26 20 53 51 4c 69 74 65 44 61 74 61 62 61 73   & SQLiteDatabas
1fc0: 65 2e 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  e.OPEN_READONLY)
1fd0: 20 21 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6d   != 0;.        m
1fe0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
1ff0: 74 43 61 63 68 65 20 3d 20 6e 65 77 20 50 72 65  tCache = new Pre
2000: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43 61  paredStatementCa
2010: 63 68 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  che(.           
2020: 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74       mConfigurat
2030: 69 6f 6e 2e 6d 61 78 53 71 6c 43 61 63 68 65 53  ion.maxSqlCacheS
2040: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 43  ize);.        mC
2050: 6c 6f 73 65 47 75 61 72 64 2e 6f 70 65 6e 28 22  loseGuard.open("
2060: 63 6c 6f 73 65 22 29 3b 0a 20 20 20 20 7d 0a 0a  close");.    }..
2070: 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20      @Override.  
2080: 20 20 70 72 6f 74 65 63 74 65 64 20 76 6f 69 64    protected void
2090: 20 66 69 6e 61 6c 69 7a 65 28 29 20 74 68 72 6f   finalize() thro
20a0: 77 73 20 54 68 72 6f 77 61 62 6c 65 20 7b 0a 20  ws Throwable {. 
20b0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
20c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 50 6f           if (mPo
20d0: 6f 6c 20 21 3d 20 6e 75 6c 6c 20 26 26 20 6d 43  ol != null && mC
20e0: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 20 21 3d 20  onnectionPtr != 
20f0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
2100: 20 20 20 20 20 6d 50 6f 6f 6c 2e 6f 6e 43 6f 6e       mPool.onCon
2110: 6e 65 63 74 69 6f 6e 4c 65 61 6b 65 64 28 29 3b  nectionLeaked();
2120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
2130: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 70              disp
2140: 6f 73 65 28 74 72 75 65 29 3b 0a 20 20 20 20 20  ose(true);.     
2150: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20     } finally {. 
2160: 20 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72             super
2170: 2e 66 69 6e 61 6c 69 7a 65 28 29 3b 0a 20 20 20  .finalize();.   
2180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2190: 20 20 2f 2f 20 43 61 6c 6c 65 64 20 62 79 20 53    // Called by S
21a0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50  QLiteConnectionP
21b0: 6f 6f 6c 20 6f 6e 6c 79 2e 0a 20 20 20 20 73 74  ool only..    st
21c0: 61 74 69 63 20 53 51 4c 69 74 65 43 6f 6e 6e 65  atic SQLiteConne
21d0: 63 74 69 6f 6e 20 6f 70 65 6e 28 53 51 4c 69 74  ction open(SQLit
21e0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20  eConnectionPool 
21f0: 70 6f 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  pool,.          
2200: 20 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65    SQLiteDatabase
2210: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
2220: 6e 66 69 67 75 72 61 74 69 6f 6e 2c 0a 20 20 20  nfiguration,.   
2230: 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 6e           int con
2240: 6e 65 63 74 69 6f 6e 49 64 2c 20 62 6f 6f 6c 65  nectionId, boole
2250: 61 6e 20 70 72 69 6d 61 72 79 43 6f 6e 6e 65 63  an primaryConnec
2260: 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tion) {.        
2270: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
2280: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 6e 65   connection = ne
2290: 77 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  w SQLiteConnecti
22a0: 6f 6e 28 70 6f 6f 6c 2c 20 63 6f 6e 66 69 67 75  on(pool, configu
22b0: 72 61 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  ration,.        
22c0: 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
22d0: 6f 6e 49 64 2c 20 70 72 69 6d 61 72 79 43 6f 6e  onId, primaryCon
22e0: 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
22f0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
2300: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 6f      connection.o
2310: 70 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20  pen();.         
2320: 20 20 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63     return connec
2330: 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d 20  tion;.        } 
2340: 63 61 74 63 68 20 28 53 51 4c 69 74 65 45 78 63  catch (SQLiteExc
2350: 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20  eption ex) {.   
2360: 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74           connect
2370: 69 6f 6e 2e 64 69 73 70 6f 73 65 28 66 61 6c 73  ion.dispose(fals
2380: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2390: 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20  throw ex;.      
23a0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23b0: 2f 20 43 61 6c 6c 65 64 20 62 79 20 53 51 4c 69  / Called by SQLi
23c0: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c  teConnectionPool
23d0: 20 6f 6e 6c 79 2e 0a 20 20 20 20 2f 2f 20 43 6c   only..    // Cl
23e0: 6f 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  oses the databas
23f0: 65 20 63 6c 6f 73 65 73 20 61 6e 64 20 72 65 6c  e closes and rel
2400: 65 61 73 65 73 20 61 6c 6c 20 6f 66 20 69 74 73  eases all of its
2410: 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
2420: 75 72 63 65 73 2e 0a 20 20 20 20 2f 2f 20 44 6f  urces..    // Do
2430: 20 6e 6f 74 20 63 61 6c 6c 20 6d 65 74 68 6f 64   not call method
2440: 73 20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74  s on the connect
2450: 69 6f 6e 20 61 66 74 65 72 20 69 74 20 69 73 20  ion after it is 
2460: 63 6c 6f 73 65 64 2e 20 20 49 74 20 77 69 6c 6c  closed.  It will
2470: 20 70 72 6f 62 61 62 6c 79 20 63 72 61 73 68 2e   probably crash.
2480: 0a 20 20 20 20 76 6f 69 64 20 63 6c 6f 73 65 28  .    void close(
2490: 29 20 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70  ) {.        disp
24a0: 6f 73 65 28 66 61 6c 73 65 29 3b 0a 20 20 20 20  ose(false);.    
24b0: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  }..    private v
24c0: 6f 69 64 20 6f 70 65 6e 28 29 20 7b 0a 20 20 20  oid open() {.   
24d0: 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e       mConnection
24e0: 50 74 72 20 3d 20 6e 61 74 69 76 65 4f 70 65 6e  Ptr = nativeOpen
24f0: 28 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  (mConfiguration.
2500: 70 61 74 68 2c 20 6d 43 6f 6e 66 69 67 75 72 61  path, mConfigura
2510: 74 69 6f 6e 2e 6f 70 65 6e 46 6c 61 67 73 2c 0a  tion.openFlags,.
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c  mConfiguration.l
2540: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
2550: 20 20 20 20 20 20 53 51 4c 69 74 65 44 65 62 75        SQLiteDebu
2560: 67 2e 44 45 42 55 47 5f 53 51 4c 5f 53 54 41 54  g.DEBUG_SQL_STAT
2570: 45 4d 45 4e 54 53 2c 20 53 51 4c 69 74 65 44 65  EMENTS, SQLiteDe
2580: 62 75 67 2e 44 45 42 55 47 5f 53 51 4c 5f 54 49  bug.DEBUG_SQL_TI
2590: 4d 45 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 65  ME);..        se
25a0: 74 50 61 67 65 53 69 7a 65 28 29 3b 0a 20 20 20  tPageSize();.   
25b0: 20 20 20 20 20 73 65 74 46 6f 72 65 69 67 6e 4b       setForeignK
25c0: 65 79 4d 6f 64 65 46 72 6f 6d 43 6f 6e 66 69 67  eyModeFromConfig
25d0: 75 72 61 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20  uration();.     
25e0: 20 20 20 73 65 74 4a 6f 75 72 6e 61 6c 53 69 7a     setJournalSiz
25f0: 65 4c 69 6d 69 74 28 29 3b 0a 09 73 65 74 41 75  eLimit();..setAu
2600: 74 6f 43 68 65 63 6b 70 6f 69 6e 74 49 6e 74 65  toCheckpointInte
2610: 72 76 61 6c 28 29 3b 0a 09 69 66 28 20 21 6e 61  rval();..if( !na
2620: 74 69 76 65 48 61 73 43 6f 64 65 63 28 29 20 29  tiveHasCodec() )
2630: 7b 0a 09 20 20 73 65 74 57 61 6c 4d 6f 64 65 46  {..  setWalModeF
2640: 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  romConfiguration
2650: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  ();.          se
2660: 74 4c 6f 63 61 6c 65 46 72 6f 6d 43 6f 6e 66 69  tLocaleFromConfi
2670: 67 75 72 61 74 69 6f 6e 28 29 3b 0a 09 7d 0a 0a  guration();..}..
2680: 20 20 20 20 20 20 20 20 2f 2f 20 52 65 67 69 73          // Regis
2690: 74 65 72 20 63 75 73 74 6f 6d 20 66 75 6e 63 74  ter custom funct
26a0: 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 66 69  ions..        fi
26b0: 6e 61 6c 20 69 6e 74 20 66 75 6e 63 74 69 6f 6e  nal int function
26c0: 43 6f 75 6e 74 20 3d 20 6d 43 6f 6e 66 69 67 75  Count = mConfigu
26d0: 72 61 74 69 6f 6e 2e 63 75 73 74 6f 6d 46 75 6e  ration.customFun
26e0: 63 74 69 6f 6e 73 2e 73 69 7a 65 28 29 3b 0a 20  ctions.size();. 
26f0: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
2700: 69 20 3d 20 30 3b 20 69 20 3c 20 66 75 6e 63 74  i = 0; i < funct
2710: 69 6f 6e 43 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b  ionCount; i++) {
2720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
2730: 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f  iteCustomFunctio
2740: 6e 20 66 75 6e 63 74 69 6f 6e 20 3d 20 6d 43 6f  n function = mCo
2750: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 75 73 74  nfiguration.cust
2760: 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e 67 65 74 28  omFunctions.get(
2770: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
2780: 6e 61 74 69 76 65 52 65 67 69 73 74 65 72 43 75  nativeRegisterCu
2790: 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 28 6d 43 6f  stomFunction(mCo
27a0: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 66 75 6e  nnectionPtr, fun
27b0: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
27c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69  }.    }..    pri
27d0: 76 61 74 65 20 76 6f 69 64 20 64 69 73 70 6f 73  vate void dispos
27e0: 65 28 62 6f 6f 6c 65 61 6e 20 66 69 6e 61 6c 69  e(boolean finali
27f0: 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 69  zed) {.        i
2800: 66 20 28 6d 43 6c 6f 73 65 47 75 61 72 64 20 21  f (mCloseGuard !
2810: 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  = null) {.      
2820: 20 20 20 20 20 20 69 66 20 28 66 69 6e 61 6c 69        if (finali
2830: 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  zed) {.         
2840: 20 20 20 20 20 20 20 6d 43 6c 6f 73 65 47 75 61         mCloseGua
2850: 72 64 2e 77 61 72 6e 49 66 4f 70 65 6e 28 29 3b  rd.warnIfOpen();
2860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2870: 20 20 20 20 20 20 20 20 20 20 20 6d 43 6c 6f 73             mClos
2880: 65 47 75 61 72 64 2e 63 6c 6f 73 65 28 29 3b 0a  eGuard.close();.
2890: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
28a0: 20 20 20 69 66 20 28 6d 43 6f 6e 6e 65 63 74 69     if (mConnecti
28b0: 6f 6e 50 74 72 20 21 3d 20 30 29 20 7b 0a 20 20  onPtr != 0) {.  
28c0: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20            final 
28d0: 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65  int cookie = mRe
28e0: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62  centOperations.b
28f0: 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22 63  eginOperation("c
2900: 6c 6f 73 65 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  lose", null, nul
2910: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
2920: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
2930: 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64 53        mPreparedS
2940: 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 65 76  tatementCache.ev
2950: 69 63 74 41 6c 6c 28 29 3b 0a 20 20 20 20 20 20  ictAll();.      
2960: 20 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65            native
2970: 43 6c 6f 73 65 28 6d 43 6f 6e 6e 65 63 74 69 6f  Close(mConnectio
2980: 6e 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  nPtr);.         
2990: 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69         mConnecti
29a0: 6f 6e 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  onPtr = 0;.     
29b0: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
29c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
29d0: 20 20 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74     mRecentOperat
29e0: 69 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f  ions.endOperatio
29f0: 6e 28 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20  n(cookie);.     
2a00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a10: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
2a20: 69 76 61 74 65 20 76 6f 69 64 20 73 65 74 50 61  ivate void setPa
2a30: 67 65 53 69 7a 65 28 29 20 7b 0a 20 20 20 20 20  geSize() {.     
2a40: 20 20 20 69 66 20 28 21 6d 43 6f 6e 66 69 67 75     if (!mConfigu
2a50: 72 61 74 69 6f 6e 2e 69 73 49 6e 4d 65 6d 6f 72  ration.isInMemor
2a60: 79 44 62 28 29 20 26 26 20 21 6d 49 73 52 65 61  yDb() && !mIsRea
2a70: 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e 29  dOnlyConnection)
2a80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
2a90: 69 6e 61 6c 20 6c 6f 6e 67 20 6e 65 77 56 61 6c  inal long newVal
2aa0: 75 65 20 3d 20 53 51 4c 69 74 65 47 6c 6f 62 61  ue = SQLiteGloba
2ab0: 6c 2e 67 65 74 44 65 66 61 75 6c 74 50 61 67 65  l.getDefaultPage
2ac0: 53 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20  Size();.        
2ad0: 20 20 20 20 6c 6f 6e 67 20 76 61 6c 75 65 20 3d      long value =
2ae0: 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28   executeForLong(
2af0: 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
2b00: 65 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  e", null, null);
2b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2b20: 28 76 61 6c 75 65 20 21 3d 20 6e 65 77 56 61 6c  (value != newVal
2b30: 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ue) {.          
2b40: 20 20 20 20 20 20 65 78 65 63 75 74 65 28 22 50        execute("P
2b50: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d  RAGMA page_size=
2b60: 22 20 2b 20 6e 65 77 56 61 6c 75 65 2c 20 6e 75  " + newValue, nu
2b70: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
2b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b90: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
2ba0: 69 76 61 74 65 20 76 6f 69 64 20 73 65 74 41 75  ivate void setAu
2bb0: 74 6f 43 68 65 63 6b 70 6f 69 6e 74 49 6e 74 65  toCheckpointInte
2bc0: 72 76 61 6c 28 29 20 7b 0a 20 20 20 20 20 20 20  rval() {.       
2bd0: 20 69 66 20 28 21 6d 43 6f 6e 66 69 67 75 72 61   if (!mConfigura
2be0: 74 69 6f 6e 2e 69 73 49 6e 4d 65 6d 6f 72 79 44  tion.isInMemoryD
2bf0: 62 28 29 20 26 26 20 21 6d 49 73 52 65 61 64 4f  b() && !mIsReadO
2c00: 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 20 7b  nlyConnection) {
2c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e  .            fin
2c20: 61 6c 20 6c 6f 6e 67 20 6e 65 77 56 61 6c 75 65  al long newValue
2c30: 20 3d 20 53 51 4c 69 74 65 47 6c 6f 62 61 6c 2e   = SQLiteGlobal.
2c40: 67 65 74 57 41 4c 41 75 74 6f 43 68 65 63 6b 70  getWALAutoCheckp
2c50: 6f 69 6e 74 28 29 3b 0a 20 20 20 20 20 20 20 20  oint();.        
2c60: 20 20 20 20 6c 6f 6e 67 20 76 61 6c 75 65 20 3d      long value =
2c70: 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28   executeForLong(
2c80: 22 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f  "PRAGMA wal_auto
2c90: 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 6e 75 6c  checkpoint", nul
2ca0: 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  l, null);.      
2cb0: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
2cc0: 21 3d 20 6e 65 77 56 61 6c 75 65 29 20 7b 0a 20  != newValue) {. 
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2ce0: 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 22 50  xecuteForLong("P
2cf0: 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68  RAGMA wal_autoch
2d00: 65 63 6b 70 6f 69 6e 74 3d 22 20 2b 20 6e 65 77  eckpoint=" + new
2d10: 56 61 6c 75 65 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  Value, null, nul
2d20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
2d30: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d40: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  }..    private v
2d50: 6f 69 64 20 73 65 74 4a 6f 75 72 6e 61 6c 53 69  oid setJournalSi
2d60: 7a 65 4c 69 6d 69 74 28 29 20 7b 0a 20 20 20 20  zeLimit() {.    
2d70: 20 20 20 20 69 66 20 28 21 6d 43 6f 6e 66 69 67      if (!mConfig
2d80: 75 72 61 74 69 6f 6e 2e 69 73 49 6e 4d 65 6d 6f  uration.isInMemo
2d90: 72 79 44 62 28 29 20 26 26 20 21 6d 49 73 52 65  ryDb() && !mIsRe
2da0: 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e  adOnlyConnection
2db0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2dc0: 66 69 6e 61 6c 20 6c 6f 6e 67 20 6e 65 77 56 61  final long newVa
2dd0: 6c 75 65 20 3d 20 53 51 4c 69 74 65 47 6c 6f 62  lue = SQLiteGlob
2de0: 61 6c 2e 67 65 74 4a 6f 75 72 6e 61 6c 53 69 7a  al.getJournalSiz
2df0: 65 4c 69 6d 69 74 28 29 3b 0a 20 20 20 20 20 20  eLimit();.      
2e00: 20 20 20 20 20 20 6c 6f 6e 67 20 76 61 6c 75 65        long value
2e10: 20 3d 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e   = executeForLon
2e20: 67 28 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  g("PRAGMA journa
2e30: 6c 5f 73 69 7a 65 5f 6c 69 6d 69 74 22 2c 20 6e  l_size_limit", n
2e40: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
2e50: 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75          if (valu
2e60: 65 20 21 3d 20 6e 65 77 56 61 6c 75 65 29 20 7b  e != newValue) {
2e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e80: 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28   executeForLong(
2e90: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
2ea0: 73 69 7a 65 5f 6c 69 6d 69 74 3d 22 20 2b 20 6e  size_limit=" + n
2eb0: 65 77 56 61 6c 75 65 2c 20 6e 75 6c 6c 2c 20 6e  ewValue, null, n
2ec0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
2ed0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ee0: 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65    }..    private
2ef0: 20 76 6f 69 64 20 73 65 74 46 6f 72 65 69 67 6e   void setForeign
2f00: 4b 65 79 4d 6f 64 65 46 72 6f 6d 43 6f 6e 66 69  KeyModeFromConfi
2f10: 67 75 72 61 74 69 6f 6e 28 29 20 7b 0a 20 20 20  guration() {.   
2f20: 20 20 20 20 20 69 66 20 28 21 6d 49 73 52 65 61       if (!mIsRea
2f30: 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e 29  dOnlyConnection)
2f40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
2f50: 69 6e 61 6c 20 6c 6f 6e 67 20 6e 65 77 56 61 6c  inal long newVal
2f60: 75 65 20 3d 20 6d 43 6f 6e 66 69 67 75 72 61 74  ue = mConfigurat
2f70: 69 6f 6e 2e 66 6f 72 65 69 67 6e 4b 65 79 43 6f  ion.foreignKeyCo
2f80: 6e 73 74 72 61 69 6e 74 73 45 6e 61 62 6c 65 64  nstraintsEnabled
2f90: 20 3f 20 31 20 3a 20 30 3b 0a 20 20 20 20 20 20   ? 1 : 0;.      
2fa0: 20 20 20 20 20 20 6c 6f 6e 67 20 76 61 6c 75 65        long value
2fb0: 20 3d 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e   = executeForLon
2fc0: 67 28 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  g("PRAGMA foreig
2fd0: 6e 5f 6b 65 79 73 22 2c 20 6e 75 6c 6c 2c 20 6e  n_keys", null, n
2fe0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
2ff0: 20 20 69 66 20 28 76 61 6c 75 65 20 21 3d 20 6e    if (value != n
3000: 65 77 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 20  ewValue) {.     
3010: 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75             execu
3020: 74 65 28 22 50 52 41 47 4d 41 20 66 6f 72 65 69  te("PRAGMA forei
3030: 67 6e 5f 6b 65 79 73 3d 22 20 2b 20 6e 65 77 56  gn_keys=" + newV
3040: 61 6c 75 65 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  alue, null, null
3050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
3060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
3070: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  ..    private vo
3080: 69 64 20 73 65 74 57 61 6c 4d 6f 64 65 46 72 6f  id setWalModeFro
3090: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29  mConfiguration()
30a0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21   {.        if (!
30b0: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 69  mConfiguration.i
30c0: 73 49 6e 4d 65 6d 6f 72 79 44 62 28 29 20 26 26  sInMemoryDb() &&
30d0: 20 21 6d 49 73 52 65 61 64 4f 6e 6c 79 43 6f 6e   !mIsReadOnlyCon
30e0: 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20  nection) {.     
30f0: 20 20 20 20 20 20 20 69 66 20 28 28 6d 43 6f 6e         if ((mCon
3100: 66 69 67 75 72 61 74 69 6f 6e 2e 6f 70 65 6e 46  figuration.openF
3110: 6c 61 67 73 20 26 20 53 51 4c 69 74 65 44 61 74  lags & SQLiteDat
3120: 61 62 61 73 65 2e 45 4e 41 42 4c 45 5f 57 52 49  abase.ENABLE_WRI
3130: 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47 49 4e 47  TE_AHEAD_LOGGING
3140: 29 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  ) != 0) {.      
3150: 20 20 20 20 20 20 20 20 20 20 73 65 74 4a 6f 75            setJou
3160: 72 6e 61 6c 4d 6f 64 65 28 22 57 41 4c 22 29 3b  rnalMode("WAL");
3170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3180: 20 73 65 74 53 79 6e 63 4d 6f 64 65 28 53 51 4c   setSyncMode(SQL
3190: 69 74 65 47 6c 6f 62 61 6c 2e 67 65 74 57 41 4c  iteGlobal.getWAL
31a0: 53 79 6e 63 4d 6f 64 65 28 29 29 3b 0a 20 20 20  SyncMode());.   
31b0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
31c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31d0: 20 20 73 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65    setJournalMode
31e0: 28 53 51 4c 69 74 65 47 6c 6f 62 61 6c 2e 67 65  (SQLiteGlobal.ge
31f0: 74 44 65 66 61 75 6c 74 4a 6f 75 72 6e 61 6c 4d  tDefaultJournalM
3200: 6f 64 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ode());.        
3210: 20 20 20 20 20 20 20 20 73 65 74 53 79 6e 63 4d          setSyncM
3220: 6f 64 65 28 53 51 4c 69 74 65 47 6c 6f 62 61 6c  ode(SQLiteGlobal
3230: 2e 67 65 74 44 65 66 61 75 6c 74 53 79 6e 63 4d  .getDefaultSyncM
3240: 6f 64 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ode());.        
3250: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3260: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
3270: 74 65 20 76 6f 69 64 20 73 65 74 53 79 6e 63 4d  te void setSyncM
3280: 6f 64 65 28 53 74 72 69 6e 67 20 6e 65 77 56 61  ode(String newVa
3290: 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 53  lue) {.        S
32a0: 74 72 69 6e 67 20 76 61 6c 75 65 20 3d 20 65 78  tring value = ex
32b0: 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67 28 22  ecuteForString("
32c0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
32d0: 75 73 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29  us", null, null)
32e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 63  ;.        if (!c
32f0: 61 6e 6f 6e 69 63 61 6c 69 7a 65 53 79 6e 63 4d  anonicalizeSyncM
3300: 6f 64 65 28 76 61 6c 75 65 29 2e 65 71 75 61 6c  ode(value).equal
3310: 73 49 67 6e 6f 72 65 43 61 73 65 28 0a 20 20 20  sIgnoreCase(.   
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6e               can
3330: 6f 6e 69 63 61 6c 69 7a 65 53 79 6e 63 4d 6f 64  onicalizeSyncMod
3340: 65 28 6e 65 77 56 61 6c 75 65 29 29 29 20 7b 0a  e(newValue))) {.
3350: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63              exec
3360: 75 74 65 28 22 50 52 41 47 4d 41 20 73 79 6e 63  ute("PRAGMA sync
3370: 68 72 6f 6e 6f 75 73 3d 22 20 2b 20 6e 65 77 56  hronous=" + newV
3380: 61 6c 75 65 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  alue, null, null
3390: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33a0: 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20   }..    private 
33b0: 73 74 61 74 69 63 20 53 74 72 69 6e 67 20 63 61  static String ca
33c0: 6e 6f 6e 69 63 61 6c 69 7a 65 53 79 6e 63 4d 6f  nonicalizeSyncMo
33d0: 64 65 28 53 74 72 69 6e 67 20 76 61 6c 75 65 29  de(String value)
33e0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 76   {.        if (v
33f0: 61 6c 75 65 2e 65 71 75 61 6c 73 28 22 30 22 29  alue.equals("0")
3400: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3410: 72 65 74 75 72 6e 20 22 4f 46 46 22 3b 0a 20 20  return "OFF";.  
3420: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
3430: 28 76 61 6c 75 65 2e 65 71 75 61 6c 73 28 22 31  (value.equals("1
3440: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
3450: 20 20 72 65 74 75 72 6e 20 22 4e 4f 52 4d 41 4c    return "NORMAL
3460: 22 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ";.        } els
3470: 65 20 69 66 20 28 76 61 6c 75 65 2e 65 71 75 61  e if (value.equa
3480: 6c 73 28 22 32 22 29 29 20 7b 0a 20 20 20 20 20  ls("2")) {.     
3490: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 46         return "F
34a0: 55 4c 4c 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ULL";.        }.
34b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 76          return v
34c0: 61 6c 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  alue;.    }..   
34d0: 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 73 65   private void se
34e0: 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 53 74 72  tJournalMode(Str
34f0: 69 6e 67 20 6e 65 77 56 61 6c 75 65 29 20 7b 0a  ing newValue) {.
3500: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 76          String v
3510: 61 6c 75 65 20 3d 20 65 78 65 63 75 74 65 46 6f  alue = executeFo
3520: 72 53 74 72 69 6e 67 28 22 50 52 41 47 4d 41 20  rString("PRAGMA 
3530: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 6e  journal_mode", n
3540: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
3550: 20 20 20 20 69 66 20 28 21 76 61 6c 75 65 2e 65      if (!value.e
3560: 71 75 61 6c 73 49 67 6e 6f 72 65 43 61 73 65 28  qualsIgnoreCase(
3570: 6e 65 77 56 61 6c 75 65 29 29 20 7b 0a 20 20 20  newValue)) {.   
3580: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
35a0: 74 72 69 6e 67 20 72 65 73 75 6c 74 20 3d 20 65  tring result = e
35b0: 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67 28  xecuteForString(
35c0: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
35d0: 6d 6f 64 65 3d 22 20 2b 20 6e 65 77 56 61 6c 75  mode=" + newValu
35e0: 65 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a  e, null, null);.
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 69 66 20 28 72 65 73 75 6c 74 2e 65 71 75 61 6c  if (result.equal
3610: 73 49 67 6e 6f 72 65 43 61 73 65 28 6e 65 77 56  sIgnoreCase(newV
3620: 61 6c 75 65 29 29 20 7b 0a 20 20 20 20 20 20 20  alue)) {.       
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
3640: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  urn;.           
3650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3660: 20 20 20 20 20 20 20 2f 2f 20 50 52 41 47 4d 41         // PRAGMA
3670: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 69   journal_mode si
3680: 6c 65 6e 74 6c 79 20 66 61 69 6c 73 20 61 6e 64  lently fails and
3690: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6f 72 69   returns the ori
36a0: 67 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 0a 20 20  ginal journal.  
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
36c0: 20 6d 6f 64 65 20 69 6e 20 73 6f 6d 65 20 63 61   mode in some ca
36d0: 73 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ses if the journ
36e0: 61 6c 20 6d 6f 64 65 20 63 6f 75 6c 64 20 6e 6f  al mode could no
36f0: 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  t be changed..  
3700: 20 20 20 20 20 20 20 20 20 20 7d 20 63 61 74 63            } catc
3710: 68 20 28 53 51 4c 69 74 65 44 61 74 61 62 61 73  h (SQLiteDatabas
3720: 65 4c 6f 63 6b 65 64 45 78 63 65 70 74 69 6f 6e  eLockedException
3730: 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
3740: 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20 65         // This e
3750: 72 72 6f 72 20 28 53 51 4c 49 54 45 5f 42 55 53  rror (SQLITE_BUS
3760: 59 29 20 6f 63 63 75 72 73 20 69 66 20 6f 6e 65  Y) occurs if one
3770: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
3780: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
37a0: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
37b0: 20 61 6e 64 20 61 6e 6f 74 68 65 72 20 74 72 69   and another tri
37c0: 65 73 20 74 6f 20 63 68 61 6e 67 65 20 69 74 20  es to change it 
37d0: 74 6f 20 6e 6f 6e 2d 57 41 4c 2e 0a 20 20 20 20  to non-WAL..    
37e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37f0: 20 20 20 20 20 20 2f 2f 20 42 65 63 61 75 73 65        // Because
3800: 20 77 65 20 61 6c 77 61 79 73 20 64 69 73 61 62   we always disab
3810: 6c 65 20 57 41 4c 20 6d 6f 64 65 20 77 68 65 6e  le WAL mode when
3820: 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 66   a database is f
3830: 69 72 73 74 20 6f 70 65 6e 65 64 0a 20 20 20 20  irst opened.    
3840: 20 20 20 20 20 20 20 20 2f 2f 20 28 65 76 65 6e          // (even
3850: 20 69 66 20 77 65 20 69 6e 74 65 6e 64 20 74 6f   if we intend to
3860: 20 72 65 2d 65 6e 61 62 6c 65 20 69 74 29 2c 20   re-enable it), 
3870: 77 65 20 63 61 6e 20 65 6e 63 6f 75 6e 74 65 72  we can encounter
3880: 20 70 72 6f 62 6c 65 6d 73 20 69 66 0a 20 20 20   problems if.   
3890: 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68 65 72           // ther
38a0: 65 20 69 73 20 61 6e 6f 74 68 65 72 20 6f 70 65  e is another ope
38b0: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  n connection to 
38c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 6d  the database som
38d0: 65 77 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20  ewhere..        
38e0: 20 20 20 20 2f 2f 20 54 68 69 73 20 63 61 6e 20      // This can 
38f0: 68 61 70 70 65 6e 20 66 6f 72 20 61 20 76 61 72  happen for a var
3900: 69 65 74 79 20 6f 66 20 72 65 61 73 6f 6e 73 20  iety of reasons 
3910: 73 75 63 68 20 61 73 20 61 6e 20 61 70 70 6c 69  such as an appli
3920: 63 61 74 69 6f 6e 20 6f 70 65 6e 69 6e 67 0a 20  cation opening. 
3930: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68             // th
3940: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
3950: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 72 6f 63  in multiple proc
3960: 65 73 73 65 73 20 61 74 20 74 68 65 20 73 61 6d  esses at the sam
3970: 65 20 74 69 6d 65 20 6f 72 20 69 66 20 74 68 65  e time or if the
3980: 72 65 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  re is a.        
3990: 20 20 20 20 2f 2f 20 63 72 61 73 68 69 6e 67 20      // crashing 
39a0: 63 6f 6e 74 65 6e 74 20 70 72 6f 76 69 64 65 72  content provider
39b0: 20 73 65 72 76 69 63 65 20 74 68 61 74 20 74 68   service that th
39c0: 65 20 41 63 74 69 76 69 74 79 4d 61 6e 61 67 65  e ActivityManage
39d0: 72 20 68 61 73 0a 20 20 20 20 20 20 20 20 20 20  r has.          
39e0: 20 20 2f 2f 20 72 65 6d 6f 76 65 64 20 66 72 6f    // removed fro
39f0: 6d 20 69 74 73 20 72 65 67 69 73 74 72 79 20 62  m its registry b
3a00: 75 74 20 77 68 6f 73 65 20 70 72 6f 63 65 73 73  ut whose process
3a10: 20 68 61 73 6e 27 74 20 71 75 69 74 65 20 64 69   hasn't quite di
3a20: 65 64 20 79 65 74 0a 20 20 20 20 20 20 20 20 20  ed yet.         
3a30: 20 20 20 2f 2f 20 62 79 20 74 68 65 20 74 69 6d     // by the tim
3a40: 65 20 69 74 20 69 73 20 72 65 73 74 61 72 74 65  e it is restarte
3a50: 64 20 69 6e 20 61 20 6e 65 77 20 70 72 6f 63 65  d in a new proce
3a60: 73 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss..            
3a70: 2f 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  //.            /
3a80: 2f 20 49 66 20 77 65 20 64 6f 6e 27 74 20 63 68  / If we don't ch
3a90: 61 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ange the journal
3aa0: 20 6d 6f 64 65 2c 20 6e 6f 74 68 69 6e 67 20 72   mode, nothing r
3ab0: 65 61 6c 6c 79 20 62 61 64 20 68 61 70 70 65 6e  eally bad happen
3ac0: 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  s..            /
3ad0: 2f 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20 63  / In the worst c
3ae0: 61 73 65 2c 20 61 6e 20 61 70 70 6c 69 63 61 74  ase, an applicat
3af0: 69 6f 6e 20 74 68 61 74 20 65 6e 61 62 6c 65 73  ion that enables
3b00: 20 57 41 4c 20 6d 69 67 68 74 20 6e 6f 74 20 61   WAL might not a
3b10: 63 74 75 61 6c 6c 79 0a 20 20 20 20 20 20 20 20  ctually.        
3b20: 20 20 20 20 2f 2f 20 67 65 74 20 69 74 2c 20 61      // get it, a
3b30: 6c 74 68 6f 75 67 68 20 69 74 20 63 61 6e 20 73  lthough it can s
3b40: 74 69 6c 6c 20 75 73 65 20 63 6f 6e 6e 65 63 74  till use connect
3b50: 69 6f 6e 20 70 6f 6f 6c 69 6e 67 2e 0a 20 20 20  ion pooling..   
3b60: 20 20 20 20 20 20 20 20 20 4c 6f 67 2e 77 28 54           Log.w(T
3b70: 41 47 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 63  AG, "Could not c
3b80: 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
3b90: 73 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  se journal mode 
3ba0: 6f 66 20 27 22 0a 20 20 20 20 20 20 20 20 20 20  of '".          
3bb0: 20 20 20 20 20 20 20 20 20 20 2b 20 6d 43 6f 6e            + mCon
3bc0: 66 69 67 75 72 61 74 69 6f 6e 2e 6c 61 62 65 6c  figuration.label
3bd0: 20 2b 20 22 27 20 66 72 6f 6d 20 27 22 20 2b 20   + "' from '" + 
3be0: 76 61 6c 75 65 20 2b 20 22 27 20 74 6f 20 27 22  value + "' to '"
3bf0: 20 2b 20 6e 65 77 56 61 6c 75 65 0a 20 20 20 20   + newValue.    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 2b 20 22 27 20 62 65 63 61 75 73 65 20 74 68 65  + "' because the
3c20: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
3c30: 6b 65 64 2e 20 20 54 68 69 73 20 75 73 75 61 6c  ked.  This usual
3c40: 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 22 0a  ly means that ".
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 2b 20 22 74 68 65 72 65 20 61 72 65      + "there are
3c70: 20 6f 74 68 65 72 20 6f 70 65 6e 20 63 6f 6e 6e   other open conn
3c80: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 64  ections to the d
3c90: 61 74 61 62 61 73 65 20 77 68 69 63 68 20 70 72  atabase which pr
3ca0: 65 76 65 6e 74 73 20 22 0a 20 20 20 20 20 20 20  events ".       
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22               + "
3cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f  the database fro
3cd0: 6d 20 65 6e 61 62 6c 69 6e 67 20 6f 72 20 64 69  m enabling or di
3ce0: 73 61 62 6c 69 6e 67 20 77 72 69 74 65 2d 61 68  sabling write-ah
3cf0: 65 61 64 20 6c 6f 67 67 69 6e 67 20 6d 6f 64 65  ead logging mode
3d00: 2e 20 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  .  ".           
3d10: 20 20 20 20 20 20 20 20 20 2b 20 22 50 72 6f 63           + "Proc
3d20: 65 65 64 69 6e 67 20 77 69 74 68 6f 75 74 20 63  eeding without c
3d30: 68 61 6e 67 69 6e 67 20 74 68 65 20 6a 6f 75 72  hanging the jour
3d40: 6e 61 6c 20 6d 6f 64 65 2e 22 29 3b 0a 20 20 20  nal mode.");.   
3d50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3d60: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 73    private void s
3d70: 65 74 4c 6f 63 61 6c 65 46 72 6f 6d 43 6f 6e 66  etLocaleFromConf
3d80: 69 67 75 72 61 74 69 6f 6e 28 29 20 7b 0a 20 20  iguration() {.  
3d90: 20 20 20 20 20 20 69 66 20 28 28 6d 43 6f 6e 66        if ((mConf
3da0: 69 67 75 72 61 74 69 6f 6e 2e 6f 70 65 6e 46 6c  iguration.openFl
3db0: 61 67 73 20 26 20 53 51 4c 69 74 65 44 61 74 61  ags & SQLiteData
3dc0: 62 61 73 65 2e 4e 4f 5f 4c 4f 43 41 4c 49 5a 45  base.NO_LOCALIZE
3dd0: 44 5f 43 4f 4c 4c 41 54 4f 52 53 29 20 21 3d 20  D_COLLATORS) != 
3de0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
3df0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
3e00: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 52   }..        // R
3e10: 65 67 69 73 74 65 72 20 74 68 65 20 6c 6f 63 61  egister the loca
3e20: 6c 69 7a 65 64 20 63 6f 6c 6c 61 74 6f 72 73 2e  lized collators.
3e30: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 53  .        final S
3e40: 74 72 69 6e 67 20 6e 65 77 4c 6f 63 61 6c 65 20  tring newLocale 
3e50: 3d 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  = mConfiguration
3e60: 2e 6c 6f 63 61 6c 65 2e 74 6f 53 74 72 69 6e 67  .locale.toString
3e70: 28 29 3b 0a 20 20 20 20 20 20 20 20 6e 61 74 69  ();.        nati
3e80: 76 65 52 65 67 69 73 74 65 72 4c 6f 63 61 6c 69  veRegisterLocali
3e90: 7a 65 64 43 6f 6c 6c 61 74 6f 72 73 28 6d 43 6f  zedCollators(mCo
3ea0: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 6e 65 77  nnectionPtr, new
3eb0: 4c 6f 63 61 6c 65 29 3b 0a 0a 20 20 20 20 20 20  Locale);..      
3ec0: 20 20 2f 2f 20 49 66 20 74 68 65 20 64 61 74 61    // If the data
3ed0: 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
3ee0: 79 2c 20 77 65 20 63 61 6e 6e 6f 74 20 6d 6f 64  y, we cannot mod
3ef0: 69 66 79 20 74 68 65 20 61 6e 64 72 6f 69 64 20  ify the android 
3f00: 6d 65 74 61 64 61 74 61 20 74 61 62 6c 65 0a 20  metadata table. 
3f10: 20 20 20 20 20 20 20 2f 2f 20 6f 72 20 65 78 69         // or exi
3f20: 73 74 69 6e 67 20 69 6e 64 65 78 65 73 2e 0a 20  sting indexes.. 
3f30: 20 20 20 20 20 20 20 69 66 20 28 6d 49 73 52 65         if (mIsRe
3f40: 61 64 4f 6e 6c 79 43 6f 6e 6e 65 63 74 69 6f 6e  adOnlyConnection
3f50: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3f60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
3f70: 7d 0a 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  }..        try {
3f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
3f90: 45 6e 73 75 72 65 20 74 68 65 20 61 6e 64 72 6f  Ensure the andro
3fa0: 69 64 20 6d 65 74 61 64 61 74 61 20 74 61 62 6c  id metadata tabl
3fb0: 65 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  e exists..      
3fc0: 20 20 20 20 20 20 65 78 65 63 75 74 65 28 22 43        execute("C
3fd0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
3fe0: 4f 54 20 45 58 49 53 54 53 20 61 6e 64 72 6f 69  OT EXISTS androi
3ff0: 64 5f 6d 65 74 61 64 61 74 61 20 28 6c 6f 63 61  d_metadata (loca
4000: 6c 65 20 54 45 58 54 29 22 2c 20 6e 75 6c 6c 2c  le TEXT)", null,
4010: 20 6e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 20   null);..       
4020: 20 20 20 20 20 2f 2f 20 43 68 65 63 6b 20 77 68       // Check wh
4030: 65 74 68 65 72 20 74 68 65 20 6c 6f 63 61 6c 65  ether the locale
4040: 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 63 68   was actually ch
4050: 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 20 20  anged..         
4060: 20 20 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 20     final String 
4070: 6f 6c 64 4c 6f 63 61 6c 65 20 3d 20 65 78 65 63  oldLocale = exec
4080: 75 74 65 46 6f 72 53 74 72 69 6e 67 28 22 53 45  uteForString("SE
4090: 4c 45 43 54 20 6c 6f 63 61 6c 65 20 46 52 4f 4d  LECT locale FROM
40a0: 20 61 6e 64 72 6f 69 64 5f 6d 65 74 61 64 61 74   android_metadat
40b0: 61 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  a ".            
40c0: 20 20 20 20 20 20 20 20 2b 20 22 55 4e 49 4f 4e          + "UNION
40d0: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4f 52 44   SELECT NULL ORD
40e0: 45 52 20 42 59 20 6c 6f 63 61 6c 65 20 44 45 53  ER BY locale DES
40f0: 43 20 4c 49 4d 49 54 20 31 22 2c 20 6e 75 6c 6c  C LIMIT 1", null
4100: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
4110: 20 20 20 20 20 69 66 20 28 6f 6c 64 4c 6f 63 61       if (oldLoca
4120: 6c 65 20 21 3d 20 6e 75 6c 6c 20 26 26 20 6f 6c  le != null && ol
4130: 64 4c 6f 63 61 6c 65 2e 65 71 75 61 6c 73 28 6e  dLocale.equals(n
4140: 65 77 4c 6f 63 61 6c 65 29 29 20 7b 0a 20 20 20  ewLocale)) {.   
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
4160: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  urn;.           
4170: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4180: 2f 2f 20 47 6f 20 61 68 65 61 64 20 61 6e 64 20  // Go ahead and 
4190: 75 70 64 61 74 65 20 74 68 65 20 69 6e 64 65 78  update the index
41a0: 65 73 20 75 73 69 6e 67 20 74 68 65 20 6e 65 77  es using the new
41b0: 20 6c 6f 63 61 6c 65 2e 0a 20 20 20 20 20 20 20   locale..       
41c0: 20 20 20 20 20 65 78 65 63 75 74 65 28 22 42 45       execute("BE
41d0: 47 49 4e 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  GIN", null, null
41e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
41f0: 6f 6f 6c 65 61 6e 20 73 75 63 63 65 73 73 20 3d  oolean success =
4200: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
4210: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
4220: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 75 74            execut
4230: 65 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 61  e("DELETE FROM a
4240: 6e 64 72 6f 69 64 5f 6d 65 74 61 64 61 74 61 22  ndroid_metadata"
4250: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20  , null, null);. 
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
4270: 78 65 63 75 74 65 28 22 49 4e 53 45 52 54 20 49  xecute("INSERT I
4280: 4e 54 4f 20 61 6e 64 72 6f 69 64 5f 6d 65 74 61  NTO android_meta
4290: 64 61 74 61 20 28 6c 6f 63 61 6c 65 29 20 56 41  data (locale) VA
42a0: 4c 55 45 53 28 3f 29 22 2c 0a 20 20 20 20 20 20  LUES(?)",.      
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 6e 65 77 20 4f 62 6a 65 63 74 5b 5d 20 7b    new Object[] {
42d0: 20 6e 65 77 4c 6f 63 61 6c 65 20 7d 2c 20 6e 75   newLocale }, nu
42e0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ll);.           
42f0: 20 20 20 20 20 65 78 65 63 75 74 65 28 22 52 45       execute("RE
4300: 49 4e 44 45 58 20 4c 4f 43 41 4c 49 5a 45 44 22  INDEX LOCALIZED"
4310: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20  , null, null);. 
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4330: 75 63 63 65 73 73 20 3d 20 74 72 75 65 3b 0a 20  uccess = true;. 
4340: 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e             } fin
4350: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
4360: 20 20 20 20 20 20 20 65 78 65 63 75 74 65 28 73         execute(s
4370: 75 63 63 65 73 73 20 3f 20 22 43 4f 4d 4d 49 54  uccess ? "COMMIT
4380: 22 20 3a 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  " : "ROLLBACK", 
4390: 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  null, null);.   
43a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
43b0: 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74     } catch (Runt
43c0: 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29  imeException ex)
43d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
43e0: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 45  hrow new SQLiteE
43f0: 78 63 65 70 74 69 6f 6e 28 22 46 61 69 6c 65 64  xception("Failed
4400: 20 74 6f 20 63 68 61 6e 67 65 20 6c 6f 63 61 6c   to change local
4410: 65 20 66 6f 72 20 64 62 20 27 22 20 2b 20 6d 43  e for db '" + mC
4420: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 61 62  onfiguration.lab
4430: 65 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  el.             
4440: 20 20 20 20 20 20 20 2b 20 22 27 20 74 6f 20 27         + "' to '
4450: 22 20 2b 20 6e 65 77 4c 6f 63 61 6c 65 20 2b 20  " + newLocale + 
4460: 22 27 2e 22 2c 20 65 78 29 3b 0a 20 20 20 20 20  "'.", ex);.     
4470: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
4480: 70 75 62 6c 69 63 20 76 6f 69 64 20 65 6e 61 62  public void enab
4490: 6c 65 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61  leLocalizedColla
44a0: 74 6f 72 73 28 29 7b 0a 20 20 20 20 20 20 69 66  tors(){.      if
44b0: 28 20 6e 61 74 69 76 65 48 61 73 43 6f 64 65 63  ( nativeHasCodec
44c0: 28 29 20 29 7b 0a 09 73 65 74 4c 6f 63 61 6c 65  () ){..setLocale
44d0: 46 72 6f 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f  FromConfiguratio
44e0: 6e 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n();.      }.   
44f0: 20 7d 0a 0a 20 20 20 20 2f 2f 20 43 61 6c 6c 65   }..    // Calle
4500: 64 20 62 79 20 53 51 4c 69 74 65 43 6f 6e 6e 65  d by SQLiteConne
4510: 63 74 69 6f 6e 50 6f 6f 6c 20 6f 6e 6c 79 2e 0a  ctionPool only..
4520: 20 20 20 20 76 6f 69 64 20 72 65 63 6f 6e 66 69      void reconfi
4530: 67 75 72 65 28 53 51 4c 69 74 65 44 61 74 61 62  gure(SQLiteDatab
4540: 61 73 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  aseConfiguration
4550: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 20   configuration) 
4560: 7b 0a 20 20 20 20 20 20 20 20 6d 4f 6e 6c 79 41  {.        mOnlyA
4570: 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79 4f 70 65 72  llowReadOnlyOper
4580: 61 74 69 6f 6e 73 20 3d 20 66 61 6c 73 65 3b 0a  ations = false;.
4590: 0a 20 20 20 20 20 20 20 20 2f 2f 20 52 65 67 69  .        // Regi
45a0: 73 74 65 72 20 63 75 73 74 6f 6d 20 66 75 6e 63  ster custom func
45b0: 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 66  tions..        f
45c0: 69 6e 61 6c 20 69 6e 74 20 66 75 6e 63 74 69 6f  inal int functio
45d0: 6e 43 6f 75 6e 74 20 3d 20 63 6f 6e 66 69 67 75  nCount = configu
45e0: 72 61 74 69 6f 6e 2e 63 75 73 74 6f 6d 46 75 6e  ration.customFun
45f0: 63 74 69 6f 6e 73 2e 73 69 7a 65 28 29 3b 0a 20  ctions.size();. 
4600: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
4610: 69 20 3d 20 30 3b 20 69 20 3c 20 66 75 6e 63 74  i = 0; i < funct
4620: 69 6f 6e 43 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b  ionCount; i++) {
4630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
4640: 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f  iteCustomFunctio
4650: 6e 20 66 75 6e 63 74 69 6f 6e 20 3d 20 63 6f 6e  n function = con
4660: 66 69 67 75 72 61 74 69 6f 6e 2e 63 75 73 74 6f  figuration.custo
4670: 6d 46 75 6e 63 74 69 6f 6e 73 2e 67 65 74 28 69  mFunctions.get(i
4680: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
4690: 66 20 28 21 6d 43 6f 6e 66 69 67 75 72 61 74 69  f (!mConfigurati
46a0: 6f 6e 2e 63 75 73 74 6f 6d 46 75 6e 63 74 69 6f  on.customFunctio
46b0: 6e 73 2e 63 6f 6e 74 61 69 6e 73 28 66 75 6e 63  ns.contains(func
46c0: 74 69 6f 6e 29 29 20 7b 0a 20 20 20 20 20 20 20  tion)) {.       
46d0: 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 52           nativeR
46e0: 65 67 69 73 74 65 72 43 75 73 74 6f 6d 46 75 6e  egisterCustomFun
46f0: 63 74 69 6f 6e 28 6d 43 6f 6e 6e 65 63 74 69 6f  ction(mConnectio
4700: 6e 50 74 72 2c 20 66 75 6e 63 74 69 6f 6e 29 3b  nPtr, function);
4710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
4720: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
4730: 20 20 2f 2f 20 52 65 6d 65 6d 62 65 72 20 77 68    // Remember wh
4740: 61 74 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  at changed..    
4750: 20 20 20 20 62 6f 6f 6c 65 61 6e 20 66 6f 72 65      boolean fore
4760: 69 67 6e 4b 65 79 4d 6f 64 65 43 68 61 6e 67 65  ignKeyModeChange
4770: 64 20 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  d = configuratio
4780: 6e 2e 66 6f 72 65 69 67 6e 4b 65 79 43 6f 6e 73  n.foreignKeyCons
4790: 74 72 61 69 6e 74 73 45 6e 61 62 6c 65 64 0a 20  traintsEnabled. 
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
47b0: 3d 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  = mConfiguration
47c0: 2e 66 6f 72 65 69 67 6e 4b 65 79 43 6f 6e 73 74  .foreignKeyConst
47d0: 72 61 69 6e 74 73 45 6e 61 62 6c 65 64 3b 0a 20  raintsEnabled;. 
47e0: 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 77         boolean w
47f0: 61 6c 4d 6f 64 65 43 68 61 6e 67 65 64 20 3d 20  alModeChanged = 
4800: 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ((configuration.
4810: 6f 70 65 6e 46 6c 61 67 73 20 5e 20 6d 43 6f 6e  openFlags ^ mCon
4820: 66 69 67 75 72 61 74 69 6f 6e 2e 6f 70 65 6e 46  figuration.openF
4830: 6c 61 67 73 29 0a 20 20 20 20 20 20 20 20 20 20  lags).          
4840: 20 20 20 20 20 20 26 20 53 51 4c 69 74 65 44 61        & SQLiteDa
4850: 74 61 62 61 73 65 2e 45 4e 41 42 4c 45 5f 57 52  tabase.ENABLE_WR
4860: 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47 49 4e  ITE_AHEAD_LOGGIN
4870: 47 29 20 21 3d 20 30 3b 0a 20 20 20 20 20 20 20  G) != 0;.       
4880: 20 62 6f 6f 6c 65 61 6e 20 6c 6f 63 61 6c 65 43   boolean localeC
4890: 68 61 6e 67 65 64 20 3d 20 21 63 6f 6e 66 69 67  hanged = !config
48a0: 75 72 61 74 69 6f 6e 2e 6c 6f 63 61 6c 65 2e 65  uration.locale.e
48b0: 71 75 61 6c 73 28 6d 43 6f 6e 66 69 67 75 72 61  quals(mConfigura
48c0: 74 69 6f 6e 2e 6c 6f 63 61 6c 65 29 3b 0a 0a 20  tion.locale);.. 
48d0: 20 20 20 20 20 20 20 2f 2f 20 55 70 64 61 74 65         // Update
48e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
48f0: 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 20 20 20  arameters..     
4900: 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f     mConfiguratio
4910: 6e 2e 75 70 64 61 74 65 50 61 72 61 6d 65 74 65  n.updateParamete
4920: 72 73 46 72 6f 6d 28 63 6f 6e 66 69 67 75 72 61  rsFrom(configura
4930: 74 69 6f 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20  tion);..        
4940: 2f 2f 20 55 70 64 61 74 65 20 70 72 65 70 61 72  // Update prepar
4950: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63  ed statement cac
4960: 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 20 20 20  he size..       
4970: 20 2f 2a 20 6d 50 72 65 70 61 72 65 64 53 74 61   /* mPreparedSta
4980: 74 65 6d 65 6e 74 43 61 63 68 65 2e 72 65 73 69  tementCache.resi
4990: 7a 65 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ze(configuration
49a0: 2e 6d 61 78 53 71 6c 43 61 63 68 65 53 69 7a 65  .maxSqlCacheSize
49b0: 29 3b 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  ); */..        /
49c0: 2f 20 55 70 64 61 74 65 20 66 6f 72 65 69 67 6e  / Update foreign
49d0: 20 6b 65 79 20 6d 6f 64 65 2e 0a 20 20 20 20 20   key mode..     
49e0: 20 20 20 69 66 20 28 66 6f 72 65 69 67 6e 4b 65     if (foreignKe
49f0: 79 4d 6f 64 65 43 68 61 6e 67 65 64 29 20 7b 0a  yModeChanged) {.
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 46              setF
4a10: 6f 72 65 69 67 6e 4b 65 79 4d 6f 64 65 46 72 6f  oreignKeyModeFro
4a20: 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 29  mConfiguration()
4a30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
4a40: 20 20 20 20 20 2f 2f 20 55 70 64 61 74 65 20 57       // Update W
4a50: 41 4c 2e 0a 20 20 20 20 20 20 20 20 69 66 20 28  AL..        if (
4a60: 77 61 6c 4d 6f 64 65 43 68 61 6e 67 65 64 29 20  walModeChanged) 
4a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
4a80: 74 57 61 6c 4d 6f 64 65 46 72 6f 6d 43 6f 6e 66  tWalModeFromConf
4a90: 69 67 75 72 61 74 69 6f 6e 28 29 3b 0a 20 20 20  iguration();.   
4aa0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
4ab0: 2f 2f 20 55 70 64 61 74 65 20 6c 6f 63 61 6c 65  // Update locale
4ac0: 2e 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f  ..        if (lo
4ad0: 63 61 6c 65 43 68 61 6e 67 65 64 29 20 7b 0a 20  caleChanged) {. 
4ae0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f             setLo
4af0: 63 61 6c 65 46 72 6f 6d 43 6f 6e 66 69 67 75 72  caleFromConfigur
4b00: 61 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20  ation();.       
4b10: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
4b20: 20 43 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74   Called by SQLit
4b30: 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20  eConnectionPool 
4b40: 6f 6e 6c 79 2e 0a 20 20 20 20 2f 2f 20 57 68 65  only..    // Whe
4b50: 6e 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 65  n set to true, e
4b60: 78 65 63 75 74 69 6e 67 20 77 72 69 74 65 20 6f  xecuting write o
4b70: 70 65 72 61 74 69 6f 6e 73 20 77 69 6c 6c 20 74  perations will t
4b80: 68 72 6f 77 20 53 51 4c 69 74 65 45 78 63 65 70  hrow SQLiteExcep
4b90: 74 69 6f 6e 2e 0a 20 20 20 20 2f 2f 20 50 72 65  tion..    // Pre
4ba0: 70 61 72 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  paring statement
4bb0: 73 20 74 68 61 74 20 6d 69 67 68 74 20 77 72 69  s that might wri
4bc0: 74 65 20 69 73 20 6f 6b 2c 20 6a 75 73 74 20 64  te is ok, just d
4bd0: 6f 6e 27 74 20 65 78 65 63 75 74 65 20 74 68 65  on't execute the
4be0: 6d 2e 0a 20 20 20 20 76 6f 69 64 20 73 65 74 4f  m..    void setO
4bf0: 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c 79  nlyAllowReadOnly
4c00: 4f 70 65 72 61 74 69 6f 6e 73 28 62 6f 6f 6c 65  Operations(boole
4c10: 61 6e 20 72 65 61 64 4f 6e 6c 79 29 20 7b 0a 20  an readOnly) {. 
4c20: 20 20 20 20 20 20 20 6d 4f 6e 6c 79 41 6c 6c 6f         mOnlyAllo
4c30: 77 52 65 61 64 4f 6e 6c 79 4f 70 65 72 61 74 69  wReadOnlyOperati
4c40: 6f 6e 73 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  ons = readOnly;.
4c50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 43 61      }..    // Ca
4c60: 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 43 6f  lled by SQLiteCo
4c70: 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 20 6f 6e 6c  nnectionPool onl
4c80: 79 2e 0a 20 20 20 20 2f 2f 20 52 65 74 75 72 6e  y..    // Return
4c90: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72  s true if the pr
4ca0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
4cb0: 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
4cc0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 53 51  the specified SQ
4cd0: 4c 2e 0a 20 20 20 20 62 6f 6f 6c 65 61 6e 20 69  L..    boolean i
4ce0: 73 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  sPreparedStateme
4cf0: 6e 74 49 6e 43 61 63 68 65 28 53 74 72 69 6e 67  ntInCache(String
4d00: 20 73 71 6c 29 20 7b 0a 20 20 20 20 20 20 20 20   sql) {.        
4d10: 72 65 74 75 72 6e 20 6d 50 72 65 70 61 72 65 64  return mPrepared
4d20: 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 67  StatementCache.g
4d30: 65 74 28 73 71 6c 29 20 21 3d 20 6e 75 6c 6c 3b  et(sql) != null;
4d40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
4d50: 20 20 20 20 20 2a 20 47 65 74 73 20 74 68 65 20       * Gets the 
4d60: 75 6e 69 71 75 65 20 69 64 20 6f 66 20 74 68 69  unique id of thi
4d70: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  s connection..  
4d80: 20 20 20 2a 20 40 72 65 74 75 72 6e 20 54 68 65     * @return The
4d90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 64 2e 0a   connection id..
4da0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
4db0: 69 63 20 69 6e 74 20 67 65 74 43 6f 6e 6e 65 63  ic int getConnec
4dc0: 74 69 6f 6e 49 64 28 29 20 7b 0a 20 20 20 20 20  tionId() {.     
4dd0: 20 20 20 72 65 74 75 72 6e 20 6d 43 6f 6e 6e 65     return mConne
4de0: 63 74 69 6f 6e 49 64 3b 0a 20 20 20 20 7d 0a 0a  ctionId;.    }..
4df0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52      /**.     * R
4e00: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
4e10: 68 69 73 20 69 73 20 74 68 65 20 70 72 69 6d 61  his is the prima
4e20: 72 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ry database conn
4e30: 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 20 40  ection..     * @
4e40: 72 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 74  return True if t
4e50: 68 69 73 20 69 73 20 74 68 65 20 70 72 69 6d 61  his is the prima
4e60: 72 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ry database conn
4e70: 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a  ection..     */.
4e80: 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65      public boole
4e90: 61 6e 20 69 73 50 72 69 6d 61 72 79 43 6f 6e 6e  an isPrimaryConn
4ea0: 65 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20  ection() {.     
4eb0: 20 20 20 72 65 74 75 72 6e 20 6d 49 73 50 72 69     return mIsPri
4ec0: 6d 61 72 79 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0a  maryConnection;.
4ed0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
4ee0: 20 20 20 20 2a 20 50 72 65 70 61 72 65 73 20 61      * Prepares a
4ef0: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 65   statement for e
4f00: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 65  xecution but doe
4f10: 73 20 6e 6f 74 20 62 69 6e 64 20 69 74 73 20 70  s not bind its p
4f20: 61 72 61 6d 65 74 65 72 73 20 6f 72 20 65 78 65  arameters or exe
4f30: 63 75 74 65 20 69 74 2e 0a 20 20 20 20 20 2a 20  cute it..     * 
4f40: 3c 70 3e 0a 20 20 20 20 20 2a 20 54 68 69 73 20  <p>.     * This 
4f50: 6d 65 74 68 6f 64 20 63 61 6e 20 62 65 20 75 73  method can be us
4f60: 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ed to check for 
4f70: 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 64 75  syntax errors du
4f80: 72 69 6e 67 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  ring compilation
4f90: 0a 20 20 20 20 20 2a 20 70 72 69 6f 72 20 74 6f  .     * prior to
4fa0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
4fb0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66  e statement.  If
4fc0: 20 74 68 65 20 7b 40 63 6f 64 65 20 6f 75 74 53   the {@code outS
4fd0: 74 61 74 65 6d 65 6e 74 49 6e 66 6f 7d 20 61 72  tatementInfo} ar
4fe0: 67 75 6d 65 6e 74 0a 20 20 20 20 20 2a 20 69 73  gument.     * is
4ff0: 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74 68 65 20 70   not null, the p
5000: 72 6f 76 69 64 65 64 20 7b 40 6c 69 6e 6b 20 53  rovided {@link S
5010: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 49 6e  QLiteStatementIn
5020: 66 6f 7d 20 6f 62 6a 65 63 74 20 69 73 20 70 6f  fo} object is po
5030: 70 75 6c 61 74 65 64 0a 20 20 20 20 20 2a 20 77  pulated.     * w
5040: 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ith information 
5050: 61 62 6f 75 74 20 74 68 65 20 73 74 61 74 65 6d  about the statem
5060: 65 6e 74 2e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e  ent..     * </p>
5070: 3c 70 3e 0a 20 20 20 20 20 2a 20 41 20 70 72 65  <p>.     * A pre
5080: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
5090: 6d 61 6b 65 73 20 6e 6f 20 72 65 66 65 72 65 6e  makes no referen
50a0: 63 65 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  ce to the argume
50b0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 65 76 65  nts that may eve
50c0: 6e 74 75 61 6c 6c 79 0a 20 20 20 20 20 2a 20 62  ntually.     * b
50d0: 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 20 63  e bound to it, c
50e0: 6f 6e 73 65 71 75 65 6e 74 6c 79 20 69 74 20 69  onsequently it i
50f0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 61  t possible to ca
5100: 63 68 65 20 63 65 72 74 61 69 6e 20 70 72 65 70  che certain prep
5110: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a  ared statements.
5120: 20 20 20 20 20 2a 20 73 75 63 68 20 61 73 20 53       * such as S
5130: 45 4c 45 43 54 20 6f 72 20 49 4e 53 45 52 54 2f  ELECT or INSERT/
5140: 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
5150: 73 2e 20 20 49 66 20 74 68 65 20 73 74 61 74 65  s.  If the state
5160: 6d 65 6e 74 20 69 73 20 63 61 63 68 65 61 62 6c  ment is cacheabl
5170: 65 2c 0a 20 20 20 20 20 2a 20 74 68 65 6e 20 69  e,.     * then i
5180: 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  t will be stored
5190: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 66 6f   in the cache fo
51a0: 72 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 2a 20  r later..     * 
51b0: 3c 2f 70 3e 3c 70 3e 0a 20 20 20 20 20 2a 20 54  </p><p>.     * T
51c0: 6f 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  o take advantage
51d0: 20 6f 66 20 74 68 69 73 20 62 65 68 61 76 69 6f   of this behavio
51e0: 72 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  r as an optimiza
51f0: 74 69 6f 6e 2c 20 74 68 65 20 63 6f 6e 6e 65 63  tion, the connec
5200: 74 69 6f 6e 20 70 6f 6f 6c 0a 20 20 20 20 20 2a  tion pool.     *
5210: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 65 74 68   provides a meth
5220: 6f 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  od to acquire a 
5230: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
5240: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 67 69  already has a gi
5250: 76 65 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ven SQL statemen
5260: 74 0a 20 20 20 20 20 2a 20 69 6e 20 69 74 73 20  t.     * in its 
5270: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
5280: 6e 74 20 63 61 63 68 65 20 73 6f 20 74 68 61 74  nt cache so that
5290: 20 69 74 20 69 73 20 72 65 61 64 79 20 66 6f 72   it is ready for
52a0: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 20 20 20 20   execution..    
52b0: 20 2a 20 3c 2f 70 3e 0a 20 20 20 20 20 2a 0a 20   * </p>.     *. 
52c0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c      * @param sql
52d0: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
52e0: 6e 74 20 74 6f 20 70 72 65 70 61 72 65 2e 0a 20  nt to prepare.. 
52f0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 6f 75 74      * @param out
5300: 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 20 54 68  StatementInfo Th
5310: 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65 53  e {@link SQLiteS
5320: 74 61 74 65 6d 65 6e 74 49 6e 66 6f 7d 20 6f 62  tatementInfo} ob
5330: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
5340: 0a 20 20 20 20 20 2a 20 77 69 74 68 20 69 6e 66  .     * with inf
5350: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
5360: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72  he statement, or
5370: 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20   null if none.. 
5380: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 74 68      *.     * @th
5390: 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63 65 70  rows SQLiteExcep
53a0: 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  tion if an error
53b0: 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20 61 73   occurs, such as
53c0: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
53d0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
53e0: 6c 69 63 20 76 6f 69 64 20 70 72 65 70 61 72 65  lic void prepare
53f0: 28 53 74 72 69 6e 67 20 73 71 6c 2c 20 53 51 4c  (String sql, SQL
5400: 69 74 65 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f  iteStatementInfo
5410: 20 6f 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66   outStatementInf
5420: 6f 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  o) {.        if 
5430: 28 73 71 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  (sql == null) {.
5440: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
5450: 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67  w new IllegalArg
5460: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22  umentException("
5470: 73 71 6c 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  sql must not be 
5480: 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  null.");.       
5490: 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61   }..        fina
54a0: 6c 20 69 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d  l int cookie = m
54b0: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
54c0: 2e 62 65 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28  .beginOperation(
54d0: 22 70 72 65 70 61 72 65 22 2c 20 73 71 6c 2c 20  "prepare", sql, 
54e0: 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 74  null);.        t
54f0: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
5500: 20 66 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53   final PreparedS
5510: 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65  tatement stateme
5520: 6e 74 20 3d 20 61 63 71 75 69 72 65 50 72 65 70  nt = acquirePrep
5530: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71  aredStatement(sq
5540: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
5550: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
5560: 20 20 20 20 20 20 69 66 20 28 6f 75 74 53 74 61        if (outSta
5570: 74 65 6d 65 6e 74 49 6e 66 6f 20 21 3d 20 6e 75  tementInfo != nu
5580: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
5590: 20 20 20 20 20 20 20 20 20 20 6f 75 74 53 74 61            outSta
55a0: 74 65 6d 65 6e 74 49 6e 66 6f 2e 6e 75 6d 50 61  tementInfo.numPa
55b0: 72 61 6d 65 74 65 72 73 20 3d 20 73 74 61 74 65  rameters = state
55c0: 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d 65 74  ment.mNumParamet
55d0: 65 72 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ers;.           
55e0: 20 20 20 20 20 20 20 20 20 6f 75 74 53 74 61 74           outStat
55f0: 65 6d 65 6e 74 49 6e 66 6f 2e 72 65 61 64 4f 6e  ementInfo.readOn
5600: 6c 79 20 3d 20 73 74 61 74 65 6d 65 6e 74 2e 6d  ly = statement.m
5610: 52 65 61 64 4f 6e 6c 79 3b 0a 0a 20 20 20 20 20  ReadOnly;..     
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
5630: 69 6e 61 6c 20 69 6e 74 20 63 6f 6c 75 6d 6e 43  inal int columnC
5640: 6f 75 6e 74 20 3d 20 6e 61 74 69 76 65 47 65 74  ount = nativeGet
5650: 43 6f 6c 75 6d 6e 43 6f 75 6e 74 28 0a 20 20 20  ColumnCount(.   
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63           mConnec
5680: 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65  tionPtr, stateme
5690: 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50 74 72  nt.mStatementPtr
56a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
56b0: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6c 75 6d         if (colum
56c0: 6e 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 20  nCount == 0) {. 
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 20 20 20 20 6f 75 74 53 74 61 74 65 6d         outStatem
56f0: 65 6e 74 49 6e 66 6f 2e 63 6f 6c 75 6d 6e 4e 61  entInfo.columnNa
5700: 6d 65 73 20 3d 20 45 4d 50 54 59 5f 53 54 52 49  mes = EMPTY_STRI
5710: 4e 47 5f 41 52 52 41 59 3b 0a 20 20 20 20 20 20  NG_ARRAY;.      
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
5730: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5750: 75 74 53 74 61 74 65 6d 65 6e 74 49 6e 66 6f 2e  utStatementInfo.
5760: 63 6f 6c 75 6d 6e 4e 61 6d 65 73 20 3d 20 6e 65  columnNames = ne
5770: 77 20 53 74 72 69 6e 67 5b 63 6f 6c 75 6d 6e 43  w String[columnC
5780: 6f 75 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 20  ount];.         
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
57a0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
57b0: 20 3c 20 63 6f 6c 75 6d 6e 43 6f 75 6e 74 3b 20   < columnCount; 
57c0: 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  i++) {.         
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 6f 75 74 53 74 61 74 65 6d 65 6e 74 49     outStatementI
57f0: 6e 66 6f 2e 63 6f 6c 75 6d 6e 4e 61 6d 65 73 5b  nfo.columnNames[
5800: 69 5d 20 3d 20 6e 61 74 69 76 65 47 65 74 43 6f  i] = nativeGetCo
5810: 6c 75 6d 6e 4e 61 6d 65 28 0a 20 20 20 20 20 20  lumnName(.      
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 43                mC
5840: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74  onnectionPtr, st
5850: 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65  atement.mStateme
5860: 6e 74 50 74 72 2c 20 69 29 3b 0a 20 20 20 20 20  ntPtr, i);.     
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5890: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
58a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
58b0: 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c           } final
58c0: 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ly {.           
58d0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 72 65 70       releasePrep
58e0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74  aredStatement(st
58f0: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5910: 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65  } catch (Runtime
5920: 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a  Exception ex) {.
5930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63              mRec
5940: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61  entOperations.fa
5950: 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b  ilOperation(cook
5960: 69 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20  ie, ex);.       
5970: 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20       throw ex;. 
5980: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
5990: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
59a0: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
59b0: 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f  .endOperation(co
59c0: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  okie);.        }
59d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
59e0: 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 73 20       * Executes 
59f0: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  a statement that
5a00: 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72 6e   does not return
5a10: 20 61 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20   a result..     
5a20: 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  *.     * @param 
5a30: 73 71 6c 20 54 68 65 20 53 51 4c 20 73 74 61 74  sql The SQL stat
5a40: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
5a50: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
5a60: 62 69 6e 64 41 72 67 73 20 54 68 65 20 61 72 67  bindArgs The arg
5a70: 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e 64 2c 20  uments to bind, 
5a80: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
5a90: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63  .     * @param c
5aa0: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
5ab0: 6c 20 41 20 73 69 67 6e 61 6c 20 74 6f 20 63 61  l A signal to ca
5ac0: 6e 63 65 6c 20 74 68 65 20 6f 70 65 72 61 74 69  ncel the operati
5ad0: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
5ae0: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
5af0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
5b00: 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63  throws SQLiteExc
5b10: 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72  eption if an err
5b20: 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20  or occurs, such 
5b30: 61 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  as a syntax erro
5b40: 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61  r.     * or inva
5b50: 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  lid number of bi
5b60: 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  nd arguments..  
5b70: 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65     * @throws Ope
5b80: 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78  rationCanceledEx
5b90: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f  ception if the o
5ba0: 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e  peration was can
5bb0: 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20  celed..     */. 
5bc0: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 65     public void e
5bd0: 78 65 63 75 74 65 28 53 74 72 69 6e 67 20 73 71  xecute(String sq
5be0: 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20 62 69 6e 64  l, Object[] bind
5bf0: 41 72 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  Args,.          
5c00: 20 20 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69    CancellationSi
5c10: 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61 74 69 6f  gnal cancellatio
5c20: 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20 20 20 20  nSignal) {.     
5c30: 20 20 20 69 66 20 28 73 71 6c 20 3d 3d 20 6e 75     if (sql == nu
5c40: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
5c50: 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65    throw new Ille
5c60: 67 61 6c 41 72 67 75 6d 65 6e 74 45 78 63 65 70  galArgumentExcep
5c70: 74 69 6f 6e 28 22 73 71 6c 20 6d 75 73 74 20 6e  tion("sql must n
5c80: 6f 74 20 62 65 20 6e 75 6c 6c 2e 22 29 3b 0a 20  ot be null.");. 
5c90: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
5ca0: 20 20 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b    final int cook
5cb0: 69 65 20 3d 20 6d 52 65 63 65 6e 74 4f 70 65 72  ie = mRecentOper
5cc0: 61 74 69 6f 6e 73 2e 62 65 67 69 6e 4f 70 65 72  ations.beginOper
5cd0: 61 74 69 6f 6e 28 22 65 78 65 63 75 74 65 22 2c  ation("execute",
5ce0: 20 73 71 6c 2c 20 62 69 6e 64 41 72 67 73 29 3b   sql, bindArgs);
5cf0: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
5d00: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
5d10: 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65   PreparedStateme
5d20: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 61  nt statement = a
5d30: 63 71 75 69 72 65 50 72 65 70 61 72 65 64 53 74  cquirePreparedSt
5d40: 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20  atement(sql);.  
5d50: 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 74 68 72 6f 77 49 66 53 74 61 74 65 6d 65 6e 74  throwIfStatement
5d80: 46 6f 72 62 69 64 64 65 6e 28 73 74 61 74 65 6d  Forbidden(statem
5d90: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
5da0: 20 20 20 20 20 20 62 69 6e 64 41 72 67 75 6d 65        bindArgume
5db0: 6e 74 73 28 73 74 61 74 65 6d 65 6e 74 2c 20 62  nts(statement, b
5dc0: 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20  indArgs);.      
5dd0: 20 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 42            applyB
5de0: 6c 6f 63 6b 47 75 61 72 64 50 6f 6c 69 63 79 28  lockGuardPolicy(
5df0: 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 61              atta
5e10: 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  chCancellationSi
5e20: 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f  gnal(cancellatio
5e30: 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20  nSignal);.      
5e40: 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 6e 61 74 69 76 65 45 78 65 63 75 74      nativeExecut
5e70: 65 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72  e(mConnectionPtr
5e80: 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61  , statement.mSta
5e90: 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20  tementPtr);.    
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69              } fi
5eb0: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 74 61              deta
5ed0: 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  chCancellationSi
5ee0: 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f  gnal(cancellatio
5ef0: 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20  nSignal);.      
5f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5f10: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
5f20: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
5f30: 20 20 20 20 72 65 6c 65 61 73 65 50 72 65 70 61      releasePrepa
5f40: 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61  redStatement(sta
5f50: 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  tement);.       
5f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5f70: 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45   catch (RuntimeE
5f80: 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20  xception ex) {. 
5f90: 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65             mRece
5fa0: 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69  ntOperations.fai
5fb0: 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69  lOperation(cooki
5fc0: 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20  e, ex);.        
5fd0: 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20      throw ex;.  
5fe0: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
5ff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52  {.            mR
6000: 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e  ecentOperations.
6010: 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f  endOperation(coo
6020: 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  kie);.        }.
6030: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
6040: 20 20 20 20 2a 20 45 78 65 63 75 74 65 73 20 61      * Executes a
6050: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
6060: 72 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65  returns a single
6070: 20 3c 63 6f 64 65 3e 6c 6f 6e 67 3c 2f 63 6f 64   <code>long</cod
6080: 65 3e 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20  e> result..     
6090: 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  *.     * @param 
60a0: 73 71 6c 20 54 68 65 20 53 51 4c 20 73 74 61 74  sql The SQL stat
60b0: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
60c0: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
60d0: 62 69 6e 64 41 72 67 73 20 54 68 65 20 61 72 67  bindArgs The arg
60e0: 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e 64 2c 20  uments to bind, 
60f0: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
6100: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63  .     * @param c
6110: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
6120: 6c 20 41 20 73 69 67 6e 61 6c 20 74 6f 20 63 61  l A signal to ca
6130: 6e 63 65 6c 20 74 68 65 20 6f 70 65 72 61 74 69  ncel the operati
6140: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
6150: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
6160: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
6170: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
6180: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 6e   first column in
6190: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f   the first row o
61a0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
61b0: 0a 20 20 20 20 20 2a 20 61 73 20 61 20 3c 63 6f  .     * as a <co
61c0: 64 65 3e 6c 6f 6e 67 3c 2f 63 6f 64 65 3e 2c 20  de>long</code>, 
61d0: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 2e  or zero if none.
61e0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
61f0: 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63  throws SQLiteExc
6200: 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72  eption if an err
6210: 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20  or occurs, such 
6220: 61 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  as a syntax erro
6230: 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61  r.     * or inva
6240: 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  lid number of bi
6250: 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  nd arguments..  
6260: 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65     * @throws Ope
6270: 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78  rationCanceledEx
6280: 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f  ception if the o
6290: 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e  peration was can
62a0: 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20  celed..     */. 
62b0: 20 20 20 70 75 62 6c 69 63 20 6c 6f 6e 67 20 65     public long e
62c0: 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 53 74  xecuteForLong(St
62d0: 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74  ring sql, Object
62e0: 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20 20 20  [] bindArgs,.   
62f0: 20 20 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c           Cancell
6300: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63  ationSignal canc
6310: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20  ellationSignal) 
6320: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71  {.        if (sq
6330: 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  l == null) {.   
6340: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
6350: 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65  ew IllegalArgume
6360: 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c  ntException("sql
6370: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c   must not be nul
6380: 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  l.");.        }.
6390: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69  .        final i
63a0: 6e 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63  nt cookie = mRec
63b0: 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65  entOperations.be
63c0: 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22 65 78  ginOperation("ex
63d0: 65 63 75 74 65 46 6f 72 4c 6f 6e 67 22 2c 20 73  ecuteForLong", s
63e0: 71 6c 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20  ql, bindArgs);. 
63f0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
6400: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 50           final P
6410: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
6420: 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 61 63 71   statement = acq
6430: 75 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  uirePreparedStat
6440: 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20  ement(sql);.    
6450: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
6470: 72 6f 77 49 66 53 74 61 74 65 6d 65 6e 74 46 6f  rowIfStatementFo
6480: 72 62 69 64 64 65 6e 28 73 74 61 74 65 6d 65 6e  rbidden(statemen
6490: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
64a0: 20 20 20 20 62 69 6e 64 41 72 67 75 6d 65 6e 74      bindArgument
64b0: 73 28 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  s(statement, bin
64c0: 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20  dArgs);.        
64d0: 20 20 20 20 20 20 20 20 61 70 70 6c 79 42 6c 6f          applyBlo
64e0: 63 6b 47 75 61 72 64 50 6f 6c 69 63 79 28 73 74  ckGuardPolicy(st
64f0: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
6500: 20 20 20 20 20 20 20 20 20 20 61 74 74 61 63 68            attach
6510: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
6520: 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53  al(cancellationS
6530: 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  ignal);.        
6540: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 72 65 74 75 72 6e 20 6e 61 74 69 76 65 45    return nativeE
6570: 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 6d 43  xecuteForLong(mC
6580: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74  onnectionPtr, st
6590: 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65  atement.mStateme
65a0: 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  ntPtr);.        
65b0: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
65c0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
65d0: 20 20 20 20 20 20 20 20 64 65 74 61 63 68 43 61          detachCa
65e0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
65f0: 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  (cancellationSig
6600: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
6610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6620: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a      } finally {.
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 72 65 6c 65 61 73 65 50 72 65 70 61 72 65 64 53  releasePreparedS
6650: 74 61 74 65 6d 65 6e 74 28 73 74 61 74 65 6d 65  tatement(stateme
6660: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
6670: 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 63 61 74   }.        } cat
6680: 63 68 20 28 52 75 6e 74 69 6d 65 45 78 63 65 70  ch (RuntimeExcep
6690: 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20 20 20  tion ex) {.     
66a0: 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74 4f 70         mRecentOp
66b0: 65 72 61 74 69 6f 6e 73 2e 66 61 69 6c 4f 70 65  erations.failOpe
66c0: 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 2c 20 65  ration(cookie, e
66d0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
66e0: 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20  throw ex;.      
66f0: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
6700: 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e            mRecen
6710: 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65 6e 64 4f  tOperations.endO
6720: 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 29  peration(cookie)
6730: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6740: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
6750: 2a 20 45 78 65 63 75 74 65 73 20 61 20 73 74 61  * Executes a sta
6760: 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65 74 75  tement that retu
6770: 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 7b 40 6c  rns a single {@l
6780: 69 6e 6b 20 53 74 72 69 6e 67 7d 20 72 65 73 75  ink String} resu
6790: 6c 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  lt..     *.     
67a0: 2a 20 40 70 61 72 61 6d 20 73 71 6c 20 54 68 65  * @param sql The
67b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
67c0: 6f 20 65 78 65 63 75 74 65 2e 0a 20 20 20 20 20  o execute..     
67d0: 2a 20 40 70 61 72 61 6d 20 62 69 6e 64 41 72 67  * @param bindArg
67e0: 73 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s The arguments 
67f0: 74 6f 20 62 69 6e 64 2c 20 6f 72 20 6e 75 6c 6c  to bind, or null
6800: 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a   if none..     *
6810: 20 40 70 61 72 61 6d 20 63 61 6e 63 65 6c 6c 61   @param cancella
6820: 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73 69 67  tionSignal A sig
6830: 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20 74 68  nal to cancel th
6840: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70  e operation in p
6850: 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75 6c 6c  rogress, or null
6860: 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a   if none..     *
6870: 20 40 72 65 74 75 72 6e 20 54 68 65 20 76 61 6c   @return The val
6880: 75 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ue of the first 
6890: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 66 69  column in the fi
68a0: 72 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72  rst row of the r
68b0: 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 20 2a  esult set.     *
68c0: 20 61 73 20 61 20 3c 63 6f 64 65 3e 53 74 72 69   as a <code>Stri
68d0: 6e 67 3c 2f 63 6f 64 65 3e 2c 20 6f 72 20 6e 75  ng</code>, or nu
68e0: 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20  ll if none..    
68f0: 20 2a 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77   *.     * @throw
6900: 73 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  s SQLiteExceptio
6910: 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
6920: 63 75 72 73 2c 20 73 75 63 68 20 61 73 20 61 20  curs, such as a 
6930: 73 79 6e 74 61 78 20 65 72 72 6f 72 0a 20 20 20  syntax error.   
6940: 20 20 2a 20 6f 72 20 69 6e 76 61 6c 69 64 20 6e    * or invalid n
6950: 75 6d 62 65 72 20 6f 66 20 62 69 6e 64 20 61 72  umber of bind ar
6960: 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 20  guments..     * 
6970: 40 74 68 72 6f 77 73 20 4f 70 65 72 61 74 69 6f  @throws Operatio
6980: 6e 43 61 6e 63 65 6c 65 64 45 78 63 65 70 74 69  nCanceledExcepti
6990: 6f 6e 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  on if the operat
69a0: 69 6f 6e 20 77 61 73 20 63 61 6e 63 65 6c 65 64  ion was canceled
69b0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  ..     */.    pu
69c0: 62 6c 69 63 20 53 74 72 69 6e 67 20 65 78 65 63  blic String exec
69d0: 75 74 65 46 6f 72 53 74 72 69 6e 67 28 53 74 72  uteForString(Str
69e0: 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b  ing sql, Object[
69f0: 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20 20 20 20  ] bindArgs,.    
6a00: 20 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c 61          Cancella
6a10: 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65  tionSignal cance
6a20: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b  llationSignal) {
6a30: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71 6c  .        if (sql
6a40: 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   == null) {.    
6a50: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
6a60: 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e  w IllegalArgumen
6a70: 74 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c 20  tException("sql 
6a80: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c  must not be null
6a90: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  .");.        }..
6aa0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e          final in
6ab0: 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63 65  t cookie = mRece
6ac0: 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65 67  ntOperations.beg
6ad0: 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22 65 78 65  inOperation("exe
6ae0: 63 75 74 65 46 6f 72 53 74 72 69 6e 67 22 2c 20  cuteForString", 
6af0: 73 71 6c 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a  sql, bindArgs);.
6b00: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
6b10: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20            final 
6b20: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
6b30: 74 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 61 63  t statement = ac
6b40: 71 75 69 72 65 50 72 65 70 61 72 65 64 53 74 61  quirePreparedSta
6b50: 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20  tement(sql);.   
6b60: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6b80: 68 72 6f 77 49 66 53 74 61 74 65 6d 65 6e 74 46  hrowIfStatementF
6b90: 6f 72 62 69 64 64 65 6e 28 73 74 61 74 65 6d 65  orbidden(stateme
6ba0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
6bb0: 20 20 20 20 20 62 69 6e 64 41 72 67 75 6d 65 6e       bindArgumen
6bc0: 74 73 28 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  ts(statement, bi
6bd0: 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20  ndArgs);.       
6be0: 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 42 6c           applyBl
6bf0: 6f 63 6b 47 75 61 72 64 50 6f 6c 69 63 79 28 73  ockGuardPolicy(s
6c00: 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
6c10: 20 20 20 20 20 20 20 20 20 20 20 61 74 74 61 63             attac
6c20: 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  hCancellationSig
6c30: 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  nal(cancellation
6c40: 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  Signal);.       
6c50: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 20 20 20 72 65 74 75 72 6e 20 6e 61 74 69 76 65     return native
6c80: 45 78 65 63 75 74 65 46 6f 72 53 74 72 69 6e 67  ExecuteForString
6c90: 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c  (mConnectionPtr,
6ca0: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74   statement.mStat
6cb0: 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20  ementPtr);.     
6cc0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e             } fin
6cd0: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
6ce0: 20 20 20 20 20 20 20 20 20 20 20 64 65 74 61 63             detac
6cf0: 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  hCancellationSig
6d00: 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  nal(cancellation
6d10: 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  Signal);.       
6d20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6d30: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
6d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6d50: 20 20 20 72 65 6c 65 61 73 65 50 72 65 70 61 72     releasePrepar
6d60: 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74 61 74  edStatement(stat
6d70: 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ement);.        
6d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
6d90: 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78  catch (RuntimeEx
6da0: 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
6db0: 20 20 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e            mRecen
6dc0: 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66 61 69 6c  tOperations.fail
6dd0: 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65  Operation(cookie
6de0: 2c 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  , ex);.         
6df0: 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20     throw ex;.   
6e00: 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
6e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65  .            mRe
6e20: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65  centOperations.e
6e30: 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f 6b  ndOperation(cook
6e40: 69 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ie);.        }. 
6e50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
6e60: 20 20 20 2a 20 45 78 65 63 75 74 65 73 20 61 20     * Executes a 
6e70: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72  statement that r
6e80: 65 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20  eturns a single 
6e90: 42 4c 4f 42 20 72 65 73 75 6c 74 20 61 73 20 61  BLOB result as a
6ea0: 0a 20 20 20 20 20 2a 20 66 69 6c 65 20 64 65 73  .     * file des
6eb0: 63 72 69 70 74 6f 72 20 74 6f 20 61 20 73 68 61  criptor to a sha
6ec0: 72 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red memory regio
6ed0: 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  n..     *.     *
6ee0: 20 40 70 61 72 61 6d 20 73 71 6c 20 54 68 65 20   @param sql The 
6ef0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
6f00: 20 65 78 65 63 75 74 65 2e 0a 20 20 20 20 20 2a   execute..     *
6f10: 20 40 70 61 72 61 6d 20 62 69 6e 64 41 72 67 73   @param bindArgs
6f20: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
6f30: 6f 20 62 69 6e 64 2c 20 6f 72 20 6e 75 6c 6c 20  o bind, or null 
6f40: 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20  if none..     * 
6f50: 40 70 61 72 61 6d 20 63 61 6e 63 65 6c 6c 61 74  @param cancellat
6f60: 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73 69 67 6e  ionSignal A sign
6f70: 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20 74 68 65  al to cancel the
6f80: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 72   operation in pr
6f90: 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75 6c 6c 20  ogress, or null 
6fa0: 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20  if none..     * 
6fb0: 40 72 65 74 75 72 6e 20 54 68 65 20 66 69 6c 65  @return The file
6fc0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
6fd0: 61 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  a shared memory 
6fe0: 72 65 67 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  region that cont
6ff0: 61 69 6e 73 0a 20 20 20 20 20 2a 20 74 68 65 20  ains.     * the 
7000: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 72  value of the fir
7010: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  st column in the
7020: 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 74 68   first row of th
7030: 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 73 20  e result set as 
7040: 61 20 42 4c 4f 42 2c 0a 20 20 20 20 20 2a 20 6f  a BLOB,.     * o
7050: 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a  r null if none..
7060: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 74       *.     * @t
7070: 68 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63 65  hrows SQLiteExce
7080: 70 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72 6f  ption if an erro
7090: 72 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20 61  r occurs, such a
70a0: 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  s a syntax error
70b0: 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61 6c  .     * or inval
70c0: 69 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e  id number of bin
70d0: 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20  d arguments..   
70e0: 20 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65 72    * @throws Oper
70f0: 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63  ationCanceledExc
7100: 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f 70  eption if the op
7110: 65 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e 63  eration was canc
7120: 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  eled..     */.  
7130: 20 20 70 75 62 6c 69 63 20 50 61 72 63 65 6c 46    public ParcelF
7140: 69 6c 65 44 65 73 63 72 69 70 74 6f 72 20 65 78  ileDescriptor ex
7150: 65 63 75 74 65 46 6f 72 42 6c 6f 62 46 69 6c 65  ecuteForBlobFile
7160: 44 65 73 63 72 69 70 74 6f 72 28 53 74 72 69 6e  Descriptor(Strin
7170: 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20  g sql, Object[] 
7180: 62 69 6e 64 41 72 67 73 2c 0a 20 20 20 20 20 20  bindArgs,.      
7190: 20 20 20 20 20 20 43 61 6e 63 65 6c 6c 61 74 69        Cancellati
71a0: 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c  onSignal cancell
71b0: 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20  ationSignal) {. 
71c0: 20 20 20 20 20 20 20 69 66 20 28 73 71 6c 20 3d         if (sql =
71d0: 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  = null) {.      
71e0: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
71f0: 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45  IllegalArgumentE
7200: 78 63 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d 75  xception("sql mu
7210: 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e 22  st not be null."
7220: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
7230: 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20        final int 
7240: 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63 65 6e 74  cookie = mRecent
7250: 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65 67 69 6e  Operations.begin
7260: 4f 70 65 72 61 74 69 6f 6e 28 22 65 78 65 63 75  Operation("execu
7270: 74 65 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73  teForBlobFileDes
7280: 63 72 69 70 74 6f 72 22 2c 0a 20 20 20 20 20 20  criptor",.      
7290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 2c 20 62            sql, b
72a0: 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20  indArgs);.      
72b0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
72c0: 20 20 20 20 66 69 6e 61 6c 20 50 72 65 70 61 72      final Prepar
72d0: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
72e0: 65 6d 65 6e 74 20 3d 20 61 63 71 75 69 72 65 50  ement = acquireP
72f0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
7300: 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  (sql);.         
7310: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
7320: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 49 66           throwIf
7330: 53 74 61 74 65 6d 65 6e 74 46 6f 72 62 69 64 64  StatementForbidd
7340: 65 6e 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20  en(statement);. 
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7360: 69 6e 64 41 72 67 75 6d 65 6e 74 73 28 73 74 61  indArguments(sta
7370: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 41 72 67 73  tement, bindArgs
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7390: 20 20 20 61 70 70 6c 79 42 6c 6f 63 6b 47 75 61     applyBlockGua
73a0: 72 64 50 6f 6c 69 63 79 28 73 74 61 74 65 6d 65  rdPolicy(stateme
73b0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
73c0: 20 20 20 20 20 61 74 74 61 63 68 43 61 6e 63 65       attachCance
73d0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61  llationSignal(ca
73e0: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
73f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7400: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
7420: 20 66 64 20 3d 20 6e 61 74 69 76 65 45 78 65 63   fd = nativeExec
7430: 75 74 65 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65  uteForBlobFileDe
7440: 73 63 72 69 70 74 6f 72 28 0a 20 20 20 20 20 20  scriptor(.      
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69 6f        mConnectio
7470: 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e  nPtr, statement.
7480: 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a  mStatementPtr);.
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 72 65 74 75 72 6e 20 66 64 20 3e 3d      return fd >=
74b0: 20 30 20 3f 20 50 61 72 63 65 6c 46 69 6c 65 44   0 ? ParcelFileD
74c0: 65 73 63 72 69 70 74 6f 72 2e 61 64 6f 70 74 46  escriptor.adoptF
74d0: 64 28 66 64 29 20 3a 20 6e 75 6c 6c 3b 0a 20 20  d(fd) : null;.  
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
74f0: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
7510: 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  tachCancellation
7520: 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74  Signal(cancellat
7530: 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20  ionSignal);.    
7540: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7550: 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61            } fina
7560: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
7570: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 72 65        releasePre
7580: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73  paredStatement(s
7590: 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
75a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
75b0: 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d   } catch (Runtim
75c0: 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b  eException ex) {
75d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65  .            mRe
75e0: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66  centOperations.f
75f0: 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f  ailOperation(coo
7600: 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20  kie, ex);.      
7610: 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a        throw ex;.
7620: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
7630: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
7640: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
7650: 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63  s.endOperation(c
7660: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20  ookie);.        
7670: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
7680: 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 73  .     * Executes
7690: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61   a statement tha
76a0: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 75 6e  t returns a coun
76b0: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
76c0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 2a 20 74  of rows.     * t
76d0: 68 61 74 20 77 65 72 65 20 63 68 61 6e 67 65 64  hat were changed
76e0: 2e 20 20 55 73 65 20 66 6f 72 20 55 50 44 41 54  .  Use for UPDAT
76f0: 45 20 6f 72 20 44 45 4c 45 54 45 20 53 51 4c 20  E or DELETE SQL 
7700: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
7710: 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d   *.     * @param
7720: 20 73 71 6c 20 54 68 65 20 53 51 4c 20 73 74 61   sql The SQL sta
7730: 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
7740: 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  e..     * @param
7750: 20 62 69 6e 64 41 72 67 73 20 54 68 65 20 61 72   bindArgs The ar
7760: 67 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e 64 2c  guments to bind,
7770: 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65   or null if none
7780: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
7790: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  cancellationSign
77a0: 61 6c 20 41 20 73 69 67 6e 61 6c 20 74 6f 20 63  al A signal to c
77b0: 61 6e 63 65 6c 20 74 68 65 20 6f 70 65 72 61 74  ancel the operat
77c0: 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
77d0: 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65   or null if none
77e0: 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e  ..     * @return
77f0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   The number of r
7800: 6f 77 73 20 74 68 61 74 20 77 65 72 65 20 63 68  ows that were ch
7810: 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 0a 20 20  anged..     *.  
7820: 20 20 20 2a 20 40 74 68 72 6f 77 73 20 53 51 4c     * @throws SQL
7830: 69 74 65 45 78 63 65 70 74 69 6f 6e 20 69 66 20  iteException if 
7840: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7850: 20 73 75 63 68 20 61 73 20 61 20 73 79 6e 74 61   such as a synta
7860: 78 20 65 72 72 6f 72 0a 20 20 20 20 20 2a 20 6f  x error.     * o
7870: 72 20 69 6e 76 61 6c 69 64 20 6e 75 6d 62 65 72  r invalid number
7880: 20 6f 66 20 62 69 6e 64 20 61 72 67 75 6d 65 6e   of bind argumen
7890: 74 73 2e 0a 20 20 20 20 20 2a 20 40 74 68 72 6f  ts..     * @thro
78a0: 77 73 20 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63  ws OperationCanc
78b0: 65 6c 65 64 45 78 63 65 70 74 69 6f 6e 20 69 66  eledException if
78c0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
78d0: 61 73 20 63 61 6e 63 65 6c 65 64 2e 0a 20 20 20  as canceled..   
78e0: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
78f0: 69 6e 74 20 65 78 65 63 75 74 65 46 6f 72 43 68  int executeForCh
7900: 61 6e 67 65 64 52 6f 77 43 6f 75 6e 74 28 53 74  angedRowCount(St
7910: 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74  ring sql, Object
7920: 5b 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20 20 20  [] bindArgs,.   
7930: 20 20 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c           Cancell
7940: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63  ationSignal canc
7950: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20  ellationSignal) 
7960: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71  {.        if (sq
7970: 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  l == null) {.   
7980: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
7990: 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65  ew IllegalArgume
79a0: 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c  ntException("sql
79b0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c   must not be nul
79c0: 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  l.");.        }.
79d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 68 61  .        int cha
79e0: 6e 67 65 64 52 6f 77 73 20 3d 20 30 3b 0a 20 20  ngedRows = 0;.  
79f0: 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20        final int 
7a00: 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63 65 6e 74  cookie = mRecent
7a10: 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65 67 69 6e  Operations.begin
7a20: 4f 70 65 72 61 74 69 6f 6e 28 22 65 78 65 63 75  Operation("execu
7a30: 74 65 46 6f 72 43 68 61 6e 67 65 64 52 6f 77 43  teForChangedRowC
7a40: 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  ount",.         
7a50: 20 20 20 20 20 20 20 73 71 6c 2c 20 62 69 6e 64         sql, bind
7a60: 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 74  Args);.        t
7a70: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
7a80: 20 66 69 6e 61 6c 20 50 72 65 70 61 72 65 64 53   final PreparedS
7a90: 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65  tatement stateme
7aa0: 6e 74 20 3d 20 61 63 71 75 69 72 65 50 72 65 70  nt = acquirePrep
7ab0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71  aredStatement(sq
7ac0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
7ad0: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
7ae0: 20 20 20 20 20 20 74 68 72 6f 77 49 66 53 74 61        throwIfSta
7af0: 74 65 6d 65 6e 74 46 6f 72 62 69 64 64 65 6e 28  tementForbidden(
7b00: 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 64              bind
7b20: 41 72 67 75 6d 65 6e 74 73 28 73 74 61 74 65 6d  Arguments(statem
7b30: 65 6e 74 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a  ent, bindArgs);.
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 61 70 70 6c 79 42 6c 6f 63 6b 47 75 61 72 64 50  applyBlockGuardP
7b60: 6f 6c 69 63 79 28 73 74 61 74 65 6d 65 6e 74 29  olicy(statement)
7b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7b80: 20 20 61 74 74 61 63 68 43 61 6e 63 65 6c 6c 61    attachCancella
7b90: 74 69 6f 6e 53 69 67 6e 61 6c 28 63 61 6e 63 65  tionSignal(cance
7ba0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a  llationSignal);.
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
7bd0: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
7be0: 64 52 6f 77 73 20 3d 20 6e 61 74 69 76 65 45 78  dRows = nativeEx
7bf0: 65 63 75 74 65 46 6f 72 43 68 61 6e 67 65 64 52  ecuteForChangedR
7c00: 6f 77 43 6f 75 6e 74 28 0a 20 20 20 20 20 20 20  owCount(.       
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e       mConnection
7c30: 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d  Ptr, statement.m
7c40: 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20  StatementPtr);. 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 72 65 74 75 72 6e 20 63 68 61 6e 67 65     return change
7c70: 64 52 6f 77 73 3b 0a 20 20 20 20 20 20 20 20 20  dRows;.         
7c80: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
7c90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7ca0: 20 20 20 20 20 20 20 64 65 74 61 63 68 43 61 6e         detachCan
7cb0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28  cellationSignal(
7cc0: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  cancellationSign
7cd0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
7ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7cf0: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20     } finally {. 
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7d10: 65 6c 65 61 73 65 50 72 65 70 61 72 65 64 53 74  eleasePreparedSt
7d20: 61 74 65 6d 65 6e 74 28 73 74 61 74 65 6d 65 6e  atement(statemen
7d30: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
7d40: 7d 0a 20 20 20 20 20 20 20 20 7d 20 63 61 74 63  }.        } catc
7d50: 68 20 28 52 75 6e 74 69 6d 65 45 78 63 65 70 74  h (RuntimeExcept
7d60: 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20 20 20 20  ion ex) {.      
7d70: 20 20 20 20 20 20 6d 52 65 63 65 6e 74 4f 70 65        mRecentOpe
7d80: 72 61 74 69 6f 6e 73 2e 66 61 69 6c 4f 70 65 72  rations.failOper
7d90: 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 2c 20 65 78  ation(cookie, ex
7da0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
7db0: 68 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20 20  hrow ex;.       
7dc0: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
7dd0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 52 65           if (mRe
7de0: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 65  centOperations.e
7df0: 6e 64 4f 70 65 72 61 74 69 6f 6e 44 65 66 65 72  ndOperationDefer
7e00: 4c 6f 67 28 63 6f 6f 6b 69 65 29 29 20 7b 0a 20  Log(cookie)) {. 
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
7e20: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
7e30: 2e 6c 6f 67 4f 70 65 72 61 74 69 6f 6e 28 63 6f  .logOperation(co
7e40: 6f 6b 69 65 2c 20 22 63 68 61 6e 67 65 64 52 6f  okie, "changedRo
7e50: 77 73 3d 22 20 2b 20 63 68 61 6e 67 65 64 52 6f  ws=" + changedRo
7e60: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ws);.           
7e70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7e80: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
7e90: 20 2a 20 45 78 65 63 75 74 65 73 20 61 20 73 74   * Executes a st
7ea0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65 74  atement that ret
7eb0: 75 72 6e 73 20 74 68 65 20 72 6f 77 20 69 64 20  urns the row id 
7ec0: 6f 66 20 74 68 65 20 6c 61 73 74 20 72 6f 77 20  of the last row 
7ed0: 69 6e 73 65 72 74 65 64 0a 20 20 20 20 20 2a 20  inserted.     * 
7ee0: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
7ef0: 2e 20 20 55 73 65 20 66 6f 72 20 49 4e 53 45 52  .  Use for INSER
7f00: 54 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  T SQL statements
7f10: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
7f20: 40 70 61 72 61 6d 20 73 71 6c 20 54 68 65 20 53  @param sql The S
7f30: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
7f40: 65 78 65 63 75 74 65 2e 0a 20 20 20 20 20 2a 20  execute..     * 
7f50: 40 70 61 72 61 6d 20 62 69 6e 64 41 72 67 73 20  @param bindArgs 
7f60: 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  The arguments to
7f70: 20 62 69 6e 64 2c 20 6f 72 20 6e 75 6c 6c 20 69   bind, or null i
7f80: 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40  f none..     * @
7f90: 70 61 72 61 6d 20 63 61 6e 63 65 6c 6c 61 74 69  param cancellati
7fa0: 6f 6e 53 69 67 6e 61 6c 20 41 20 73 69 67 6e 61  onSignal A signa
7fb0: 6c 20 74 6f 20 63 61 6e 63 65 6c 20 74 68 65 20  l to cancel the 
7fc0: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 72 6f  operation in pro
7fd0: 67 72 65 73 73 2c 20 6f 72 20 6e 75 6c 6c 20 69  gress, or null i
7fe0: 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 40  f none..     * @
7ff0: 72 65 74 75 72 6e 20 54 68 65 20 72 6f 77 20 69  return The row i
8000: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 72 6f  d of the last ro
8010: 77 20 74 68 61 74 20 77 61 73 20 69 6e 73 65 72  w that was inser
8020: 74 65 64 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e  ted, or 0 if non
8030: 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  e..     *.     *
8040: 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65 45   @throws SQLiteE
8050: 78 63 65 70 74 69 6f 6e 20 69 66 20 61 6e 20 65  xception if an e
8060: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 75 63  rror occurs, suc
8070: 68 20 61 73 20 61 20 73 79 6e 74 61 78 20 65 72  h as a syntax er
8080: 72 6f 72 0a 20 20 20 20 20 2a 20 6f 72 20 69 6e  ror.     * or in
8090: 76 61 6c 69 64 20 6e 75 6d 62 65 72 20 6f 66 20  valid number of 
80a0: 62 69 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a  bind arguments..
80b0: 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 4f       * @throws O
80c0: 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64  perationCanceled
80d0: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  Exception if the
80e0: 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20 63   operation was c
80f0: 61 6e 63 65 6c 65 64 2e 0a 20 20 20 20 20 2a 2f  anceled..     */
8100: 0a 20 20 20 20 70 75 62 6c 69 63 20 6c 6f 6e 67  .    public long
8110: 20 65 78 65 63 75 74 65 46 6f 72 4c 61 73 74 49   executeForLastI
8120: 6e 73 65 72 74 65 64 52 6f 77 49 64 28 53 74 72  nsertedRowId(Str
8130: 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b  ing sql, Object[
8140: 5d 20 62 69 6e 64 41 72 67 73 2c 0a 20 20 20 20  ] bindArgs,.    
8150: 20 20 20 20 20 20 20 20 43 61 6e 63 65 6c 6c 61          Cancella
8160: 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63 65  tionSignal cance
8170: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20 7b  llationSignal) {
8180: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 71 6c  .        if (sql
8190: 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   == null) {.    
81a0: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
81b0: 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e  w IllegalArgumen
81c0: 74 45 78 63 65 70 74 69 6f 6e 28 22 73 71 6c 20  tException("sql 
81d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c  must not be null
81e0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  .");.        }..
81f0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e          final in
8200: 74 20 63 6f 6f 6b 69 65 20 3d 20 6d 52 65 63 65  t cookie = mRece
8210: 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 62 65 67  ntOperations.beg
8220: 69 6e 4f 70 65 72 61 74 69 6f 6e 28 22 65 78 65  inOperation("exe
8230: 63 75 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72  cuteForLastInser
8240: 74 65 64 52 6f 77 49 64 22 2c 0a 20 20 20 20 20  tedRowId",.     
8250: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 2c 20             sql, 
8260: 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20 20  bindArgs);.     
8270: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
8280: 20 20 20 20 20 66 69 6e 61 6c 20 50 72 65 70 61       final Prepa
8290: 72 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61  redStatement sta
82a0: 74 65 6d 65 6e 74 20 3d 20 61 63 71 75 69 72 65  tement = acquire
82b0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
82c0: 74 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  t(sql);.        
82d0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
82e0: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 49            throwI
82f0: 66 53 74 61 74 65 6d 65 6e 74 46 6f 72 62 69 64  fStatementForbid
8300: 64 65 6e 28 73 74 61 74 65 6d 65 6e 74 29 3b 0a  den(statement);.
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 62 69 6e 64 41 72 67 75 6d 65 6e 74 73 28 73 74  bindArguments(st
8330: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 41 72 67  atement, bindArg
8340: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
8350: 20 20 20 20 61 70 70 6c 79 42 6c 6f 63 6b 47 75      applyBlockGu
8360: 61 72 64 50 6f 6c 69 63 79 28 73 74 61 74 65 6d  ardPolicy(statem
8370: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
8380: 20 20 20 20 20 20 61 74 74 61 63 68 43 61 6e 63        attachCanc
8390: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 63  ellationSignal(c
83a0: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
83b0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
83c0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
83e0: 74 75 72 6e 20 6e 61 74 69 76 65 45 78 65 63 75  turn nativeExecu
83f0: 74 65 46 6f 72 4c 61 73 74 49 6e 73 65 72 74 65  teForLastInserte
8400: 64 52 6f 77 49 64 28 0a 20 20 20 20 20 20 20 20  dRowId(.        
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50      mConnectionP
8430: 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53  tr, statement.mS
8440: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20  tatementPtr);.  
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
8460: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
8480: 74 61 63 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  tachCancellation
8490: 53 69 67 6e 61 6c 28 63 61 6e 63 65 6c 6c 61 74  Signal(cancellat
84a0: 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20  ionSignal);.    
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
84c0: 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61            } fina
84d0: 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lly {.          
84e0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 72 65        releasePre
84f0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73  paredStatement(s
8500: 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20  tatement);.     
8510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8520: 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d   } catch (Runtim
8530: 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b  eException ex) {
8540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65  .            mRe
8550: 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73 2e 66  centOperations.f
8560: 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63 6f 6f  ailOperation(coo
8570: 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20 20 20  kie, ex);.      
8580: 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a        throw ex;.
8590: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
85a0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
85b0: 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e  mRecentOperation
85c0: 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e 28 63  s.endOperation(c
85d0: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20  ookie);.        
85e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
85f0: 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 73  .     * Executes
8600: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64   a statement and
8610: 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 73   populates the s
8620: 70 65 63 69 66 69 65 64 20 7b 40 6c 69 6e 6b 20  pecified {@link 
8630: 43 75 72 73 6f 72 57 69 6e 64 6f 77 7d 0a 20 20  CursorWindow}.  
8640: 20 20 20 2a 20 77 69 74 68 20 61 20 72 61 6e 67     * with a rang
8650: 65 20 6f 66 20 72 65 73 75 6c 74 73 2e 20 20 52  e of results.  R
8660: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
8670: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
8680: 65 72 65 20 63 6f 75 6e 74 65 64 0a 20 20 20 20  ere counted.    
8690: 20 2a 20 64 75 72 69 6e 67 20 71 75 65 72 79 20   * during query 
86a0: 65 78 65 63 75 74 69 6f 6e 2e 0a 20 20 20 20 20  execution..     
86b0: 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  *.     * @param 
86c0: 73 71 6c 20 54 68 65 20 53 51 4c 20 73 74 61 74  sql The SQL stat
86d0: 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
86e0: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
86f0: 62 69 6e 64 41 72 67 73 20 54 68 65 20 61 72 67  bindArgs The arg
8700: 75 6d 65 6e 74 73 20 74 6f 20 62 69 6e 64 2c 20  uments to bind, 
8710: 6f 72 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e  or null if none.
8720: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 77  .     * @param w
8730: 69 6e 64 6f 77 20 54 68 65 20 63 75 72 73 6f 72  indow The cursor
8740: 20 77 69 6e 64 6f 77 20 74 6f 20 63 6c 65 61 72   window to clear
8750: 20 61 6e 64 20 66 69 6c 6c 2e 0a 20 20 20 20 20   and fill..     
8760: 2a 20 40 70 61 72 61 6d 20 73 74 61 72 74 50 6f  * @param startPo
8770: 73 20 54 68 65 20 73 74 61 72 74 20 70 6f 73 69  s The start posi
8780: 74 69 6f 6e 20 66 6f 72 20 66 69 6c 6c 69 6e 67  tion for filling
8790: 20 74 68 65 20 77 69 6e 64 6f 77 2e 0a 20 20 20   the window..   
87a0: 20 20 2a 20 40 70 61 72 61 6d 20 72 65 71 75 69    * @param requi
87b0: 72 65 64 50 6f 73 20 54 68 65 20 70 6f 73 69 74  redPos The posit
87c0: 69 6f 6e 20 6f 66 20 61 20 72 6f 77 20 74 68 61  ion of a row tha
87d0: 74 20 4d 55 53 54 20 62 65 20 69 6e 20 74 68 65  t MUST be in the
87e0: 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a 20   window..     * 
87f0: 49 66 20 69 74 20 77 6f 6e 27 74 20 66 69 74 2c  If it won't fit,
8800: 20 74 68 65 6e 20 74 68 65 20 71 75 65 72 79 20   then the query 
8810: 73 68 6f 75 6c 64 20 64 69 73 63 61 72 64 20 70  should discard p
8820: 61 72 74 20 6f 66 20 77 68 61 74 20 69 74 20 66  art of what it f
8830: 69 6c 6c 65 64 0a 20 20 20 20 20 2a 20 73 6f 20  illed.     * so 
8840: 74 68 61 74 20 69 74 20 64 6f 65 73 2e 20 20 4d  that it does.  M
8850: 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
8860: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8870: 3c 63 6f 64 65 3e 73 74 61 72 74 50 6f 73 3c 2f  <code>startPos</
8880: 63 6f 64 65 3e 2e 0a 20 20 20 20 20 2a 20 40 70  code>..     * @p
8890: 61 72 61 6d 20 63 6f 75 6e 74 41 6c 6c 52 6f 77  aram countAllRow
88a0: 73 20 54 72 75 65 20 74 6f 20 63 6f 75 6e 74 20  s True to count 
88b0: 61 6c 6c 20 72 6f 77 73 20 74 68 61 74 20 74 68  all rows that th
88c0: 65 20 71 75 65 72 79 20 77 6f 75 6c 64 20 72 65  e query would re
88d0: 74 75 72 6e 0a 20 20 20 20 20 2a 20 72 65 67 61  turn.     * rega
88e0: 67 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  gless of whether
88f0: 20 74 68 65 79 20 66 69 74 20 69 6e 20 74 68 65   they fit in the
8900: 20 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a 20   window..     * 
8910: 40 70 61 72 61 6d 20 63 61 6e 63 65 6c 6c 61 74  @param cancellat
8920: 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73 69 67 6e  ionSignal A sign
8930: 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20 74 68 65  al to cancel the
8940: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 72   operation in pr
8950: 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75 6c 6c 20  ogress, or null 
8960: 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20  if none..     * 
8970: 40 72 65 74 75 72 6e 20 54 68 65 20 6e 75 6d 62  @return The numb
8980: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
8990: 77 65 72 65 20 63 6f 75 6e 74 65 64 20 64 75 72  were counted dur
89a0: 69 6e 67 20 71 75 65 72 79 20 65 78 65 63 75 74  ing query execut
89b0: 69 6f 6e 2e 20 20 4d 69 67 68 74 0a 20 20 20 20  ion.  Might.    
89c0: 20 2a 20 6e 6f 74 20 62 65 20 61 6c 6c 20 72 6f   * not be all ro
89d0: 77 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ws in the result
89e0: 20 73 65 74 20 75 6e 6c 65 73 73 20 3c 63 6f 64   set unless <cod
89f0: 65 3e 63 6f 75 6e 74 41 6c 6c 52 6f 77 73 3c 2f  e>countAllRows</
8a00: 63 6f 64 65 3e 20 69 73 20 74 72 75 65 2e 0a 20  code> is true.. 
8a10: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 74 68      *.     * @th
8a20: 72 6f 77 73 20 53 51 4c 69 74 65 45 78 63 65 70  rows SQLiteExcep
8a30: 74 69 6f 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  tion if an error
8a40: 20 6f 63 63 75 72 73 2c 20 73 75 63 68 20 61 73   occurs, such as
8a50: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 0a   a syntax error.
8a60: 20 20 20 20 20 2a 20 6f 72 20 69 6e 76 61 6c 69       * or invali
8a70: 64 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 6e 64  d number of bind
8a80: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20   arguments..    
8a90: 20 2a 20 40 74 68 72 6f 77 73 20 4f 70 65 72 61   * @throws Opera
8aa0: 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63 65  tionCanceledExce
8ab0: 70 74 69 6f 6e 20 69 66 20 74 68 65 20 6f 70 65  ption if the ope
8ac0: 72 61 74 69 6f 6e 20 77 61 73 20 63 61 6e 63 65  ration was cance
8ad0: 6c 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  led..     */.   
8ae0: 20 70 75 62 6c 69 63 20 69 6e 74 20 65 78 65 63   public int exec
8af0: 75 74 65 46 6f 72 43 75 72 73 6f 72 57 69 6e 64  uteForCursorWind
8b00: 6f 77 28 53 74 72 69 6e 67 20 73 71 6c 2c 20 4f  ow(String sql, O
8b10: 62 6a 65 63 74 5b 5d 20 62 69 6e 64 41 72 67 73  bject[] bindArgs
8b20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 75  ,.            Cu
8b30: 72 73 6f 72 57 69 6e 64 6f 77 20 77 69 6e 64 6f  rsorWindow windo
8b40: 77 2c 20 69 6e 74 20 73 74 61 72 74 50 6f 73 2c  w, int startPos,
8b50: 20 69 6e 74 20 72 65 71 75 69 72 65 64 50 6f 73   int requiredPos
8b60: 2c 20 62 6f 6f 6c 65 61 6e 20 63 6f 75 6e 74 41  , boolean countA
8b70: 6c 6c 52 6f 77 73 2c 0a 20 20 20 20 20 20 20 20  llRows,.        
8b80: 20 20 20 20 43 61 6e 63 65 6c 6c 61 74 69 6f 6e      Cancellation
8b90: 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61 74  Signal cancellat
8ba0: 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20 20  ionSignal) {.   
8bb0: 20 20 20 20 20 69 66 20 28 73 71 6c 20 3d 3d 20       if (sql == 
8bc0: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
8bd0: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6c      throw new Il
8be0: 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45 78 63  legalArgumentExc
8bf0: 65 70 74 69 6f 6e 28 22 73 71 6c 20 6d 75 73 74  eption("sql must
8c00: 20 6e 6f 74 20 62 65 20 6e 75 6c 6c 2e 22 29 3b   not be null.");
8c10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8c20: 20 20 20 69 66 20 28 77 69 6e 64 6f 77 20 3d 3d     if (window ==
8c30: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
8c40: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49       throw new I
8c50: 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45 78  llegalArgumentEx
8c60: 63 65 70 74 69 6f 6e 28 22 77 69 6e 64 6f 77 20  ception("window 
8c70: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c  must not be null
8c80: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  .");.        }..
8c90: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 2e 61          window.a
8ca0: 63 71 75 69 72 65 52 65 66 65 72 65 6e 63 65 28  cquireReference(
8cb0: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  );.        try {
8cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
8cd0: 20 61 63 74 75 61 6c 50 6f 73 20 3d 20 2d 31 3b   actualPos = -1;
8ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
8cf0: 20 63 6f 75 6e 74 65 64 52 6f 77 73 20 3d 20 2d   countedRows = -
8d00: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
8d10: 6e 74 20 66 69 6c 6c 65 64 52 6f 77 73 20 3d 20  nt filledRows = 
8d20: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
8d30: 66 69 6e 61 6c 20 69 6e 74 20 63 6f 6f 6b 69 65  final int cookie
8d40: 20 3d 20 6d 52 65 63 65 6e 74 4f 70 65 72 61 74   = mRecentOperat
8d50: 69 6f 6e 73 2e 62 65 67 69 6e 4f 70 65 72 61 74  ions.beginOperat
8d60: 69 6f 6e 28 22 65 78 65 63 75 74 65 46 6f 72 43  ion("executeForC
8d70: 75 72 73 6f 72 57 69 6e 64 6f 77 22 2c 0a 20 20  ursorWindow",.  
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 73 71 6c 2c 20 62 69 6e 64 41 72 67 73 29    sql, bindArgs)
8da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
8db0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
8dc0: 20 20 20 20 66 69 6e 61 6c 20 50 72 65 70 61 72      final Prepar
8dd0: 65 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  edStatement stat
8de0: 65 6d 65 6e 74 20 3d 20 61 63 71 75 69 72 65 50  ement = acquireP
8df0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
8e00: 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  (sql);.         
8e10: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 74 68 72 6f 77 49 66 53 74 61 74 65 6d 65 6e   throwIfStatemen
8e40: 74 46 6f 72 62 69 64 64 65 6e 28 73 74 61 74 65  tForbidden(state
8e50: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
8e60: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 64 41             bindA
8e70: 72 67 75 6d 65 6e 74 73 28 73 74 61 74 65 6d 65  rguments(stateme
8e80: 6e 74 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20  nt, bindArgs);. 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 20 20 20 61 70 70 6c 79 42 6c 6f 63 6b 47 75 61     applyBlockGua
8eb0: 72 64 50 6f 6c 69 63 79 28 73 74 61 74 65 6d 65  rdPolicy(stateme
8ec0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
8ed0: 20 20 20 20 20 20 20 20 20 61 74 74 61 63 68 43           attachC
8ee0: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
8ef0: 6c 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  l(cancellationSi
8f00: 67 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  gnal);.         
8f10: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b             try {
8f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f30: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 6c           final l
8f40: 6f 6e 67 20 72 65 73 75 6c 74 20 3d 20 6e 61 74  ong result = nat
8f50: 69 76 65 45 78 65 63 75 74 65 46 6f 72 43 75 72  iveExecuteForCur
8f60: 73 6f 72 57 69 6e 64 6f 77 28 0a 20 20 20 20 20  sorWindow(.     
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e             mConn
8f90: 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65  ectionPtr, state
8fa0: 6d 65 6e 74 2e 6d 53 74 61 74 65 6d 65 6e 74 50  ment.mStatementP
8fb0: 74 72 2c 20 77 69 6e 64 6f 77 2c 0a 20 20 20 20  tr, window,.    
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72              star
8fe0: 74 50 6f 73 2c 20 72 65 71 75 69 72 65 64 50 6f  tPos, requiredPo
8ff0: 73 2c 20 63 6f 75 6e 74 41 6c 6c 52 6f 77 73 29  s, countAllRows)
9000: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9010: 20 20 20 20 20 20 20 20 20 20 61 63 74 75 61 6c            actual
9020: 50 6f 73 20 3d 20 28 69 6e 74 29 28 72 65 73 75  Pos = (int)(resu
9030: 6c 74 20 3e 3e 20 33 32 29 3b 0a 20 20 20 20 20  lt >> 32);.     
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 20 20 63 6f 75 6e 74 65 64 52 6f 77 73 20 3d     countedRows =
9060: 20 28 69 6e 74 29 72 65 73 75 6c 74 3b 0a 20 20   (int)result;.  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 20 20 20 20 66 69 6c 6c 65 64 52 6f 77 73        filledRows
9090: 20 3d 20 77 69 6e 64 6f 77 2e 67 65 74 4e 75 6d   = window.getNum
90a0: 52 6f 77 73 28 29 3b 0a 20 20 20 20 20 20 20 20  Rows();.        
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 77 69 6e 64 6f 77 2e 73 65 74 53 74 61 72 74 50  window.setStartP
90d0: 6f 73 69 74 69 6f 6e 28 61 63 74 75 61 6c 50 6f  osition(actualPo
90e0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
9100: 72 6e 20 63 6f 75 6e 74 65 64 52 6f 77 73 3b 0a  rn countedRows;.
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a      } finally {.
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 20 20 20 20 20 64 65 74 61 63 68 43 61          detachCa
9150: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
9160: 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  (cancellationSig
9170: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nal);.          
9180: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9190: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69              } fi
91a0: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
91c0: 61 73 65 50 72 65 70 61 72 65 64 53 74 61 74 65  asePreparedState
91d0: 6d 65 6e 74 28 73 74 61 74 65 6d 65 6e 74 29 3b  ment(statement);
91e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
91f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
9200: 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45   catch (RuntimeE
9210: 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20  xception ex) {. 
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
9230: 52 65 63 65 6e 74 4f 70 65 72 61 74 69 6f 6e 73  RecentOperations
9240: 2e 66 61 69 6c 4f 70 65 72 61 74 69 6f 6e 28 63  .failOperation(c
9250: 6f 6f 6b 69 65 2c 20 65 78 29 3b 0a 20 20 20 20  ookie, ex);.    
9260: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
9270: 77 20 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  w ex;.          
9280: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
92a0: 20 28 6d 52 65 63 65 6e 74 4f 70 65 72 61 74 69   (mRecentOperati
92b0: 6f 6e 73 2e 65 6e 64 4f 70 65 72 61 74 69 6f 6e  ons.endOperation
92c0: 44 65 66 65 72 4c 6f 67 28 63 6f 6f 6b 69 65 29  DeferLog(cookie)
92d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
92e0: 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74 4f          mRecentO
92f0: 70 65 72 61 74 69 6f 6e 73 2e 6c 6f 67 4f 70 65  perations.logOpe
9300: 72 61 74 69 6f 6e 28 63 6f 6f 6b 69 65 2c 20 22  ration(cookie, "
9310: 77 69 6e 64 6f 77 3d 27 22 20 2b 20 77 69 6e 64  window='" + wind
9320: 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ow.             
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
9340: 20 22 27 2c 20 73 74 61 72 74 50 6f 73 3d 22 20   "', startPos=" 
9350: 2b 20 73 74 61 72 74 50 6f 73 0a 20 20 20 20 20  + startPos.     
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 20 20 2b 20 22 2c 20 61 63 74 75         + ", actu
9380: 61 6c 50 6f 73 3d 22 20 2b 20 61 63 74 75 61 6c  alPos=" + actual
9390: 50 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  Pos.            
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 2b 20 22 2c 20 66 69 6c 6c 65 64 52 6f 77 73 3d  + ", filledRows=
93c0: 22 20 2b 20 66 69 6c 6c 65 64 52 6f 77 73 0a 20  " + filledRows. 
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 2c 20             + ", 
93f0: 63 6f 75 6e 74 65 64 52 6f 77 73 3d 22 20 2b 20  countedRows=" + 
9400: 63 6f 75 6e 74 65 64 52 6f 77 73 29 3b 0a 20 20  countedRows);.  
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
9420: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9430: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
9440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69  {.            wi
9450: 6e 64 6f 77 2e 72 65 6c 65 61 73 65 52 65 66 65  ndow.releaseRefe
9460: 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20  rence();.       
9470: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
9480: 69 76 61 74 65 20 50 72 65 70 61 72 65 64 53 74  ivate PreparedSt
9490: 61 74 65 6d 65 6e 74 20 61 63 71 75 69 72 65 50  atement acquireP
94a0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
94b0: 28 53 74 72 69 6e 67 20 73 71 6c 29 20 7b 0a 20  (String sql) {. 
94c0: 20 20 20 20 20 20 20 50 72 65 70 61 72 65 64 53         PreparedS
94d0: 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65  tatement stateme
94e0: 6e 74 20 3d 20 6d 50 72 65 70 61 72 65 64 53 74  nt = mPreparedSt
94f0: 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 67 65 74  atementCache.get
9500: 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 62  (sql);.        b
9510: 6f 6f 6c 65 61 6e 20 73 6b 69 70 43 61 63 68 65  oolean skipCache
9520: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
9530: 20 20 69 66 20 28 73 74 61 74 65 6d 65 6e 74 20    if (statement 
9540: 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  != null) {.     
9550: 20 20 20 20 20 20 20 69 66 20 28 21 73 74 61 74         if (!stat
9560: 65 6d 65 6e 74 2e 6d 49 6e 55 73 65 29 20 7b 0a  ement.mInUse) {.
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 72 65 74 75 72 6e 20 73 74 61 74 65 6d 65 6e 74  return statement
9590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54              // T
95b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
95c0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
95d0: 61 63 68 65 20 62 75 74 20 69 73 20 69 6e 20 75  ache but is in u
95e0: 73 65 20 28 74 68 69 73 20 73 74 61 74 65 6d 65  se (this stateme
95f0: 6e 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20  nt appears.     
9600: 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 62 65 20         // to be 
9610: 6e 6f 74 20 6f 6e 6c 79 20 72 65 2d 65 6e 74 72  not only re-entr
9620: 61 6e 74 20 62 75 74 20 72 65 63 75 72 73 69 76  ant but recursiv
9630: 65 21 29 2e 20 20 53 6f 20 70 72 65 70 61 72 65  e!).  So prepare
9640: 20 61 20 6e 65 77 20 63 6f 70 79 20 6f 66 20 74   a new copy of t
9650: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  he.            /
9660: 2f 20 73 74 61 74 65 6d 65 6e 74 20 62 75 74 20  / statement but 
9670: 64 6f 20 6e 6f 74 20 63 61 63 68 65 20 69 74 2e  do not cache it.
9680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 6b 69  .            ski
9690: 70 43 61 63 68 65 20 3d 20 74 72 75 65 3b 0a 20  pCache = true;. 
96a0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
96b0: 20 20 66 69 6e 61 6c 20 6c 6f 6e 67 20 73 74 61    final long sta
96c0: 74 65 6d 65 6e 74 50 74 72 20 3d 20 6e 61 74 69  tementPtr = nati
96d0: 76 65 50 72 65 70 61 72 65 53 74 61 74 65 6d 65  vePrepareStateme
96e0: 6e 74 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74  nt(mConnectionPt
96f0: 72 2c 20 73 71 6c 29 3b 0a 20 20 20 20 20 20 20  r, sql);.       
9700: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
9710: 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 6e 75 6d     final int num
9720: 50 61 72 61 6d 65 74 65 72 73 20 3d 20 6e 61 74  Parameters = nat
9730: 69 76 65 47 65 74 50 61 72 61 6d 65 74 65 72 43  iveGetParameterC
9740: 6f 75 6e 74 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e  ount(mConnection
9750: 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 50 74  Ptr, statementPt
9760: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
9770: 66 69 6e 61 6c 20 69 6e 74 20 74 79 70 65 20 3d  final int type =
9780: 20 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e 67   DatabaseUtils.g
9790: 65 74 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79  etSqlStatementTy
97a0: 70 65 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20  pe(sql);.       
97b0: 20 20 20 20 20 66 69 6e 61 6c 20 62 6f 6f 6c 65       final boole
97c0: 61 6e 20 72 65 61 64 4f 6e 6c 79 20 3d 20 6e 61  an readOnly = na
97d0: 74 69 76 65 49 73 52 65 61 64 4f 6e 6c 79 28 6d  tiveIsReadOnly(m
97e0: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73  ConnectionPtr, s
97f0: 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20  tatementPtr);.  
9800: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d            statem
9810: 65 6e 74 20 3d 20 6f 62 74 61 69 6e 50 72 65 70  ent = obtainPrep
9820: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 71  aredStatement(sq
9830: 6c 2c 20 73 74 61 74 65 6d 65 6e 74 50 74 72 2c  l, statementPtr,
9840: 20 6e 75 6d 50 61 72 61 6d 65 74 65 72 73 2c 20   numParameters, 
9850: 74 79 70 65 2c 20 72 65 61 64 4f 6e 6c 79 29 3b  type, readOnly);
9860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
9870: 28 21 73 6b 69 70 43 61 63 68 65 20 26 26 20 69  (!skipCache && i
9880: 73 43 61 63 68 65 61 62 6c 65 28 74 79 70 65 29  sCacheable(type)
9890: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
98a0: 20 20 20 20 6d 50 72 65 70 61 72 65 64 53 74 61      mPreparedSta
98b0: 74 65 6d 65 6e 74 43 61 63 68 65 2e 70 75 74 28  tementCache.put(
98c0: 73 71 6c 2c 20 73 74 61 74 65 6d 65 6e 74 29 3b  sql, statement);
98d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98e0: 20 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43 61   statement.mInCa
98f0: 63 68 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  che = true;.    
9900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9910: 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e 74 69    } catch (Runti
9920: 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20  meException ex) 
9930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
9940: 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74   Finalize the st
9950: 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 20 65 78  atement if an ex
9960: 63 65 70 74 69 6f 6e 20 6f 63 63 75 72 72 65 64  ception occurred
9970: 20 61 6e 64 20 77 65 20 64 69 64 20 6e 6f 74 20   and we did not 
9980: 61 64 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  add.            
9990: 2f 2f 20 69 74 20 74 6f 20 74 68 65 20 63 61 63  // it to the cac
99a0: 68 65 2e 20 20 49 66 20 69 74 20 69 73 20 61 6c  he.  If it is al
99b0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
99c0: 68 65 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 69  he, then leave i
99d0: 74 20 74 68 65 72 65 2e 0a 20 20 20 20 20 20 20  t there..       
99e0: 20 20 20 20 20 69 66 20 28 73 74 61 74 65 6d 65       if (stateme
99f0: 6e 74 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 21 73  nt == null || !s
9a00: 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 43 61 63 68  tatement.mInCach
9a10: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
9a20: 20 20 20 20 20 6e 61 74 69 76 65 46 69 6e 61 6c       nativeFinal
9a30: 69 7a 65 53 74 61 74 65 6d 65 6e 74 28 6d 43 6f  izeStatement(mCo
9a40: 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61  nnectionPtr, sta
9a50: 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20  tementPtr);.    
9a60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9a70: 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a        throw ex;.
9a80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9a90: 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e 55    statement.mInU
9aa0: 73 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  se = true;.     
9ab0: 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 6d     return statem
9ac0: 65 6e 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ent;.    }..    
9ad0: 70 72 69 76 61 74 65 20 76 6f 69 64 20 72 65 6c  private void rel
9ae0: 65 61 73 65 50 72 65 70 61 72 65 64 53 74 61 74  easePreparedStat
9af0: 65 6d 65 6e 74 28 50 72 65 70 61 72 65 64 53 74  ement(PreparedSt
9b00: 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e  atement statemen
9b10: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 73 74 61  t) {.        sta
9b20: 74 65 6d 65 6e 74 2e 6d 49 6e 55 73 65 20 3d 20  tement.mInUse = 
9b30: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 69  false;.        i
9b40: 66 20 28 73 74 61 74 65 6d 65 6e 74 2e 6d 49 6e  f (statement.mIn
9b50: 43 61 63 68 65 29 20 7b 0a 20 20 20 20 20 20 20  Cache) {.       
9b60: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
9b70: 20 20 20 20 20 20 20 20 20 20 20 6e 61 74 69 76             nativ
9b80: 65 52 65 73 65 74 53 74 61 74 65 6d 65 6e 74 41  eResetStatementA
9b90: 6e 64 43 6c 65 61 72 42 69 6e 64 69 6e 67 73 28  ndClearBindings(
9ba0: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20  mConnectionPtr, 
9bb0: 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65  statement.mState
9bc0: 6d 65 6e 74 50 74 72 29 3b 0a 20 20 20 20 20 20  mentPtr);.      
9bd0: 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 53        } catch (S
9be0: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 65  QLiteException e
9bf0: 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x) {.           
9c00: 20 20 20 20 20 2f 2f 20 54 68 65 20 73 74 61 74       // The stat
9c10: 65 6d 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ement could not 
9c20: 62 65 20 72 65 73 65 74 20 64 75 65 20 74 6f 20  be reset due to 
9c30: 61 6e 20 65 72 72 6f 72 2e 20 20 52 65 6d 6f 76  an error.  Remov
9c40: 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 63 61  e it from the ca
9c50: 63 68 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  che..           
9c60: 20 20 20 20 20 2f 2f 20 57 68 65 6e 20 72 65 6d       // When rem
9c70: 6f 76 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ove() is called,
9c80: 20 74 68 65 20 63 61 63 68 65 20 77 69 6c 6c 20   the cache will 
9c90: 69 6e 76 6f 6b 65 20 69 74 73 20 65 6e 74 72 79  invoke its entry
9ca0: 52 65 6d 6f 76 65 64 28 29 20 63 61 6c 6c 62 61  Removed() callba
9cb0: 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck,.            
9cc0: 20 20 20 20 2f 2f 20 77 68 69 63 68 20 77 69 6c      // which wil
9cd0: 6c 20 69 6e 20 74 75 72 6e 20 63 61 6c 6c 20 66  l in turn call f
9ce0: 69 6e 61 6c 69 7a 65 50 72 65 70 61 72 65 64 53  inalizePreparedS
9cf0: 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 20 66 69  tatement() to fi
9d00: 6e 61 6c 69 7a 65 20 61 6e 64 0a 20 20 20 20 20  nalize and.     
9d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65             // re
9d20: 63 79 63 6c 65 20 74 68 65 20 73 74 61 74 65 6d  cycle the statem
9d30: 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ent..           
9d40: 20 20 20 20 20 69 66 20 28 44 45 42 55 47 29 20       if (DEBUG) 
9d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9d60: 20 20 20 20 20 20 4c 6f 67 2e 64 28 54 41 47 2c        Log.d(TAG,
9d70: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 73 65   "Could not rese
9d80: 74 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  t prepared state
9d90: 6d 65 6e 74 20 64 75 65 20 74 6f 20 61 6e 20 65  ment due to an e
9da0: 78 63 65 70 74 69 6f 6e 2e 20 20 22 0a 20 20 20  xception.  ".   
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 2b 20 22 52 65 6d 6f           + "Remo
9dd0: 76 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65  ving it from the
9de0: 20 63 61 63 68 65 2e 20 20 53 51 4c 3a 20 22 0a   cache.  SQL: ".
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 74 72              + tr
9e10: 69 6d 53 71 6c 46 6f 72 44 69 73 70 6c 61 79 28  imSqlForDisplay(
9e20: 73 74 61 74 65 6d 65 6e 74 2e 6d 53 71 6c 29 2c  statement.mSql),
9e30: 20 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20   ex);.          
9e40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
9e50: 20 20 20 20 20 20 20 20 20 6d 50 72 65 70 61 72           mPrepar
9e60: 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65  edStatementCache
9e70: 2e 72 65 6d 6f 76 65 28 73 74 61 74 65 6d 65 6e  .remove(statemen
9e80: 74 2e 6d 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t.mSql);.       
9e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9ea0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
9eb0: 20 20 20 20 66 69 6e 61 6c 69 7a 65 50 72 65 70      finalizePrep
9ec0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28 73 74  aredStatement(st
9ed0: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
9ee0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
9ef0: 72 69 76 61 74 65 20 76 6f 69 64 20 66 69 6e 61  rivate void fina
9f00: 6c 69 7a 65 50 72 65 70 61 72 65 64 53 74 61 74  lizePreparedStat
9f10: 65 6d 65 6e 74 28 50 72 65 70 61 72 65 64 53 74  ement(PreparedSt
9f20: 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e  atement statemen
9f30: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6e 61 74  t) {.        nat
9f40: 69 76 65 46 69 6e 61 6c 69 7a 65 53 74 61 74 65  iveFinalizeState
9f50: 6d 65 6e 74 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e  ment(mConnection
9f60: 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 2e 6d  Ptr, statement.m
9f70: 53 74 61 74 65 6d 65 6e 74 50 74 72 29 3b 0a 20  StatementPtr);. 
9f80: 20 20 20 20 20 20 20 72 65 63 79 63 6c 65 50 72         recyclePr
9f90: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28  eparedStatement(
9fa0: 73 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  statement);.    
9fb0: 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  }..    private v
9fc0: 6f 69 64 20 61 74 74 61 63 68 43 61 6e 63 65 6c  oid attachCancel
9fd0: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 28 43 61 6e  lationSignal(Can
9fe0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
9ff0: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  cancellationSign
a000: 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  al) {.        if
a010: 20 28 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69   (cancellationSi
a020: 67 6e 61 6c 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a  gnal != null) {.
a030: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6e 63              canc
a040: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 2e 74  ellationSignal.t
a050: 68 72 6f 77 49 66 43 61 6e 63 65 6c 65 64 28 29  hrowIfCanceled()
a060: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ;..            m
a070: 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  CancellationSign
a080: 61 6c 41 74 74 61 63 68 43 6f 75 6e 74 20 2b 3d  alAttachCount +=
a090: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
a0a0: 69 66 20 28 6d 43 61 6e 63 65 6c 6c 61 74 69 6f  if (mCancellatio
a0b0: 6e 53 69 67 6e 61 6c 41 74 74 61 63 68 43 6f 75  nSignalAttachCou
a0c0: 6e 74 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20  nt == 1) {.     
a0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65             // Re
a0e0: 73 65 74 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e  set cancellation
a0f0: 20 66 6c 61 67 20 62 65 66 6f 72 65 20 65 78 65   flag before exe
a100: 63 75 74 69 6e 67 20 74 68 65 20 73 74 61 74 65  cuting the state
a110: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
a120: 20 20 20 20 20 20 6e 61 74 69 76 65 52 65 73 65        nativeRese
a130: 74 43 61 6e 63 65 6c 28 6d 43 6f 6e 6e 65 63 74  tCancel(mConnect
a140: 69 6f 6e 50 74 72 2c 20 74 72 75 65 20 2f 2a 63  ionPtr, true /*c
a150: 61 6e 63 65 6c 61 62 6c 65 2a 2f 29 3b 0a 0a 20  ancelable*/);.. 
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a170: 2f 20 41 66 74 65 72 20 74 68 69 73 20 70 6f 69  / After this poi
a180: 6e 74 2c 20 6f 6e 43 61 6e 63 65 6c 28 29 20 6d  nt, onCancel() m
a190: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 63 6f 6e  ay be called con
a1a0: 63 75 72 72 65 6e 74 6c 79 2e 0a 20 20 20 20 20  currently..     
a1b0: 20 20 20 20 20 20 20 20 20 20 20 63 61 6e 63 65             cance
a1c0: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 2e 73 65  llationSignal.se
a1d0: 74 4f 6e 43 61 6e 63 65 6c 4c 69 73 74 65 6e 65  tOnCancelListene
a1e0: 72 28 74 68 69 73 29 3b 0a 20 20 20 20 20 20 20  r(this);.       
a1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  .    }..    priv
a210: 61 74 65 20 76 6f 69 64 20 64 65 74 61 63 68 43  ate void detachC
a220: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
a230: 6c 28 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  l(CancellationSi
a240: 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61 74 69 6f  gnal cancellatio
a250: 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20 20 20 20  nSignal) {.     
a260: 20 20 20 69 66 20 28 63 61 6e 63 65 6c 6c 61 74     if (cancellat
a270: 69 6f 6e 53 69 67 6e 61 6c 20 21 3d 20 6e 75 6c  ionSignal != nul
a280: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
a290: 20 61 73 73 65 72 74 20 6d 43 61 6e 63 65 6c 6c   assert mCancell
a2a0: 61 74 69 6f 6e 53 69 67 6e 61 6c 41 74 74 61 63  ationSignalAttac
a2b0: 68 43 6f 75 6e 74 20 3e 20 30 3b 0a 0a 20 20 20  hCount > 0;..   
a2c0: 20 20 20 20 20 20 20 20 20 6d 43 61 6e 63 65 6c           mCancel
a2d0: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 41 74 74 61  lationSignalAtta
a2e0: 63 68 43 6f 75 6e 74 20 2d 3d 20 31 3b 0a 20 20  chCount -= 1;.  
a2f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 43            if (mC
a300: 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61  ancellationSigna
a310: 6c 41 74 74 61 63 68 43 6f 75 6e 74 20 3d 3d 20  lAttachCount == 
a320: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
a330: 20 20 20 20 20 2f 2f 20 41 66 74 65 72 20 74 68       // After th
a340: 69 73 20 70 6f 69 6e 74 2c 20 6f 6e 43 61 6e 63  is point, onCanc
a350: 65 6c 28 29 20 63 61 6e 6e 6f 74 20 62 65 20 63  el() cannot be c
a360: 61 6c 6c 65 64 20 63 6f 6e 63 75 72 72 65 6e 74  alled concurrent
a370: 6c 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
a380: 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e      cancellation
a390: 53 69 67 6e 61 6c 2e 73 65 74 4f 6e 43 61 6e 63  Signal.setOnCanc
a3a0: 65 6c 4c 69 73 74 65 6e 65 72 28 6e 75 6c 6c 29  elListener(null)
a3b0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
a3c0: 20 20 20 2f 2f 20 52 65 73 65 74 20 63 61 6e 63     // Reset canc
a3d0: 65 6c 6c 61 74 69 6f 6e 20 66 6c 61 67 20 61 66  ellation flag af
a3e0: 74 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68  ter executing th
a3f0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  e statement..   
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 74               nat
a410: 69 76 65 52 65 73 65 74 43 61 6e 63 65 6c 28 6d  iveResetCancel(m
a420: 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20 66  ConnectionPtr, f
a430: 61 6c 73 65 20 2f 2a 63 61 6e 63 65 6c 61 62 6c  alse /*cancelabl
a440: 65 2a 2f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e*/);.          
a450: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a460: 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 43 61 6e 63    }..    // Canc
a470: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 2e 4f  ellationSignal.O
a480: 6e 43 61 6e 63 65 6c 4c 69 73 74 65 6e 65 72 20  nCancelListener 
a490: 63 61 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2f 2f  callback..    //
a4a0: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 6d 61 79   This method may
a4b0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
a4c0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
a4d0: 20 74 68 61 6e 20 74 68 65 20 65 78 65 63 75 74   than the execut
a4e0: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ing statement.. 
a4f0: 20 20 20 2f 2f 20 48 6f 77 65 76 65 72 2c 20 69     // However, i
a500: 74 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 63  t will only be c
a510: 61 6c 6c 65 64 20 62 65 74 77 65 65 6e 20 63 61  alled between ca
a520: 6c 6c 73 20 74 6f 20 61 74 74 61 63 68 43 61 6e  lls to attachCan
a530: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
a540: 61 6e 64 0a 20 20 20 20 2f 2f 20 64 65 74 61 63  and.    // detac
a550: 68 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  hCancellationSig
a560: 6e 61 6c 2c 20 77 68 69 6c 65 20 61 20 73 74 61  nal, while a sta
a570: 74 65 6d 65 6e 74 20 69 73 20 65 78 65 63 75 74  tement is execut
a580: 69 6e 67 2e 20 20 57 65 20 63 61 6e 20 73 61 66  ing.  We can saf
a590: 65 6c 79 20 61 73 73 75 6d 65 0a 20 20 20 20 2f  ely assume.    /
a5a0: 2f 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  / that the SQLit
a5b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
a5c0: 73 74 69 6c 6c 20 61 6c 69 76 65 2e 0a 20 20 20  still alive..   
a5d0: 20 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20 70   @Override.    p
a5e0: 75 62 6c 69 63 20 76 6f 69 64 20 6f 6e 43 61 6e  ublic void onCan
a5f0: 63 65 6c 28 29 20 7b 0a 20 20 20 20 20 20 20 20  cel() {.        
a600: 6e 61 74 69 76 65 43 61 6e 63 65 6c 28 6d 43 6f  nativeCancel(mCo
a610: 6e 6e 65 63 74 69 6f 6e 50 74 72 29 3b 0a 20 20  nnectionPtr);.  
a620: 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65    }..    private
a630: 20 76 6f 69 64 20 62 69 6e 64 41 72 67 75 6d 65   void bindArgume
a640: 6e 74 73 28 50 72 65 70 61 72 65 64 53 74 61 74  nts(PreparedStat
a650: 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 2c  ement statement,
a660: 20 4f 62 6a 65 63 74 5b 5d 20 62 69 6e 64 41 72   Object[] bindAr
a670: 67 73 29 20 7b 0a 20 20 20 20 20 20 20 20 66 69  gs) {.        fi
a680: 6e 61 6c 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20  nal int count = 
a690: 62 69 6e 64 41 72 67 73 20 21 3d 20 6e 75 6c 6c  bindArgs != null
a6a0: 20 3f 20 62 69 6e 64 41 72 67 73 2e 6c 65 6e 67   ? bindArgs.leng
a6b0: 74 68 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  th : 0;.        
a6c0: 69 66 20 28 63 6f 75 6e 74 20 21 3d 20 73 74 61  if (count != sta
a6d0: 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d  tement.mNumParam
a6e0: 65 74 65 72 73 29 20 7b 0a 20 20 20 20 20 20 20  eters) {.       
a6f0: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 53       throw new S
a700: 51 4c 69 74 65 42 69 6e 64 4f 72 43 6f 6c 75 6d  QLiteBindOrColum
a710: 6e 49 6e 64 65 78 4f 75 74 4f 66 52 61 6e 67 65  nIndexOutOfRange
a720: 45 78 63 65 70 74 69 6f 6e 28 0a 20 20 20 20 20  Exception(.     
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
a740: 45 78 70 65 63 74 65 64 20 22 20 2b 20 73 74 61  Expected " + sta
a750: 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72 61 6d  tement.mNumParam
a760: 65 74 65 72 73 20 2b 20 22 20 62 69 6e 64 20 61  eters + " bind a
a770: 72 67 75 6d 65 6e 74 73 20 62 75 74 20 22 0a 20  rguments but ". 
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 2b 20 63 6f 75 6e 74 20 2b 20 22 20 77     + count + " w
a7a0: 65 72 65 20 70 72 6f 76 69 64 65 64 2e 22 29 3b  ere provided.");
a7b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a7c0: 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20     if (count == 
a7d0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
a7e0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a7f0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61   }..        fina
a800: 6c 20 6c 6f 6e 67 20 73 74 61 74 65 6d 65 6e 74  l long statement
a810: 50 74 72 20 3d 20 73 74 61 74 65 6d 65 6e 74 2e  Ptr = statement.
a820: 6d 53 74 61 74 65 6d 65 6e 74 50 74 72 3b 0a 20  mStatementPtr;. 
a830: 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20         for (int 
a840: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6f 75 6e 74  i = 0; i < count
a850: 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  ; i++) {.       
a860: 20 20 20 20 20 66 69 6e 61 6c 20 4f 62 6a 65 63       final Objec
a870: 74 20 61 72 67 20 3d 20 62 69 6e 64 41 72 67 73  t arg = bindArgs
a880: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
a890: 20 73 77 69 74 63 68 20 28 45 78 74 72 61 55 74   switch (ExtraUt
a8a0: 69 6c 73 2e 67 65 74 54 79 70 65 4f 66 4f 62 6a  ils.getTypeOfObj
a8b0: 65 63 74 28 61 72 67 29 29 20 7b 0a 20 20 20 20  ect(arg)) {.    
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
a8d0: 20 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59   Cursor.FIELD_TY
a8e0: 50 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  PE_NULL:.       
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 74               nat
a900: 69 76 65 42 69 6e 64 4e 75 6c 6c 28 6d 43 6f 6e  iveBindNull(mCon
a910: 6e 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74  nectionPtr, stat
a920: 65 6d 65 6e 74 50 74 72 2c 20 69 20 2b 20 31 29  ementPtr, i + 1)
a930: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a940: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
a960: 65 20 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f 54  e Cursor.FIELD_T
a970: 59 50 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20  YPE_INTEGER:.   
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 20 6e 61 74 69 76 65 42 69 6e 64 4c 6f 6e 67 28   nativeBindLong(
a9a0: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 2c 20  mConnectionPtr, 
a9b0: 73 74 61 74 65 6d 65 6e 74 50 74 72 2c 20 69 20  statementPtr, i 
a9c0: 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  + 1,.           
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 28 28 4e 75 6d 62 65 72 29 61 72 67 29 2e 6c   ((Number)arg).l
a9f0: 6f 6e 67 56 61 6c 75 65 28 29 29 3b 0a 20 20 20  ongValue());.   
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
aa20: 20 20 20 20 20 20 20 20 63 61 73 65 20 43 75 72          case Cur
aa30: 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f 46  sor.FIELD_TYPE_F
aa40: 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20 20  LOAT:.          
aa50: 20 20 20 20 20 20 20 20 20 20 6e 61 74 69 76 65            native
aa60: 42 69 6e 64 44 6f 75 62 6c 65 28 6d 43 6f 6e 6e  BindDouble(mConn
aa70: 65 63 74 69 6f 6e 50 74 72 2c 20 73 74 61 74 65  ectionPtr, state
aa80: 6d 65 6e 74 50 74 72 2c 20 69 20 2b 20 31 2c 0a  mentPtr, i + 1,.
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 4e 75              ((Nu
aab0: 6d 62 65 72 29 61 72 67 29 2e 64 6f 75 62 6c 65  mber)arg).double
aac0: 56 61 6c 75 65 28 29 29 3b 0a 20 20 20 20 20 20  Value());.      
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
aae0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
aaf0: 20 20 20 20 20 63 61 73 65 20 43 75 72 73 6f 72       case Cursor
ab00: 2e 46 49 45 4c 44 5f 54 59 50 45 5f 42 4c 4f 42  .FIELD_TYPE_BLOB
ab10: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
ab20: 20 20 20 20 20 20 6e 61 74 69 76 65 42 69 6e 64        nativeBind
ab30: 42 6c 6f 62 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e  Blob(mConnection
ab40: 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 50 74  Ptr, statementPt
ab50: 72 2c 20 69 20 2b 20 31 2c 20 28 62 79 74 65 5b  r, i + 1, (byte[
ab60: 5d 29 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ])arg);.        
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ab80: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
ab90: 20 20 20 63 61 73 65 20 43 75 72 73 6f 72 2e 46     case Cursor.F
aba0: 49 45 4c 44 5f 54 59 50 45 5f 53 54 52 49 4e 47  IELD_TYPE_STRING
abb0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
abc0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
abe0: 66 20 28 61 72 67 20 69 6e 73 74 61 6e 63 65 6f  f (arg instanceo
abf0: 66 20 42 6f 6f 6c 65 61 6e 29 20 7b 0a 20 20 20  f Boolean) {.   
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac10: 20 20 20 20 20 2f 2f 20 50 72 6f 76 69 64 65 20       // Provide 
ac20: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
ac30: 74 68 20 6c 65 67 61 63 79 20 61 70 70 6c 69 63  th legacy applic
ac40: 61 74 69 6f 6e 73 20 77 68 69 63 68 20 6d 61 79  ations which may
ac50: 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 20 20   pass.          
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
ac70: 20 42 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   Boolean values 
ac80: 69 6e 20 62 69 6e 64 20 61 72 67 73 2e 0a 20 20  in bind args..  
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 20 20 20 6e 61 74 69 76 65 42 69 6e 64        nativeBind
acb0: 4c 6f 6e 67 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e  Long(mConnection
acc0: 50 74 72 2c 20 73 74 61 74 65 6d 65 6e 74 50 74  Ptr, statementPt
acd0: 72 2c 20 69 20 2b 20 31 2c 0a 20 20 20 20 20 20  r, i + 1,.      
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 20 20 20 20 20 20 20 20 28 28 42 6f 6f 6c            ((Bool
ad00: 65 61 6e 29 61 72 67 29 2e 62 6f 6f 6c 65 61 6e  ean)arg).boolean
ad10: 56 61 6c 75 65 28 29 20 3f 20 31 20 3a 20 30 29  Value() ? 1 : 0)
ad20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ad30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 20 20 20 20 6e 61 74 69 76 65 42 69 6e         nativeBin
ad60: 64 53 74 72 69 6e 67 28 6d 43 6f 6e 6e 65 63 74  dString(mConnect
ad70: 69 6f 6e 50 74 72 2c 20 73 74 61 74 65 6d 65 6e  ionPtr, statemen
ad80: 74 50 74 72 2c 20 69 20 2b 20 31 2c 20 61 72 67  tPtr, i + 1, arg
ad90: 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20  .toString());.  
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
adc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
add0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ade0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
adf0: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 74    private void t
ae00: 68 72 6f 77 49 66 53 74 61 74 65 6d 65 6e 74 46  hrowIfStatementF
ae10: 6f 72 62 69 64 64 65 6e 28 50 72 65 70 61 72 65  orbidden(Prepare
ae20: 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65  dStatement state
ae30: 6d 65 6e 74 29 20 7b 0a 20 20 20 20 20 20 20 20  ment) {.        
ae40: 69 66 20 28 6d 4f 6e 6c 79 41 6c 6c 6f 77 52 65  if (mOnlyAllowRe
ae50: 61 64 4f 6e 6c 79 4f 70 65 72 61 74 69 6f 6e 73  adOnlyOperations
ae60: 20 26 26 20 21 73 74 61 74 65 6d 65 6e 74 2e 6d   && !statement.m
ae70: 52 65 61 64 4f 6e 6c 79 29 20 7b 0a 20 20 20 20  ReadOnly) {.    
ae80: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
ae90: 77 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f  w SQLiteExceptio
aea0: 6e 28 22 43 61 6e 6e 6f 74 20 65 78 65 63 75 74  n("Cannot execut
aeb0: 65 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  e this statement
aec0: 20 62 65 63 61 75 73 65 20 69 74 20 22 0a 20 20   because it ".  
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 2b 20 22 6d 69 67 68 74 20 6d 6f 64 69 66    + "might modif
aef0: 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  y the database b
af00: 75 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ut the connectio
af10: 6e 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 22  n is read-only."
af20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
af30: 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20   }..    private 
af40: 73 74 61 74 69 63 20 62 6f 6f 6c 65 61 6e 20 69  static boolean i
af50: 73 43 61 63 68 65 61 62 6c 65 28 69 6e 74 20 73  sCacheable(int s
af60: 74 61 74 65 6d 65 6e 74 54 79 70 65 29 20 7b 0a  tatementType) {.
af70: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61 74          if (stat
af80: 65 6d 65 6e 74 54 79 70 65 20 3d 3d 20 44 61 74  ementType == Dat
af90: 61 62 61 73 65 55 74 69 6c 73 2e 53 54 41 54 45  abaseUtils.STATE
afa0: 4d 45 4e 54 5f 55 50 44 41 54 45 0a 20 20 20 20  MENT_UPDATE.    
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
afc0: 74 61 74 65 6d 65 6e 74 54 79 70 65 20 3d 3d 20  tatementType == 
afd0: 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e 53 54  DatabaseUtils.ST
afe0: 41 54 45 4d 45 4e 54 5f 53 45 4c 45 43 54 29 20  ATEMENT_SELECT) 
aff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
b000: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20  turn true;.     
b010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
b020: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
b030: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  ..    private vo
b040: 69 64 20 61 70 70 6c 79 42 6c 6f 63 6b 47 75 61  id applyBlockGua
b050: 72 64 50 6f 6c 69 63 79 28 50 72 65 70 61 72 65  rdPolicy(Prepare
b060: 64 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65  dStatement state
b070: 6d 65 6e 74 29 20 7b 0a 2f 2a 20 20 20 20 20 20  ment) {./*      
b080: 20 20 69 66 20 28 21 6d 43 6f 6e 66 69 67 75 72    if (!mConfigur
b090: 61 74 69 6f 6e 2e 69 73 49 6e 4d 65 6d 6f 72 79  ation.isInMemory
b0a0: 44 62 28 29 29 20 7b 2a 2f 0a 2f 2a 20 20 20 20  Db()) {*/./*    
b0b0: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61 74          if (stat
b0c0: 65 6d 65 6e 74 2e 6d 52 65 61 64 4f 6e 6c 79 29  ement.mReadOnly)
b0d0: 20 7b 2a 2f 0a 2f 2a 20 20 20 20 20 20 20 20 20   {*/./*         
b0e0: 20 20 20 20 20 20 20 42 6c 6f 63 6b 47 75 61 72         BlockGuar
b0f0: 64 2e 67 65 74 54 68 72 65 61 64 50 6f 6c 69 63  d.getThreadPolic
b100: 79 28 29 2e 6f 6e 52 65 61 64 46 72 6f 6d 44 69  y().onReadFromDi
b110: 73 6b 28 29 3b 2a 2f 0a 2f 2a 20 20 20 20 20 20  sk();*/./*      
b120: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 2a 2f        } else {*/
b130: 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  ./*             
b140: 20 20 20 42 6c 6f 63 6b 47 75 61 72 64 2e 67 65     BlockGuard.ge
b150: 74 54 68 72 65 61 64 50 6f 6c 69 63 79 28 29 2e  tThreadPolicy().
b160: 6f 6e 57 72 69 74 65 54 6f 44 69 73 6b 28 29 3b  onWriteToDisk();
b170: 2a 2f 0a 2f 2a 20 20 20 20 20 20 20 20 20 20 20  */./*           
b180: 20 7d 2a 2f 0a 2f 2a 20 20 20 20 20 20 20 20 7d   }*/./*        }
b190: 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
b1a0: 2a 0a 20 20 20 20 20 2a 20 44 75 6d 70 73 20 64  *.     * Dumps d
b1b0: 65 62 75 67 67 69 6e 67 20 69 6e 66 6f 72 6d 61  ebugging informa
b1c0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
b1d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20  connection..    
b1e0: 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d   *.     * @param
b1f0: 20 70 72 69 6e 74 65 72 20 54 68 65 20 70 72 69   printer The pri
b200: 6e 74 65 72 20 74 6f 20 72 65 63 65 69 76 65 20  nter to receive 
b210: 74 68 65 20 64 75 6d 70 2c 20 6e 6f 74 20 6e 75  the dump, not nu
b220: 6c 6c 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ll..     * @para
b230: 6d 20 76 65 72 62 6f 73 65 20 54 72 75 65 20 74  m verbose True t
b240: 6f 20 64 75 6d 70 20 6d 6f 72 65 20 76 65 72 62  o dump more verb
b250: 6f 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ose information.
b260: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
b270: 6c 69 63 20 76 6f 69 64 20 64 75 6d 70 28 50 72  lic void dump(Pr
b280: 69 6e 74 65 72 20 70 72 69 6e 74 65 72 2c 20 62  inter printer, b
b290: 6f 6f 6c 65 61 6e 20 76 65 72 62 6f 73 65 29 20  oolean verbose) 
b2a0: 7b 0a 20 20 20 20 20 20 20 20 64 75 6d 70 55 6e  {.        dumpUn
b2b0: 73 61 66 65 28 70 72 69 6e 74 65 72 2c 20 76 65  safe(printer, ve
b2c0: 72 62 6f 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  rbose);.    }.. 
b2d0: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 44 75     /**.     * Du
b2e0: 6d 70 73 20 64 65 62 75 67 67 69 6e 67 20 69 6e  mps debugging in
b2f0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
b300: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  this connection,
b310: 20 69 6e 20 74 68 65 20 63 61 73 65 20 77 68 65   in the case whe
b320: 72 65 20 74 68 65 0a 20 20 20 20 20 2a 20 63 61  re the.     * ca
b330: 6c 6c 65 72 20 6d 69 67 68 74 20 6e 6f 74 20 61  ller might not a
b340: 63 74 75 61 6c 6c 79 20 6f 77 6e 20 74 68 65 20  ctually own the 
b350: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20  connection..    
b360: 20 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 66   *.     * This f
b370: 75 6e 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  unction is writt
b380: 65 6e 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  en so that it ma
b390: 79 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 61  y be called by a
b3a0: 20 74 68 72 65 61 64 20 74 68 61 74 20 64 6f 65   thread that doe
b3b0: 73 20 6e 6f 74 0a 20 20 20 20 20 2a 20 6f 77 6e  s not.     * own
b3c0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e   the connection.
b3d0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 62 65 20    We need to be 
b3e0: 76 65 72 79 20 63 61 72 65 66 75 6c 20 62 65 63  very careful bec
b3f0: 61 75 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  ause the connect
b400: 69 6f 6e 20 73 74 61 74 65 20 69 73 0a 20 20 20  ion state is.   
b410: 20 20 2a 20 6e 6f 74 20 73 79 6e 63 68 72 6f 6e    * not synchron
b420: 69 7a 65 64 2e 0a 20 20 20 20 20 2a 0a 20 20 20  ized..     *.   
b430: 20 20 2a 20 41 74 20 77 6f 72 73 74 2c 20 74 68    * At worst, th
b440: 65 20 6d 65 74 68 6f 64 20 6d 61 79 20 72 65 74  e method may ret
b450: 75 72 6e 20 73 74 61 6c 65 20 6f 72 20 73 6c 69  urn stale or sli
b460: 67 68 74 6c 79 20 77 72 6f 6e 67 20 64 61 74 61  ghtly wrong data
b470: 2c 20 68 6f 77 65 76 65 72 0a 20 20 20 20 20 2a  , however.     *
b480: 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63   it should not c
b490: 72 61 73 68 2e 20 20 54 68 69 73 20 69 73 20 6f  rash.  This is o
b4a0: 6b 20 61 73 20 69 74 20 69 73 20 6f 6e 6c 79 20  k as it is only 
b4b0: 75 73 65 64 20 66 6f 72 20 64 69 61 67 6e 6f 73  used for diagnos
b4c0: 74 69 63 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  tic purposes..  
b4d0: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
b4e0: 61 6d 20 70 72 69 6e 74 65 72 20 54 68 65 20 70  am printer The p
b4f0: 72 69 6e 74 65 72 20 74 6f 20 72 65 63 65 69 76  rinter to receiv
b500: 65 20 74 68 65 20 64 75 6d 70 2c 20 6e 6f 74 20  e the dump, not 
b510: 6e 75 6c 6c 2e 0a 20 20 20 20 20 2a 20 40 70 61  null..     * @pa
b520: 72 61 6d 20 76 65 72 62 6f 73 65 20 54 72 75 65  ram verbose True
b530: 20 74 6f 20 64 75 6d 70 20 6d 6f 72 65 20 76 65   to dump more ve
b540: 72 62 6f 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  rbose informatio
b550: 6e 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 76  n..     */.    v
b560: 6f 69 64 20 64 75 6d 70 55 6e 73 61 66 65 28 50  oid dumpUnsafe(P
b570: 72 69 6e 74 65 72 20 70 72 69 6e 74 65 72 2c 20  rinter printer, 
b580: 62 6f 6f 6c 65 61 6e 20 76 65 72 62 6f 73 65 29  boolean verbose)
b590: 20 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74   {.        print
b5a0: 65 72 2e 70 72 69 6e 74 6c 6e 28 22 43 6f 6e 6e  er.println("Conn
b5b0: 65 63 74 69 6f 6e 20 23 22 20 2b 20 6d 43 6f 6e  ection #" + mCon
b5c0: 6e 65 63 74 69 6f 6e 49 64 20 2b 20 22 3a 22 29  nectionId + ":")
b5d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 76 65  ;.        if (ve
b5e0: 72 62 6f 73 65 29 20 7b 0a 20 20 20 20 20 20 20  rbose) {.       
b5f0: 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69       printer.pri
b600: 6e 74 6c 6e 28 22 20 20 63 6f 6e 6e 65 63 74 69  ntln("  connecti
b610: 6f 6e 50 74 72 3a 20 30 78 22 20 2b 20 4c 6f 6e  onPtr: 0x" + Lon
b620: 67 2e 74 6f 48 65 78 53 74 72 69 6e 67 28 6d 43  g.toHexString(mC
b630: 6f 6e 6e 65 63 74 69 6f 6e 50 74 72 29 29 3b 0a  onnectionPtr));.
b640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b650: 20 20 70 72 69 6e 74 65 72 2e 70 72 69 6e 74 6c    printer.printl
b660: 6e 28 22 20 20 69 73 50 72 69 6d 61 72 79 43 6f  n("  isPrimaryCo
b670: 6e 6e 65 63 74 69 6f 6e 3a 20 22 20 2b 20 6d 49  nnection: " + mI
b680: 73 50 72 69 6d 61 72 79 43 6f 6e 6e 65 63 74 69  sPrimaryConnecti
b690: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 72 69  on);.        pri
b6a0: 6e 74 65 72 2e 70 72 69 6e 74 6c 6e 28 22 20 20  nter.println("  
b6b0: 6f 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f 6e 6c  onlyAllowReadOnl
b6c0: 79 4f 70 65 72 61 74 69 6f 6e 73 3a 20 22 20 2b  yOperations: " +
b6d0: 20 6d 4f 6e 6c 79 41 6c 6c 6f 77 52 65 61 64 4f   mOnlyAllowReadO
b6e0: 6e 6c 79 4f 70 65 72 61 74 69 6f 6e 73 29 3b 0a  nlyOperations);.
b6f0: 0a 20 20 20 20 20 20 20 20 6d 52 65 63 65 6e 74  .        mRecent
b700: 4f 70 65 72 61 74 69 6f 6e 73 2e 64 75 6d 70 28  Operations.dump(
b710: 70 72 69 6e 74 65 72 2c 20 76 65 72 62 6f 73 65  printer, verbose
b720: 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28  );..        if (
b730: 76 65 72 62 6f 73 65 29 20 7b 0a 20 20 20 20 20  verbose) {.     
b740: 20 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64         mPrepared
b750: 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65 2e 64  StatementCache.d
b760: 75 6d 70 28 70 72 69 6e 74 65 72 29 3b 0a 20 20  ump(printer);.  
b770: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b780: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 44 65     /**.     * De
b790: 73 63 72 69 62 65 73 20 74 68 65 20 63 75 72 72  scribes the curr
b7a0: 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67 20  ently executing 
b7b0: 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 74 68  operation, in th
b7c0: 65 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  e case where the
b7d0: 0a 20 20 20 20 20 2a 20 63 61 6c 6c 65 72 20 6d  .     * caller m
b7e0: 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
b7f0: 79 20 6f 77 6e 20 74 68 65 20 63 6f 6e 6e 65 63  y own the connec
b800: 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20  tion..     *.   
b810: 20 20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f    * This functio
b820: 6e 20 69 73 20 77 72 69 74 74 65 6e 20 73 6f 20  n is written so 
b830: 74 68 61 74 20 69 74 20 6d 61 79 20 62 65 20 63  that it may be c
b840: 61 6c 6c 65 64 20 62 79 20 61 20 74 68 72 65 61  alled by a threa
b850: 64 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  d that does not.
b860: 20 20 20 20 20 2a 20 6f 77 6e 20 74 68 65 20 63       * own the c
b870: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 57 65 20 6e  onnection.  We n
b880: 65 65 64 20 74 6f 20 62 65 20 76 65 72 79 20 63  eed to be very c
b890: 61 72 65 66 75 6c 20 62 65 63 61 75 73 65 20 74  areful because t
b8a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
b8b0: 61 74 65 20 69 73 0a 20 20 20 20 20 2a 20 6e 6f  ate is.     * no
b8c0: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 2e 0a  t synchronized..
b8d0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 74       *.     * At
b8e0: 20 77 6f 72 73 74 2c 20 74 68 65 20 6d 65 74 68   worst, the meth
b8f0: 6f 64 20 6d 61 79 20 72 65 74 75 72 6e 20 73 74  od may return st
b900: 61 6c 65 20 6f 72 20 73 6c 69 67 68 74 6c 79 20  ale or slightly 
b910: 77 72 6f 6e 67 20 64 61 74 61 2c 20 68 6f 77 65  wrong data, howe
b920: 76 65 72 0a 20 20 20 20 20 2a 20 69 74 20 73 68  ver.     * it sh
b930: 6f 75 6c 64 20 6e 6f 74 20 63 72 61 73 68 2e 20  ould not crash. 
b940: 20 54 68 69 73 20 69 73 20 6f 6b 20 61 73 20 69   This is ok as i
b950: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  t is only used f
b960: 6f 72 20 64 69 61 67 6e 6f 73 74 69 63 20 70 75  or diagnostic pu
b970: 72 70 6f 73 65 73 2e 0a 20 20 20 20 20 2a 0a 20  rposes..     *. 
b980: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 41 20      * @return A 
b990: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
b9a0: 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61  he current opera
b9b0: 74 69 6f 6e 20 69 6e 63 6c 75 64 69 6e 67 20 68  tion including h
b9c0: 6f 77 20 6c 6f 6e 67 20 69 74 20 68 61 73 20 62  ow long it has b
b9d0: 65 65 6e 20 72 75 6e 6e 69 6e 67 2c 0a 20 20 20  een running,.   
b9e0: 20 20 2a 20 6f 72 20 6e 75 6c 6c 20 69 66 20 6e    * or null if n
b9f0: 6f 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  one..     */.   
ba00: 20 53 74 72 69 6e 67 20 64 65 73 63 72 69 62 65   String describe
ba10: 43 75 72 72 65 6e 74 4f 70 65 72 61 74 69 6f 6e  CurrentOperation
ba20: 55 6e 73 61 66 65 28 29 20 7b 0a 20 20 20 20 20  Unsafe() {.     
ba30: 20 20 20 72 65 74 75 72 6e 20 6d 52 65 63 65 6e     return mRecen
ba40: 74 4f 70 65 72 61 74 69 6f 6e 73 2e 64 65 73 63  tOperations.desc
ba50: 72 69 62 65 43 75 72 72 65 6e 74 4f 70 65 72 61  ribeCurrentOpera
ba60: 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a 20  tion();.    }.. 
ba70: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 43 6f     /**.     * Co
ba80: 6c 6c 65 63 74 73 20 73 74 61 74 69 73 74 69 63  llects statistic
ba90: 73 20 61 62 6f 75 74 20 64 61 74 61 62 61 73 65  s about database
baa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 65 6d 6f   connection memo
bab0: 72 79 20 75 73 61 67 65 2e 0a 20 20 20 20 20 2a  ry usage..     *
bac0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 64  .     * @param d
bad0: 62 53 74 61 74 73 4c 69 73 74 20 54 68 65 20 6c  bStatsList The l
bae0: 69 73 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e  ist to populate.
baf0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  .     */.    voi
bb00: 64 20 63 6f 6c 6c 65 63 74 44 62 53 74 61 74 73  d collectDbStats
bb10: 28 41 72 72 61 79 4c 69 73 74 3c 44 62 53 74 61  (ArrayList<DbSta
bb20: 74 73 3e 20 64 62 53 74 61 74 73 4c 69 73 74 29  ts> dbStatsList)
bb30: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 47 65   {.        // Ge
bb40: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
bb50: 6f 75 74 20 74 68 65 20 6d 61 69 6e 20 64 61 74  out the main dat
bb60: 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 69  abase..        i
bb70: 6e 74 20 6c 6f 6f 6b 61 73 69 64 65 20 3d 20 6e  nt lookaside = n
bb80: 61 74 69 76 65 47 65 74 44 62 4c 6f 6f 6b 61 73  ativeGetDbLookas
bb90: 69 64 65 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50  ide(mConnectionP
bba0: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6e  tr);.        lon
bbb0: 67 20 70 61 67 65 43 6f 75 6e 74 20 3d 20 30 3b  g pageCount = 0;
bbc0: 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 70 61  .        long pa
bbd0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  geSize = 0;.    
bbe0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
bbf0: 20 20 20 20 20 20 70 61 67 65 43 6f 75 6e 74 20        pageCount 
bc00: 3d 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67  = executeForLong
bc10: 28 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f  ("PRAGMA page_co
bc20: 75 6e 74 3b 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  unt;", null, nul
bc30: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
bc40: 70 61 67 65 53 69 7a 65 20 3d 20 65 78 65 63 75  pageSize = execu
bc50: 74 65 46 6f 72 4c 6f 6e 67 28 22 50 52 41 47 4d  teForLong("PRAGM
bc60: 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 2c 20 6e  A page_size;", n
bc70: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
bc80: 20 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c      } catch (SQL
bc90: 69 74 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29  iteException ex)
bca0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
bcb0: 2f 20 49 67 6e 6f 72 65 2e 0a 20 20 20 20 20 20  / Ignore..      
bcc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 53 74    }.        dbSt
bcd0: 61 74 73 4c 69 73 74 2e 61 64 64 28 67 65 74 4d  atsList.add(getM
bce0: 61 69 6e 44 62 53 74 61 74 73 55 6e 73 61 66 65  ainDbStatsUnsafe
bcf0: 28 6c 6f 6f 6b 61 73 69 64 65 2c 20 70 61 67 65  (lookaside, page
bd00: 43 6f 75 6e 74 2c 20 70 61 67 65 53 69 7a 65 29  Count, pageSize)
bd10: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 47  );..        // G
bd20: 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  et information a
bd30: 62 6f 75 74 20 61 74 74 61 63 68 65 64 20 64 61  bout attached da
bd40: 74 61 62 61 73 65 73 2e 0a 20 20 20 20 20 20 20  tabases..       
bd50: 20 2f 2f 20 57 65 20 69 67 6e 6f 72 65 20 74 68   // We ignore th
bd60: 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74  e first row in t
bd70: 68 65 20 64 61 74 61 62 61 73 65 20 6c 69 73 74  he database list
bd80: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 72 72   because it corr
bd90: 65 73 70 6f 6e 64 73 20 74 6f 0a 20 20 20 20 20  esponds to.     
bda0: 20 20 20 2f 2f 20 74 68 65 20 6d 61 69 6e 20 64     // the main d
bdb0: 61 74 61 62 61 73 65 20 77 68 69 63 68 20 77 65  atabase which we
bdc0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
bdd0: 73 63 72 69 62 65 64 2e 0a 20 20 20 20 20 20 20  scribed..       
bde0: 20 43 75 72 73 6f 72 57 69 6e 64 6f 77 20 77 69   CursorWindow wi
bdf0: 6e 64 6f 77 20 3d 20 6e 65 77 20 43 75 72 73 6f  ndow = new Curso
be00: 72 57 69 6e 64 6f 77 28 22 63 6f 6c 6c 65 63 74  rWindow("collect
be10: 44 62 53 74 61 74 73 22 29 3b 0a 20 20 20 20 20  DbStats");.     
be20: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
be30: 20 20 20 20 20 65 78 65 63 75 74 65 46 6f 72 43       executeForC
be40: 75 72 73 6f 72 57 69 6e 64 6f 77 28 22 50 52 41  ursorWindow("PRA
be50: 47 4d 41 20 64 61 74 61 62 61 73 65 5f 6c 69 73  GMA database_lis
be60: 74 3b 22 2c 20 6e 75 6c 6c 2c 20 77 69 6e 64 6f  t;", null, windo
be70: 77 2c 20 30 2c 20 30 2c 20 66 61 6c 73 65 2c 20  w, 0, 0, false, 
be80: 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  null);.         
be90: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20     for (int i = 
bea0: 31 3b 20 69 20 3c 20 77 69 6e 64 6f 77 2e 67 65  1; i < window.ge
beb0: 74 4e 75 6d 52 6f 77 73 28 29 3b 20 69 2b 2b 29  tNumRows(); i++)
bec0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
bed0: 20 20 20 53 74 72 69 6e 67 20 6e 61 6d 65 20 3d     String name =
bee0: 20 77 69 6e 64 6f 77 2e 67 65 74 53 74 72 69 6e   window.getStrin
bef0: 67 28 69 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  g(i, 1);.       
bf00: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20           String 
bf10: 70 61 74 68 20 3d 20 77 69 6e 64 6f 77 2e 67 65  path = window.ge
bf20: 74 53 74 72 69 6e 67 28 69 2c 20 32 29 3b 0a 20  tString(i, 2);. 
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
bf40: 61 67 65 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  ageCount = 0;.  
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
bf60: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  geSize = 0;.    
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
bf80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bf90: 20 20 20 20 20 20 70 61 67 65 43 6f 75 6e 74 20        pageCount 
bfa0: 3d 20 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67  = executeForLong
bfb0: 28 22 50 52 41 47 4d 41 20 22 20 2b 20 6e 61 6d  ("PRAGMA " + nam
bfc0: 65 20 2b 20 22 2e 70 61 67 65 5f 63 6f 75 6e 74  e + ".page_count
bfd0: 3b 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  ;", null, null);
bfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bff0: 20 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20       pageSize = 
c000: 65 78 65 63 75 74 65 46 6f 72 4c 6f 6e 67 28 22  executeForLong("
c010: 50 52 41 47 4d 41 20 22 20 2b 20 6e 61 6d 65 20  PRAGMA " + name 
c020: 2b 20 22 2e 70 61 67 65 5f 73 69 7a 65 3b 22 2c  + ".page_size;",
c030: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20   null, null);.  
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
c050: 63 61 74 63 68 20 28 53 51 4c 69 74 65 45 78 63  catch (SQLiteExc
c060: 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20 20  eption ex) {.   
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 2f 2f 20 49 67 6e 6f 72 65 2e 0a 20 20 20 20   // Ignore..    
c090: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
c0b0: 72 69 6e 67 20 6c 61 62 65 6c 20 3d 20 22 20 20  ring label = "  
c0c0: 28 61 74 74 61 63 68 65 64 29 20 22 20 2b 20 6e  (attached) " + n
c0d0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
c0e0: 20 20 20 20 20 69 66 20 28 21 70 61 74 68 2e 69       if (!path.i
c0f0: 73 45 6d 70 74 79 28 29 29 20 7b 0a 20 20 20 20  sEmpty()) {.    
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 6c 61 62 65 6c 20 2b 3d 20 22 3a 20 22 20 2b 20  label += ": " + 
c120: 70 61 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  path;.          
c130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c140: 20 20 20 20 20 20 20 20 64 62 53 74 61 74 73 4c          dbStatsL
c150: 69 73 74 2e 61 64 64 28 6e 65 77 20 44 62 53 74  ist.add(new DbSt
c160: 61 74 73 28 6c 61 62 65 6c 2c 20 70 61 67 65 43  ats(label, pageC
c170: 6f 75 6e 74 2c 20 70 61 67 65 53 69 7a 65 2c 20  ount, pageSize, 
c180: 30 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20  0, 0, 0, 0));.  
c190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c1a0: 20 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c      } catch (SQL
c1b0: 69 74 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29  iteException ex)
c1c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
c1d0: 2f 20 49 67 6e 6f 72 65 2e 0a 20 20 20 20 20 20  / Ignore..      
c1e0: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
c1f0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
c200: 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20  .close();.      
c210: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
c220: 2a 2a 0a 20 20 20 20 20 2a 20 43 6f 6c 6c 65 63  **.     * Collec
c230: 74 73 20 73 74 61 74 69 73 74 69 63 73 20 61 62  ts statistics ab
c240: 6f 75 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  out database con
c250: 6e 65 63 74 69 6f 6e 20 6d 65 6d 6f 72 79 20 75  nection memory u
c260: 73 61 67 65 2c 20 69 6e 20 74 68 65 20 63 61 73  sage, in the cas
c270: 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
c280: 20 2a 20 63 61 6c 6c 65 72 20 6d 69 67 68 74 20   * caller might 
c290: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6f 77 6e  not actually own
c2a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e   the connection.
c2b0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
c2c0: 72 65 74 75 72 6e 20 54 68 65 20 73 74 61 74 69  return The stati
c2d0: 73 74 69 63 73 20 6f 62 6a 65 63 74 2c 20 6e 65  stics object, ne
c2e0: 76 65 72 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 2a  ver null..     *
c2f0: 2f 0a 20 20 20 20 76 6f 69 64 20 63 6f 6c 6c 65  /.    void colle
c300: 63 74 44 62 53 74 61 74 73 55 6e 73 61 66 65 28  ctDbStatsUnsafe(
c310: 41 72 72 61 79 4c 69 73 74 3c 44 62 53 74 61 74  ArrayList<DbStat
c320: 73 3e 20 64 62 53 74 61 74 73 4c 69 73 74 29 20  s> dbStatsList) 
c330: 7b 0a 20 20 20 20 20 20 20 20 64 62 53 74 61 74  {.        dbStat
c340: 73 4c 69 73 74 2e 61 64 64 28 67 65 74 4d 61 69  sList.add(getMai
c350: 6e 44 62 53 74 61 74 73 55 6e 73 61 66 65 28 30  nDbStatsUnsafe(0
c360: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a  , 0, 0));.    }.
c370: 0a 20 20 20 20 70 72 69 76 61 74 65 20 44 62 53  .    private DbS
c380: 74 61 74 73 20 67 65 74 4d 61 69 6e 44 62 53 74  tats getMainDbSt
c390: 61 74 73 55 6e 73 61 66 65 28 69 6e 74 20 6c 6f  atsUnsafe(int lo
c3a0: 6f 6b 61 73 69 64 65 2c 20 6c 6f 6e 67 20 70 61  okaside, long pa
c3b0: 67 65 43 6f 75 6e 74 2c 20 6c 6f 6e 67 20 70 61  geCount, long pa
c3c0: 67 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20  geSize) {.      
c3d0: 20 20 2f 2f 20 54 68 65 20 70 72 65 70 61 72 65    // The prepare
c3e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
c3f0: 65 20 69 73 20 74 68 72 65 61 64 2d 73 61 66 65  e is thread-safe
c400: 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
c410: 73 20 69 74 73 20 73 74 61 74 69 73 74 69 63 73  s its statistics
c420: 0a 20 20 20 20 20 20 20 20 2f 2f 20 65 76 65 6e  .        // even
c430: 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 6f 77   if we do not ow
c440: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
c450: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 20 20 20  onnection..     
c460: 20 20 20 53 74 72 69 6e 67 20 6c 61 62 65 6c 20     String label 
c470: 3d 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  = mConfiguration
c480: 2e 70 61 74 68 3b 0a 20 20 20 20 20 20 20 20 69  .path;.        i
c490: 66 20 28 21 6d 49 73 50 72 69 6d 61 72 79 43 6f  f (!mIsPrimaryCo
c4a0: 6e 6e 65 63 74 69 6f 6e 29 20 7b 0a 20 20 20 20  nnection) {.    
c4b0: 20 20 20 20 20 20 20 20 6c 61 62 65 6c 20 2b 3d          label +=
c4c0: 20 22 20 28 22 20 2b 20 6d 43 6f 6e 6e 65 63 74   " (" + mConnect
c4d0: 69 6f 6e 49 64 20 2b 20 22 29 22 3b 0a 20 20 20  ionId + ")";.   
c4e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
c4f0: 65 74 75 72 6e 20 6e 65 77 20 44 62 53 74 61 74  eturn new DbStat
c500: 73 28 6c 61 62 65 6c 2c 20 70 61 67 65 43 6f 75  s(label, pageCou
c510: 6e 74 2c 20 70 61 67 65 53 69 7a 65 2c 20 6c 6f  nt, pageSize, lo
c520: 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
c530: 20 20 20 20 20 20 20 20 20 6d 50 72 65 70 61 72           mPrepar
c540: 65 64 53 74 61 74 65 6d 65 6e 74 43 61 63 68 65  edStatementCache
c550: 2e 68 69 74 43 6f 75 6e 74 28 29 2c 0a 20 20 20  .hitCount(),.   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 50 72               mPr
c570: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 43  eparedStatementC
c580: 61 63 68 65 2e 6d 69 73 73 43 6f 75 6e 74 28 29  ache.missCount()
c590: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c5a0: 20 20 6d 50 72 65 70 61 72 65 64 53 74 61 74 65    mPreparedState
c5b0: 6d 65 6e 74 43 61 63 68 65 2e 73 69 7a 65 28 29  mentCache.size()
c5c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 4f  );.    }..    @O
c5d0: 76 65 72 72 69 64 65 0a 20 20 20 20 70 75 62 6c  verride.    publ
c5e0: 69 63 20 53 74 72 69 6e 67 20 74 6f 53 74 72 69  ic String toStri
c5f0: 6e 67 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72  ng() {.        r
c600: 65 74 75 72 6e 20 22 53 51 4c 69 74 65 43 6f 6e  eturn "SQLiteCon
c610: 6e 65 63 74 69 6f 6e 3a 20 22 20 2b 20 6d 43 6f  nection: " + mCo
c620: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 70 61 74 68  nfiguration.path
c630: 20 2b 20 22 20 28 22 20 2b 20 6d 43 6f 6e 6e 65   + " (" + mConne
c640: 63 74 69 6f 6e 49 64 20 2b 20 22 29 22 3b 0a 20  ctionId + ")";. 
c650: 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
c660: 65 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  e PreparedStatem
c670: 65 6e 74 20 6f 62 74 61 69 6e 50 72 65 70 61 72  ent obtainPrepar
c680: 65 64 53 74 61 74 65 6d 65 6e 74 28 53 74 72 69  edStatement(Stri
c690: 6e 67 20 73 71 6c 2c 20 6c 6f 6e 67 20 73 74 61  ng sql, long sta
c6a0: 74 65 6d 65 6e 74 50 74 72 2c 0a 20 20 20 20 20  tementPtr,.     
c6b0: 20 20 20 20 20 20 20 69 6e 74 20 6e 75 6d 50 61         int numPa
c6c0: 72 61 6d 65 74 65 72 73 2c 20 69 6e 74 20 74 79  rameters, int ty
c6d0: 70 65 2c 20 62 6f 6f 6c 65 61 6e 20 72 65 61 64  pe, boolean read
c6e0: 4f 6e 6c 79 29 20 7b 0a 20 20 20 20 20 20 20 20  Only) {.        
c6f0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
c700: 74 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 6d 50  t statement = mP
c710: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
c720: 50 6f 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  Pool;.        if
c730: 20 28 73 74 61 74 65 6d 65 6e 74 20 21 3d 20 6e   (statement != n
c740: 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ull) {.         
c750: 20 20 20 6d 50 72 65 70 61 72 65 64 53 74 61 74     mPreparedStat
c760: 65 6d 65 6e 74 50 6f 6f 6c 20 3d 20 73 74 61 74  ementPool = stat
c770: 65 6d 65 6e 74 2e 6d 50 6f 6f 6c 4e 65 78 74 3b  ement.mPoolNext;
c780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61  .            sta
c790: 74 65 6d 65 6e 74 2e 6d 50 6f 6f 6c 4e 65 78 74  tement.mPoolNext
c7a0: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   = null;.       
c7b0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d       statement.m
c7c0: 49 6e 43 61 63 68 65 20 3d 20 66 61 6c 73 65 3b  InCache = false;
c7d0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
c7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
c7f0: 61 74 65 6d 65 6e 74 20 3d 20 6e 65 77 20 50 72  atement = new Pr
c800: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28  eparedStatement(
c810: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c820: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d       statement.m
c830: 53 71 6c 20 3d 20 73 71 6c 3b 0a 20 20 20 20 20  Sql = sql;.     
c840: 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d 53 74     statement.mSt
c850: 61 74 65 6d 65 6e 74 50 74 72 20 3d 20 73 74 61  atementPtr = sta
c860: 74 65 6d 65 6e 74 50 74 72 3b 0a 20 20 20 20 20  tementPtr;.     
c870: 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d 4e 75     statement.mNu
c880: 6d 50 61 72 61 6d 65 74 65 72 73 20 3d 20 6e 75  mParameters = nu
c890: 6d 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  mParameters;.   
c8a0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d       statement.m
c8b0: 54 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 20  Type = type;.   
c8c0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 6d       statement.m
c8d0: 52 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  ReadOnly = readO
c8e0: 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nly;.        ret
c8f0: 75 72 6e 20 73 74 61 74 65 6d 65 6e 74 3b 0a 20  urn statement;. 
c900: 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
c910: 65 20 76 6f 69 64 20 72 65 63 79 63 6c 65 50 72  e void recyclePr
c920: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 28  eparedStatement(
c930: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
c940: 74 20 73 74 61 74 65 6d 65 6e 74 29 20 7b 0a 20  t statement) {. 
c950: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
c960: 2e 6d 53 71 6c 20 3d 20 6e 75 6c 6c 3b 0a 20 20  .mSql = null;.  
c970: 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e        statement.
c980: 6d 50 6f 6f 6c 4e 65 78 74 20 3d 20 6d 50 72 65  mPoolNext = mPre
c990: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 50 6f  paredStatementPo
c9a0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 6d 50 72 65  ol;.        mPre
c9b0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 50 6f  paredStatementPo
c9c0: 6f 6c 20 3d 20 73 74 61 74 65 6d 65 6e 74 3b 0a  ol = statement;.
c9d0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
c9e0: 74 65 20 73 74 61 74 69 63 20 53 74 72 69 6e 67  te static String
c9f0: 20 74 72 69 6d 53 71 6c 46 6f 72 44 69 73 70 6c   trimSqlForDispl
ca00: 61 79 28 53 74 72 69 6e 67 20 73 71 6c 29 20 7b  ay(String sql) {
ca10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ca20: 54 52 49 4d 5f 53 51 4c 5f 50 41 54 54 45 52 4e  TRIM_SQL_PATTERN
ca30: 2e 6d 61 74 63 68 65 72 28 73 71 6c 29 2e 72 65  .matcher(sql).re
ca40: 70 6c 61 63 65 41 6c 6c 28 22 20 22 29 3b 0a 20  placeAll(" ");. 
ca50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
ca60: 20 20 20 2a 20 48 6f 6c 64 65 72 20 74 79 70 65     * Holder type
ca70: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
ca80: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
ca90: 2a 0a 20 20 20 20 20 2a 20 41 6c 74 68 6f 75 67  *.     * Althoug
caa0: 68 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f  h this object ho
cab0: 6c 64 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lds a pointer to
cac0: 20 61 20 6e 61 74 69 76 65 20 73 74 61 74 65 6d   a native statem
cad0: 65 6e 74 20 6f 62 6a 65 63 74 2c 20 69 74 0a 20  ent object, it. 
cae0: 20 20 20 20 2a 20 64 6f 65 73 20 6e 6f 74 20 68      * does not h
caf0: 61 76 65 20 61 20 66 69 6e 61 6c 69 7a 65 72 2e  ave a finalizer.
cb00: 20 20 54 68 69 73 20 69 73 20 64 65 6c 69 62 65    This is delibe
cb10: 72 61 74 65 2e 20 20 54 68 65 20 7b 40 6c 69 6e  rate.  The {@lin
cb20: 6b 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  k SQLiteConnecti
cb30: 6f 6e 7d 0a 20 20 20 20 20 2a 20 6f 77 6e 73 20  on}.     * owns 
cb40: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 62  the statement ob
cb50: 6a 65 63 74 20 61 6e 64 20 77 69 6c 6c 20 74 61  ject and will ta
cb60: 6b 65 20 63 61 72 65 20 6f 66 20 66 72 65 65 69  ke care of freei
cb70: 6e 67 20 69 74 20 77 68 65 6e 20 6e 65 65 64 65  ng it when neede
cb80: 64 2e 0a 20 20 20 20 20 2a 20 49 6e 20 70 61 72  d..     * In par
cb90: 74 69 63 75 6c 61 72 2c 20 63 6c 6f 73 69 6e 67  ticular, closing
cba0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
cbb0: 72 65 71 75 69 72 65 73 20 61 20 67 75 61 72 61  requires a guara
cbc0: 6e 74 65 65 20 6f 66 20 64 65 74 65 72 6d 69 6e  ntee of determin
cbd0: 69 73 74 69 63 0a 20 20 20 20 20 2a 20 72 65 73  istic.     * res
cbe0: 6f 75 72 63 65 20 64 69 73 70 6f 73 61 6c 20 62  ource disposal b
cbf0: 65 63 61 75 73 65 20 61 6c 6c 20 6e 61 74 69 76  ecause all nativ
cc00: 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65  e statement obje
cc10: 63 74 73 20 6d 75 73 74 20 62 65 20 66 72 65 65  cts must be free
cc20: 64 20 62 65 66 6f 72 65 0a 20 20 20 20 20 2a 20  d before.     * 
cc30: 74 68 65 20 6e 61 74 69 76 65 20 64 61 74 61 62  the native datab
cc40: 61 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  ase object can b
cc50: 65 20 63 6c 6f 73 65 64 2e 20 20 53 6f 20 6e 6f  e closed.  So no
cc60: 20 66 69 6e 61 6c 69 7a 65 72 73 20 68 65 72 65   finalizers here
cc70: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 72  ..     */.    pr
cc80: 69 76 61 74 65 20 73 74 61 74 69 63 20 66 69 6e  ivate static fin
cc90: 61 6c 20 63 6c 61 73 73 20 50 72 65 70 61 72 65  al class Prepare
cca0: 64 53 74 61 74 65 6d 65 6e 74 20 7b 0a 20 20 20  dStatement {.   
ccb0: 20 20 20 20 20 2f 2f 20 4e 65 78 74 20 69 74 65       // Next ite
ccc0: 6d 20 69 6e 20 70 6f 6f 6c 2e 0a 20 20 20 20 20  m in pool..     
ccd0: 20 20 20 70 75 62 6c 69 63 20 50 72 65 70 61 72     public Prepar
cce0: 65 64 53 74 61 74 65 6d 65 6e 74 20 6d 50 6f 6f  edStatement mPoo
ccf0: 6c 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20  lNext;..        
cd00: 2f 2f 20 54 68 65 20 53 51 4c 20 66 72 6f 6d 20  // The SQL from 
cd10: 77 68 69 63 68 20 74 68 65 20 73 74 61 74 65 6d  which the statem
cd20: 65 6e 74 20 77 61 73 20 70 72 65 70 61 72 65 64  ent was prepared
cd30: 2e 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63  ..        public
cd40: 20 53 74 72 69 6e 67 20 6d 53 71 6c 3b 0a 0a 20   String mSql;.. 
cd50: 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 6e 61         // The na
cd60: 74 69 76 65 20 73 71 6c 69 74 65 33 5f 73 74 6d  tive sqlite3_stm
cd70: 74 20 6f 62 6a 65 63 74 20 70 6f 69 6e 74 65 72  t object pointer
cd80: 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 4c 69 66  ..        // Lif
cd90: 65 74 69 6d 65 20 69 73 20 6d 61 6e 61 67 65 64  etime is managed
cda0: 20 65 78 70 6c 69 63 69 74 6c 79 20 62 79 20 74   explicitly by t
cdb0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  he connection.. 
cdc0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 6c 6f         public lo
cdd0: 6e 67 20 6d 53 74 61 74 65 6d 65 6e 74 50 74 72  ng mStatementPtr
cde0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 68  ;..        // Th
cdf0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  e number of para
ce00: 6d 65 74 65 72 73 20 74 68 61 74 20 74 68 65 20  meters that the 
ce10: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
ce20: 6e 74 20 68 61 73 2e 0a 20 20 20 20 20 20 20 20  nt has..        
ce30: 70 75 62 6c 69 63 20 69 6e 74 20 6d 4e 75 6d 50  public int mNumP
ce40: 61 72 61 6d 65 74 65 72 73 3b 0a 0a 20 20 20 20  arameters;..    
ce50: 20 20 20 20 2f 2f 20 54 68 65 20 73 74 61 74 65      // The state
ce60: 6d 65 6e 74 20 74 79 70 65 2e 0a 20 20 20 20 20  ment type..     
ce70: 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 6d 54     public int mT
ce80: 79 70 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  ype;..        //
ce90: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
cea0: 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
ceb0: 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 70 75 62  nly..        pub
cec0: 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 6d 52 65 61  lic boolean mRea
ced0: 64 4f 6e 6c 79 3b 0a 0a 20 20 20 20 20 20 20 20  dOnly;..        
cee0: 2f 2f 20 54 72 75 65 20 69 66 20 74 68 65 20 73  // True if the s
cef0: 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 20 74  tatement is in t
cf00: 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  he cache..      
cf10: 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e    public boolean
cf20: 20 6d 49 6e 43 61 63 68 65 3b 0a 0a 20 20 20 20   mInCache;..    
cf30: 20 20 20 20 2f 2f 20 54 72 75 65 20 69 66 20 74      // True if t
cf40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
cf50: 69 6e 20 75 73 65 20 28 63 75 72 72 65 6e 74 6c  in use (currentl
cf60: 79 20 65 78 65 63 75 74 69 6e 67 29 2e 0a 20 20  y executing)..  
cf70: 20 20 20 20 20 20 2f 2f 20 57 65 20 6e 65 65 64        // We need
cf80: 20 74 68 69 73 20 66 6c 61 67 20 62 65 63 61 75   this flag becau
cf90: 73 65 20 64 75 65 20 74 6f 20 74 68 65 20 75 73  se due to the us
cfa0: 65 20 6f 66 20 63 75 73 74 6f 6d 20 66 75 6e 63  e of custom func
cfb0: 74 69 6f 6e 73 20 69 6e 20 74 72 69 67 67 65 72  tions in trigger
cfc0: 73 2c 20 69 74 27 73 0a 20 20 20 20 20 20 20 20  s, it's.        
cfd0: 2f 2f 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  // possible for 
cfe0: 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 6f 20  SQLite calls to 
cff0: 62 65 20 72 65 2d 65 6e 74 72 61 6e 74 2e 20 20  be re-entrant.  
d000: 43 6f 6e 73 65 71 75 65 6e 74 6c 79 20 77 65 20  Consequently we 
d010: 6e 65 65 64 20 74 6f 20 70 72 65 76 65 6e 74 0a  need to prevent.
d020: 20 20 20 20 20 20 20 20 2f 2f 20 69 6e 20 75 73          // in us
d030: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f  e statements fro
d040: 6d 20 62 65 69 6e 67 20 66 69 6e 61 6c 69 7a 65  m being finalize
d050: 64 20 75 6e 74 69 6c 20 74 68 65 79 20 61 72 65  d until they are
d060: 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
d070: 65 2e 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  e..        publi
d080: 63 20 62 6f 6f 6c 65 61 6e 20 6d 49 6e 55 73 65  c boolean mInUse
d090: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69  ;.    }..    pri
d0a0: 76 61 74 65 20 66 69 6e 61 6c 20 63 6c 61 73 73  vate final class
d0b0: 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65   PreparedStateme
d0c0: 6e 74 43 61 63 68 65 0a 20 20 20 20 20 20 20 20  ntCache.        
d0d0: 20 20 20 20 65 78 74 65 6e 64 73 20 4c 72 75 43      extends LruC
d0e0: 61 63 68 65 3c 53 74 72 69 6e 67 2c 20 50 72 65  ache<String, Pre
d0f0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 3e 20  paredStatement> 
d100: 7b 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63  {.        public
d110: 20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65   PreparedStateme
d120: 6e 74 43 61 63 68 65 28 69 6e 74 20 73 69 7a 65  ntCache(int size
d130: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d140: 73 75 70 65 72 28 73 69 7a 65 29 3b 0a 20 20 20  super(size);.   
d150: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
d160: 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20 20 20  @Override.      
d170: 20 20 70 72 6f 74 65 63 74 65 64 20 76 6f 69 64    protected void
d180: 20 65 6e 74 72 79 52 65 6d 6f 76 65 64 28 62 6f   entryRemoved(bo
d190: 6f 6c 65 61 6e 20 65 76 69 63 74 65 64 2c 20 53  olean evicted, S
d1a0: 74 72 69 6e 67 20 6b 65 79 2c 0a 20 20 20 20 20  tring key,.     
d1b0: 20 20 20 20 20 20 20 20 20 20 20 50 72 65 70 61             Prepa
d1c0: 72 65 64 53 74 61 74 65 6d 65 6e 74 20 6f 6c 64  redStatement old
d1d0: 56 61 6c 75 65 2c 20 50 72 65 70 61 72 65 64 53  Value, PreparedS
d1e0: 74 61 74 65 6d 65 6e 74 20 6e 65 77 56 61 6c 75  tatement newValu
d1f0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
d200: 20 6f 6c 64 56 61 6c 75 65 2e 6d 49 6e 43 61 63   oldValue.mInCac
d210: 68 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  he = false;.    
d220: 20 20 20 20 20 20 20 20 69 66 20 28 21 6f 6c 64          if (!old
d230: 56 61 6c 75 65 2e 6d 49 6e 55 73 65 29 20 7b 0a  Value.mInUse) {.
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 66 69 6e 61 6c 69 7a 65 50 72 65 70 61 72 65 64  finalizePrepared
d260: 53 74 61 74 65 6d 65 6e 74 28 6f 6c 64 56 61 6c  Statement(oldVal
d270: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ue);.           
d280: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
d290: 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69        public voi
d2a0: 64 20 64 75 6d 70 28 50 72 69 6e 74 65 72 20 70  d dump(Printer p
d2b0: 72 69 6e 74 65 72 29 20 7b 0a 20 20 20 20 20 20  rinter) {.      
d2c0: 20 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72        printer.pr
d2d0: 69 6e 74 6c 6e 28 22 20 20 50 72 65 70 61 72 65  intln("  Prepare
d2e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 63 61 63 68  d statement cach
d2f0: 65 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e:");.          
d300: 20 20 4d 61 70 3c 53 74 72 69 6e 67 2c 20 50 72    Map<String, Pr
d310: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 3e  eparedStatement>
d320: 20 63 61 63 68 65 20 3d 20 73 6e 61 70 73 68 6f   cache = snapsho
d330: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t();.           
d340: 20 69 66 20 28 21 63 61 63 68 65 2e 69 73 45 6d   if (!cache.isEm
d350: 70 74 79 28 29 29 20 7b 0a 20 20 20 20 20 20 20  pty()) {.       
d360: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d           int i =
d370: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
d380: 20 20 20 20 66 6f 72 20 28 4d 61 70 2e 45 6e 74      for (Map.Ent
d390: 72 79 3c 53 74 72 69 6e 67 2c 20 50 72 65 70 61  ry<String, Prepa
d3a0: 72 65 64 53 74 61 74 65 6d 65 6e 74 3e 20 65 6e  redStatement> en
d3b0: 74 72 79 20 3a 20 63 61 63 68 65 2e 65 6e 74 72  try : cache.entr
d3c0: 79 53 65 74 28 29 29 20 7b 0a 20 20 20 20 20 20  ySet()) {.      
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72                Pr
d3e0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 20  eparedStatement 
d3f0: 73 74 61 74 65 6d 65 6e 74 20 3d 20 65 6e 74 72  statement = entr
d400: 79 2e 67 65 74 56 61 6c 75 65 28 29 3b 0a 20 20  y.getValue();.  
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 69 66 20 28 73 74 61 74 65 6d 65 6e 74 2e    if (statement.
d430: 6d 49 6e 43 61 63 68 65 29 20 7b 20 2f 2f 20 6d  mInCache) { // m
d440: 69 67 68 74 20 62 65 20 66 61 6c 73 65 20 64 75  ight be false du
d450: 65 20 74 6f 20 61 20 72 61 63 65 20 77 69 74 68  e to a race with
d460: 20 65 6e 74 72 79 52 65 6d 6f 76 65 64 0a 20 20   entryRemoved.  
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 20 20 20 20 20 20 53 74 72 69 6e 67 20 73 71 6c        String sql
d490: 20 3d 20 65 6e 74 72 79 2e 67 65 74 4b 65 79 28   = entry.getKey(
d4a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
d4b0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
d4c0: 65 72 2e 70 72 69 6e 74 6c 6e 28 22 20 20 20 20  er.println("    
d4d0: 22 20 2b 20 69 20 2b 20 22 3a 20 73 74 61 74 65  " + i + ": state
d4e0: 6d 65 6e 74 50 74 72 3d 30 78 22 0a 20 20 20 20  mentPtr=0x".    
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4c 6f              + Lo
d510: 6e 67 2e 74 6f 48 65 78 53 74 72 69 6e 67 28 73  ng.toHexString(s
d520: 74 61 74 65 6d 65 6e 74 2e 6d 53 74 61 74 65 6d  tatement.mStatem
d530: 65 6e 74 50 74 72 29 0a 20 20 20 20 20 20 20 20  entPtr).        
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 2b 20 22 2c 20 6e 75 6d          + ", num
d560: 50 61 72 61 6d 65 74 65 72 73 3d 22 20 2b 20 73  Parameters=" + s
d570: 74 61 74 65 6d 65 6e 74 2e 6d 4e 75 6d 50 61 72  tatement.mNumPar
d580: 61 6d 65 74 65 72 73 0a 20 20 20 20 20 20 20 20  ameters.        
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 20 2b 20 22 2c 20 74 79 70          + ", typ
d5b0: 65 3d 22 20 2b 20 73 74 61 74 65 6d 65 6e 74 2e  e=" + statement.
d5c0: 6d 54 79 70 65 0a 20 20 20 20 20 20 20 20 20 20  mType.          
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 2b 20 22 2c 20 72 65 61 64 4f        + ", readO
d5f0: 6e 6c 79 3d 22 20 2b 20 73 74 61 74 65 6d 65 6e  nly=" + statemen
d600: 74 2e 6d 52 65 61 64 4f 6e 6c 79 0a 20 20 20 20  t.mReadOnly.    
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 2c              + ",
d630: 20 73 71 6c 3d 5c 22 22 20 2b 20 74 72 69 6d 53   sql=\"" + trimS
d640: 71 6c 46 6f 72 44 69 73 70 6c 61 79 28 73 71 6c  qlForDisplay(sql
d650: 29 20 2b 20 22 5c 22 22 29 3b 0a 20 20 20 20 20  ) + "\"");.     
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
d670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d680: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
d6a0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
d6b0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
d6c0: 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69 6e      printer.prin
d6d0: 74 6c 6e 28 22 20 20 20 20 3c 6e 6f 6e 65 3e 22  tln("    <none>"
d6e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
d6f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
d700: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
d710: 61 74 69 63 20 66 69 6e 61 6c 20 63 6c 61 73 73  atic final class
d720: 20 4f 70 65 72 61 74 69 6f 6e 4c 6f 67 20 7b 0a   OperationLog {.
d730: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
d740: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74  static final int
d750: 20 4d 41 58 5f 52 45 43 45 4e 54 5f 4f 50 45 52   MAX_RECENT_OPER
d760: 41 54 49 4f 4e 53 20 3d 20 32 30 3b 0a 20 20 20  ATIONS = 20;.   
d770: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
d780: 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 43 4f  tic final int CO
d790: 4f 4b 49 45 5f 47 45 4e 45 52 41 54 49 4f 4e 5f  OKIE_GENERATION_
d7a0: 53 48 49 46 54 20 3d 20 38 3b 0a 20 20 20 20 20  SHIFT = 8;.     
d7b0: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
d7c0: 63 20 66 69 6e 61 6c 20 69 6e 74 20 43 4f 4f 4b  c final int COOK
d7d0: 49 45 5f 49 4e 44 45 58 5f 4d 41 53 4b 20 3d 20  IE_INDEX_MASK = 
d7e0: 30 78 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 70  0xff;..        p
d7f0: 72 69 76 61 74 65 20 66 69 6e 61 6c 20 4f 70 65  rivate final Ope
d800: 72 61 74 69 6f 6e 5b 5d 20 6d 4f 70 65 72 61 74  ration[] mOperat
d810: 69 6f 6e 73 20 3d 20 6e 65 77 20 4f 70 65 72 61  ions = new Opera
d820: 74 69 6f 6e 5b 4d 41 58 5f 52 45 43 45 4e 54 5f  tion[MAX_RECENT_
d830: 4f 50 45 52 41 54 49 4f 4e 53 5d 3b 0a 20 20 20  OPERATIONS];.   
d840: 20 20 20 20 20 70 72 69 76 61 74 65 20 69 6e 74       private int
d850: 20 6d 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20   mIndex;.       
d860: 20 70 72 69 76 61 74 65 20 69 6e 74 20 6d 47 65   private int mGe
d870: 6e 65 72 61 74 69 6f 6e 3b 0a 0a 20 20 20 20 20  neration;..     
d880: 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 62 65     public int be
d890: 67 69 6e 4f 70 65 72 61 74 69 6f 6e 28 53 74 72  ginOperation(Str
d8a0: 69 6e 67 20 6b 69 6e 64 2c 20 53 74 72 69 6e 67  ing kind, String
d8b0: 20 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20 62   sql, Object[] b
d8c0: 69 6e 64 41 72 67 73 29 20 7b 0a 20 20 20 20 20  indArgs) {.     
d8d0: 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69         synchroni
d8e0: 7a 65 64 20 28 6d 4f 70 65 72 61 74 69 6f 6e 73  zed (mOperations
d8f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d900: 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 69 6e      final int in
d910: 64 65 78 20 3d 20 28 6d 49 6e 64 65 78 20 2b 20  dex = (mIndex + 
d920: 31 29 20 25 20 4d 41 58 5f 52 45 43 45 4e 54 5f  1) % MAX_RECENT_
d930: 4f 50 45 52 41 54 49 4f 4e 53 3b 0a 20 20 20 20  OPERATIONS;.    
d940: 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 72              Oper
d950: 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ation operation 
d960: 3d 20 6d 4f 70 65 72 61 74 69 6f 6e 73 5b 69 6e  = mOperations[in
d970: 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  dex];.          
d980: 20 20 20 20 20 20 69 66 20 28 6f 70 65 72 61 74        if (operat
d990: 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  ion == null) {. 
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 3d 20 6e     operation = n
d9c0: 65 77 20 4f 70 65 72 61 74 69 6f 6e 28 29 3b 0a  ew Operation();.
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 6d 4f 70 65 72 61 74 69 6f 6e 73 5b      mOperations[
d9f0: 69 6e 64 65 78 5d 20 3d 20 6f 70 65 72 61 74 69  index] = operati
da00: 6f 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  on;.            
da10: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 46 69 6e 69   operation.mFini
da40: 73 68 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  shed = false;.  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 45 78 63    operation.mExc
da70: 65 70 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0a 20  eption = null;. 
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 69 66 20 28 6f 70 65 72 61 74 69 6f 6e     if (operation
daa0: 2e 6d 42 69 6e 64 41 72 67 73 20 21 3d 20 6e 75  .mBindArgs != nu
dab0: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
dad0: 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67  eration.mBindArg
dae0: 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20 20  s.clear();.     
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
db00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
db20: 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 53 74     operation.mSt
db30: 61 72 74 54 69 6d 65 20 3d 20 53 79 73 74 65 6d  artTime = System
db40: 2e 63 75 72 72 65 6e 74 54 69 6d 65 4d 69 6c 6c  .currentTimeMill
db50: 69 73 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  is();.          
db60: 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e        operation.
db70: 6d 4b 69 6e 64 20 3d 20 6b 69 6e 64 3b 0a 20 20  mKind = kind;.  
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
db90: 65 72 61 74 69 6f 6e 2e 6d 53 71 6c 20 3d 20 73  eration.mSql = s
dba0: 71 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ql;.            
dbb0: 20 20 20 20 69 66 20 28 62 69 6e 64 41 72 67 73      if (bindArgs
dbc0: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   != null) {.    
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 69 66 20 28 6f 70 65 72 61 74 69 6f 6e 2e 6d 42  if (operation.mB
dbf0: 69 6e 64 41 72 67 73 20 3d 3d 20 6e 75 6c 6c 29  indArgs == null)
dc00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
dc10: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61             opera
dc20: 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67 73 20 3d  tion.mBindArgs =
dc30: 20 6e 65 77 20 41 72 72 61 79 4c 69 73 74 3c 4f   new ArrayList<O
dc40: 62 6a 65 63 74 3e 28 29 3b 0a 20 20 20 20 20 20  bject>();.      
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
dc60: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dc80: 70 65 72 61 74 69 6f 6e 2e 6d 42 69 6e 64 41 72  peration.mBindAr
dc90: 67 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20  gs.clear();.    
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
dcc0: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69        for (int i
dcd0: 20 3d 20 30 3b 20 69 20 3c 20 62 69 6e 64 41 72   = 0; i < bindAr
dce0: 67 73 2e 6c 65 6e 67 74 68 3b 20 69 2b 2b 29 20  gs.length; i++) 
dcf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
dd00: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20            final 
dd10: 4f 62 6a 65 63 74 20 61 72 67 20 3d 20 62 69 6e  Object arg = bin
dd20: 64 41 72 67 73 5b 69 5d 3b 0a 20 20 20 20 20 20  dArgs[i];.      
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 69 66 20 28 61 72 67 20 21 3d 20 6e 75 6c    if (arg != nul
dd50: 6c 20 26 26 20 61 72 67 20 69 6e 73 74 61 6e 63  l && arg instanc
dd60: 65 6f 66 20 62 79 74 65 5b 5d 29 20 7b 0a 20 20  eof byte[]) {.  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 44 6f 6e            // Don
dd90: 27 74 20 68 6f 6c 64 20 6f 6e 74 6f 20 74 68 65  't hold onto the
dda0: 20 72 65 61 6c 20 62 79 74 65 20 61 72 72 61 79   real byte array
ddb0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 65 63   longer than nec
ddc0: 65 73 73 61 72 79 2e 0a 20 20 20 20 20 20 20 20  essary..        
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 20 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 42      operation.mB
ddf0: 69 6e 64 41 72 67 73 2e 61 64 64 28 45 4d 50 54  indArgs.add(EMPT
de00: 59 5f 42 59 54 45 5f 41 52 52 41 59 29 3b 0a 20  Y_BYTE_ARRAY);. 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72              oper
de50: 61 74 69 6f 6e 2e 6d 42 69 6e 64 41 72 67 73 2e  ation.mBindArgs.
de60: 61 64 64 28 61 72 67 29 3b 0a 20 20 20 20 20 20  add(arg);.      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
de90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dea0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72              oper
dec0: 61 74 69 6f 6e 2e 6d 43 6f 6f 6b 69 65 20 3d 20  ation.mCookie = 
ded0: 6e 65 77 4f 70 65 72 61 74 69 6f 6e 43 6f 6f 6b  newOperationCook
dee0: 69 65 4c 6f 63 6b 65 64 28 69 6e 64 65 78 29 3b  ieLocked(index);
def0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df00: 20 6d 49 6e 64 65 78 20 3d 20 69 6e 64 65 78 3b   mIndex = index;
df10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df20: 20 72 65 74 75 72 6e 20 6f 70 65 72 61 74 69 6f   return operatio
df30: 6e 2e 6d 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  n.mCookie;.     
df40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
df50: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 62 6c   }..        publ
df60: 69 63 20 76 6f 69 64 20 66 61 69 6c 4f 70 65 72  ic void failOper
df70: 61 74 69 6f 6e 28 69 6e 74 20 63 6f 6f 6b 69 65  ation(int cookie
df80: 2c 20 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20  , Exception ex) 
df90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 79  {.            sy
dfa0: 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d 4f 70 65  nchronized (mOpe
dfb0: 72 61 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20  rations) {.     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
dfd0: 20 4f 70 65 72 61 74 69 6f 6e 20 6f 70 65 72 61   Operation opera
dfe0: 74 69 6f 6e 20 3d 20 67 65 74 4f 70 65 72 61 74  tion = getOperat
dff0: 69 6f 6e 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65  ionLocked(cookie
e000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e010: 20 20 20 69 66 20 28 6f 70 65 72 61 74 69 6f 6e     if (operation
e020: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   != null) {.    
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 6f 70 65 72 61 74 69 6f 6e 2e 6d 45 78 63 65 70  operation.mExcep
e050: 74 69 6f 6e 20 3d 20 65 78 3b 0a 20 20 20 20 20  tion = ex;.     
e060: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e070: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e080: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 75     }..        pu
e090: 62 6c 69 63 20 76 6f 69 64 20 65 6e 64 4f 70 65  blic void endOpe
e0a0: 72 61 74 69 6f 6e 28 69 6e 74 20 63 6f 6f 6b 69  ration(int cooki
e0b0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
e0c0: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d   synchronized (m
e0d0: 4f 70 65 72 61 74 69 6f 6e 73 29 20 7b 0a 20 20  Operations) {.  
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
e0f0: 20 28 65 6e 64 4f 70 65 72 61 74 69 6f 6e 44 65   (endOperationDe
e100: 66 65 72 4c 6f 67 4c 6f 63 6b 65 64 28 63 6f 6f  ferLogLocked(coo
e110: 6b 69 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20  kie)) {.        
e120: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 4f              logO
e130: 70 65 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 28 63  perationLocked(c
e140: 6f 6f 6b 69 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20  ookie, null);.  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
e160: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e170: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e180: 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e 20   public boolean 
e190: 65 6e 64 4f 70 65 72 61 74 69 6f 6e 44 65 66 65  endOperationDefe
e1a0: 72 4c 6f 67 28 69 6e 74 20 63 6f 6f 6b 69 65 29  rLog(int cookie)
e1b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
e1c0: 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d 4f 70  ynchronized (mOp
e1d0: 65 72 61 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20  erations) {.    
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e1f0: 72 6e 20 65 6e 64 4f 70 65 72 61 74 69 6f 6e 44  rn endOperationD
e200: 65 66 65 72 4c 6f 67 4c 6f 63 6b 65 64 28 63 6f  eferLogLocked(co
e210: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20 20 20  okie);.         
e220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
e230: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76          public v
e240: 6f 69 64 20 6c 6f 67 4f 70 65 72 61 74 69 6f 6e  oid logOperation
e250: 28 69 6e 74 20 63 6f 6f 6b 69 65 2c 20 53 74 72  (int cookie, Str
e260: 69 6e 67 20 64 65 74 61 69 6c 29 20 7b 0a 20 20  ing detail) {.  
e270: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 68 72            synchr
e280: 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61 74 69  onized (mOperati
e290: 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ons) {.         
e2a0: 20 20 20 20 20 20 20 6c 6f 67 4f 70 65 72 61 74         logOperat
e2b0: 69 6f 6e 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65  ionLocked(cookie
e2c0: 2c 20 64 65 74 61 69 6c 29 3b 0a 20 20 20 20 20  , detail);.     
e2d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e2e0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 72 69 76   }..        priv
e2f0: 61 74 65 20 62 6f 6f 6c 65 61 6e 20 65 6e 64 4f  ate boolean endO
e300: 70 65 72 61 74 69 6f 6e 44 65 66 65 72 4c 6f 67  perationDeferLog
e310: 4c 6f 63 6b 65 64 28 69 6e 74 20 63 6f 6f 6b 69  Locked(int cooki
e320: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
e330: 20 66 69 6e 61 6c 20 4f 70 65 72 61 74 69 6f 6e   final Operation
e340: 20 6f 70 65 72 61 74 69 6f 6e 20 3d 20 67 65 74   operation = get
e350: 4f 70 65 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 28  OperationLocked(
e360: 63 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 20  cookie);.       
e370: 20 20 20 20 20 69 66 20 28 6f 70 65 72 61 74 69       if (operati
e380: 6f 6e 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  on != null) {.  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
e3a0: 65 72 61 74 69 6f 6e 2e 6d 45 6e 64 54 69 6d 65  eration.mEndTime
e3b0: 20 3d 20 53 79 73 74 65 6d 2e 63 75 72 72 65 6e   = System.curren
e3c0: 74 54 69 6d 65 4d 69 6c 6c 69 73 28 29 3b 0a 20  tTimeMillis();. 
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
e3e0: 70 65 72 61 74 69 6f 6e 2e 6d 46 69 6e 69 73 68  peration.mFinish
e3f0: 65 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  ed = true;.     
e400: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e410: 6e 20 53 51 4c 69 74 65 44 65 62 75 67 2e 44 45  n SQLiteDebug.DE
e420: 42 55 47 5f 4c 4f 47 5f 53 4c 4f 57 5f 51 55 45  BUG_LOG_SLOW_QUE
e430: 52 49 45 53 20 26 26 20 53 51 4c 69 74 65 44 65  RIES && SQLiteDe
e440: 62 75 67 2e 73 68 6f 75 6c 64 4c 6f 67 53 6c 6f  bug.shouldLogSlo
e450: 77 51 75 65 72 79 28 0a 20 20 20 20 20 20 20 20  wQuery(.        
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 69 6f          operatio
e480: 6e 2e 6d 45 6e 64 54 69 6d 65 20 2d 20 6f 70 65  n.mEndTime - ope
e490: 72 61 74 69 6f 6e 2e 6d 53 74 61 72 74 54 69 6d  ration.mStartTim
e4a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
e4b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
e4c0: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
e4d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
e4e0: 72 69 76 61 74 65 20 76 6f 69 64 20 6c 6f 67 4f  rivate void logO
e4f0: 70 65 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 28 69  perationLocked(i
e500: 6e 74 20 63 6f 6f 6b 69 65 2c 20 53 74 72 69 6e  nt cookie, Strin
e510: 67 20 64 65 74 61 69 6c 29 20 7b 0a 20 20 20 20  g detail) {.    
e520: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 4f 70          final Op
e530: 65 72 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  eration operatio
e540: 6e 20 3d 20 67 65 74 4f 70 65 72 61 74 69 6f 6e  n = getOperation
e550: 4c 6f 63 6b 65 64 28 63 6f 6f 6b 69 65 29 3b 0a  Locked(cookie);.
e560: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
e570: 6e 67 42 75 69 6c 64 65 72 20 6d 73 67 20 3d 20  ngBuilder msg = 
e580: 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65  new StringBuilde
e590: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r();.           
e5a0: 20 6f 70 65 72 61 74 69 6f 6e 2e 64 65 73 63 72   operation.descr
e5b0: 69 62 65 28 6d 73 67 2c 20 66 61 6c 73 65 29 3b  ibe(msg, false);
e5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
e5d0: 28 64 65 74 61 69 6c 20 21 3d 20 6e 75 6c 6c 29  (detail != null)
e5e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
e5f0: 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 2c     msg.append(",
e600: 20 22 29 2e 61 70 70 65 6e 64 28 64 65 74 61 69   ").append(detai
e610: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
e620: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f  }.            Lo
e630: 67 2e 64 28 54 41 47 2c 20 6d 73 67 2e 74 6f 53  g.d(TAG, msg.toS
e640: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20  tring());.      
e650: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 72 69    }..        pri
e660: 76 61 74 65 20 69 6e 74 20 6e 65 77 4f 70 65 72  vate int newOper
e670: 61 74 69 6f 6e 43 6f 6f 6b 69 65 4c 6f 63 6b 65  ationCookieLocke
e680: 64 28 69 6e 74 20 69 6e 64 65 78 29 20 7b 0a 20  d(int index) {. 
e690: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
e6a0: 20 69 6e 74 20 67 65 6e 65 72 61 74 69 6f 6e 20   int generation 
e6b0: 3d 20 6d 47 65 6e 65 72 61 74 69 6f 6e 2b 2b 3b  = mGeneration++;
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
e6d0: 75 72 6e 20 67 65 6e 65 72 61 74 69 6f 6e 20 3c  urn generation <
e6e0: 3c 20 43 4f 4f 4b 49 45 5f 47 45 4e 45 52 41 54  < COOKIE_GENERAT
e6f0: 49 4f 4e 5f 53 48 49 46 54 20 7c 20 69 6e 64 65  ION_SHIFT | inde
e700: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  x;.        }..  
e710: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 4f 70        private Op
e720: 65 72 61 74 69 6f 6e 20 67 65 74 4f 70 65 72 61  eration getOpera
e730: 74 69 6f 6e 4c 6f 63 6b 65 64 28 69 6e 74 20 63  tionLocked(int c
e740: 6f 6f 6b 69 65 29 20 7b 0a 20 20 20 20 20 20 20  ookie) {.       
e750: 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 69       final int i
e760: 6e 64 65 78 20 3d 20 63 6f 6f 6b 69 65 20 26 20  ndex = cookie & 
e770: 43 4f 4f 4b 49 45 5f 49 4e 44 45 58 5f 4d 41 53  COOKIE_INDEX_MAS
e780: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  K;.            f
e790: 69 6e 61 6c 20 4f 70 65 72 61 74 69 6f 6e 20 6f  inal Operation o
e7a0: 70 65 72 61 74 69 6f 6e 20 3d 20 6d 4f 70 65 72  peration = mOper
e7b0: 61 74 69 6f 6e 73 5b 69 6e 64 65 78 5d 3b 0a 20  ations[index];. 
e7c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e7d0: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 6d 43 6f 6f  n operation.mCoo
e7e0: 6b 69 65 20 3d 3d 20 63 6f 6f 6b 69 65 20 3f 20  kie == cookie ? 
e7f0: 6f 70 65 72 61 74 69 6f 6e 20 3a 20 6e 75 6c 6c  operation : null
e800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
e810: 20 20 20 20 20 70 75 62 6c 69 63 20 53 74 72 69       public Stri
e820: 6e 67 20 64 65 73 63 72 69 62 65 43 75 72 72 65  ng describeCurre
e830: 6e 74 4f 70 65 72 61 74 69 6f 6e 28 29 20 7b 0a  ntOperation() {.
e840: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
e850: 68 72 6f 6e 69 7a 65 64 20 28 6d 4f 70 65 72 61  hronized (mOpera
e860: 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20  tions) {.       
e870: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 4f           final O
e880: 70 65 72 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  peration operati
e890: 6f 6e 20 3d 20 6d 4f 70 65 72 61 74 69 6f 6e 73  on = mOperations
e8a0: 5b 6d 49 6e 64 65 78 5d 3b 0a 20 20 20 20 20 20  [mIndex];.      
e8b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 70            if (op
e8c0: 65 72 61 74 69 6f 6e 20 21 3d 20 6e 75 6c 6c 20  eration != null 
e8d0: 26 26 20 21 6f 70 65 72 61 74 69 6f 6e 2e 6d 46  && !operation.mF
e8e0: 69 6e 69 73 68 65 64 29 20 7b 0a 20 20 20 20 20  inished) {.     
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e900: 74 72 69 6e 67 42 75 69 6c 64 65 72 20 6d 73 67  tringBuilder msg
e910: 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69   = new StringBui
e920: 6c 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  lder();.        
e930: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72              oper
e940: 61 74 69 6f 6e 2e 64 65 73 63 72 69 62 65 28 6d  ation.describe(m
e950: 73 67 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20  sg, false);.    
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e970: 72 65 74 75 72 6e 20 6d 73 67 2e 74 6f 53 74 72  return msg.toStr
e980: 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ing();.         
e990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e9a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e9b0: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  null;.          
e9c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
e9d0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f         public vo
e9e0: 69 64 20 64 75 6d 70 28 50 72 69 6e 74 65 72 20  id dump(Printer 
e9f0: 70 72 69 6e 74 65 72 2c 20 62 6f 6f 6c 65 61 6e  printer, boolean
ea00: 20 76 65 72 62 6f 73 65 29 20 7b 0a 20 20 20 20   verbose) {.    
ea10: 20 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e          synchron
ea20: 69 7a 65 64 20 28 6d 4f 70 65 72 61 74 69 6f 6e  ized (mOperation
ea30: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s) {.           
ea40: 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69       printer.pri
ea50: 6e 74 6c 6e 28 22 20 20 4d 6f 73 74 20 72 65 63  ntln("  Most rec
ea60: 65 6e 74 6c 79 20 65 78 65 63 75 74 65 64 20 6f  ently executed o
ea70: 70 65 72 61 74 69 6f 6e 73 3a 22 29 3b 0a 20 20  perations:");.  
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
ea90: 74 20 69 6e 64 65 78 20 3d 20 6d 49 6e 64 65 78  t index = mIndex
eaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
eab0: 20 20 4f 70 65 72 61 74 69 6f 6e 20 6f 70 65 72    Operation oper
eac0: 61 74 69 6f 6e 20 3d 20 6d 4f 70 65 72 61 74 69  ation = mOperati
ead0: 6f 6e 73 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20  ons[index];.    
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
eaf0: 6f 70 65 72 61 74 69 6f 6e 20 21 3d 20 6e 75 6c  operation != nul
eb00: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
eb10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
eb20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
eb30: 20 20 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20          do {.   
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64       StringBuild
eb60: 65 72 20 6d 73 67 20 3d 20 6e 65 77 20 53 74 72  er msg = new Str
eb70: 69 6e 67 42 75 69 6c 64 65 72 28 29 3b 0a 20 20  ingBuilder();.  
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64        msg.append
eba0: 28 22 20 20 20 20 22 29 2e 61 70 70 65 6e 64 28  ("    ").append(
ebb0: 6e 29 2e 61 70 70 65 6e 64 28 22 3a 20 5b 22 29  n).append(": [")
ebc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ebd0: 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70            msg.ap
ebe0: 70 65 6e 64 28 6f 70 65 72 61 74 69 6f 6e 2e 67  pend(operation.g
ebf0: 65 74 46 6f 72 6d 61 74 74 65 64 53 74 61 72 74  etFormattedStart
ec00: 54 69 6d 65 28 29 29 3b 0a 20 20 20 20 20 20 20  Time());.       
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 5d 20 22   msg.append("] "
ec30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ec40: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61             opera
ec50: 74 69 6f 6e 2e 64 65 73 63 72 69 62 65 28 6d 73  tion.describe(ms
ec60: 67 2c 20 76 65 72 62 6f 73 65 29 3b 0a 20 20 20  g, verbose);.   
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69       printer.pri
ec90: 6e 74 6c 6e 28 6d 73 67 2e 74 6f 53 74 72 69 6e  ntln(msg.toStrin
eca0: 67 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  g());..         
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
ecc0: 66 20 28 69 6e 64 65 78 20 3e 20 30 29 20 7b 0a  f (index > 0) {.
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65              inde
ecf0: 78 20 2d 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  x -= 1;.        
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed30: 20 20 20 20 20 69 6e 64 65 78 20 3d 20 4d 41 58       index = MAX
ed40: 5f 52 45 43 45 4e 54 5f 4f 50 45 52 41 54 49 4f  _RECENT_OPERATIO
ed50: 4e 53 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  NS - 1;.        
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
ed80: 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 31            n += 1
ed90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
eda0: 20 20 20 20 20 20 20 20 20 20 6f 70 65 72 61 74            operat
edb0: 69 6f 6e 20 3d 20 6d 4f 70 65 72 61 74 69 6f 6e  ion = mOperation
edc0: 73 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20 20 20  s[index];.      
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
ede0: 77 68 69 6c 65 20 28 6f 70 65 72 61 74 69 6f 6e  while (operation
edf0: 20 21 3d 20 6e 75 6c 6c 20 26 26 20 6e 20 3c 20   != null && n < 
ee00: 4d 41 58 5f 52 45 43 45 4e 54 5f 4f 50 45 52 41  MAX_RECENT_OPERA
ee10: 54 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20 20  TIONS);.        
ee20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
ee30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee40: 20 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69       printer.pri
ee50: 6e 74 6c 6e 28 22 20 20 20 20 3c 6e 6f 6e 65 3e  ntln("    <none>
ee60: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
ee70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ee80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ee90: 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65    }..    private
eea0: 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 63 6c   static final cl
eeb0: 61 73 73 20 4f 70 65 72 61 74 69 6f 6e 20 7b 0a  ass Operation {.
eec0: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
eed0: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 53 69 6d  static final Sim
eee0: 70 6c 65 44 61 74 65 46 6f 72 6d 61 74 20 73 44  pleDateFormat sD
eef0: 61 74 65 46 6f 72 6d 61 74 20 3d 0a 20 20 20 20  ateFormat =.    
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20              new 
ef10: 53 69 6d 70 6c 65 44 61 74 65 46 6f 72 6d 61 74  SimpleDateFormat
ef20: 28 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a  ("yyyy-MM-dd HH:
ef30: 6d 6d 3a 73 73 2e 53 53 53 22 29 3b 0a 0a 20 20  mm:ss.SSS");..  
ef40: 20 20 20 20 20 20 70 75 62 6c 69 63 20 6c 6f 6e        public lon
ef50: 67 20 6d 53 74 61 72 74 54 69 6d 65 3b 0a 20 20  g mStartTime;.  
ef60: 20 20 20 20 20 20 70 75 62 6c 69 63 20 6c 6f 6e        public lon
ef70: 67 20 6d 45 6e 64 54 69 6d 65 3b 0a 20 20 20 20  g mEndTime;.    
ef80: 20 20 20 20 70 75 62 6c 69 63 20 53 74 72 69 6e      public Strin
ef90: 67 20 6d 4b 69 6e 64 3b 0a 20 20 20 20 20 20 20  g mKind;.       
efa0: 20 70 75 62 6c 69 63 20 53 74 72 69 6e 67 20 6d   public String m
efb0: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 70 75 62  Sql;.        pub
efc0: 6c 69 63 20 41 72 72 61 79 4c 69 73 74 3c 4f 62  lic ArrayList<Ob
efd0: 6a 65 63 74 3e 20 6d 42 69 6e 64 41 72 67 73 3b  ject> mBindArgs;
efe0: 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20  .        public 
eff0: 62 6f 6f 6c 65 61 6e 20 6d 46 69 6e 69 73 68 65  boolean mFinishe
f000: 64 3b 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  d;.        publi
f010: 63 20 45 78 63 65 70 74 69 6f 6e 20 6d 45 78 63  c Exception mExc
f020: 65 70 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  eption;.        
f030: 70 75 62 6c 69 63 20 69 6e 74 20 6d 43 6f 6f 6b  public int mCook
f040: 69 65 3b 0a 0a 20 20 20 20 20 20 20 20 70 75 62  ie;..        pub
f050: 6c 69 63 20 76 6f 69 64 20 64 65 73 63 72 69 62  lic void describ
f060: 65 28 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20  e(StringBuilder 
f070: 6d 73 67 2c 20 62 6f 6f 6c 65 61 6e 20 76 65 72  msg, boolean ver
f080: 62 6f 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20  bose) {.        
f090: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 6d      msg.append(m
f0a0: 4b 69 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  Kind);.         
f0b0: 20 20 20 69 66 20 28 6d 46 69 6e 69 73 68 65 64     if (mFinished
f0c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
f0d0: 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22      msg.append("
f0e0: 20 74 6f 6f 6b 20 22 29 2e 61 70 70 65 6e 64 28   took ").append(
f0f0: 6d 45 6e 64 54 69 6d 65 20 2d 20 6d 53 74 61 72  mEndTime - mStar
f100: 74 54 69 6d 65 29 2e 61 70 70 65 6e 64 28 22 6d  tTime).append("m
f110: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s");.           
f120: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
f130: 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70            msg.ap
f140: 70 65 6e 64 28 22 20 73 74 61 72 74 65 64 20 22  pend(" started "
f150: 29 2e 61 70 70 65 6e 64 28 53 79 73 74 65 6d 2e  ).append(System.
f160: 63 75 72 72 65 6e 74 54 69 6d 65 4d 69 6c 6c 69  currentTimeMilli
f170: 73 28 29 20 2d 20 6d 53 74 61 72 74 54 69 6d 65  s() - mStartTime
f180: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f190: 20 20 20 20 20 20 20 20 20 20 2e 61 70 70 65 6e            .appen
f1a0: 64 28 22 6d 73 20 61 67 6f 22 29 3b 0a 20 20 20  d("ms ago");.   
f1b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f1c0: 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e         msg.appen
f1d0: 64 28 22 20 2d 20 22 29 2e 61 70 70 65 6e 64 28  d(" - ").append(
f1e0: 67 65 74 53 74 61 74 75 73 28 29 29 3b 0a 20 20  getStatus());.  
f1f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 53            if (mS
f200: 71 6c 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  ql != null) {.  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 73                ms
f220: 67 2e 61 70 70 65 6e 64 28 22 2c 20 73 71 6c 3d  g.append(", sql=
f230: 5c 22 22 29 2e 61 70 70 65 6e 64 28 74 72 69 6d  \"").append(trim
f240: 53 71 6c 46 6f 72 44 69 73 70 6c 61 79 28 6d 53  SqlForDisplay(mS
f250: 71 6c 29 29 2e 61 70 70 65 6e 64 28 22 5c 22 22  ql)).append("\""
f260: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
f270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
f280: 28 76 65 72 62 6f 73 65 20 26 26 20 6d 42 69 6e  (verbose && mBin
f290: 64 41 72 67 73 20 21 3d 20 6e 75 6c 6c 20 26 26  dArgs != null &&
f2a0: 20 6d 42 69 6e 64 41 72 67 73 2e 73 69 7a 65 28   mBindArgs.size(
f2b0: 29 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  ) != 0) {.      
f2c0: 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70            msg.ap
f2d0: 70 65 6e 64 28 22 2c 20 62 69 6e 64 41 72 67 73  pend(", bindArgs
f2e0: 3d 5b 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =[");.          
f2f0: 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20        final int 
f300: 63 6f 75 6e 74 20 3d 20 6d 42 69 6e 64 41 72 67  count = mBindArg
f310: 73 2e 73 69 7a 65 28 29 3b 0a 20 20 20 20 20 20  s.size();.      
f320: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69            for (i
f330: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 63 6f  nt i = 0; i < co
f340: 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  unt; i++) {.    
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 66 69 6e 61 6c 20 4f 62 6a 65 63 74 20 61 72 67  final Object arg
f370: 20 3d 20 6d 42 69 6e 64 41 72 67 73 2e 67 65 74   = mBindArgs.get
f380: 28 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (i);.           
f390: 20 20 20 20 20 20 20 20 20 69 66 20 28 69 20 21           if (i !
f3a0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 0) {.         
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
f3c0: 73 67 2e 61 70 70 65 6e 64 28 22 2c 20 22 29 3b  sg.append(", ");
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f3e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f3f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61             if (a
f400: 72 67 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  rg == null) {.  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65 6e 64        msg.append
f430: 28 22 6e 75 6c 6c 22 29 3b 0a 20 20 20 20 20 20  ("null");.      
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
f450: 65 6c 73 65 20 69 66 20 28 61 72 67 20 69 6e 73  else if (arg ins
f460: 74 61 6e 63 65 6f 66 20 62 79 74 65 5b 5d 29 20  tanceof byte[]) 
f470: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
f480: 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70            msg.ap
f490: 70 65 6e 64 28 22 3c 62 79 74 65 5b 5d 3e 22 29  pend("<byte[]>")
f4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f4b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
f4c0: 28 61 72 67 20 69 6e 73 74 61 6e 63 65 6f 66 20  (arg instanceof 
f4d0: 53 74 72 69 6e 67 29 20 7b 0a 20 20 20 20 20 20  String) {.      
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 5c 22    msg.append("\"
f500: 22 29 2e 61 70 70 65 6e 64 28 28 53 74 72 69 6e  ").append((Strin
f510: 67 29 61 72 67 29 2e 61 70 70 65 6e 64 28 22 5c  g)arg).append("\
f520: 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "");.           
f530: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
f540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
f550: 20 20 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70            msg.ap
f560: 70 65 6e 64 28 61 72 67 29 3b 0a 20 20 20 20 20  pend(arg);.     
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f590: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
f5a0: 20 20 20 6d 73 67 2e 61 70 70 65 6e 64 28 22 5d     msg.append("]
f5b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
f5c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
f5d0: 20 28 6d 45 78 63 65 70 74 69 6f 6e 20 21 3d 20   (mException != 
f5e0: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
f5f0: 20 20 20 20 20 20 20 20 6d 73 67 2e 61 70 70 65          msg.appe
f600: 6e 64 28 22 2c 20 65 78 63 65 70 74 69 6f 6e 3d  nd(", exception=
f610: 5c 22 22 29 2e 61 70 70 65 6e 64 28 6d 45 78 63  \"").append(mExc
f620: 65 70 74 69 6f 6e 2e 67 65 74 4d 65 73 73 61 67  eption.getMessag
f630: 65 28 29 29 2e 61 70 70 65 6e 64 28 22 5c 22 22  e()).append("\""
f640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
f650: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
f660: 20 20 20 20 70 72 69 76 61 74 65 20 53 74 72 69      private Stri
f670: 6e 67 20 67 65 74 53 74 61 74 75 73 28 29 20 7b  ng getStatus() {
f680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
f690: 28 21 6d 46 69 6e 69 73 68 65 64 29 20 7b 0a 20  (!mFinished) {. 
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
f6b0: 65 74 75 72 6e 20 22 72 75 6e 6e 69 6e 67 22 3b  eturn "running";
f6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f6d0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
f6e0: 6e 20 6d 45 78 63 65 70 74 69 6f 6e 20 21 3d 20  n mException != 
f6f0: 6e 75 6c 6c 20 3f 20 22 66 61 69 6c 65 64 22 20  null ? "failed" 
f700: 3a 20 22 73 75 63 63 65 65 64 65 64 22 3b 0a 20  : "succeeded";. 
f710: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
f720: 20 20 70 72 69 76 61 74 65 20 53 74 72 69 6e 67    private String
f730: 20 67 65 74 46 6f 72 6d 61 74 74 65 64 53 74 61   getFormattedSta
f740: 72 74 54 69 6d 65 28 29 20 7b 0a 20 20 20 20 20  rtTime() {.     
f750: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 44         return sD
f760: 61 74 65 46 6f 72 6d 61 74 2e 66 6f 72 6d 61 74  ateFormat.format
f770: 28 6e 65 77 20 44 61 74 65 28 6d 53 74 61 72 74  (new Date(mStart
f780: 54 69 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Time));.        
f790: 7d 0a 20 20 20 20 7d 0a 7d 0a                    }.    }.}.