SQLite
Hex Artifact Content
Not logged in

Artifact fcb38ffe3db028a3138b4818fc098359c80dc51a0d1278a91c99c554cc1abb92:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 31 32 2d 32 38  /*.** 2016-12-28
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0180: 69 6d 70 6c 65 6d 65 6e 74 73 20 22 6b 65 79 2d  implements "key-
0190: 76 61 6c 75 65 22 20 70 65 72 66 6f 72 6d 61 6e  value" performan
01a0: 63 65 20 74 65 73 74 20 66 6f 72 20 53 51 4c 69  ce test for SQLi
01b0: 74 65 2e 20 20 54 68 65 0a 2a 2a 20 70 75 72 70  te.  The.** purp
01c0: 6f 73 65 20 69 73 20 74 6f 20 63 6f 6d 70 61 72  ose is to compar
01d0: 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 53  e the speed of S
01e0: 51 4c 69 74 65 20 66 6f 72 20 61 63 63 65 73 73  QLite for access
01f0: 69 6e 67 20 6c 61 72 67 65 20 42 4c 4f 42 73 0a  ing large BLOBs.
0200: 2a 2a 20 76 65 72 73 75 73 20 72 65 61 64 69 6e  ** versus readin
0210: 67 20 74 68 6f 73 65 20 73 61 6d 65 20 42 4c 4f  g those same BLO
0220: 42 20 76 61 6c 75 65 73 20 6f 75 74 20 6f 66 20  B values out of 
0230: 69 6e 64 69 76 69 64 75 61 6c 20 66 69 6c 65 73  individual files
0240: 20 69 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 73   in the.** files
0250: 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e  ystem..**.** Run
0260: 20 22 6b 76 74 65 73 74 22 20 77 69 74 68 20 6e   "kvtest" with n
0270: 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  o arguments for 
0280: 6f 6e 2d 6c 69 6e 65 20 68 65 6c 70 2c 20 6f 72  on-line help, or
0290: 20 73 65 65 20 63 6f 6d 6d 65 6e 74 73 20 62 65   see comments be
02a0: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 48 4f 57 20 54  low..**.** HOW T
02b0: 4f 20 43 4f 4d 50 49 4c 45 3a 0a 2a 2a 0a 2a 2a  O COMPILE:.**.**
02c0: 20 28 31 29 20 47 61 74 68 65 72 20 74 68 69 73   (1) Gather this
02d0: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 61 6e 64   source file and
02e0: 20 61 20 72 65 63 65 6e 74 20 53 51 4c 69 74 65   a recent SQLite
02f0: 33 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 77  3 amalgamation w
0300: 69 74 68 20 69 74 73 0a 2a 2a 20 20 20 20 20 68  ith its.**     h
0310: 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 20 77  eader into the w
0320: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
0330: 2e 20 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61  .  You should ha
0340: 76 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ve:.**.**       
0350: 20 20 20 6b 76 74 65 73 74 2e 63 20 20 20 20 20     kvtest.c     
0360: 20 20 3e 2d 2d 2d 20 74 68 69 73 20 66 69 6c 65    >--- this file
0370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 71 6c  .**          sql
0380: 69 74 65 33 2e 63 20 20 20 20 20 20 5c 5f 5f 5f  ite3.c      \___
0390: 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20 20 20 20   SQLite.**      
03a0: 20 20 20 20 73 71 6c 69 74 65 33 2e 68 20 20 20      sqlite3.h   
03b0: 20 20 20 2f 20 20 20 20 61 6d 6c 61 67 61 6d 61     /    amlagama
03c0: 74 69 6f 6e 20 26 20 68 65 61 64 65 72 0a 2a 2a  tion & header.**
03d0: 0a 2a 2a 20 28 32 29 20 52 75 6e 20 79 6f 75 20  .** (2) Run you 
03e0: 63 6f 6d 70 69 6c 65 72 20 61 67 61 69 6e 73 74  compiler against
03f0: 20 74 68 65 20 74 77 6f 20 43 20 73 6f 75 72 63   the two C sourc
0400: 65 20 63 6f 64 65 20 66 69 6c 65 73 2e 0a 2a 2a  e code files..**
0410: 0a 2a 2a 20 20 20 20 28 61 29 20 4f 6e 20 6c 69  .**    (a) On li
0420: 6e 75 78 20 6f 72 20 6d 61 63 3a 0a 2a 2a 0a 2a  nux or mac:.**.*
0430: 2a 20 20 20 20 20 20 20 20 4f 50 54 53 3d 22 2d  *        OPTS="-
0440: 44 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  DSQLITE_THREADSA
0450: 46 45 3d 30 20 2d 44 53 51 4c 49 54 45 5f 4f 4d  FE=0 -DSQLITE_OM
0460: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
0470: 4e 22 0a 2a 2a 20 20 20 20 20 20 20 20 67 63 63  N".**        gcc
0480: 20 2d 4f 73 20 2d 49 2e 20 24 4f 50 54 53 20 6b   -Os -I. $OPTS k
0490: 76 74 65 73 74 2e 63 20 73 71 6c 69 74 65 33 2e  vtest.c sqlite3.
04a0: 63 20 2d 6f 20 6b 76 74 65 73 74 0a 2a 2a 0a 2a  c -o kvtest.**.*
04b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68  *             Th
04c0: 65 20 24 4f 50 54 53 20 6f 70 74 69 6f 6e 73 20  e $OPTS options 
04d0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
04e0: 20 54 68 65 20 24 4f 50 54 53 20 6d 65 72 65 6c   The $OPTS merel
04f0: 79 20 6f 6d 69 74 0a 2a 2a 20 20 20 20 20 20 20  y omit.**       
0500: 20 20 20 20 20 20 74 68 65 20 6e 65 65 64 20 74        the need t
0510: 6f 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 2d  o link against -
0520: 6c 64 6c 20 61 6e 64 20 2d 6c 70 74 68 72 65 61  ldl and -lpthrea
0530: 64 2c 20 6f 72 20 77 68 61 74 65 76 65 72 0a 2a  d, or whatever.*
0540: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68  *             th
0550: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6c 69 62  e equivalent lib
0560: 72 61 72 69 65 73 20 61 72 65 20 63 61 6c 6c 65  raries are calle
0570: 64 20 6f 6e 20 79 6f 75 72 20 73 79 73 74 65 6d  d on your system
0580: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 62 29 20 57  ..**.**    (b) W
0590: 69 6e 64 6f 77 73 20 77 69 74 68 20 4d 53 56 43  indows with MSVC
05a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 63  :.**.**        c
05b0: 6c 20 2d 49 2e 20 6b 76 74 65 73 74 2e 63 20 73  l -I. kvtest.c s
05c0: 71 6c 69 74 65 33 2e 63 0a 2a 2a 0a 2a 2a 20 55  qlite3.c.**.** U
05d0: 53 41 47 45 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20  SAGE:.**.** (1) 
05e0: 43 72 65 61 74 65 20 61 20 74 65 73 74 20 64 61  Create a test da
05f0: 74 61 62 61 73 65 20 62 79 20 72 75 6e 6e 69 6e  tabase by runnin
0600: 67 20 22 6b 76 74 65 73 74 20 69 6e 69 74 22 20  g "kvtest init" 
0610: 77 69 74 68 20 61 70 70 72 6f 70 72 69 61 74 65  with appropriate
0620: 0a 2a 2a 20 20 20 20 20 6f 70 74 69 6f 6e 73 2e  .**     options.
0630: 20 20 53 65 65 20 74 68 65 20 68 65 6c 70 20 6d    See the help m
0640: 65 73 73 61 67 65 20 66 6f 72 20 61 76 61 69 6c  essage for avail
0650: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 0a 2a 2a  able options..**
0660: 0a 2a 2a 20 28 32 29 20 43 6f 6e 73 74 72 75 63  .** (2) Construc
0670: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
0680: 69 6e 67 20 70 69 6c 65 2d 6f 66 2d 66 69 6c 65  ing pile-of-file
0690: 73 20 64 61 74 61 62 61 73 65 20 6f 6e 20 64 69  s database on di
06a0: 73 6b 20 75 73 69 6e 67 0a 2a 2a 20 20 20 20 20  sk using.**     
06b0: 74 68 65 20 22 6b 76 74 65 73 74 20 65 78 70 6f  the "kvtest expo
06c0: 72 74 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  rt" command..**.
06d0: 2a 2a 20 28 33 29 20 52 75 6e 20 74 65 73 74 73  ** (3) Run tests
06e0: 20 75 73 69 6e 67 20 22 6b 76 74 65 73 74 20 72   using "kvtest r
06f0: 75 6e 22 20 61 67 61 69 6e 73 74 20 65 69 74 68  un" against eith
0700: 65 72 20 74 68 65 20 53 51 4c 69 74 65 20 64 61  er the SQLite da
0710: 74 61 62 61 73 65 20 6f 72 0a 2a 2a 20 20 20 20  tabase or.**    
0720: 20 74 68 65 20 70 69 6c 65 2d 6f 66 2d 66 69 6c   the pile-of-fil
0730: 65 73 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  es database and 
0740: 77 69 74 68 20 61 70 70 72 6f 70 72 69 61 74 65  with appropriate
0750: 20 6f 70 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20   options..**.** 
0760: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0770: 2a 2a 20 20 20 20 20 20 20 2e 2f 6b 76 74 65 73  **       ./kvtes
0780: 74 20 69 6e 69 74 20 78 31 2e 64 62 20 2d 2d 63  t init x1.db --c
0790: 6f 75 6e 74 20 31 30 30 30 30 30 20 2d 2d 73 69  ount 100000 --si
07a0: 7a 65 20 31 30 30 30 30 0a 2a 2a 20 20 20 20 20  ze 10000.**     
07b0: 20 20 6d 6b 64 69 72 20 78 31 0a 2a 2a 20 20 20    mkdir x1.**   
07c0: 20 20 20 20 2e 2f 6b 76 74 65 73 74 20 65 78 70      ./kvtest exp
07d0: 6f 72 74 20 78 31 2e 64 62 20 78 31 0a 2a 2a 20  ort x1.db x1.** 
07e0: 20 20 20 20 20 20 2e 2f 6b 76 74 65 73 74 20 72        ./kvtest r
07f0: 75 6e 20 78 31 2e 64 62 20 2d 2d 63 6f 75 6e 74  un x1.db --count
0800: 20 31 30 30 30 30 20 2d 2d 6d 61 78 2d 69 64 20   10000 --max-id 
0810: 31 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20  1000000.**      
0820: 20 2e 2f 6b 76 74 65 73 74 20 72 75 6e 20 78 31   ./kvtest run x1
0830: 20 2d 2d 63 6f 75 6e 74 20 31 30 30 30 30 20 2d   --count 10000 -
0840: 2d 6d 61 78 2d 69 64 20 31 30 30 30 30 30 30 0a  -max-id 1000000.
0850: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
0860: 63 68 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 20 0a  char zHelp[] = .
0870: 22 55 73 61 67 65 3a 20 6b 76 74 65 73 74 20 43  "Usage: kvtest C
0880: 4f 4d 4d 41 4e 44 20 41 52 47 53 2e 2e 2e 5c 6e  OMMAND ARGS...\n
0890: 22 0a 22 5c 6e 22 0a 22 20 20 20 6b 76 74 65 73  "."\n"."   kvtes
08a0: 74 20 69 6e 69 74 20 44 42 46 49 4c 45 20 2d 2d  t init DBFILE --
08b0: 63 6f 75 6e 74 20 4e 20 2d 2d 73 69 7a 65 20 4d  count N --size M
08c0: 20 2d 2d 70 61 67 65 73 69 7a 65 20 58 5c 6e 22   --pagesize X\n"
08d0: 0a 22 5c 6e 22 0a 22 20 20 20 20 20 20 20 20 47  ."\n"."        G
08e0: 65 6e 65 72 61 74 65 20 61 20 6e 65 77 20 74 65  enerate a new te
08f0: 73 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  st database file
0900: 20 6e 61 6d 65 64 20 44 42 46 49 4c 45 20 63 6f   named DBFILE co
0910: 6e 74 61 69 6e 69 6e 67 20 4e 5c 6e 22 0a 22 20  ntaining N\n"." 
0920: 20 20 20 20 20 20 20 42 4c 4f 42 73 20 65 61 63         BLOBs eac
0930: 68 20 6f 66 20 73 69 7a 65 20 4d 20 62 79 74 65  h of size M byte
0940: 73 2e 20 20 54 68 65 20 70 61 67 65 20 73 69 7a  s.  The page siz
0950: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 64 61 74  e of the new dat
0960: 61 62 61 73 65 5c 6e 22 0a 22 20 20 20 20 20 20  abase\n"."      
0970: 20 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 58    file will be X
0980: 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 6f 70  .  Additional op
0990: 74 69 6f 6e 73 3a 5c 6e 22 0a 22 5c 6e 22 0a 22  tions:\n"."\n"."
09a0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 76 61 72             --var
09b0: 69 61 6e 63 65 20 56 20 20 20 20 20 20 20 20 20  iance V         
09c0: 20 20 52 61 6e 64 6f 6d 6c 79 20 76 61 72 79 20    Randomly vary 
09d0: 4d 20 62 79 20 70 6c 75 73 20 6f 72 20 6d 69 6e  M by plus or min
09e0: 75 73 20 56 5c 6e 22 0a 22 5c 6e 22 0a 22 20 20  us V\n"."\n"."  
09f0: 20 6b 76 74 65 73 74 20 65 78 70 6f 72 74 20 44   kvtest export D
0a00: 42 46 49 4c 45 20 44 49 52 45 43 54 4f 52 59 20  BFILE DIRECTORY 
0a10: 5b 2d 2d 74 72 65 65 5d 5c 6e 22 0a 22 5c 6e 22  [--tree]\n"."\n"
0a20: 0a 22 20 20 20 20 20 20 20 20 45 78 70 6f 72 74  ."        Export
0a30: 20 61 6c 6c 20 74 68 65 20 62 6c 6f 62 73 20 69   all the blobs i
0a40: 6e 20 74 68 65 20 6b 76 20 74 61 62 6c 65 20 6f  n the kv table o
0a50: 66 20 44 42 46 49 4c 45 20 69 6e 74 6f 20 73 65  f DBFILE into se
0a60: 70 61 72 61 74 65 5c 6e 22 0a 22 20 20 20 20 20  parate\n"."     
0a70: 20 20 20 66 69 6c 65 73 20 69 6e 20 44 49 52 45     files in DIRE
0a80: 43 54 4f 52 59 2e 20 20 44 49 52 45 43 54 4f 52  CTORY.  DIRECTOR
0a90: 59 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  Y is created if 
0aa0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  it does not prev
0ab0: 69 6f 75 73 6c 79 5c 6e 22 0a 22 20 20 20 20 20  iously\n"."     
0ac0: 20 20 20 65 78 69 73 74 2e 20 20 49 66 20 74 68     exist.  If th
0ad0: 65 20 2d 2d 74 72 65 65 20 6f 70 74 69 6f 6e 20  e --tree option 
0ae0: 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68  is used, then th
0af0: 65 20 62 6c 6f 62 73 20 61 72 65 20 77 72 69 74  e blobs are writ
0b00: 74 65 6e 5c 6e 22 0a 22 20 20 20 20 20 20 20 20  ten\n"."        
0b10: 69 6e 74 6f 20 61 20 68 69 65 72 61 72 63 68 79  into a hierarchy
0b20: 20 6f 66 20 64 69 72 65 63 74 6f 72 69 65 73 2c   of directories,
0b30: 20 75 73 69 6e 67 20 6e 61 6d 65 73 20 6c 69 6b   using names lik
0b40: 65 20 30 30 2f 30 30 2f 30 30 2c 5c 6e 22 0a 22  e 00/00/00,\n"."
0b50: 20 20 20 20 20 20 20 20 30 30 2f 30 30 2f 30 31          00/00/01
0b60: 2c 20 30 30 2f 30 30 2f 30 32 2c 20 61 6e 64 20  , 00/00/02, and 
0b70: 73 6f 20 66 6f 72 74 68 2e 20 20 57 69 74 68 6f  so forth.  Witho
0b80: 75 74 20 74 68 65 20 2d 2d 74 72 65 65 20 6f 70  ut the --tree op
0b90: 74 69 6f 6e 2c 20 61 6c 6c 5c 6e 22 0a 22 20 20  tion, all\n"."  
0ba0: 20 20 20 20 20 20 66 69 6c 65 73 20 61 72 65 20        files are 
0bb0: 69 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  in the top-level
0bc0: 20 64 69 72 65 63 74 6f 72 79 20 77 69 74 68 20   directory with 
0bd0: 6e 61 6d 65 73 20 6c 69 6b 65 20 30 30 30 30 30  names like 00000
0be0: 30 2c 20 30 30 30 30 30 31 2c 5c 6e 22 0a 22 20  0, 000001,\n"." 
0bf0: 20 20 20 20 20 20 20 30 30 30 30 30 32 2c 20 61         000002, a
0c00: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 5c 6e 22 0a  nd so forth.\n".
0c10: 22 5c 6e 22 0a 22 20 20 20 6b 76 74 65 73 74 20  "\n"."   kvtest 
0c20: 73 74 61 74 20 44 42 46 49 4c 45 20 5b 6f 70 74  stat DBFILE [opt
0c30: 69 6f 6e 73 5d 5c 6e 22 0a 22 5c 6e 22 0a 22 20  ions]\n"."\n"." 
0c40: 20 20 20 20 20 20 20 44 69 73 70 6c 61 79 20 73         Display s
0c50: 75 6d 6d 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  ummary informati
0c60: 6f 6e 20 61 62 6f 75 74 20 44 42 46 49 4c 45 2e  on about DBFILE.
0c70: 20 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 5c    Options:\n"."\
0c80: 6e 22 0a 22 20 20 20 20 20 20 20 20 20 20 20 2d  n"."           -
0c90: 2d 76 61 63 75 75 6d 20 20 20 20 20 20 20 20 20  -vacuum         
0ca0: 20 20 20 20 20 20 52 75 6e 20 56 41 43 55 55 4d        Run VACUUM
0cb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
0cc0: 20 66 69 6c 65 5c 6e 22 0a 22 5c 6e 22 0a 22 20   file\n"."\n"." 
0cd0: 20 20 6b 76 74 65 73 74 20 72 75 6e 20 44 42 46    kvtest run DBF
0ce0: 49 4c 45 20 5b 6f 70 74 69 6f 6e 73 5d 5c 6e 22  ILE [options]\n"
0cf0: 0a 22 5c 6e 22 0a 22 20 20 20 20 20 20 20 20 52  ."\n"."        R
0d00: 75 6e 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  un a performance
0d10: 20 74 65 73 74 2e 20 20 44 42 46 49 4c 45 20 63   test.  DBFILE c
0d20: 61 6e 20 62 65 20 65 69 74 68 65 72 20 74 68 65  an be either the
0d30: 20 6e 61 6d 65 20 6f 66 20 61 5c 6e 22 0a 22 20   name of a\n"." 
0d40: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0d50: 6f 72 20 61 20 64 69 72 65 63 74 6f 72 79 20 63  or a directory c
0d60: 6f 6e 74 61 69 6e 69 6e 67 20 73 61 6d 70 6c 65  ontaining sample
0d70: 20 66 69 6c 65 73 2e 20 20 4f 70 74 69 6f 6e 73   files.  Options
0d80: 3a 5c 6e 22 0a 22 5c 6e 22 0a 22 20 20 20 20 20  :\n"."\n"."     
0d90: 20 20 20 20 20 20 2d 2d 61 73 63 20 20 20 20 20        --asc     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 61               Rea
0db0: 64 20 62 6c 6f 62 73 20 69 6e 20 61 73 63 65 6e  d blobs in ascen
0dc0: 64 69 6e 67 20 6f 72 64 65 72 5c 6e 22 0a 22 20  ding order\n"." 
0dd0: 20 20 20 20 20 20 20 20 20 20 2d 2d 62 6c 6f 62            --blob
0de0: 2d 61 70 69 20 20 20 20 20 20 20 20 20 20 20 20  -api            
0df0: 20 55 73 65 20 74 68 65 20 42 4c 4f 42 20 41 50   Use the BLOB AP
0e00: 49 5c 6e 22 0a 22 20 20 20 20 20 20 20 20 20 20  I\n"."          
0e10: 20 2d 2d 63 61 63 68 65 2d 73 69 7a 65 20 4e 20   --cache-size N 
0e20: 20 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65          Database
0e30: 20 63 61 63 68 65 20 73 69 7a 65 5c 6e 22 0a 22   cache size\n"."
0e40: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 63 6f 75             --cou
0e50: 6e 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20  nt N            
0e60: 20 20 52 65 61 64 20 4e 20 62 6c 6f 62 73 5c 6e    Read N blobs\n
0e70: 22 0a 22 20 20 20 20 20 20 20 20 20 20 20 2d 2d  "."           --
0e80: 64 65 73 63 20 20 20 20 20 20 20 20 20 20 20 20  desc            
0e90: 20 20 20 20 20 52 65 61 64 20 62 6c 6f 62 73 20       Read blobs 
0ea0: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
0eb0: 64 65 72 5c 6e 22 0a 22 20 20 20 20 20 20 20 20  der\n"."        
0ec0: 20 20 20 2d 2d 66 73 79 6e 63 20 20 20 20 20 20     --fsync      
0ed0: 20 20 20 20 20 20 20 20 20 20 53 79 6e 63 68 72            Synchr
0ee0: 6f 6e 6f 75 73 20 66 69 6c 65 20 77 72 69 74 65  onous file write
0ef0: 73 5c 6e 22 0a 22 20 20 20 20 20 20 20 20 20 20  s\n"."          
0f00: 20 2d 2d 69 6e 74 65 67 72 69 74 79 2d 63 68 65   --integrity-che
0f10: 63 6b 20 20 20 20 20 20 52 75 6e 20 5c 22 50 52  ck      Run \"PR
0f20: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0f30: 68 65 63 6b 5c 22 20 61 66 74 65 72 20 74 65 73  heck\" after tes
0f40: 74 5c 6e 22 0a 22 20 20 20 20 20 20 20 20 20 20  t\n"."          
0f50: 20 2d 2d 6d 61 78 2d 69 64 20 4e 20 20 20 20 20   --max-id N     
0f60: 20 20 20 20 20 20 20 20 4d 61 78 69 6d 75 6d 20          Maximum 
0f70: 62 6c 6f 62 20 6b 65 79 20 74 6f 20 75 73 65 5c  blob key to use\
0f80: 6e 22 0a 22 20 20 20 20 20 20 20 20 20 20 20 2d  n"."           -
0f90: 2d 6d 6d 61 70 20 4e 20 20 20 20 20 20 20 20 20  -mmap N         
0fa0: 20 20 20 20 20 20 4d 6d 61 70 20 61 73 20 6d 75        Mmap as mu
0fb0: 63 68 20 61 73 20 4e 20 62 79 74 65 73 20 6f 66  ch as N bytes of
0fc0: 20 44 42 46 49 4c 45 5c 6e 22 0a 22 20 20 20 20   DBFILE\n"."    
0fd0: 20 20 20 20 20 20 20 2d 2d 6d 75 6c 74 69 74 72         --multitr
0fe0: 61 6e 73 20 20 20 20 20 20 20 20 20 20 20 45 61  ans           Ea
0ff0: 63 68 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ch read or write
1000: 20 69 6e 20 69 74 73 20 6f 77 6e 20 74 72 61 6e   in its own tran
1010: 73 61 63 74 69 6f 6e 5c 6e 22 0a 22 20 20 20 20  saction\n"."    
1020: 20 20 20 20 20 20 20 2d 2d 6e 6f 63 68 65 63 6b         --nocheck
1030: 70 6f 69 6e 74 20 20 20 20 20 20 20 20 20 4f 6d  point         Om
1040: 69 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  it the checkpoin
1050: 74 20 6f 6e 20 57 41 4c 20 6d 6f 64 65 20 77 72  t on WAL mode wr
1060: 69 74 65 73 5c 6e 22 0a 22 20 20 20 20 20 20 20  ites\n"."       
1070: 20 20 20 20 2d 2d 6e 6f 73 79 6e 63 20 20 20 20      --nosync    
1080: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 5c             Set \
1090: 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
10a0: 6f 75 73 3d 4f 46 46 5c 22 5c 6e 22 0a 22 20 20  ous=OFF\"\n"."  
10b0: 20 20 20 20 20 20 20 20 20 2d 2d 6a 6d 6f 64 65           --jmode
10c0: 20 4d 4f 44 45 20 20 20 20 20 20 20 20 20 20 20   MODE           
10d0: 53 65 74 20 4d 4f 44 45 20 6a 6f 75 72 6e 61 6c  Set MODE journal
10e0: 20 6d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 73   mode prior to s
10f0: 74 61 72 74 69 6e 67 5c 6e 22 0a 22 20 20 20 20  tarting\n"."    
1100: 20 20 20 20 20 20 20 2d 2d 72 61 6e 64 6f 6d 20         --random 
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1120: 61 64 20 62 6c 6f 62 73 20 69 6e 20 61 20 72 61  ad blobs in a ra
1130: 6e 64 6f 6d 20 6f 72 64 65 72 5c 6e 22 0a 22 20  ndom order\n"." 
1140: 20 20 20 20 20 20 20 20 20 20 2d 2d 73 74 61 72            --star
1150: 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  t N             
1160: 20 53 74 61 72 74 20 72 65 61 64 69 6e 67 20 77   Start reading w
1170: 69 74 68 20 74 68 69 73 20 62 6c 6f 62 20 6b 65  ith this blob ke
1180: 79 5c 6e 22 0a 22 20 20 20 20 20 20 20 20 20 20  y\n"."          
1190: 20 2d 2d 73 74 61 74 73 20 20 20 20 20 20 20 20   --stats        
11a0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 6f          Output o
11b0: 70 65 72 61 74 69 6e 67 20 73 74 61 74 73 20 62  perating stats b
11c0: 65 66 6f 72 65 20 65 78 69 74 69 6e 67 5c 6e 22  efore exiting\n"
11d0: 0a 22 20 20 20 20 20 20 20 20 20 20 20 2d 2d 75  ."           --u
11e0: 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20  pdate           
11f0: 20 20 20 20 44 6f 20 61 6e 20 6f 76 65 72 77 72      Do an overwr
1200: 69 74 65 20 74 65 73 74 5c 6e 22 0a 3b 0a 0a 2f  ite test\n".;../
1210: 2a 20 52 65 66 65 72 65 6e 63 65 20 72 65 73 6f  * Reference reso
1220: 75 72 63 65 73 20 75 73 65 64 20 2a 2f 0a 23 69  urces used */.#i
1230: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
1240: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
1250: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  b.h>.#include <s
1260: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
1270: 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68  lude <sys/stat.h
1280: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
1290: 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rt.h>.#include <
12a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
12b0: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
12c0: 23 69 66 6e 64 65 66 20 5f 57 49 4e 33 32 0a 23  #ifndef _WIN32.#
12d0: 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64   include <unistd
12e0: 2e 68 3e 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 50  .h>.#else.  /* P
12f0: 72 6f 76 69 64 65 20 57 69 6e 64 6f 77 73 20 65  rovide Windows e
1300: 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68  quivalent for th
1310: 65 20 6e 65 65 64 65 64 20 70 61 72 74 73 20 6f  e needed parts o
1320: 66 20 75 6e 69 73 74 64 2e 68 20 2a 2f 0a 23 20  f unistd.h */.# 
1330: 69 6e 63 6c 75 64 65 20 3c 64 69 72 65 63 74 2e  include <direct.
1340: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f  h>.# include <io
1350: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 52 5f 4f  .h>.# define R_O
1360: 4b 20 32 0a 23 20 64 65 66 69 6e 65 20 53 5f 49  K 2.# define S_I
1370: 53 52 45 47 28 6d 29 20 28 28 28 6d 29 20 26 20  SREG(m) (((m) & 
1380: 53 5f 49 46 4d 54 29 20 3d 3d 20 53 5f 49 46 52  S_IFMT) == S_IFR
1390: 45 47 29 0a 23 20 64 65 66 69 6e 65 20 53 5f 49  EG).# define S_I
13a0: 53 44 49 52 28 6d 29 20 28 28 28 6d 29 20 26 20  SDIR(m) (((m) & 
13b0: 53 5f 49 46 4d 54 29 20 3d 3d 20 53 5f 49 46 44  S_IFMT) == S_IFD
13c0: 49 52 29 0a 23 20 64 65 66 69 6e 65 20 61 63 63  IR).# define acc
13d0: 65 73 73 20 5f 61 63 63 65 73 73 0a 23 65 6e 64  ess _access.#end
13e0: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
13f0: 64 69 6e 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  dint.h>../*.** T
1400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
1410: 72 6f 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  ros are used to 
1420: 63 61 73 74 20 70 6f 69 6e 74 65 72 73 20 74 6f  cast pointers to
1430: 20 69 6e 74 65 67 65 72 73 20 61 6e 64 0a 2a 2a   integers and.**
1440: 20 69 6e 74 65 67 65 72 73 20 74 6f 20 70 6f 69   integers to poi
1450: 6e 74 65 72 73 2e 20 20 54 68 65 20 77 61 79 20  nters.  The way 
1460: 79 6f 75 20 64 6f 20 74 68 69 73 20 76 61 72 69  you do this vari
1470: 65 73 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6d 70  es from one comp
1480: 69 6c 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iler.** to the n
1490: 65 78 74 2c 20 73 6f 20 77 65 20 68 61 76 65 20  ext, so we have 
14a0: 64 65 76 65 6c 6f 70 65 64 20 74 68 65 20 66 6f  developed the fo
14b0: 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 23  llowing set of #
14c0: 69 66 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  if statements.**
14d0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 70 70   to generate app
14e0: 72 6f 70 72 69 61 74 65 20 6d 61 63 72 6f 73 20  ropriate macros 
14f0: 66 6f 72 20 61 20 77 69 64 65 20 72 61 6e 67 65  for a wide range
1500: 20 6f 66 20 63 6f 6d 70 69 6c 65 72 73 2e 0a 2a   of compilers..*
1510: 2a 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74  *.** The correct
1520: 20 22 41 4e 53 49 22 20 77 61 79 20 74 6f 20 64   "ANSI" way to d
1530: 6f 20 74 68 69 73 20 69 73 20 74 6f 20 75 73 65  o this is to use
1540: 20 74 68 65 20 69 6e 74 70 74 72 5f 74 20 74 79   the intptr_t ty
1550: 70 65 2e 0a 2a 2a 20 55 6e 66 6f 72 74 75 6e 61  pe..** Unfortuna
1560: 74 65 6c 79 2c 20 74 68 61 74 20 74 79 70 65 64  tely, that typed
1570: 65 66 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ef is not availa
1580: 62 6c 65 20 6f 6e 20 61 6c 6c 20 63 6f 6d 70 69  ble on all compi
1590: 6c 65 72 73 2c 20 6f 72 0a 2a 2a 20 69 66 20 69  lers, or.** if i
15a0: 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
15b0: 69 74 20 72 65 71 75 69 72 65 73 20 61 6e 20 23  it requires an #
15c0: 69 6e 63 6c 75 64 65 20 6f 66 20 73 70 65 63 69  include of speci
15d0: 66 69 63 20 68 65 61 64 65 72 73 0a 2a 2a 20 74  fic headers.** t
15e0: 68 61 74 20 76 61 72 79 20 66 72 6f 6d 20 6f 6e  hat vary from on
15f0: 65 20 6d 61 63 68 69 6e 65 20 74 6f 20 74 68 65  e machine to the
1600: 20 6e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 69 63   next..**.** Tic
1610: 6b 65 74 20 23 33 38 36 30 3a 20 20 54 68 65 20  ket #3860:  The 
1620: 6c 6c 76 6d 2d 67 63 63 2d 34 2e 32 20 63 6f 6d  llvm-gcc-4.2 com
1630: 70 69 6c 65 72 20 66 72 6f 6d 20 41 70 70 6c 65  piler from Apple
1640: 20 63 68 6f 6b 65 73 20 6f 6e 0a 2a 2a 20 74 68   chokes on.** th
1650: 65 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61  e ((void*)&((cha
1660: 72 2a 29 30 29 5b 58 5d 29 20 63 6f 6e 73 74 72  r*)0)[X]) constr
1670: 75 63 74 2e 20 20 42 75 74 20 4d 53 56 43 20 63  uct.  But MSVC c
1680: 68 6f 6b 65 73 20 6f 6e 20 28 28 76 6f 69 64 2a  hokes on ((void*
1690: 29 28 58 29 29 2e 0a 2a 2a 20 53 6f 20 77 65 20  )(X))..** So we 
16a0: 68 61 76 65 20 74 6f 20 64 65 66 69 6e 65 20 74  have to define t
16b0: 68 65 20 6d 61 63 72 6f 73 20 69 6e 20 64 69 66  he macros in dif
16c0: 66 65 72 65 6e 74 20 77 61 79 73 20 64 65 70 65  ferent ways depe
16d0: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
16e0: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2f 0a 23 69 66  compiler..*/.#if
16f0: 20 64 65 66 69 6e 65 64 28 5f 5f 50 54 52 44 49   defined(__PTRDI
1700: 46 46 5f 54 59 50 45 5f 5f 29 20 20 2f 2a 20 54  FF_TYPE__)  /* T
1710: 68 69 73 20 63 61 73 65 20 73 68 6f 75 6c 64 20  his case should 
1720: 77 6f 72 6b 20 66 6f 72 20 47 43 43 20 2a 2f 0a  work for GCC */.
1730: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1740: 49 4e 54 5f 54 4f 5f 50 54 52 28 58 29 20 20 28  INT_TO_PTR(X)  (
1750: 28 76 6f 69 64 2a 29 28 5f 5f 50 54 52 44 49 46  (void*)(__PTRDIF
1760: 46 5f 54 59 50 45 5f 5f 29 28 58 29 29 0a 23 20  F_TYPE__)(X)).# 
1770: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 54  define SQLITE_PT
1780: 52 5f 54 4f 5f 49 4e 54 28 58 29 20 20 28 28 73  R_TO_INT(X)  ((s
1790: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 5f 5f  qlite3_int64)(__
17a0: 50 54 52 44 49 46 46 5f 54 59 50 45 5f 5f 29 28  PTRDIFF_TYPE__)(
17b0: 58 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  X)).#else.# defi
17c0: 6e 65 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  ne SQLITE_INT_TO
17d0: 5f 50 54 52 28 58 29 20 20 28 28 76 6f 69 64 2a  _PTR(X)  ((void*
17e0: 29 28 69 6e 74 70 74 72 5f 74 29 28 58 29 29 0a  )(intptr_t)(X)).
17f0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1800: 50 54 52 5f 54 4f 5f 49 4e 54 28 58 29 20 20 28  PTR_TO_INT(X)  (
1810: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1820: 69 6e 74 70 74 72 5f 74 29 28 58 29 29 0a 23 65  intptr_t)(X)).#e
1830: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77  ndif../*.** Show
1840: 20 74 68 71 65 20 68 65 6c 70 20 74 65 78 74 20   thqe help text 
1850: 61 6e 64 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61  and quit..*/.sta
1860: 74 69 63 20 76 6f 69 64 20 73 68 6f 77 48 65 6c  tic void showHel
1870: 70 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e  p(void){.  fprin
1880: 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 22 2c  tf(stdout, "%s",
1890: 20 7a 48 65 6c 70 29 3b 0a 20 20 65 78 69 74 28   zHelp);.  exit(
18a0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f  1);.}../*.** Sho
18b0: 77 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  w an error messa
18c0: 67 65 20 61 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73  ge an quit..*/.s
18d0: 74 61 74 69 63 20 76 6f 69 64 20 66 61 74 61 6c  tatic void fatal
18e0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
18f0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1900: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1910: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
1920: 20 22 45 52 52 4f 52 3a 20 22 29 3b 0a 20 20 76   "ERROR: ");.  v
1930: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
1940: 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74 66  mat);.  vfprintf
1950: 28 73 74 64 6f 75 74 2c 20 7a 46 6f 72 6d 61 74  (stdout, zFormat
1960: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1970: 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ap);.  fprintf(s
1980: 74 64 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  tdout, "\n");.  
1990: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(1);.}../*.*
19a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
19b0: 75 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69  ue of a hexadeci
19c0: 6d 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75  mal digit.  Retu
19d0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70  rn -1 if the inp
19e0: 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68  ut.** is not a h
19f0: 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61  ex digit..*/.sta
1a00: 74 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74  tic int hexDigit
1a10: 56 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20  Value(char c){. 
1a20: 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
1a30: 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63  <='9' ) return c
1a40: 20 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e   - '0';.  if( c>
1a50: 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29  ='a' && c<='f' )
1a60: 20 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20   return c - 'a' 
1a70: 2b 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27  + 10;.  if( c>='
1a80: 41 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72  A' && c<='F' ) r
1a90: 65 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20  eturn c - 'A' + 
1aa0: 31 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b  10;.  return -1;
1ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  .}../*.** Interp
1ac0: 72 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69  ret zArg as an i
1ad0: 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f  nteger value, po
1ae0: 73 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66  ssibly with suff
1af0: 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ixes..*/.static 
1b00: 69 6e 74 20 69 6e 74 65 67 65 72 56 61 6c 75 65  int integerValue
1b10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72  (const char *zAr
1b20: 67 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  g){.  int v = 0;
1b30: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1b40: 73 74 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a  struct { char *z
1b50: 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c  Suffix; int iMul
1b60: 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b  t; } aMult[] = {
1b70: 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30  .    { "KiB", 10
1b80: 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42  24 },.    { "MiB
1b90: 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a  ", 1024*1024 },.
1ba0: 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32      { "GiB", 102
1bb0: 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20  4*1024*1024 },. 
1bc0: 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30     { "KB",  1000
1bd0: 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20   },.    { "MB", 
1be0: 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20   1000000 },.    
1bf0: 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30 30 30  { "GB",  1000000
1c00: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22  000 },.    { "K"
1c10: 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20  ,   1000 },.    
1c20: 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30  { "M",   1000000
1c30: 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20   },.    { "G",  
1c40: 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   1000000000 },. 
1c50: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   };.  int i;.  i
1c60: 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20  nt isNeg = 0;.  
1c70: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27  if( zArg[0]=='-'
1c80: 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20   ){.    isNeg = 
1c90: 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  1;.    zArg++;. 
1ca0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b   }else if( zArg[
1cb0: 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a  0]=='+' ){.    z
1cc0: 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Arg++;.  }.  if(
1cd0: 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
1ce0: 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
1cf0: 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20  .    int x;.    
1d00: 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77  zArg += 2;.    w
1d10: 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69  hile( (x = hexDi
1d20: 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d  gitValue(zArg[0]
1d30: 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ))>=0 ){.      v
1d40: 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20   = (v<<4) + x;. 
1d50: 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20       zArg++;.   
1d60: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d70: 77 68 69 6c 65 28 20 7a 41 72 67 5b 30 5d 3e 3d  while( zArg[0]>=
1d80: 27 30 27 20 26 26 20 7a 41 72 67 5b 30 5d 3c 3d  '0' && zArg[0]<=
1d90: 27 39 27 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  '9' ){.      v =
1da0: 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20   v*10 + zArg[0] 
1db0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72  - '0';.      zAr
1dc0: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  g++;.    }.  }. 
1dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1de0: 6f 66 28 61 4d 75 6c 74 29 2f 73 69 7a 65 6f 66  of(aMult)/sizeof
1df0: 28 61 4d 75 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29  (aMult[0]); i++)
1e00: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e10: 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b  3_stricmp(aMult[
1e20: 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72 67  i].zSuffix, zArg
1e30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
1e40: 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c  *= aMult[i].iMul
1e50: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
1e60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e70: 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76  rn isNeg? -v : v
1e80: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ;.}.../*.** Chec
1e90: 6b 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  k the filesystem
1ea0: 20 6f 62 6a 65 63 74 20 7a 50 61 74 68 2e 20 20   object zPath.  
1eb0: 44 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 69  Determine what i
1ec0: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  t is:.**.**    P
1ed0: 41 54 48 5f 44 49 52 20 20 20 20 20 41 20 73 69  ATH_DIR     A si
1ee0: 6e 67 6c 65 20 64 69 72 65 63 74 6f 72 79 20 68  ngle directory h
1ef0: 6f 6c 64 69 6e 67 20 6d 61 6e 79 20 66 69 6c 65  olding many file
1f00: 73 0a 2a 2a 20 20 20 20 50 41 54 48 5f 54 52 45  s.**    PATH_TRE
1f10: 45 20 20 20 20 41 20 64 69 72 65 63 74 6f 72 79  E    A directory
1f20: 20 68 69 65 72 61 72 63 68 79 20 77 69 74 68 20   hierarchy with 
1f30: 66 69 6c 65 73 20 61 74 20 74 68 65 20 6c 65 61  files at the lea
1f40: 76 65 73 0a 2a 2a 20 20 20 20 50 41 54 48 5f 44  ves.**    PATH_D
1f50: 42 20 20 20 20 20 20 41 6e 20 53 51 4c 69 74 65  B      An SQLite
1f60: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
1f70: 50 41 54 48 5f 4e 45 58 49 53 54 20 20 44 6f 65  PATH_NEXIST  Doe
1f80: 73 20 6e 6f 74 20 65 78 69 73 74 0a 2a 2a 20 20  s not exist.**  
1f90: 20 20 50 41 54 48 5f 4f 54 48 45 52 20 20 20 53    PATH_OTHER   S
1fa0: 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 0a 2a 2a  omething else.**
1fb0: 0a 2a 2a 20 50 41 54 48 5f 44 49 52 20 6d 65 61  .** PATH_DIR mea
1fc0: 6e 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 65  ns all of the se
1fd0: 70 61 72 61 74 65 20 66 69 6c 65 73 20 61 72 65  parate files are
1fe0: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1ff0: 72 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67  r.** into a sing
2000: 6c 65 20 64 69 72 65 63 74 6f 72 79 20 77 69 74  le directory wit
2010: 68 20 6e 61 6d 65 73 20 6c 69 6b 65 20 30 30 30  h names like 000
2020: 30 30 30 2c 20 30 30 30 30 30 31 2c 20 30 30 30  000, 000001, 000
2030: 30 30 32 2c 20 61 6e 64 0a 2a 2a 20 73 6f 20 66  002, and.** so f
2040: 6f 72 74 68 2e 20 20 50 41 54 48 5f 54 52 45 45  orth.  PATH_TREE
2050: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
2060: 61 20 68 69 65 72 61 72 63 68 79 20 6f 66 20 64  a hierarchy of d
2070: 69 72 65 63 74 6f 72 69 65 73 20 73 6f 0a 2a 2a  irectories so.**
2080: 20 74 68 61 74 20 6e 6f 20 73 69 6e 67 6c 65 20   that no single 
2090: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 74 6f  directory has to
20a0: 6f 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 2e 20  o many entries. 
20b0: 20 54 68 65 20 66 69 6c 65 73 20 68 61 76 65 20   The files have 
20c0: 6e 61 6d 65 73 0a 2a 2a 20 6c 69 6b 65 20 30 30  names.** like 00
20d0: 2f 30 30 2f 30 30 2c 20 30 30 2f 30 30 2f 30 31  /00/00, 00/00/01
20e0: 2c 20 30 30 2f 30 30 2f 30 32 20 61 6e 64 20 73  , 00/00/02 and s
20f0: 6f 20 66 6f 72 74 68 2e 20 20 54 68 65 20 64 65  o forth.  The de
2100: 63 69 73 69 6f 6e 20 62 65 74 77 65 65 6e 0a 2a  cision between.*
2110: 2a 20 50 41 54 48 5f 44 49 52 20 61 6e 64 20 50  * PATH_DIR and P
2120: 41 54 48 5f 54 52 45 45 20 69 73 20 64 65 74 65  ATH_TREE is dete
2130: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 72  rmined by the pr
2140: 65 73 65 6e 63 65 20 6f 66 20 61 20 73 75 62 64  esence of a subd
2150: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 6e 61 6d 65  irectory.** name
2160: 64 20 22 30 30 22 20 61 74 20 74 68 65 20 74 6f  d "00" at the to
2170: 70 2d 6c 65 76 65 6c 2e 0a 2a 2f 0a 23 64 65 66  p-level..*/.#def
2180: 69 6e 65 20 50 41 54 48 5f 44 49 52 20 20 20 20  ine PATH_DIR    
2190: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 54 48 5f   1.#define PATH_
21a0: 54 52 45 45 20 20 20 20 32 0a 23 64 65 66 69 6e  TREE    2.#defin
21b0: 65 20 50 41 54 48 5f 44 42 20 20 20 20 20 20 33  e PATH_DB      3
21c0: 0a 23 64 65 66 69 6e 65 20 50 41 54 48 5f 4e 45  .#define PATH_NE
21d0: 58 49 53 54 20 20 30 0a 23 64 65 66 69 6e 65 20  XIST  0.#define 
21e0: 50 41 54 48 5f 4f 54 48 45 52 20 20 20 39 39 0a  PATH_OTHER   99.
21f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 74 68 54  static int pathT
2200: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
2210: 7a 50 61 74 68 29 7b 0a 20 20 73 74 72 75 63 74  zPath){.  struct
2220: 20 73 74 61 74 20 78 3b 0a 20 20 69 6e 74 20 72   stat x;.  int r
2230: 63 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  c;.  if( access(
2240: 7a 50 61 74 68 2c 52 5f 4f 4b 29 20 29 20 72 65  zPath,R_OK) ) re
2250: 74 75 72 6e 20 50 41 54 48 5f 4e 45 58 49 53 54  turn PATH_NEXIST
2260: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
2270: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
2280: 72 63 20 3d 20 73 74 61 74 28 7a 50 61 74 68 2c  rc = stat(zPath,
2290: 20 26 78 29 3b 0a 20 20 69 66 28 20 72 63 3c 30   &x);.  if( rc<0
22a0: 20 29 20 72 65 74 75 72 6e 20 50 41 54 48 5f 4f   ) return PATH_O
22b0: 54 48 45 52 3b 0a 20 20 69 66 28 20 53 5f 49 53  THER;.  if( S_IS
22c0: 44 49 52 28 78 2e 73 74 5f 6d 6f 64 65 29 20 29  DIR(x.st_mode) )
22d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 61 79  {.    char *zLay
22e0: 65 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  er1 = sqlite3_mp
22f0: 72 69 6e 74 66 28 22 25 73 2f 30 30 22 2c 20 7a  rintf("%s/00", z
2300: 50 61 74 68 29 3b 0a 20 20 20 20 6d 65 6d 73 65  Path);.    memse
2310: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
2320: 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 74  x));.    rc = st
2330: 61 74 28 7a 4c 61 79 65 72 31 2c 20 26 78 29 3b  at(zLayer1, &x);
2340: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2350: 65 28 7a 4c 61 79 65 72 31 29 3b 0a 20 20 20 20  e(zLayer1);.    
2360: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
2370: 6e 20 50 41 54 48 5f 44 49 52 3b 0a 20 20 20 20  n PATH_DIR;.    
2380: 69 66 28 20 53 5f 49 53 44 49 52 28 78 2e 73 74  if( S_ISDIR(x.st
2390: 5f 6d 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  _mode) ) return 
23a0: 50 41 54 48 5f 54 52 45 45 3b 0a 20 20 20 20 72  PATH_TREE;.    r
23b0: 65 74 75 72 6e 20 50 41 54 48 5f 44 49 52 3b 0a  eturn PATH_DIR;.
23c0: 20 20 7d 0a 20 20 69 66 28 20 28 78 2e 73 74 5f    }.  if( (x.st_
23d0: 73 69 7a 65 25 35 31 32 29 3d 3d 30 20 29 20 72  size%512)==0 ) r
23e0: 65 74 75 72 6e 20 50 41 54 48 5f 44 42 3b 0a 20  eturn PATH_DB;. 
23f0: 20 72 65 74 75 72 6e 20 50 41 54 48 5f 4f 54 48   return PATH_OTH
2400: 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ER;.}../*.** Ret
2410: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
2420: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 2e  a file in bytes.
2430: 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69    Or return -1 i
2440: 66 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 64 20 6f  f the.** named o
2450: 62 6a 65 63 74 20 69 73 20 6e 6f 74 20 61 20 72  bject is not a r
2460: 65 67 75 6c 61 72 20 66 69 6c 65 20 6f 72 20 64  egular file or d
2470: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
2480: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
2490: 5f 69 6e 74 36 34 20 66 69 6c 65 53 69 7a 65 28  _int64 fileSize(
24a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
24b0: 68 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  h){.  struct sta
24c0: 74 20 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t x;.  int rc;. 
24d0: 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73   memset(&x, 0, s
24e0: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 72 63 20  izeof(x));.  rc 
24f0: 3d 20 73 74 61 74 28 7a 50 61 74 68 2c 20 26 78  = stat(zPath, &x
2500: 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20  );.  if( rc<0 ) 
2510: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28  return -1;.  if(
2520: 20 21 53 5f 49 53 52 45 47 28 78 2e 73 74 5f 6d   !S_ISREG(x.st_m
2530: 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 2d 31  ode) ) return -1
2540: 3b 0a 20 20 72 65 74 75 72 6e 20 78 2e 73 74 5f  ;.  return x.st_
2550: 73 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  size;.}../*.** A
2560: 20 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e   Pseudo-random n
2570: 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20  umber generator 
2580: 77 69 74 68 20 61 20 66 69 78 65 64 20 73 65 65  with a fixed see
2590: 64 2e 20 20 55 73 65 20 74 68 69 73 20 73 6f 0a  d.  Use this so.
25a0: 2a 2a 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ** that the same
25b0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 22 72 61   sequence of "ra
25c0: 6e 64 6f 6d 22 20 6e 75 6d 62 65 72 73 20 61 72  ndom" numbers ar
25d0: 65 20 67 65 6e 65 72 61 74 65 64 20 6f 6e 20 65  e generated on e
25e0: 61 63 68 0a 2a 2a 20 72 75 6e 2c 20 66 6f 72 20  ach.** run, for 
25f0: 72 65 70 65 61 74 61 62 69 6c 69 74 79 2e 0a 2a  repeatability..*
2600: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
2610: 64 20 69 6e 74 20 72 61 6e 64 49 6e 74 28 76 6f  d int randInt(vo
2620: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 6e  id){.  static un
2630: 73 69 67 6e 65 64 20 69 6e 74 20 78 20 3d 20 30  signed int x = 0
2640: 78 33 33 33 61 31 33 63 64 3b 0a 20 20 73 74 61  x333a13cd;.  sta
2650: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
2660: 20 79 20 3d 20 30 78 65 63 62 32 61 64 65 61 3b   y = 0xecb2adea;
2670: 0a 20 20 78 20 3d 20 28 78 3e 3e 31 29 20 5e 20  .  x = (x>>1) ^ 
2680: 28 28 31 2b 7e 28 78 26 31 29 29 20 26 20 30 78  ((1+~(x&1)) & 0x
2690: 64 30 30 30 30 30 30 31 29 3b 0a 20 20 79 20 3d  d0000001);.  y =
26a0: 20 79 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20   y*1103515245 + 
26b0: 31 32 33 34 35 3b 0a 20 20 72 65 74 75 72 6e 20  12345;.  return 
26c0: 78 5e 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  x^y;.}../*.** Do
26d0: 20 64 61 74 61 62 61 73 65 20 69 6e 69 74 69 61   database initia
26e0: 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  lization..*/.sta
26f0: 74 69 63 20 69 6e 74 20 69 6e 69 74 4d 61 69 6e  tic int initMain
2700: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
2710: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
2720: 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 69 2c 20 72  *zDb;.  int i, r
2730: 63 3b 0a 20 20 69 6e 74 20 6e 43 6f 75 6e 74 20  c;.  int nCount 
2740: 3d 20 31 30 30 30 3b 0a 20 20 69 6e 74 20 73 7a  = 1000;.  int sz
2750: 20 3d 20 31 30 30 30 30 3b 0a 20 20 69 6e 74 20   = 10000;.  int 
2760: 69 56 61 72 69 61 6e 63 65 20 3d 20 30 3b 0a 20  iVariance = 0;. 
2770: 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36   int pgsz = 4096
2780: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2790: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
27a0: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
27b0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
27c0: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 69  trcmp(argv[1],"i
27d0: 6e 69 74 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73  nit")==0 );.  as
27e0: 73 65 72 74 28 20 61 72 67 63 3e 3d 33 20 29 3b  sert( argc>=3 );
27f0: 0a 20 20 7a 44 62 20 3d 20 61 72 67 76 5b 32 5d  .  zDb = argv[2]
2800: 3b 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 61  ;.  for(i=3; i<a
2810: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  rgc; i++){.    c
2820: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
2830: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d  ;.    if( z[0]!=
2840: 27 2d 27 20 29 20 66 61 74 61 6c 45 72 72 6f 72  '-' ) fatalError
2850: 28 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65  ("unknown argume
2860: 6e 74 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 29 3b  nt: \"%s\"", z);
2870: 0a 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27  .    if( z[1]=='
2880: 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  -' ) z++;.    if
2890: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 63 6f  ( strcmp(z, "-co
28a0: 75 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  unt")==0 ){.    
28b0: 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20    if( i==argc-1 
28c0: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69  ) fatalError("mi
28d0: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
28e0: 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b  n \"%s\"", argv[
28f0: 69 5d 29 3b 0a 20 20 20 20 20 20 6e 43 6f 75 6e  i]);.      nCoun
2900: 74 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65  t = integerValue
2910: 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20  (argv[++i]);.   
2920: 20 20 20 69 66 28 20 6e 43 6f 75 6e 74 3c 31 20     if( nCount<1 
2930: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 68  ) fatalError("th
2940: 65 20 2d 2d 63 6f 75 6e 74 20 6d 75 73 74 20 62  e --count must b
2950: 65 20 70 6f 73 69 74 69 76 65 22 29 3b 0a 20 20  e positive");.  
2960: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2970: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
2980: 6d 70 28 7a 2c 20 22 2d 73 69 7a 65 22 29 3d 3d  mp(z, "-size")==
2990: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
29a0: 3d 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c  ==argc-1 ) fatal
29b0: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
29c0: 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25 73 5c  rgument on \"%s\
29d0: 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  "", argv[i]);.  
29e0: 20 20 20 20 73 7a 20 3d 20 69 6e 74 65 67 65 72      sz = integer
29f0: 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29  Value(argv[++i])
2a00: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 31  ;.      if( sz<1
2a10: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74   ) fatalError("t
2a20: 68 65 20 2d 2d 73 69 7a 65 20 6d 75 73 74 20 62  he --size must b
2a30: 65 20 70 6f 73 69 74 69 76 65 22 29 3b 0a 20 20  e positive");.  
2a40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2a50: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
2a60: 6d 70 28 7a 2c 20 22 2d 76 61 72 69 61 6e 63 65  mp(z, "-variance
2a70: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
2a80: 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66  f( i==argc-1 ) f
2a90: 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69  atalError("missi
2aa0: 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c  ng argument on \
2ab0: 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29  "%s\"", argv[i])
2ac0: 3b 0a 20 20 20 20 20 20 69 56 61 72 69 61 6e 63  ;.      iVarianc
2ad0: 65 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65  e = integerValue
2ae0: 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20  (argv[++i]);.   
2af0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2b00: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
2b10: 70 28 7a 2c 20 22 2d 70 61 67 65 73 69 7a 65 22  p(z, "-pagesize"
2b20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
2b30: 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i==argc-1 ) fa
2b40: 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  talError("missin
2b50: 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22  g argument on \"
2b60: 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b  %s\"", argv[i]);
2b70: 0a 20 20 20 20 20 20 70 67 73 7a 20 3d 20 69 6e  .      pgsz = in
2b80: 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b  tegerValue(argv[
2b90: 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  ++i]);.      if(
2ba0: 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73   pgsz<512 || pgs
2bb0: 7a 3e 36 35 35 33 36 20 7c 7c 20 28 28 70 67 73  z>65536 || ((pgs
2bc0: 7a 2d 31 29 26 70 67 73 7a 29 21 3d 30 20 29 7b  z-1)&pgsz)!=0 ){
2bd0: 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72  .        fatalEr
2be0: 72 6f 72 28 22 74 68 65 20 2d 2d 70 61 67 65 73  ror("the --pages
2bf0: 69 7a 65 20 6d 75 73 74 20 62 65 20 70 6f 77 65  ize must be powe
2c00: 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
2c10: 31 32 20 61 6e 64 20 36 35 35 33 36 22 29 3b 0a  12 and 65536");.
2c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
2c30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
2c40: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e    fatalError("un
2c50: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22  known option: \"
2c60: 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b  %s\"", argv[i]);
2c70: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2c80: 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c 20 26 64  te3_open(zDb, &d
2c90: 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
2ca0: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
2cb0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74 61  cannot open data
2cc0: 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 22  base \"%s\": %s"
2cd0: 2c 20 7a 44 62 2c 20 73 71 6c 69 74 65 33 5f 65  , zDb, sqlite3_e
2ce0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
2cf0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2d00: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 22 44  _mprintf(.    "D
2d10: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2d20: 53 54 53 20 6b 76 3b 5c 6e 22 0a 20 20 20 20 22  STS kv;\n".    "
2d30: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
2d40: 3d 25 64 3b 5c 6e 22 0a 20 20 20 20 22 56 41 43  =%d;\n".    "VAC
2d50: 55 55 4d 3b 5c 6e 22 0a 20 20 20 20 22 42 45 47  UUM;\n".    "BEG
2d60: 49 4e 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41  IN;\n".    "CREA
2d70: 54 45 20 54 41 42 4c 45 20 6b 76 28 6b 20 49 4e  TE TABLE kv(k IN
2d80: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2d90: 59 2c 20 76 20 42 4c 4f 42 29 3b 5c 6e 22 0a 20  Y, v BLOB);\n". 
2da0: 20 20 20 22 57 49 54 48 20 52 45 43 55 52 53 49     "WITH RECURSI
2db0: 56 45 20 63 28 78 29 20 41 53 20 28 56 41 4c 55  VE c(x) AS (VALU
2dc0: 45 53 28 31 29 20 55 4e 49 4f 4e 20 41 4c 4c 20  ES(1) UNION ALL 
2dd0: 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
2de0: 63 20 57 48 45 52 45 20 78 3c 25 64 29 22 0a 20  c WHERE x<%d)". 
2df0: 20 20 20 22 20 49 4e 53 45 52 54 20 49 4e 54 4f     " INSERT INTO
2e00: 20 6b 76 28 6b 2c 76 29 20 53 45 4c 45 43 54 20   kv(k,v) SELECT 
2e10: 78 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 25 64  x, randomblob(%d
2e20: 2b 28 72 61 6e 64 6f 6d 28 29 25 25 28 25 64 29  +(random()%%(%d)
2e30: 29 29 20 46 52 4f 4d 20 63 3b 5c 6e 22 0a 20 20  )) FROM c;\n".  
2e40: 20 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 2c 0a 20    "COMMIT;\n",. 
2e50: 20 20 20 70 67 73 7a 2c 20 6e 43 6f 75 6e 74 2c     pgsz, nCount,
2e60: 20 73 7a 2c 20 69 56 61 72 69 61 6e 63 65 2b 31   sz, iVariance+1
2e70: 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  .  );.  rc = sql
2e80: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
2e90: 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
2ea0: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  sg);.  if( rc ) 
2eb0: 66 61 74 61 6c 45 72 72 6f 72 28 22 64 61 74 61  fatalError("data
2ec0: 62 61 73 65 20 63 72 65 61 74 65 20 66 61 69 6c  base create fail
2ed0: 65 64 3a 20 25 73 22 2c 20 7a 45 72 72 4d 73 67  ed: %s", zErrMsg
2ee0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2ef0: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
2f00: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
2f10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2f20: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 20 65 78  ** Analyze an ex
2f30: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
2f40: 66 69 6c 65 2e 20 20 52 65 70 6f 72 74 20 69 74  file.  Report it
2f50: 73 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74  s content..*/.st
2f60: 61 74 69 63 20 69 6e 74 20 73 74 61 74 4d 61 69  atic int statMai
2f70: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
2f80: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72   **argv){.  char
2f90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 69 2c 20   *zDb;.  int i, 
2fa0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
2fb0: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  b;.  char *zSql;
2fc0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2fd0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 64 6f  *pStmt;.  int do
2fe0: 56 61 63 75 75 6d 20 3d 20 30 3b 0a 0a 20 20 61  Vacuum = 0;..  a
2ff0: 73 73 65 72 74 28 20 73 74 72 63 6d 70 28 61 72  ssert( strcmp(ar
3000: 67 76 5b 31 5d 2c 22 73 74 61 74 22 29 3d 3d 30  gv[1],"stat")==0
3010: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72   );.  assert( ar
3020: 67 63 3e 3d 33 20 29 3b 0a 20 20 7a 44 62 20 3d  gc>=3 );.  zDb =
3030: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28   argv[2];.  for(
3040: 69 3d 33 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=3; i<argc; i++
3050: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
3060: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66   argv[i];.    if
3070: 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 66 61  ( z[0]!='-' ) fa
3080: 74 61 6c 45 72 72 6f 72 28 22 75 6e 6b 6e 6f 77  talError("unknow
3090: 6e 20 61 72 67 75 6d 65 6e 74 3a 20 5c 22 25 73  n argument: \"%s
30a0: 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28  \"", z);.    if(
30b0: 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
30c0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
30d0: 28 7a 2c 20 22 2d 76 61 63 75 75 6d 22 29 3d 3d  (z, "-vacuum")==
30e0: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 56 61 63  0 ){.      doVac
30f0: 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  uum = 1;.      c
3100: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
3110: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75     fatalError("u
3120: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c  nknown option: \
3130: 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29  "%s\"", argv[i])
3140: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
3150: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c 20 26  ite3_open(zDb, &
3160: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  db);.  if( rc ){
3170: 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28  .    fatalError(
3180: 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74  "cannot open dat
3190: 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73  abase \"%s\": %s
31a0: 22 2c 20 7a 44 62 2c 20 73 71 6c 69 74 65 33 5f  ", zDb, sqlite3_
31b0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
31c0: 0a 20 20 69 66 28 20 64 6f 56 61 63 75 75 6d 20  .  if( doVacuum 
31d0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56  ){.    printf("V
31e0: 61 63 75 75 6d 69 6e 67 2e 2e 2e 2e 22 29 3b 20  acuuming...."); 
31f0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
3200: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
3210: 28 64 62 2c 20 22 56 41 43 55 55 4d 22 2c 20 30  (db, "VACUUM", 0
3220: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 72 69  , 0, 0);.    pri
3230: 6e 74 66 28 22 20 20 20 20 20 20 20 64 6f 6e 65  ntf("       done
3240: 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  \n");.  }.  zSql
3250: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
3260: 74 66 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20  tf(.    "SELECT 
3270: 63 6f 75 6e 74 28 2a 29 2c 20 6d 69 6e 28 6c 65  count(*), min(le
3280: 6e 67 74 68 28 76 29 29 2c 20 6d 61 78 28 6c 65  ngth(v)), max(le
3290: 6e 67 74 68 28 76 29 29 2c 20 61 76 67 28 6c 65  ngth(v)), avg(le
32a0: 6e 67 74 68 28 76 29 29 22 0a 20 20 20 20 22 20  ngth(v))".    " 
32b0: 20 46 52 4f 4d 20 6b 76 22 0a 20 20 29 3b 0a 20   FROM kv".  );. 
32c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
32d0: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
32e0: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
32f0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66 61  );.  if( rc ) fa
3300: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
3310: 20 70 72 65 70 61 72 65 20 53 51 4c 20 5b 25 73   prepare SQL [%s
3320: 5d 3a 20 25 73 22 2c 20 7a 53 71 6c 2c 20 73 71  ]: %s", zSql, sq
3330: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
3340: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3350: 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 73  e(zSql);.  if( s
3360: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
3370: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
3380: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 4e 75  {.    printf("Nu
3390: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 3a  mber of entries:
33a0: 20 20 25 38 64 5c 6e 22 2c 20 73 71 6c 69 74 65    %8d\n", sqlite
33b0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
33c0: 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 70 72 69  mt, 0));.    pri
33d0: 6e 74 66 28 22 41 76 65 72 61 67 65 20 76 61 6c  ntf("Average val
33e0: 75 65 20 73 69 7a 65 3a 20 25 38 64 5c 6e 22 2c  ue size: %8d\n",
33f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3400: 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 29 3b 0a  int(pStmt, 3));.
3410: 20 20 20 20 70 72 69 6e 74 66 28 22 4d 69 6e 69      printf("Mini
3420: 6d 75 6d 20 76 61 6c 75 65 20 73 69 7a 65 3a 20  mum value size: 
3430: 25 38 64 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  %8d\n", sqlite3_
3440: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
3450: 2c 20 31 29 29 3b 0a 20 20 20 20 70 72 69 6e 74  , 1));.    print
3460: 66 28 22 4d 61 78 69 6d 75 6d 20 76 61 6c 75 65  f("Maximum value
3470: 20 73 69 7a 65 3a 20 25 38 64 5c 6e 22 2c 20 73   size: %8d\n", s
3480: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
3490: 74 28 70 53 74 6d 74 2c 20 32 29 29 3b 0a 20 20  t(pStmt, 2));.  
34a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
34b0: 66 28 22 4e 6f 20 72 6f 77 73 5c 6e 22 29 3b 0a  f("No rows\n");.
34c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
34d0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
34e0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
34f0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
3500: 70 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 72  page_size");.  r
3510: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
3520: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
3530: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
3540: 0a 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61  .  if( rc ) fata
3550: 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 70  lError("cannot p
3560: 72 65 70 61 72 65 20 53 51 4c 20 5b 25 73 5d 3a  repare SQL [%s]:
3570: 20 25 73 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69   %s", zSql, sqli
3580: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
3590: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
35a0: 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  zSql);.  if( sql
35b0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
35c0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
35d0: 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 67 65      printf("Page
35e0: 2d 73 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20  -size:          
35f0: 25 38 64 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  %8d\n", sqlite3_
3600: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
3610: 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , 0));.  }.  sql
3620: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3630: 74 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  tmt);.  zSql = s
3640: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
3650: 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
3660: 74 22 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  t");.  rc = sqli
3670: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
3680: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
3690: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
36a0: 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  c ) fatalError("
36b0: 63 61 6e 6e 6f 74 20 70 72 65 70 61 72 65 20 53  cannot prepare S
36c0: 51 4c 20 5b 25 73 5d 3a 20 25 73 22 2c 20 7a 53  QL [%s]: %s", zS
36d0: 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ql, sqlite3_errm
36e0: 73 67 28 64 62 29 29 3b 0a 20 20 73 71 6c 69 74  sg(db));.  sqlit
36f0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
3700: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
3710: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
3720: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 70 72 69 6e  _ROW ){.    prin
3730: 74 66 28 22 50 61 67 65 2d 63 6f 75 6e 74 3a 20  tf("Page-count: 
3740: 20 20 20 20 20 20 20 20 25 38 64 5c 6e 22 2c 20          %8d\n", 
3750: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
3760: 6e 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20  nt(pStmt, 0));. 
3770: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
3780: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
3790: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
37a0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 66  printf("PRAGMA f
37b0: 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 22 29 3b  reelist_count");
37c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
37d0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
37e0: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
37f0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
3800: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
3810: 6f 74 20 70 72 65 70 61 72 65 20 53 51 4c 20 5b  ot prepare SQL [
3820: 25 73 5d 3a 20 25 73 22 2c 20 7a 53 71 6c 2c 20  %s]: %s", zSql, 
3830: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
3840: 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  b));.  sqlite3_f
3850: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
3860: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
3870: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
3880: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3890: 46 72 65 65 6c 69 73 74 2d 63 6f 75 6e 74 3a 20  Freelist-count: 
38a0: 20 20 20 20 25 38 64 5c 6e 22 2c 20 73 71 6c 69      %8d\n", sqli
38b0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
38c0: 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20  Stmt, 0));.  }. 
38d0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
38e0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d  e(pStmt);.  rc =
38f0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
3900: 5f 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20  _v2(db, "PRAGMA 
3910: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28  integrity_check(
3920: 31 30 29 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  10)", -1, &pStmt
3930: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
3940: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
3950: 6e 6f 74 20 70 72 65 70 61 72 65 20 69 6e 74 65  not prepare inte
3960: 67 72 69 74 79 20 63 68 65 63 6b 3a 20 25 73 22  grity check: %s"
3970: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
3980: 28 64 62 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  (db));.  while( 
3990: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
39a0: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
39b0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 49  ){.    printf("I
39c0: 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 3a 20  ntegrity-check: 
39d0: 20 20 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65     %s\n", sqlite
39e0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
39f0: 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20  tmt, 0));.  }.  
3a00: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3a10: 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74  (pStmt);.  sqlit
3a20: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
3a30: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3a40: 2a 2a 20 20 20 20 20 20 72 65 6d 65 6d 62 65 72  **      remember
3a50: 28 56 2c 50 54 52 29 0a 2a 2a 0a 2a 2a 20 52 65  (V,PTR).**.** Re
3a60: 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72  turn the integer
3a70: 20 76 61 6c 75 65 20 56 2e 20 20 41 6c 73 6f 20   value V.  Also 
3a80: 73 61 76 65 20 74 68 65 20 76 61 6c 75 65 20 6f  save the value o
3a90: 66 20 56 20 69 6e 20 61 0a 2a 2a 20 43 2d 6c 61  f V in a.** C-la
3aa0: 6e 67 75 61 67 65 20 76 61 72 69 61 62 6c 65 20  nguage variable 
3ab0: 77 68 6f 73 65 20 61 64 64 72 65 73 73 20 69 73  whose address is
3ac0: 20 50 54 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   PTR..*/.static 
3ad0: 76 6f 69 64 20 72 65 6d 65 6d 62 65 72 46 75 6e  void rememberFun
3ae0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
3af0: 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e  text *pCtx,.  in
3b00: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
3b10: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
3b20: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
3b30: 34 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  4 v;.  sqlite3_i
3b40: 6e 74 36 34 20 70 74 72 3b 0a 20 20 61 73 73 65  nt64 ptr;.  asse
3b50: 72 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20  rt( argc==2 );. 
3b60: 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   v = sqlite3_val
3b70: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
3b80: 29 3b 0a 20 20 70 74 72 20 3d 20 73 71 6c 69 74  );.  ptr = sqlit
3b90: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
3ba0: 72 67 76 5b 31 5d 29 3b 0a 20 20 2a 28 73 71 6c  rgv[1]);.  *(sql
3bb0: 69 74 65 33 5f 69 6e 74 36 34 2a 29 53 51 4c 49  ite3_int64*)SQLI
3bc0: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 74  TE_INT_TO_PTR(pt
3bd0: 72 29 20 3d 20 76 3b 0a 20 20 73 71 6c 69 74 65  r) = v;.  sqlite
3be0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
3bf0: 43 74 78 2c 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Ctx, v);.}../*.*
3c00: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 20 64 69  * Make sure a di
3c10: 72 65 63 74 6f 72 79 20 6e 61 6d 65 64 20 7a 44  rectory named zD
3c20: 69 72 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  ir exists..*/.st
3c30: 61 74 69 63 20 76 6f 69 64 20 6b 76 74 65 73 74  atic void kvtest
3c40: 5f 6d 6b 64 69 72 28 63 6f 6e 73 74 20 63 68 61  _mkdir(const cha
3c50: 72 20 2a 7a 44 69 72 29 7b 0a 23 69 66 20 64 65  r *zDir){.#if de
3c60: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
3c70: 28 76 6f 69 64 29 6d 6b 64 69 72 28 7a 44 69 72  (void)mkdir(zDir
3c80: 29 3b 0a 23 65 6c 73 65 0a 20 20 28 76 6f 69 64  );.#else.  (void
3c90: 29 6d 6b 64 69 72 28 7a 44 69 72 2c 20 30 37 35  )mkdir(zDir, 075
3ca0: 35 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  5);.#endif.}../*
3cb0: 0a 2a 2a 20 45 78 70 6f 72 74 20 74 68 65 20 6b  .** Export the k
3cc0: 76 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 69 76  v table to indiv
3cd0: 69 64 75 61 6c 20 66 69 6c 65 73 20 69 6e 20 74  idual files in t
3ce0: 68 65 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2f  he filesystem.*/
3cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 6f  .static int expo
3d00: 72 74 4d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  rtMain(int argc,
3d10: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
3d20: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68   char *zDb;.  ch
3d30: 61 72 20 2a 7a 44 69 72 3b 0a 20 20 73 71 6c 69  ar *zDir;.  sqli
3d40: 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
3d50: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
3d60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
3d70: 65 50 61 74 68 54 79 70 65 3b 0a 20 20 69 6e 74  ePathType;.  int
3d80: 20 6e 46 4e 3b 0a 20 20 63 68 61 72 20 2a 7a 46   nFN;.  char *zF
3d90: 4e 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c  N;.  char *zTail
3da0: 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 57 72 6f 74  ;.  size_t nWrot
3db0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  e;.  int i;..  a
3dc0: 73 73 65 72 74 28 20 73 74 72 63 6d 70 28 61 72  ssert( strcmp(ar
3dd0: 67 76 5b 31 5d 2c 22 65 78 70 6f 72 74 22 29 3d  gv[1],"export")=
3de0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3df0: 61 72 67 63 3e 3d 33 20 29 3b 0a 20 20 69 66 28  argc>=3 );.  if(
3e00: 20 61 72 67 63 3c 34 20 29 20 66 61 74 61 6c 45   argc<4 ) fatalE
3e10: 72 72 6f 72 28 22 55 73 61 67 65 3a 20 6b 76 74  rror("Usage: kvt
3e20: 65 73 74 20 65 78 70 6f 72 74 20 44 41 54 41 42  est export DATAB
3e30: 41 53 45 20 44 49 52 45 43 54 4f 52 59 20 5b 4f  ASE DIRECTORY [O
3e40: 50 54 49 4f 4e 53 5d 22 29 3b 0a 20 20 7a 44 62  PTIONS]");.  zDb
3e50: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 7a 44   = argv[2];.  zD
3e60: 69 72 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20  ir = argv[3];.  
3e70: 6b 76 74 65 73 74 5f 6d 6b 64 69 72 28 7a 44 69  kvtest_mkdir(zDi
3e80: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 34 3b 20 69  r);.  for(i=4; i
3e90: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
3ea0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
3eb0: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66   argv[i];.    if
3ec0: 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
3ed0: 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
3ee0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
3ef0: 2c 22 2d 74 72 65 65 22 29 3d 3d 30 20 29 7b 0a  ,"-tree")==0 ){.
3f00: 20 20 20 20 20 20 7a 46 4e 20 3d 20 73 71 6c 69        zFN = sqli
3f10: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
3f20: 30 30 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  00", zDir);.    
3f30: 20 20 6b 76 74 65 73 74 5f 6d 6b 64 69 72 28 7a    kvtest_mkdir(z
3f40: 46 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  FN);.      sqlit
3f50: 65 33 5f 66 72 65 65 28 7a 46 4e 29 3b 0a 20 20  e3_free(zFN);.  
3f60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3f70: 20 20 7d 0a 20 20 20 20 66 61 74 61 6c 45 72 72    }.    fatalErr
3f80: 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75  or("unknown argu
3f90: 6d 65 6e 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c  ment: \"%s\"\n",
3fa0: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20   argv[i]);.  }. 
3fb0: 20 65 50 61 74 68 54 79 70 65 20 3d 20 70 61 74   ePathType = pat
3fc0: 68 54 79 70 65 28 7a 44 69 72 29 3b 0a 20 20 69  hType(zDir);.  i
3fd0: 66 28 20 65 50 61 74 68 54 79 70 65 21 3d 50 41  f( ePathType!=PA
3fe0: 54 48 5f 44 49 52 20 26 26 20 65 50 61 74 68 54  TH_DIR && ePathT
3ff0: 79 70 65 21 3d 50 41 54 48 5f 54 52 45 45 20 29  ype!=PATH_TREE )
4000: 7b 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72  {.    fatalError
4010: 28 22 6f 62 6a 65 63 74 20 5c 22 25 73 5c 22 20  ("object \"%s\" 
4020: 69 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74 6f  is not a directo
4030: 72 79 22 2c 20 7a 44 69 72 29 3b 0a 20 20 7d 0a  ry", zDir);.  }.
4040: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
4050: 70 65 6e 28 7a 44 62 2c 20 26 64 62 29 3b 0a 20  pen(zDb, &db);. 
4060: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66   if( rc ){.    f
4070: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
4080: 74 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  t open database 
4090: 5c 22 25 73 5c 22 3a 20 25 73 22 2c 20 7a 44 62  \"%s\": %s", zDb
40a0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
40b0: 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (db));.  }.  rc 
40c0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
40d0: 65 5f 76 32 28 64 62 2c 20 22 53 45 4c 45 43 54  e_v2(db, "SELECT
40e0: 20 6b 2c 20 76 20 46 52 4f 4d 20 6b 76 20 4f 52   k, v FROM kv OR
40f0: 44 45 52 20 42 59 20 6b 22 2c 20 2d 31 2c 20 26  DER BY k", -1, &
4100: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
4110: 20 72 63 20 29 7b 0a 20 20 20 20 66 61 74 61 6c   rc ){.    fatal
4120: 45 72 72 6f 72 28 22 70 72 65 70 61 72 65 5f 76  Error("prepare_v
4130: 32 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  2 failed: %s\n",
4140: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
4150: 64 62 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 4e 20  db));.  }.  nFN 
4160: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  = (int)strlen(zD
4170: 69 72 29 3b 0a 20 20 7a 46 4e 20 3d 20 73 71 6c  ir);.  zFN = sql
4180: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
4190: 2f 30 30 2f 30 30 2f 30 30 2e 65 78 74 72 61 2d  /00/00/00.extra-
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 22 2c 20 7a 44 69 72 29 3b 0a 20 20  ----", zDir);.  
41c0: 69 66 28 20 7a 46 4e 3d 3d 30 20 29 7b 0a 20 20  if( zFN==0 ){.  
41d0: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 61    fatalError("ma
41e0: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
41f0: 0a 20 20 7d 0a 20 20 7a 54 61 69 6c 20 3d 20 7a  .  }.  zTail = z
4200: 46 4e 20 2b 20 6e 46 4e 20 2b 20 31 3b 0a 20 20  FN + nFN + 1;.  
4210: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
4220: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
4230: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
4240: 74 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  t iKey = sqlite3
4250: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
4260: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
4270: 65 33 5f 69 6e 74 36 34 20 6e 44 61 74 61 20 3d  e3_int64 nData =
4280: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4290: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b  bytes(pStmt, 1);
42a0: 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
42b0: 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  *pData = sqlite3
42c0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
42d0: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 46 49 4c 45  mt, 1);.    FILE
42e0: 20 2a 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 65   *out;.    if( e
42f0: 50 61 74 68 54 79 70 65 3d 3d 50 41 54 48 5f 44  PathType==PATH_D
4300: 49 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  IR ){.      sqli
4310: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c  te3_snprintf(20,
4320: 20 7a 54 61 69 6c 2c 20 22 25 30 36 64 22 2c 20   zTail, "%06d", 
4330: 69 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iKey);.    }else
4340: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4350: 73 6e 70 72 69 6e 74 66 28 32 30 2c 20 7a 54 61  snprintf(20, zTa
4360: 69 6c 2c 20 22 25 30 32 64 22 2c 20 69 4b 65 79  il, "%02d", iKey
4370: 2f 31 30 30 30 30 29 3b 0a 20 20 20 20 20 20 6b  /10000);.      k
4380: 76 74 65 73 74 5f 6d 6b 64 69 72 28 7a 46 4e 29  vtest_mkdir(zFN)
4390: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
43a0: 73 6e 70 72 69 6e 74 66 28 32 30 2c 20 7a 54 61  snprintf(20, zTa
43b0: 69 6c 2c 20 22 25 30 32 64 2f 25 30 32 64 22 2c  il, "%02d/%02d",
43c0: 20 69 4b 65 79 2f 31 30 30 30 30 2c 20 28 69 4b   iKey/10000, (iK
43d0: 65 79 2f 31 30 30 29 25 31 30 30 29 3b 0a 20 20  ey/100)%100);.  
43e0: 20 20 20 20 6b 76 74 65 73 74 5f 6d 6b 64 69 72      kvtest_mkdir
43f0: 28 7a 46 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  (zFN);.      sql
4400: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
4410: 2c 20 7a 54 61 69 6c 2c 20 22 25 30 32 64 2f 25  , zTail, "%02d/%
4420: 30 32 64 2f 25 30 32 64 22 2c 0a 20 20 20 20 20  02d/%02d",.     
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 69 4b 65 79 2f 31 30 30 30 30 2c 20 28 69    iKey/10000, (i
4450: 4b 65 79 2f 31 30 30 29 25 31 30 30 2c 20 69 4b  Key/100)%100, iK
4460: 65 79 25 31 30 30 29 3b 0a 20 20 20 20 7d 0a 20  ey%100);.    }. 
4470: 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a     out = fopen(z
4480: 46 4e 2c 20 22 77 62 22 29 3b 20 20 20 20 20 20  FN, "wb");      
4490: 0a 20 20 20 20 6e 57 72 6f 74 65 20 3d 20 66 77  .    nWrote = fw
44a0: 72 69 74 65 28 70 44 61 74 61 2c 20 31 2c 20 6e  rite(pData, 1, n
44b0: 44 61 74 61 2c 20 6f 75 74 29 3b 0a 20 20 20 20  Data, out);.    
44c0: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
44d0: 20 70 72 69 6e 74 66 28 22 5c 72 25 73 20 20 20   printf("\r%s   
44e0: 22 2c 20 7a 54 61 69 6c 29 3b 20 66 66 6c 75 73  ", zTail); fflus
44f0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 69  h(stdout);.    i
4500: 66 28 20 6e 57 72 6f 74 65 21 3d 6e 44 61 74 61  f( nWrote!=nData
4510: 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45   ){.      fatalE
4520: 72 72 6f 72 28 22 57 72 6f 74 65 20 6f 6e 6c 79  rror("Wrote only
4530: 20 25 64 20 6f 66 20 25 64 20 62 79 74 65 73 20   %d of %d bytes 
4540: 74 6f 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  to %s\n",.      
4550: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
4560: 29 6e 57 72 6f 74 65 2c 20 6e 44 61 74 61 2c 20  )nWrote, nData, 
4570: 7a 46 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  zFN);.    }.  }.
4580: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
4590: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  ze(pStmt);.  sql
45a0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
45b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
45c0: 46 4e 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c  FN);.  printf("\
45d0: 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n");.  return 0;
45e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
45f0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  he content of fi
4600: 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65  le zName into me
4610: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4620: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4630: 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74  c64().** and ret
4640: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
4650: 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65   the buffer. The
4660: 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
4670: 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
4680: 6e 67 20 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ng .** the memor
4690: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  y. .**.** If par
46a0: 61 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73  ameter pnByte is
46b0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42   not NULL, (*pnB
46c0: 79 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74  yte) is set to t
46d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
46e0: 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a  es.** read..**.*
46f0: 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63  * For convenienc
4700: 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  e, a nul-termina
4710: 74 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61  tor byte is alwa
4720: 79 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ys appended to t
4730: 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
4740: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65  from the file be
4750: 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  fore the buffer 
4760: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
4770: 73 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e  s byte is not in
4780: 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65  cluded in.** the
4790: 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
47a0: 28 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70  (*pnByte), if ap
47b0: 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  plicable..**.** 
47c0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
47d0: 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73   if any error is
47e0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68   encountered. Th
47f0: 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
4800: 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75   *pnByte.** is u
4810: 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
4820: 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
4830: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4840: 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  readFile(const c
4850: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 73 71 6c 69  har *zName, sqli
4860: 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 42 79 74  te3_int64 *pnByt
4870: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20  e){.  FILE *in; 
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4890: 20 46 49 4c 45 20 66 72 6f 6d 20 77 68 69 63 68   FILE from which
48a0: 20 74 6f 20 72 65 61 64 20 63 6f 6e 74 65 6e 74   to read content
48b0: 20 6f 66 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 73   of zName */.  s
48c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 49 6e  qlite3_int64 nIn
48d0: 3b 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ;      /* Size o
48e0: 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73  f zName in bytes
48f0: 20 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65   */.  size_t nRe
4900: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
4910: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
4920: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 2a   actually read *
4930: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
4940: 72 20 2a 70 42 75 66 3b 20 20 20 20 2f 2a 20 43  r *pBuf;    /* C
4950: 6f 6e 74 65 6e 74 20 72 65 61 64 20 66 72 6f 6d  ontent read from
4960: 20 64 69 73 6b 20 2a 2f 0a 0a 20 20 6e 49 6e 20   disk */..  nIn 
4970: 3d 20 66 69 6c 65 53 69 7a 65 28 7a 4e 61 6d 65  = fileSize(zName
4980: 29 3b 0a 20 20 69 66 28 20 6e 49 6e 3c 30 20 29  );.  if( nIn<0 )
4990: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 6e 20   return 0;.  in 
49a0: 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
49b0: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
49c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
49d0: 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
49e0: 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 29 3b 0a  alloc64( nIn );.
49f0: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20    if( pBuf==0 ) 
4a00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61  return 0;.  nRea
4a10: 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
4a20: 28 73 69 7a 65 5f 74 29 6e 49 6e 2c 20 31 2c 20  (size_t)nIn, 1, 
4a30: 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
4a40: 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
4a50: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
4a60: 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
4a70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4a80: 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70   if( pnByte ) *p
4a90: 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72  nByte = nIn;.  r
4aa0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
4ab0: 2a 0a 2a 2a 20 4f 76 65 72 77 72 69 74 65 20 61  *.** Overwrite a
4ac0: 20 66 69 6c 65 20 77 69 74 68 20 72 61 6e 64 6f   file with rando
4ad0: 6d 6e 65 73 73 2e 20 20 44 6f 20 6e 6f 74 20 63  mness.  Do not c
4ae0: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
4af0: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  f the.** file..*
4b00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
4b10: 64 61 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63  dateFile(const c
4b20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 73 71 6c 69  har *zName, sqli
4b30: 74 65 33 5f 69 6e 74 36 34 20 2a 70 6e 42 79 74  te3_int64 *pnByt
4b40: 65 2c 20 69 6e 74 20 64 6f 46 73 79 6e 63 29 7b  e, int doFsync){
4b50: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  .  FILE *out;   
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 49             /* FI
4b70: 4c 45 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  LE from which to
4b80: 20 72 65 61 64 20 63 6f 6e 74 65 6e 74 20 6f 66   read content of
4b90: 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 73 71 6c 69   zName */.  sqli
4ba0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
4bb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
4bc0: 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Name in bytes */
4bd0: 0a 20 20 73 69 7a 65 5f 74 20 6e 57 72 69 74 74  .  size_t nWritt
4be0: 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  en;        /* Nu
4bf0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
4c00: 74 75 61 6c 6c 79 20 72 65 61 64 20 2a 2f 0a 20  tually read */. 
4c10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c20: 70 42 75 66 3b 20 20 20 20 2f 2a 20 43 6f 6e 74  pBuf;    /* Cont
4c30: 65 6e 74 20 74 6f 20 73 74 6f 72 65 20 6f 6e 20  ent to store on 
4c40: 64 69 73 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  disk */.  const 
4c50: 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 22 77  char *zMode = "w
4c60: 62 22 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 66 6f  b";   /* Mode fo
4c70: 72 20 66 6f 70 65 6e 28 29 20 2a 2f 0a 0a 20 20  r fopen() */..  
4c80: 73 7a 20 3d 20 66 69 6c 65 53 69 7a 65 28 7a 4e  sz = fileSize(zN
4c90: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 7a 3c 30  ame);.  if( sz<0
4ca0: 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72 72   ){.    fatalErr
4cb0: 6f 72 28 22 4e 6f 20 73 75 63 68 20 66 69 6c 65  or("No such file
4cc0: 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 4e 61 6d 65  : \"%s\"", zName
4cd0: 29 3b 0a 20 20 7d 0a 20 20 2a 70 6e 42 79 74 65  );.  }.  *pnByte
4ce0: 20 3d 20 73 7a 3b 0a 20 20 69 66 28 20 73 7a 3d   = sz;.  if( sz=
4cf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
4d00: 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
4d10: 6c 6c 6f 63 36 34 28 20 73 7a 20 29 3b 0a 20 20  lloc64( sz );.  
4d20: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
4d30: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 43     fatalError("C
4d40: 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25  annot allocate %
4d50: 6c 6c 64 20 62 79 74 65 73 5c 6e 22 2c 20 73 7a  lld bytes\n", sz
4d60: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4d70: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 28 69 6e 74  _randomness((int
4d80: 29 73 7a 2c 20 70 42 75 66 29 3b 20 0a 23 69 66  )sz, pBuf); .#if
4d90: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
4da0: 0a 20 20 69 66 28 20 64 6f 46 73 79 6e 63 20 29  .  if( doFsync )
4db0: 20 7a 4d 6f 64 65 20 3d 20 22 77 62 63 22 3b 0a   zMode = "wbc";.
4dc0: 23 65 6e 64 69 66 0a 20 20 6f 75 74 20 3d 20 66  #endif.  out = f
4dd0: 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 7a 4d 6f 64  open(zName, zMod
4de0: 65 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  e);.  if( out==0
4df0: 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72 72   ){.    fatalErr
4e00: 6f 72 28 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  or("Cannot open 
4e10: 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69  \"%s\" for writi
4e20: 6e 67 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ng\n", zName);. 
4e30: 20 7d 0a 20 20 6e 57 72 69 74 74 65 6e 20 3d 20   }.  nWritten = 
4e40: 66 77 72 69 74 65 28 70 42 75 66 2c 20 31 2c 20  fwrite(pBuf, 1, 
4e50: 28 73 69 7a 65 5f 74 29 73 7a 2c 20 6f 75 74 29  (size_t)sz, out)
4e60: 3b 0a 20 20 69 66 28 20 64 6f 46 73 79 6e 63 20  ;.  if( doFsync 
4e70: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
4e80: 57 49 4e 33 32 29 0a 20 20 20 20 66 66 6c 75 73  WIN32).    fflus
4e90: 68 28 6f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20  h(out);.#else.  
4ea0: 20 20 66 73 79 6e 63 28 66 69 6c 65 6e 6f 28 6f    fsync(fileno(o
4eb0: 75 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ut));.#endif.  }
4ec0: 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a  .  fclose(out);.
4ed0: 20 20 69 66 28 20 6e 57 72 69 74 74 65 6e 21 3d    if( nWritten!=
4ee0: 28 73 69 7a 65 5f 74 29 73 7a 20 29 7b 0a 20 20  (size_t)sz ){.  
4ef0: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 57 72    fatalError("Wr
4f00: 6f 74 65 20 6f 6e 6c 79 20 25 64 20 6f 66 20 25  ote only %d of %
4f10: 64 20 62 79 74 65 73 20 74 6f 20 5c 22 25 73 5c  d bytes to \"%s\
4f20: 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
4f30: 20 20 20 20 20 28 69 6e 74 29 6e 57 72 69 74 74       (int)nWritt
4f40: 65 6e 2c 20 28 69 6e 74 29 73 7a 2c 20 7a 4e 61  en, (int)sz, zNa
4f50: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
4f60: 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 7d  e3_free(pBuf);.}
4f70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4f80: 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
4f90: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  in milliseconds 
4fa0: 73 69 6e 63 65 20 74 68 65 20 62 65 67 69 6e 6e  since the beginn
4fb0: 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 4a 75  ing of.** the Ju
4fc0: 6c 69 61 6e 20 65 70 6f 63 68 2e 0a 2a 2f 0a 73  lian epoch..*/.s
4fd0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
4fe0: 74 36 34 20 74 69 6d 65 4f 66 44 61 79 28 76 6f  t64 timeOfDay(vo
4ff0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
5000: 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b  lite3_vfs *clock
5010: 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Vfs = 0;.  sqlit
5020: 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69 66  e3_int64 t;.  if
5030: 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20  ( clockVfs==0 ) 
5040: 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69 74  clockVfs = sqlit
5050: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
5060: 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e    if( clockVfs->
5070: 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 63  iVersion>=2 && c
5080: 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e  lockVfs->xCurren
5090: 74 54 69 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b  tTimeInt64!=0 ){
50a0: 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78  .    clockVfs->x
50b0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
50c0: 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a  (clockVfs, &t);.
50d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75    }else{.    dou
50e0: 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b  ble r;.    clock
50f0: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
5100: 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b  e(clockVfs, &r);
5110: 0a 20 20 20 20 74 20 3d 20 28 73 71 6c 69 74 65  .    t = (sqlite
5120: 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30  3_int64)(r*86400
5130: 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65  000.0);.  }.  re
5140: 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66 64 65  turn t;.}..#ifde
5150: 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
5160: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73  * Attempt to dis
5170: 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f  play I/O stats o
5180: 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70  n Linux using /p
5190: 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74  roc/PID/io.*/.st
51a0: 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
51b0: 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49  yLinuxIoStats(FI
51c0: 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45  LE *out){.  FILE
51d0: 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32   *in;.  char z[2
51e0: 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
51f0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5200: 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f  ), z, "/proc/%d/
5210: 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  io", getpid());.
5220: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20    in = fopen(z, 
5230: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
5240: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
5250: 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73  hile( fgets(z, s
5260: 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30  izeof(z), in)!=0
5270: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
5280: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
5290: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
52a0: 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
52b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
52c0: 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b  c;.    } aTrans[
52d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72  ] = {.      { "r
52e0: 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
52f0: 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
5300: 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61   received by rea
5310: 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  d():" },.      {
5320: 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "wchar: ",     
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
5340: 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74  tes sent to writ
5350: 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  e():"    },.    
5360: 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20    { "syscr: ",  
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63  "Read() system c
5390: 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20  alls:"      },. 
53a0: 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22       { "syscw: "
53b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
53c0: 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74     "Write() syst
53d0: 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d  em calls:"     }
53e0: 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f  ,.      { "read_
53f0: 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
5400: 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61        "Bytes rea
5410: 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22  d from storage:"
5420: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72    },.      { "wr
5430: 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ite_bytes: ",   
5440: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
5450: 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61  written to stora
5460: 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ge:" },.      { 
5470: 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65  "cancelled_write
5480: 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e  _bytes: ",  "Can
5490: 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74  celled write byt
54a0: 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d  es:"    },.    }
54b0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
54c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
54d0: 6f 66 28 61 54 72 61 6e 73 29 2f 73 69 7a 65 6f  of(aTrans)/sizeo
54e0: 66 28 61 54 72 61 6e 73 5b 30 5d 29 3b 20 69 2b  f(aTrans[0]); i+
54f0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
5500: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 54  = (int)strlen(aT
5510: 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
5520: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
5530: 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
5540: 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
5550: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
5560: 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
5570: 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e   %s", aTrans[i].
5580: 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20  zDesc, &z[n]);. 
5590: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
55a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
55b0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a    fclose(in);.}.
55c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
55d0: 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61  splay memory sta
55e0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
55f0: 74 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28  t display_stats(
5600: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
5630: 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  o query */.  int
5640: 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5660: 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 53 51  True to reset SQ
5670: 4c 69 74 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b  Lite stats */.){
5680: 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
5690: 6e 74 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c  nt iHiwtr;.  FIL
56a0: 45 20 2a 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  E *out = stdout;
56b0: 0a 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ..  fprintf(out,
56c0: 20 22 5c 6e 22 29 3b 0a 0a 20 20 69 48 69 77 74   "\n");..  iHiwt
56d0: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
56e0: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
56f0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45  SQLITE_STATUS_ME
5700: 4d 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75 72  MORY_USED, &iCur
5710: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
5720: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  t);.  fprintf(ou
5730: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 65  t,.          "Me
5740: 6d 6f 72 79 20 55 73 65 64 3a 20 20 20 20 20 20  mory Used:      
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 20 62     %d (max %d) b
5770: 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
5780: 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
5790: 3b 0a 20 20 69 48 69 77 74 72 20 3d 20 69 43 75  ;.  iHiwtr = iCu
57a0: 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  r = -1;.  sqlite
57b0: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
57c0: 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f  STATUS_MALLOC_CO
57d0: 55 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69  UNT, &iCur, &iHi
57e0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
57f0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 4e 75  fprintf(out, "Nu
5800: 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64  mber of Outstand
5810: 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a  ing Allocations:
5820: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
5830: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 75  ",.          iCu
5840: 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 69 48  r, iHiwtr);.  iH
5850: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
5860: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
5870: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
5880: 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c  _PAGECACHE_USED,
5890: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
58a0: 20 62 52 65 73 65 74 29 3b 0a 20 20 66 70 72 69   bReset);.  fpri
58b0: 6e 74 66 28 6f 75 74 2c 0a 20 20 20 20 20 20 22  ntf(out,.      "
58c0: 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
58d0: 20 50 61 67 65 73 20 55 73 65 64 3a 20 20 20 20   Pages Used:    
58e0: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
58f0: 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
5900: 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
5910: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
5920: 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = -1;.  sqlite3_
5930: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
5940: 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f  ATUS_PAGECACHE_O
5950: 56 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20  VERFLOW, &iCur, 
5960: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
5970: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
5980: 0a 20 20 20 20 20 20 20 20 20 20 22 4e 75 6d 62  .          "Numb
5990: 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65  er of Pcache Ove
59a0: 72 66 6c 6f 77 20 42 79 74 65 73 3a 20 20 20 20  rflow Bytes:    
59b0: 20 25 64 20 28 6d 61 78 20 25 64 29 20 62 79 74   %d (max %d) byt
59c0: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
59d0: 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
59e0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
59f0: 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = -1;.  sqlite3_
5a00: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
5a10: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45  ATUS_MALLOC_SIZE
5a20: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
5a30: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 70 72  , bReset);.  fpr
5a40: 69 6e 74 66 28 6f 75 74 2c 20 22 4c 61 72 67 65  intf(out, "Large
5a50: 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20  st Allocation:  
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
5a80: 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
5a90: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
5aa0: 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = -1;.  sqlite3_
5ab0: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
5ac0: 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53  ATUS_PAGECACHE_S
5ad0: 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69  IZE, &iCur, &iHi
5ae0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
5af0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 4c 61  fprintf(out, "La
5b00: 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
5b10: 6f 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20  ocation:        
5b20: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
5b30: 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72            iHiwtr
5b40: 29 3b 0a 0a 20 20 69 48 69 77 74 72 20 3d 20 69  );..  iHiwtr = i
5b50: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69  Cur = -1;.  sqli
5b60: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
5b70: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
5b80: 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69  S_CACHE_USED, &i
5b90: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
5ba0: 65 73 65 74 29 3b 0a 20 20 66 70 72 69 6e 74 66  eset);.  fprintf
5bb0: 28 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61  (out, "Pager Hea
5bc0: 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
5be0: 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69  ytes\n",.      i
5bf0: 43 75 72 29 3b 0a 20 20 69 48 69 77 74 72 20 3d  Cur);.  iHiwtr =
5c00: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
5c10: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
5c20: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
5c30: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26  TUS_CACHE_HIT, &
5c40: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
5c50: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
5c60: 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68 69  , "Page cache hi
5c70: 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
5c80: 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
5c90: 43 75 72 29 3b 0a 20 20 69 48 69 77 74 72 20 3d  Cur);.  iHiwtr =
5ca0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
5cb0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
5cc0: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
5cd0: 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20  TUS_CACHE_MISS, 
5ce0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
5cf0: 31 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  1);.  fprintf(ou
5d00: 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d  t, "Page cache m
5d10: 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20  isses:          
5d20: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
5d30: 69 43 75 72 29 3b 0a 20 20 69 48 69 77 74 72 20  iCur);.  iHiwtr 
5d40: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  = iCur = -1;.  s
5d50: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
5d60: 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
5d70: 41 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45  ATUS_CACHE_WRITE
5d80: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
5d90: 2c 20 31 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  , 1);.  fprintf(
5da0: 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
5db0: 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20   writes:        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
5dd0: 2c 20 69 43 75 72 29 3b 0a 20 20 69 48 69 77 74  , iCur);.  iHiwt
5de0: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 0a  r = iCur = -1;..
5df0: 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
5e00: 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
5e10: 6f 53 74 61 74 73 28 6f 75 74 29 3b 0a 23 65 6e  oStats(out);.#en
5e20: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b  dif..  return 0;
5e30: 0a 7d 0a 0a 2f 2a 20 42 6c 6f 62 20 61 63 63 65  .}../* Blob acce
5e40: 73 73 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  ss order */.#def
5e50: 69 6e 65 20 4f 52 44 45 52 5f 41 53 43 20 20 20  ine ORDER_ASC   
5e60: 20 20 31 0a 23 64 65 66 69 6e 65 20 4f 52 44 45    1.#define ORDE
5e70: 52 5f 44 45 53 43 20 20 20 20 32 0a 23 64 65 66  R_DESC    2.#def
5e80: 69 6e 65 20 4f 52 44 45 52 5f 52 41 4e 44 4f 4d  ine ORDER_RANDOM
5e90: 20 20 33 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20    3.../*.** Run 
5ea0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 65  a performance te
5eb0: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  st.*/.static int
5ec0: 20 72 75 6e 4d 61 69 6e 28 69 6e 74 20 61 72 67   runMain(int arg
5ed0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
5ee0: 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f00: 2a 20 49 73 20 7a 44 62 20 61 20 64 61 74 61 62  * Is zDb a datab
5f10: 61 73 65 20 6f 72 20 61 20 64 69 72 65 63 74 6f  ase or a directo
5f20: 72 79 3f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ry? */.  char *z
5f30: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
5f40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5f50: 20 6f 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61   or directory na
5f60: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  me */.  int i;  
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5f90: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
5fc0: 6f 64 65 20 66 72 6f 6d 20 53 51 4c 69 74 65 20  ode from SQLite 
5fd0: 63 61 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  calls */.  int n
5fe0: 43 6f 75 6e 74 20 3d 20 31 30 30 30 3b 20 20 20  Count = 1000;   
5ff0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6000: 20 6f 66 20 62 6c 6f 62 20 66 65 74 63 68 20 6f   of blob fetch o
6010: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
6020: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
6030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
6040: 74 72 61 20 63 79 63 6c 65 73 20 2a 2f 0a 20 20  tra cycles */.  
6050: 69 6e 74 20 69 4b 65 79 20 3d 20 31 3b 20 20 20  int iKey = 1;   
6060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6070: 65 78 74 20 62 6c 6f 62 20 6b 65 79 20 2a 2f 0a  ext blob key */.
6080: 20 20 69 6e 74 20 69 4d 61 78 20 3d 20 30 3b 20    int iMax = 0; 
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60a0: 20 4c 61 72 67 65 73 74 20 61 6c 6c 6f 77 65 64   Largest allowed
60b0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50   key */.  int iP
60c0: 61 67 65 73 69 7a 65 20 3d 20 30 3b 20 20 20 20  agesize = 0;    
60d0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
60e0: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
60f0: 20 69 6e 74 20 69 43 61 63 68 65 20 3d 20 31 30   int iCache = 10
6100: 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
6110: 44 61 74 61 62 61 73 65 20 63 61 63 68 65 20 73  Database cache s
6120: 69 7a 65 20 69 6e 20 6b 69 62 69 62 79 74 65 73  ize in kibibytes
6130: 20 2a 2f 0a 20 20 69 6e 74 20 62 42 6c 6f 62 41   */.  int bBlobA
6140: 70 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pi = 0;         
6150: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 69 6e 63    /* Use the inc
6160: 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 2f  remental blob I/
6170: 4f 20 41 50 49 20 2a 2f 0a 20 20 69 6e 74 20 62  O API */.  int b
6180: 53 74 61 74 73 20 3d 20 30 3b 20 20 20 20 20 20  Stats = 0;      
6190: 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20         /* Print 
61a0: 73 74 61 74 73 20 62 65 66 6f 72 65 20 65 78 69  stats before exi
61b0: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  ting */.  int eO
61c0: 72 64 65 72 20 3d 20 4f 52 44 45 52 5f 41 53 43  rder = ORDER_ASC
61d0: 3b 20 20 20 20 20 2f 2a 20 41 63 63 65 73 73 20  ;     /* Access 
61e0: 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  order */.  int i
61f0: 73 55 70 64 61 74 65 54 65 73 74 20 3d 20 30 3b  sUpdateTest = 0;
6200: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 69 6e 2d         /* Do in-
6210: 70 6c 61 63 65 20 75 70 64 61 74 65 73 20 72 61  place updates ra
6220: 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 73 20  ther than reads 
6230: 2a 2f 0a 20 20 69 6e 74 20 64 6f 49 6e 74 65 67  */.  int doInteg
6240: 72 69 74 79 43 6b 20 3d 20 30 3b 20 20 20 20 20  rityCk = 0;     
6250: 20 2f 2a 20 52 75 6e 20 50 52 41 47 4d 41 20 69   /* Run PRAGMA i
6260: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 61  ntegrity_check a
6270: 66 74 65 72 20 74 68 65 20 74 65 73 74 20 2a 2f  fter the test */
6280: 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 3d 20  .  int noSync = 
6290: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
62a0: 2a 20 44 69 73 61 62 6c 65 20 73 79 6e 63 68 72  * Disable synchr
62b0: 6f 6e 6f 75 73 20 6d 6f 64 65 20 2a 2f 0a 20 20  onous mode */.  
62c0: 69 6e 74 20 64 6f 46 73 79 6e 63 20 3d 20 30 3b  int doFsync = 0;
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
62e0: 70 64 61 74 65 20 64 69 73 6b 20 66 69 6c 65 73  pdate disk files
62f0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2a   synchronously *
6300: 2f 0a 20 20 69 6e 74 20 64 6f 4d 75 6c 74 69 54  /.  int doMultiT
6310: 72 61 6e 73 20 3d 20 30 3b 20 20 20 20 20 20 20  rans = 0;       
6320: 2f 2a 20 45 61 63 68 20 6f 70 65 72 61 74 69 6f  /* Each operatio
6330: 6e 20 69 6e 20 69 74 73 20 6f 77 6e 20 74 72 61  n in its own tra
6340: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
6350: 74 20 6e 6f 43 68 65 63 6b 70 6f 69 6e 74 20 3d  t noCheckpoint =
6360: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69   0;       /* Omi
6370: 74 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  t the checkpoint
6380: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a   in WAL mode */.
6390: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
63a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
63b0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
63c0: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
63d0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
63e0: 30 3b 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65  0;    /* Prepare
63f0: 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  d statement for 
6400: 53 51 4c 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  SQL access */.  
6410: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
6420: 6c 6f 62 20 3d 20 30 3b 20 20 20 20 2f 2a 20 48  lob = 0;    /* H
6430: 61 6e 64 6c 65 20 66 6f 72 20 69 6e 63 72 65 6d  andle for increm
6440: 65 6e 74 61 6c 20 42 6c 6f 62 20 49 2f 4f 20 2a  ental Blob I/O *
6450: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
6460: 34 20 74 6d 53 74 61 72 74 3b 20 20 20 20 20 20  4 tmStart;      
6470: 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20 2a 2f  /* Start time */
6480: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6490: 20 74 6d 45 6c 61 70 73 65 64 3b 20 20 20 20 2f   tmElapsed;    /
64a0: 2a 20 45 6c 61 70 73 65 64 20 74 69 6d 65 20 2a  * Elapsed time *
64b0: 2f 0a 20 20 69 6e 74 20 6d 6d 61 70 53 69 7a 65  /.  int mmapSize
64c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
64d0: 2f 2a 20 2d 2d 6d 6d 61 70 20 4e 20 61 72 67 75  /* --mmap N argu
64e0: 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
64f0: 33 5f 69 6e 74 36 34 20 6e 44 61 74 61 20 3d 20  3_int64 nData = 
6500: 30 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f  0;    /* Bytes o
6510: 66 20 64 61 74 61 20 2a 2f 0a 20 20 73 71 6c 69  f data */.  sqli
6520: 74 65 33 5f 69 6e 74 36 34 20 6e 54 6f 74 61 6c  te3_int64 nTotal
6530: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 6f 74 61 6c   = 0;   /* Total
6540: 20 64 61 74 61 20 72 65 61 64 20 2a 2f 0a 20 20   data read */.  
6550: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
6560: 44 61 74 61 20 3d 20 30 3b 20 20 20 2f 2a 20 43  Data = 0;   /* C
6570: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 62 6c  ontent of the bl
6580: 6f 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ob */.  sqlite3_
6590: 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 30  int64 nAlloc = 0
65a0: 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c  ;   /* Space all
65b0: 6f 63 61 74 65 64 20 66 6f 72 20 70 44 61 74 61  ocated for pData
65c0: 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  [] */.  const ch
65d0: 61 72 20 2a 7a 4a 4d 6f 64 65 20 3d 20 30 3b 20  ar *zJMode = 0; 
65e0: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 6d      /* Journal m
65f0: 6f 64 65 20 2a 2f 0a 20 20 0a 0a 20 20 61 73 73  ode */.  ..  ass
6600: 65 72 74 28 20 73 74 72 63 6d 70 28 61 72 67 76  ert( strcmp(argv
6610: 5b 31 5d 2c 22 72 75 6e 22 29 3d 3d 30 20 29 3b  [1],"run")==0 );
6620: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3e  .  assert( argc>
6630: 3d 33 20 29 3b 0a 20 20 7a 44 62 20 3d 20 61 72  =3 );.  zDb = ar
6640: 67 76 5b 32 5d 3b 0a 20 20 65 54 79 70 65 20 3d  gv[2];.  eType =
6650: 20 70 61 74 68 54 79 70 65 28 7a 44 62 29 3b 0a   pathType(zDb);.
6660: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 41 54    if( eType==PAT
6670: 48 5f 4f 54 48 45 52 20 29 20 66 61 74 61 6c 45  H_OTHER ) fatalE
6680: 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 62  rror("unknown ob
6690: 6a 65 63 74 20 74 79 70 65 3a 20 5c 22 25 73 5c  ject type: \"%s\
66a0: 22 22 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  "", zDb);.  if( 
66b0: 65 54 79 70 65 3d 3d 50 41 54 48 5f 4e 45 58 49  eType==PATH_NEXI
66c0: 53 54 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  ST ) fatalError(
66d0: 22 6f 62 6a 65 63 74 20 64 6f 65 73 20 6e 6f 74  "object does not
66e0: 20 65 78 69 73 74 3a 20 5c 22 25 73 5c 22 22 2c   exist: \"%s\"",
66f0: 20 7a 44 62 29 3b 0a 20 20 66 6f 72 28 69 3d 33   zDb);.  for(i=3
6700: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
6710: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72      char *z = ar
6720: 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  gv[i];.    if( z
6730: 5b 30 5d 21 3d 27 2d 27 20 29 20 66 61 74 61 6c  [0]!='-' ) fatal
6740: 45 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 61  Error("unknown a
6750: 72 67 75 6d 65 6e 74 3a 20 5c 22 25 73 5c 22 22  rgument: \"%s\""
6760: 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b  , z);.    if( z[
6770: 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
6780: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6790: 20 22 2d 61 73 63 22 29 3d 3d 30 20 29 7b 0a 20   "-asc")==0 ){. 
67a0: 20 20 20 20 20 65 4f 72 64 65 72 20 3d 20 4f 52       eOrder = OR
67b0: 44 45 52 5f 41 53 43 3b 0a 20 20 20 20 20 20 63  DER_ASC;.      c
67c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
67d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
67e0: 20 22 2d 62 6c 6f 62 2d 61 70 69 22 29 3d 3d 30   "-blob-api")==0
67f0: 20 29 7b 0a 20 20 20 20 20 20 62 42 6c 6f 62 41   ){.      bBlobA
6800: 70 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  pi = 1;.      co
6810: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6820: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
6830: 22 2d 63 61 63 68 65 2d 73 69 7a 65 22 29 3d 3d  "-cache-size")==
6840: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
6850: 3d 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c  ==argc-1 ) fatal
6860: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
6870: 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25 73 5c  rgument on \"%s\
6880: 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  "", argv[i]);.  
6890: 20 20 20 20 69 43 61 63 68 65 20 3d 20 69 6e 74      iCache = int
68a0: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b  egerValue(argv[+
68b0: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  +i]);.      cont
68c0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
68d0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
68e0: 63 6f 75 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  count")==0 ){.  
68f0: 20 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d      if( i==argc-
6900: 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  1 ) fatalError("
6910: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
6920: 20 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72 67   on \"%s\"", arg
6930: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6e 43 6f  v[i]);.      nCo
6940: 75 6e 74 20 3d 20 69 6e 74 65 67 65 72 56 61 6c  unt = integerVal
6950: 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20  ue(argv[++i]);. 
6960: 20 20 20 20 20 69 66 28 20 6e 43 6f 75 6e 74 3c       if( nCount<
6970: 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  1 ) fatalError("
6980: 74 68 65 20 2d 2d 63 6f 75 6e 74 20 6d 75 73 74  the --count must
6990: 20 62 65 20 70 6f 73 69 74 69 76 65 22 29 3b 0a   be positive");.
69a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
69b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
69c0: 72 63 6d 70 28 7a 2c 20 22 2d 64 65 73 63 22 29  rcmp(z, "-desc")
69d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 4f 72  ==0 ){.      eOr
69e0: 64 65 72 20 3d 20 4f 52 44 45 52 5f 44 45 53 43  der = ORDER_DESC
69f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
6a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6a10: 73 74 72 63 6d 70 28 7a 2c 20 22 2d 66 73 79 6e  strcmp(z, "-fsyn
6a20: 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  c")==0 ){.      
6a30: 64 6f 46 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20  doFsync = 1;.   
6a40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6a50: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
6a60: 70 28 7a 2c 20 22 2d 69 6e 74 65 67 72 69 74 79  p(z, "-integrity
6a70: 2d 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  -check")==0 ){. 
6a80: 20 20 20 20 20 64 6f 49 6e 74 65 67 72 69 74 79       doIntegrity
6a90: 43 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  Ck = 1;.      co
6aa0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6ab0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
6ac0: 22 2d 6a 6d 6f 64 65 22 29 3d 3d 30 20 29 7b 0a  "-jmode")==0 ){.
6ad0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72 67        if( i==arg
6ae0: 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72  c-1 ) fatalError
6af0: 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  ("missing argume
6b00: 6e 74 20 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 61  nt on \"%s\"", a
6b10: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a  rgv[i]);.      z
6b20: 4a 4d 6f 64 65 20 3d 20 61 72 67 76 5b 2b 2b 69  JMode = argv[++i
6b30: 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ];.      continu
6b40: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
6b50: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6d 6d 61   strcmp(z, "-mma
6b60: 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  p")==0 ){.      
6b70: 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20  if( i==argc-1 ) 
6b80: 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73  fatalError("miss
6b90: 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ing argument on 
6ba0: 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d  \"%s\"", argv[i]
6bb0: 29 3b 0a 20 20 20 20 20 20 6d 6d 61 70 53 69 7a  );.      mmapSiz
6bc0: 65 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65  e = integerValue
6bd0: 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20  (argv[++i]);.   
6be0: 20 20 20 69 66 28 20 6e 43 6f 75 6e 74 3c 30 20     if( nCount<0 
6bf0: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 68  ) fatalError("th
6c00: 65 20 2d 2d 6d 6d 61 70 20 6d 75 73 74 20 62 65  e --mmap must be
6c10: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 29 3b   non-negative");
6c20: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
6c30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
6c40: 74 72 63 6d 70 28 7a 2c 20 22 2d 6d 61 78 2d 69  trcmp(z, "-max-i
6c50: 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
6c60: 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20  if( i==argc-1 ) 
6c70: 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73  fatalError("miss
6c80: 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ing argument on 
6c90: 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d  \"%s\"", argv[i]
6ca0: 29 3b 0a 20 20 20 20 20 20 69 4d 61 78 20 3d 20  );.      iMax = 
6cb0: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
6cc0: 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 63  v[++i]);.      c
6cd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6ce0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6cf0: 20 22 2d 6d 75 6c 74 69 74 72 61 6e 73 22 29 3d   "-multitrans")=
6d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 4d 75  =0 ){.      doMu
6d10: 6c 74 69 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20  ltiTrans = 1;.  
6d20: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6d30: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
6d40: 6d 70 28 7a 2c 20 22 2d 6e 6f 63 68 65 63 6b 70  mp(z, "-nocheckp
6d50: 6f 69 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  oint")==0 ){.   
6d60: 20 20 20 6e 6f 43 68 65 63 6b 70 6f 69 6e 74 20     noCheckpoint 
6d70: 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
6d80: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
6d90: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6e  f( strcmp(z, "-n
6da0: 6f 73 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20  osync")==0 ){.  
6db0: 20 20 20 20 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a      noSync = 1;.
6dc0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6dd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
6de0: 72 63 6d 70 28 7a 2c 20 22 2d 72 61 6e 64 6f 6d  rcmp(z, "-random
6df0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  ")==0 ){.      e
6e00: 4f 72 64 65 72 20 3d 20 4f 52 44 45 52 5f 52 41  Order = ORDER_RA
6e10: 4e 44 4f 4d 3b 0a 20 20 20 20 20 20 63 6f 6e 74  NDOM;.      cont
6e20: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
6e30: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
6e40: 73 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  start")==0 ){.  
6e50: 20 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d      if( i==argc-
6e60: 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  1 ) fatalError("
6e70: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
6e80: 20 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72 67   on \"%s\"", arg
6e90: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 4b 65  v[i]);.      iKe
6ea0: 79 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65  y = integerValue
6eb0: 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20  (argv[++i]);.   
6ec0: 20 20 20 69 66 28 20 69 4b 65 79 3c 31 20 29 20     if( iKey<1 ) 
6ed0: 66 61 74 61 6c 45 72 72 6f 72 28 22 74 68 65 20  fatalError("the 
6ee0: 2d 2d 73 74 61 72 74 20 6d 75 73 74 20 62 65 20  --start must be 
6ef0: 70 6f 73 69 74 69 76 65 22 29 3b 0a 20 20 20 20  positive");.    
6f00: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6f10: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
6f20: 28 7a 2c 20 22 2d 73 74 61 74 73 22 29 3d 3d 30  (z, "-stats")==0
6f30: 20 29 7b 0a 20 20 20 20 20 20 62 53 74 61 74 73   ){.      bStats
6f40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
6f50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
6f60: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d  if( strcmp(z, "-
6f70: 75 70 64 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20  update")==0 ){. 
6f80: 20 20 20 20 20 69 73 55 70 64 61 74 65 54 65 73       isUpdateTes
6f90: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  t = 1;.      con
6fa0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
6fb0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e 6b   fatalError("unk
6fc0: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22 25  nown option: \"%
6fd0: 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\"", argv[i]);.
6fe0: 20 20 7d 0a 20 20 69 66 28 20 65 54 79 70 65 3d    }.  if( eType=
6ff0: 3d 50 41 54 48 5f 44 42 20 29 7b 0a 20 20 20 20  =PATH_DB ){.    
7000: 2f 2a 20 52 65 63 6f 76 65 72 20 61 6e 79 20 70  /* Recover any p
7010: 72 69 6f 72 20 63 72 61 73 68 65 73 20 70 72 69  rior crashes pri
7020: 6f 72 20 74 6f 20 73 74 61 72 74 69 6e 67 20 74  or to starting t
7030: 68 65 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20  he timer */.    
7040: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62  sqlite3_open(zDb
7050: 2c 20 26 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  , &db);.    sqli
7060: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 53 45  te3_exec(db, "SE
7070: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
7080: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49  sqlite_master LI
7090: 4d 49 54 20 31 22 2c 20 30 2c 20 30 2c 20 30 29  MIT 1", 0, 0, 0)
70a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
70b0: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
70c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 74 6d 53 74 61  = 0;.  }.  tmSta
70d0: 72 74 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  rt = timeOfDay()
70e0: 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
70f0: 41 54 48 5f 44 42 20 29 7b 0a 20 20 20 20 63 68  ATH_DB ){.    ch
7100: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 72 63  ar *zSql;.    rc
7110: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
7120: 7a 44 62 2c 20 26 64 62 29 3b 0a 20 20 20 20 69  zDb, &db);.    i
7130: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
7140: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
7150: 74 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  t open database 
7160: 5c 22 25 73 5c 22 3a 20 25 73 22 2c 20 7a 44 62  \"%s\": %s", zDb
7170: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
7180: 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (db));.    }.   
7190: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
71a0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
71b0: 6d 6d 61 70 5f 73 69 7a 65 3d 25 64 22 2c 20 6d  mmap_size=%d", m
71c0: 6d 61 70 53 69 7a 65 29 3b 0a 20 20 20 20 73 71  mapSize);.    sq
71d0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
71e0: 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
71f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7200: 7a 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20  zSql);.    zSql 
7210: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
7220: 66 28 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  f("PRAGMA cache_
7230: 73 69 7a 65 3d 25 64 22 2c 20 69 43 61 63 68 65  size=%d", iCache
7240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
7250: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
7260: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
7270: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
7280: 20 20 20 20 69 66 28 20 6e 6f 53 79 6e 63 20 29      if( noSync )
7290: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
72a0: 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41  exec(db, "PRAGMA
72b0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
72c0: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
72d0: 20 7d 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30   }.    pStmt = 0
72e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72  ;.    sqlite3_pr
72f0: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52  epare_v2(db, "PR
7300: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 2c  AGMA page_size",
7310: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
7320: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7330: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
7340: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
7350: 20 20 69 50 61 67 65 73 69 7a 65 20 3d 20 73 71    iPagesize = sq
7360: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7370: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
7380: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
7390: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
73a0: 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
73b0: 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41 47 4d  re_v2(db, "PRAGM
73c0: 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2c 20 2d  A cache_size", -
73d0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
73e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
73f0: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
7400: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
7410: 69 43 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33  iCache = sqlite3
7420: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
7430: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
7440: 7b 0a 20 20 20 20 20 20 69 43 61 63 68 65 20 3d  {.      iCache =
7450: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
7460: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
7470: 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74  Stmt);.    pStmt
7480: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4a   = 0;.    if( zJ
7490: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 7a 53  Mode ){.      zS
74a0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
74b0: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6a 6f 75  intf("PRAGMA jou
74c0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 51 22 2c 20 7a  rnal_mode=%Q", z
74d0: 4a 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 73 71  JMode);.      sq
74e0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
74f0: 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
7500: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7510: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  e(zSql);.      i
7520: 66 28 20 6e 6f 43 68 65 63 6b 70 6f 69 6e 74 20  f( noCheckpoint 
7530: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7540: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52 41  e3_exec(db, "PRA
7550: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
7560: 6b 70 6f 69 6e 74 3d 30 22 2c 20 30 2c 20 30 2c  kpoint=0", 0, 0,
7570: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
7580: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70   }.    sqlite3_p
7590: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50  repare_v2(db, "P
75a0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
75b0: 64 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  de", -1, &pStmt,
75c0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c   0);.    if( sql
75d0: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
75e0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
75f0: 20 20 20 20 20 20 7a 4a 4d 6f 64 65 20 3d 20 73        zJMode = s
7600: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
7610: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  %s", sqlite3_col
7620: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
7630: 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0));.    }else{.
7640: 20 20 20 20 20 20 7a 4a 4d 6f 64 65 20 3d 20 22        zJMode = "
7650: 3f 3f 3f 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ???";.    }.    
7660: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
7670: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
7680: 20 69 4d 61 78 3c 3d 30 20 29 7b 0a 20 20 20 20   iMax<=0 ){.    
7690: 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
76a0: 65 5f 76 32 28 64 62 2c 20 22 53 45 4c 45 43 54  e_v2(db, "SELECT
76b0: 20 6d 61 78 28 6b 29 20 46 52 4f 4d 20 6b 76 22   max(k) FROM kv"
76c0: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
76d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
76e0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
76f0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
7700: 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 73 71         iMax = sq
7710: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7720: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
7730: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7740: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
7750: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  );.    }.    pSt
7760: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  mt = 0;.    if( 
7770: 21 64 6f 4d 75 6c 74 69 54 72 61 6e 73 20 29 20  !doMultiTrans ) 
7780: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
7790: 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
77a0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4d  0);.  }.  if( iM
77b0: 61 78 3c 3d 30 20 29 20 69 4d 61 78 20 3d 20 31  ax<=0 ) iMax = 1
77c0: 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  000;.  for(i=0; 
77d0: 69 3c 6e 43 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  i<nCount; i++){.
77e0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
77f0: 41 54 48 5f 44 49 52 20 7c 7c 20 65 54 79 70 65  ATH_DIR || eType
7800: 3d 3d 50 41 54 48 5f 54 52 45 45 20 29 7b 0a 20  ==PATH_TREE ){. 
7810: 20 20 20 20 20 2f 2a 20 43 41 53 45 20 31 3a 20       /* CASE 1: 
7820: 52 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  Reading or writi
7830: 6e 67 20 62 6c 6f 62 73 20 6f 75 74 20 6f 66 20  ng blobs out of 
7840: 73 65 70 61 72 61 74 65 20 66 69 6c 65 73 20 2a  separate files *
7850: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4b  /.      char *zK
7860: 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ey;.      if( eT
7870: 79 70 65 3d 3d 50 41 54 48 5f 44 49 52 20 29 7b  ype==PATH_DIR ){
7880: 0a 20 20 20 20 20 20 20 20 7a 4b 65 79 20 3d 20  .        zKey = 
7890: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
78a0: 22 25 73 2f 25 30 36 64 22 2c 20 7a 44 62 2c 20  "%s/%06d", zDb, 
78b0: 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iKey);.      }el
78c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4b 65 79  se{.        zKey
78d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
78e0: 74 66 28 22 25 73 2f 25 30 32 64 2f 25 30 32 64  tf("%s/%02d/%02d
78f0: 2f 25 30 32 64 22 2c 20 7a 44 62 2c 20 69 4b 65  /%02d", zDb, iKe
7900: 79 2f 31 30 30 30 30 2c 0a 20 20 20 20 20 20 20  y/10000,.       
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 20 20 20 20 20 20 20 20 28 69 4b 65 79 2f 31 30          (iKey/10
7930: 30 29 25 31 30 30 2c 20 69 4b 65 79 25 31 30 30  0)%100, iKey%100
7940: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7950: 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
7960: 20 20 69 66 28 20 69 73 55 70 64 61 74 65 54 65    if( isUpdateTe
7970: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70  st ){.        up
7980: 64 61 74 65 46 69 6c 65 28 7a 4b 65 79 2c 20 26  dateFile(zKey, &
7990: 6e 44 61 74 61 2c 20 64 6f 46 73 79 6e 63 29 3b  nData, doFsync);
79a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
79b0: 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 72 65        pData = re
79c0: 61 64 46 69 6c 65 28 7a 4b 65 79 2c 20 26 6e 44  adFile(zKey, &nD
79d0: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ata);.        sq
79e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
79f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7a00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b   sqlite3_free(zK
7a10: 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ey);.    }else i
7a20: 66 28 20 62 42 6c 6f 62 41 70 69 20 29 7b 0a 20  f( bBlobApi ){. 
7a30: 20 20 20 20 20 2f 2a 20 43 41 53 45 20 32 3a 20       /* CASE 2: 
7a40: 52 65 61 64 69 6e 67 20 66 72 6f 6d 20 64 61 74  Reading from dat
7a50: 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
7a60: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 42 4c 4f 42  incremental BLOB
7a70: 20 49 2f 4f 20 41 50 49 20 2a 2f 0a 20 20 20 20   I/O API */.    
7a80: 20 20 69 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29    if( pBlob==0 )
7a90: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
7aa0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
7ab0: 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 22 6b 76  (db, "main", "kv
7ac0: 22 2c 20 22 76 22 2c 20 69 4b 65 79 2c 0a 20 20  ", "v", iKey,.  
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 55               isU
7af0: 70 64 61 74 65 54 65 73 74 2c 20 26 70 42 6c 6f  pdateTest, &pBlo
7b00: 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  b);.        if( 
7b10: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
7b20: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 6f 75 6c  fatalError("coul
7b30: 64 20 6e 6f 74 20 6f 70 65 6e 20 73 71 6c 69 74  d not open sqlit
7b40: 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 3a 20  e3_blob handle: 
7b50: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
7b60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7b70: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
7b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7b90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
7ba0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
7bb0: 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 4b  reopen(pBlob, iK
7bc0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
7bd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7be0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7bf0: 6e 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  nData = sqlite3_
7c00: 62 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62  blob_bytes(pBlob
7c10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
7c20: 41 6c 6c 6f 63 3c 6e 44 61 74 61 2b 31 20 29 7b  Alloc<nData+1 ){
7c30: 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f  .          nAllo
7c40: 63 20 3d 20 6e 44 61 74 61 2b 31 30 30 3b 0a 20  c = nData+100;. 
7c50: 20 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d           pData =
7c60: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7c70: 36 34 28 70 44 61 74 61 2c 20 6e 41 6c 6c 6f 63  64(pData, nAlloc
7c80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7c90: 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
7ca0: 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  0 ) fatalError("
7cb0: 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  cannot allocate 
7cc0: 25 64 20 62 79 74 65 73 22 2c 20 6e 44 61 74 61  %d bytes", nData
7cd0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
7ce0: 20 69 73 55 70 64 61 74 65 54 65 73 74 20 29 7b   isUpdateTest ){
7cf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7d00: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 28 69  e3_randomness((i
7d10: 6e 74 29 6e 44 61 74 61 2c 20 70 44 61 74 61 29  nt)nData, pData)
7d20: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
7d30: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
7d40: 69 74 65 28 70 42 6c 6f 62 2c 20 70 44 61 74 61  ite(pBlob, pData
7d50: 2c 20 28 69 6e 74 29 6e 44 61 74 61 2c 20 30 29  , (int)nData, 0)
7d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7d70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 61 74  .            fat
7d90: 61 6c 45 72 72 6f 72 28 22 63 6f 75 6c 64 20 6e  alError("could n
7da0: 6f 74 20 77 72 69 74 65 20 74 68 65 20 62 6c 6f  ot write the blo
7db0: 62 20 61 74 20 25 64 3a 20 25 73 22 2c 20 69 4b  b at %d: %s", iK
7dc0: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
7dd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7de0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
7df0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7e00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7e20: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62  _blob_read(pBlob
7e30: 2c 20 70 44 61 74 61 2c 20 28 69 6e 74 29 6e 44  , pData, (int)nD
7e40: 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ata, 0);.       
7e50: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7e60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7e70: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
7e80: 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 74  could not read t
7e90: 68 65 20 62 6c 6f 62 20 61 74 20 25 64 3a 20 25  he blob at %d: %
7ea0: 73 22 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20 20  s", iKey,.      
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
7ed0: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  b));.          }
7ee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ef0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7f00: 20 20 20 20 2f 2a 20 43 41 53 45 20 33 3a 20 52      /* CASE 3: R
7f10: 65 61 64 69 6e 67 20 66 72 6f 6d 20 64 61 74 61  eading from data
7f20: 62 61 73 65 20 75 73 69 6e 67 20 53 51 4c 20 2a  base using SQL *
7f30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 6d  /.      if( pStm
7f40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
7f50: 69 66 28 20 69 73 55 70 64 61 74 65 54 65 73 74  if( isUpdateTest
7f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7f70: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7f80: 63 74 69 6f 6e 28 64 62 2c 20 22 72 65 6d 65 6d  ction(db, "remem
7f90: 62 65 72 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ber", 2, SQLITE_
7fa0: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 65 6d             remem
7fd0: 62 65 72 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  berFunc, 0, 0);.
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7ff0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
8000: 76 32 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  v2(db, .        
8010: 20 20 20 20 22 55 50 44 41 54 45 20 6b 76 20 53      "UPDATE kv S
8020: 45 54 20 76 3d 72 61 6e 64 6f 6d 62 6c 6f 62 28  ET v=randomblob(
8030: 72 65 6d 65 6d 62 65 72 28 6c 65 6e 67 74 68 28  remember(length(
8040: 76 29 2c 3f 32 29 29 22 0a 20 20 20 20 20 20 20  v),?2))".       
8050: 20 20 20 20 20 22 20 57 48 45 52 45 20 6b 3d 3f       " WHERE k=?
8060: 31 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  1", -1, &pStmt, 
8070: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
8080: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
8090: 28 70 53 74 6d 74 2c 20 32 2c 20 53 51 4c 49 54  (pStmt, 2, SQLIT
80a0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 26 6e 44  E_PTR_TO_INT(&nD
80b0: 61 74 61 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ata));.        }
80c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
80d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
80e0: 70 61 72 65 5f 76 32 28 64 62 2c 20 0a 20 20 20  pare_v2(db, .   
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
8100: 45 4c 45 43 54 20 76 20 46 52 4f 4d 20 6b 76 20  ELECT v FROM kv 
8110: 57 48 45 52 45 20 6b 3d 3f 31 22 2c 20 2d 31 2c  WHERE k=?1", -1,
8120: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
8130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8140: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
8150: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
8160: 61 6e 6e 6f 74 20 70 72 65 70 61 72 65 20 71 75  annot prepare qu
8170: 65 72 79 3a 20 25 73 22 2c 20 73 71 6c 69 74 65  ery: %s", sqlite
8180: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
8190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
81a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
81b0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
81c0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
81d0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
81e0: 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4b 65  nt(pStmt, 1, iKe
81f0: 79 29 3b 0a 20 20 20 20 20 20 6e 44 61 74 61 20  y);.      nData 
8200: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
8210: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
8220: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
8230: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
8240: 0a 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 3d  .        nData =
8250: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8260: 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b  bytes(pStmt, 0);
8270: 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d  .        pData =
8280: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
8290: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
82a0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a  blob(pStmt, 0);.
82b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
82c0: 20 20 69 66 28 20 65 4f 72 64 65 72 3d 3d 4f 52    if( eOrder==OR
82d0: 44 45 52 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  DER_ASC ){.     
82e0: 20 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 69   iKey++;.      i
82f0: 66 28 20 69 4b 65 79 3e 69 4d 61 78 20 29 20 69  f( iKey>iMax ) i
8300: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
8310: 73 65 20 69 66 28 20 65 4f 72 64 65 72 3d 3d 4f  se if( eOrder==O
8320: 52 44 45 52 5f 44 45 53 43 20 29 7b 0a 20 20 20  RDER_DESC ){.   
8330: 20 20 20 69 4b 65 79 2d 2d 3b 0a 20 20 20 20 20     iKey--;.     
8340: 20 69 66 28 20 69 4b 65 79 3c 3d 30 20 29 20 69   if( iKey<=0 ) i
8350: 4b 65 79 20 3d 20 69 4d 61 78 3b 0a 20 20 20 20  Key = iMax;.    
8360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65  }else{.      iKe
8370: 79 20 3d 20 28 72 61 6e 64 49 6e 74 28 29 25 69  y = (randInt()%i
8380: 4d 61 78 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  Max)+1;.    }.  
8390: 20 20 6e 54 6f 74 61 6c 20 2b 3d 20 6e 44 61 74    nTotal += nDat
83a0: 61 3b 0a 20 20 20 20 69 66 28 20 6e 44 61 74 61  a;.    if( nData
83b0: 3d 3d 30 20 29 7b 20 6e 43 6f 75 6e 74 2b 2b 3b  ==0 ){ nCount++;
83c0: 20 6e 45 78 74 72 61 2b 2b 3b 20 7d 0a 20 20 7d   nExtra++; }.  }
83d0: 0a 20 20 69 66 28 20 6e 41 6c 6c 6f 63 20 29 20  .  if( nAlloc ) 
83e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
83f0: 74 61 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  ta);.  if( pStmt
8400: 20 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   ) sqlite3_final
8410: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
8420: 28 20 70 42 6c 6f 62 20 29 20 73 71 6c 69 74 65  ( pBlob ) sqlite
8430: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
8440: 6f 62 29 3b 0a 20 20 69 66 28 20 62 53 74 61 74  ob);.  if( bStat
8450: 73 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79  s ){.    display
8460: 5f 73 74 61 74 73 28 64 62 2c 20 30 29 3b 0a 20  _stats(db, 0);. 
8470: 20 7d 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20   }.  if( db ){. 
8480: 20 20 20 69 66 28 20 21 64 6f 4d 75 6c 74 69 54     if( !doMultiT
8490: 72 61 6e 73 20 29 20 73 71 6c 69 74 65 33 5f 65  rans ) sqlite3_e
84a0: 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22  xec(db, "COMMIT"
84b0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
84c0: 69 66 28 20 21 6e 6f 43 68 65 63 6b 70 6f 69 6e  if( !noCheckpoin
84d0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
84e0: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
84f0: 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
8500: 7d 0a 20 20 7d 0a 20 20 74 6d 45 6c 61 70 73 65  }.  }.  tmElapse
8510: 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 20  d = timeOfDay() 
8520: 2d 20 74 6d 53 74 61 72 74 3b 0a 20 20 69 66 28  - tmStart;.  if(
8530: 20 64 62 20 26 26 20 6e 6f 43 68 65 63 6b 70 6f   db && noCheckpo
8540: 69 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  int ){.    sqlit
8550: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
8560: 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    db = 0;.  }.  
8570: 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20  if( nExtra ){.  
8580: 20 20 70 72 69 6e 74 66 28 22 25 64 20 63 79 63    printf("%d cyc
8590: 6c 65 73 20 64 75 65 20 74 6f 20 25 64 20 6d 69  les due to %d mi
85a0: 73 73 65 73 5c 6e 22 2c 20 6e 43 6f 75 6e 74 2c  sses\n", nCount,
85b0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 0a 20 20   nExtra);.  }.  
85c0: 69 66 28 20 65 54 79 70 65 3d 3d 50 41 54 48 5f  if( eType==PATH_
85d0: 44 42 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  DB ){.    printf
85e0: 28 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  ("SQLite version
85f0: 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
8600: 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 29 3b 0a  _libversion());.
8610: 20 20 20 20 69 66 28 20 64 6f 49 6e 74 65 67 72      if( doIntegr
8620: 69 74 79 43 6b 20 29 7b 0a 20 20 20 20 20 20 73  ityCk ){.      s
8630: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c  qlite3_open(zDb,
8640: 20 26 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   &db);.      sql
8650: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
8660: 64 62 2c 20 22 50 52 41 47 4d 41 20 69 6e 74 65  db, "PRAGMA inte
8670: 67 72 69 74 79 5f 63 68 65 63 6b 22 2c 20 2d 31  grity_check", -1
8680: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
8690: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
86a0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
86b0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
86c0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 69 6e        printf("in
86d0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 3a 20 25  tegrity-check: %
86e0: 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  s\n", sqlite3_co
86f0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
8700: 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   0));.      }.  
8710: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
8720: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
8730: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
8740: 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
8750: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
8760: 70 72 69 6e 74 66 28 22 2d 2d 63 6f 75 6e 74 20  printf("--count 
8770: 25 64 20 2d 2d 6d 61 78 2d 69 64 20 25 64 22 2c  %d --max-id %d",
8780: 20 6e 43 6f 75 6e 74 2d 6e 45 78 74 72 61 2c 20   nCount-nExtra, 
8790: 69 4d 61 78 29 3b 0a 20 20 73 77 69 74 63 68 28  iMax);.  switch(
87a0: 20 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 63   eOrder ){.    c
87b0: 61 73 65 20 4f 52 44 45 52 5f 52 41 4e 44 4f 4d  ase ORDER_RANDOM
87c0: 3a 20 20 70 72 69 6e 74 66 28 22 20 2d 2d 72 61  :  printf(" --ra
87d0: 6e 64 6f 6d 5c 6e 22 29 3b 20 20 62 72 65 61 6b  ndom\n");  break
87e0: 3b 0a 20 20 20 20 63 61 73 65 20 4f 52 44 45 52  ;.    case ORDER
87f0: 5f 44 45 53 43 3a 20 20 20 20 70 72 69 6e 74 66  _DESC:    printf
8800: 28 22 20 2d 2d 64 65 73 63 5c 6e 22 29 3b 20 20  (" --desc\n");  
8810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
8820: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
8830: 20 70 72 69 6e 74 66 28 22 20 2d 2d 61 73 63 5c   printf(" --asc\
8840: 6e 22 29 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  n");     break;.
8850: 20 20 7d 0a 20 20 69 66 28 20 65 54 79 70 65 3d    }.  if( eType=
8860: 3d 50 41 54 48 5f 44 42 20 29 7b 0a 20 20 20 20  =PATH_DB ){.    
8870: 70 72 69 6e 74 66 28 22 2d 2d 63 61 63 68 65 2d  printf("--cache-
8880: 73 69 7a 65 20 25 64 20 2d 2d 6a 6d 6f 64 65 20  size %d --jmode 
8890: 25 73 5c 6e 22 2c 20 69 43 61 63 68 65 2c 20 7a  %s\n", iCache, z
88a0: 4a 4d 6f 64 65 29 3b 0a 20 20 20 20 70 72 69 6e  JMode);.    prin
88b0: 74 66 28 22 2d 2d 6d 6d 61 70 20 25 64 25 73 5c  tf("--mmap %d%s\
88c0: 6e 22 2c 20 6d 6d 61 70 53 69 7a 65 2c 20 62 42  n", mmapSize, bB
88d0: 6c 6f 62 41 70 69 20 3f 20 22 20 2d 2d 62 6c 6f  lobApi ? " --blo
88e0: 62 2d 61 70 69 22 20 3a 20 22 22 29 3b 0a 20 20  b-api" : "");.  
88f0: 20 20 69 66 28 20 6e 6f 53 79 6e 63 20 29 20 70    if( noSync ) p
8900: 72 69 6e 74 66 28 22 2d 2d 6e 6f 73 79 6e 63 5c  rintf("--nosync\
8910: 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  n");.  }.  if( i
8920: 50 61 67 65 73 69 7a 65 20 29 20 70 72 69 6e 74  Pagesize ) print
8930: 66 28 22 44 61 74 61 62 61 73 65 20 70 61 67 65  f("Database page
8940: 20 73 69 7a 65 3a 20 25 64 5c 6e 22 2c 20 69 50   size: %d\n", iP
8950: 61 67 65 73 69 7a 65 29 3b 0a 20 20 70 72 69 6e  agesize);.  prin
8960: 74 66 28 22 54 6f 74 61 6c 20 65 6c 61 70 73 65  tf("Total elapse
8970: 64 20 74 69 6d 65 3a 20 25 2e 33 66 5c 6e 22 2c  d time: %.3f\n",
8980: 20 74 6d 45 6c 61 70 73 65 64 2f 31 30 30 30 2e   tmElapsed/1000.
8990: 30 29 3b 0a 20 20 69 66 28 20 69 73 55 70 64 61  0);.  if( isUpda
89a0: 74 65 54 65 73 74 20 29 7b 0a 20 20 20 20 70 72  teTest ){.    pr
89b0: 69 6e 74 66 28 22 4d 69 63 72 6f 73 65 63 6f 6e  intf("Microsecon
89c0: 64 73 20 70 65 72 20 42 4c 4f 42 20 77 72 69 74  ds per BLOB writ
89d0: 65 3a 20 25 2e 33 66 5c 6e 22 2c 20 74 6d 45 6c  e: %.3f\n", tmEl
89e0: 61 70 73 65 64 2a 31 30 30 30 2e 30 2f 6e 43 6f  apsed*1000.0/nCo
89f0: 75 6e 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  unt);.    printf
8a00: 28 22 43 6f 6e 74 65 6e 74 20 77 72 69 74 65 20  ("Content write 
8a10: 72 61 74 65 3a 20 25 2e 31 66 20 4d 42 2f 73 5c  rate: %.1f MB/s\
8a20: 6e 22 2c 20 6e 54 6f 74 61 6c 2f 28 31 30 30 30  n", nTotal/(1000
8a30: 2e 30 2a 74 6d 45 6c 61 70 73 65 64 29 29 3b 0a  .0*tmElapsed));.
8a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
8a50: 6e 74 66 28 22 4d 69 63 72 6f 73 65 63 6f 6e 64  ntf("Microsecond
8a60: 73 20 70 65 72 20 42 4c 4f 42 20 72 65 61 64 3a  s per BLOB read:
8a70: 20 25 2e 33 66 5c 6e 22 2c 20 74 6d 45 6c 61 70   %.3f\n", tmElap
8a80: 73 65 64 2a 31 30 30 30 2e 30 2f 6e 43 6f 75 6e  sed*1000.0/nCoun
8a90: 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  t);.    printf("
8aa0: 43 6f 6e 74 65 6e 74 20 72 65 61 64 20 72 61 74  Content read rat
8ab0: 65 3a 20 25 2e 31 66 20 4d 42 2f 73 5c 6e 22 2c  e: %.1f MB/s\n",
8ac0: 20 6e 54 6f 74 61 6c 2f 28 31 30 30 30 2e 30 2a   nTotal/(1000.0*
8ad0: 74 6d 45 6c 61 70 73 65 64 29 29 3b 0a 20 20 7d  tmElapsed));.  }
8ae0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8af0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
8b00: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
8b10: 7b 0a 20 20 69 66 28 20 61 72 67 63 3c 33 20 29  {.  if( argc<3 )
8b20: 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20 20 69   showHelp();.  i
8b30: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31  f( strcmp(argv[1
8b40: 5d 2c 22 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ],"init")==0 ){.
8b50: 20 20 20 20 72 65 74 75 72 6e 20 69 6e 69 74 4d      return initM
8b60: 61 69 6e 28 61 72 67 63 2c 20 61 72 67 76 29 3b  ain(argc, argv);
8b70: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d  .  }.  if( strcm
8b80: 70 28 61 72 67 76 5b 31 5d 2c 22 65 78 70 6f 72  p(argv[1],"expor
8b90: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  t")==0 ){.    re
8ba0: 74 75 72 6e 20 65 78 70 6f 72 74 4d 61 69 6e 28  turn exportMain(
8bb0: 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 7d  argc, argv);.  }
8bc0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  .  if( strcmp(ar
8bd0: 67 76 5b 31 5d 2c 22 72 75 6e 22 29 3d 3d 30 20  gv[1],"run")==0 
8be0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 75  ){.    return ru
8bf0: 6e 4d 61 69 6e 28 61 72 67 63 2c 20 61 72 67 76  nMain(argc, argv
8c00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  );.  }.  if( str
8c10: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 61  cmp(argv[1],"sta
8c20: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  t")==0 ){.    re
8c30: 74 75 72 6e 20 73 74 61 74 4d 61 69 6e 28 61 72  turn statMain(ar
8c40: 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20  gc, argv);.  }. 
8c50: 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20 20 72   showHelp();.  r
8c60: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.