/ Hex Artifact Content
Login

Artifact 23452e653e6b0254dc2fd1d242d4c7c65644504de8951d7d60f7e4291c52c231:


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 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
13f0: 28 5f 4d 53 43 5f 56 45 52 29 0a 23 20 69 6e 63  (_MSC_VER).# inc
1400: 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a  lude <stdint.h>.
1410: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1420: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
1430: 6f 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 63  os are used to c
1440: 61 73 74 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ast pointers to 
1450: 69 6e 74 65 67 65 72 73 20 61 6e 64 0a 2a 2a 20  integers and.** 
1460: 69 6e 74 65 67 65 72 73 20 74 6f 20 70 6f 69 6e  integers to poin
1470: 74 65 72 73 2e 20 20 54 68 65 20 77 61 79 20 79  ters.  The way y
1480: 6f 75 20 64 6f 20 74 68 69 73 20 76 61 72 69 65  ou do this varie
1490: 73 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6d 70 69  s from one compi
14a0: 6c 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  ler.** to the ne
14b0: 78 74 2c 20 73 6f 20 77 65 20 68 61 76 65 20 64  xt, so we have d
14c0: 65 76 65 6c 6f 70 65 64 20 74 68 65 20 66 6f 6c  eveloped the fol
14d0: 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 23 69  lowing set of #i
14e0: 66 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  f statements.** 
14f0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 70 70 72  to generate appr
1500: 6f 70 72 69 61 74 65 20 6d 61 63 72 6f 73 20 66  opriate macros f
1510: 6f 72 20 61 20 77 69 64 65 20 72 61 6e 67 65 20  or a wide range 
1520: 6f 66 20 63 6f 6d 70 69 6c 65 72 73 2e 0a 2a 2a  of compilers..**
1530: 0a 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20  .** The correct 
1540: 22 41 4e 53 49 22 20 77 61 79 20 74 6f 20 64 6f  "ANSI" way to do
1550: 20 74 68 69 73 20 69 73 20 74 6f 20 75 73 65 20   this is to use 
1560: 74 68 65 20 69 6e 74 70 74 72 5f 74 20 74 79 70  the intptr_t typ
1570: 65 2e 0a 2a 2a 20 55 6e 66 6f 72 74 75 6e 61 74  e..** Unfortunat
1580: 65 6c 79 2c 20 74 68 61 74 20 74 79 70 65 64 65  ely, that typede
1590: 66 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  f is not availab
15a0: 6c 65 20 6f 6e 20 61 6c 6c 20 63 6f 6d 70 69 6c  le on all compil
15b0: 65 72 73 2c 20 6f 72 0a 2a 2a 20 69 66 20 69 74  ers, or.** if it
15c0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69   is available, i
15d0: 74 20 72 65 71 75 69 72 65 73 20 61 6e 20 23 69  t requires an #i
15e0: 6e 63 6c 75 64 65 20 6f 66 20 73 70 65 63 69 66  nclude of specif
15f0: 69 63 20 68 65 61 64 65 72 73 0a 2a 2a 20 74 68  ic headers.** th
1600: 61 74 20 76 61 72 79 20 66 72 6f 6d 20 6f 6e 65  at vary from one
1610: 20 6d 61 63 68 69 6e 65 20 74 6f 20 74 68 65 20   machine to the 
1620: 6e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  next..**.** Tick
1630: 65 74 20 23 33 38 36 30 3a 20 20 54 68 65 20 6c  et #3860:  The l
1640: 6c 76 6d 2d 67 63 63 2d 34 2e 32 20 63 6f 6d 70  lvm-gcc-4.2 comp
1650: 69 6c 65 72 20 66 72 6f 6d 20 41 70 70 6c 65 20  iler from Apple 
1660: 63 68 6f 6b 65 73 20 6f 6e 0a 2a 2a 20 74 68 65  chokes on.** the
1670: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
1680: 2a 29 30 29 5b 58 5d 29 20 63 6f 6e 73 74 72 75  *)0)[X]) constru
1690: 63 74 2e 20 20 42 75 74 20 4d 53 56 43 20 63 68  ct.  But MSVC ch
16a0: 6f 6b 65 73 20 6f 6e 20 28 28 76 6f 69 64 2a 29  okes on ((void*)
16b0: 28 58 29 29 2e 0a 2a 2a 20 53 6f 20 77 65 20 68  (X))..** So we h
16c0: 61 76 65 20 74 6f 20 64 65 66 69 6e 65 20 74 68  ave to define th
16d0: 65 20 6d 61 63 72 6f 73 20 69 6e 20 64 69 66 66  e macros in diff
16e0: 65 72 65 6e 74 20 77 61 79 73 20 64 65 70 65 6e  erent ways depen
16f0: 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ding on the.** c
1700: 6f 6d 70 69 6c 65 72 2e 0a 2a 2f 0a 23 69 66 20  ompiler..*/.#if 
1710: 64 65 66 69 6e 65 64 28 5f 5f 50 54 52 44 49 46  defined(__PTRDIF
1720: 46 5f 54 59 50 45 5f 5f 29 20 20 2f 2a 20 54 68  F_TYPE__)  /* Th
1730: 69 73 20 63 61 73 65 20 73 68 6f 75 6c 64 20 77  is case should w
1740: 6f 72 6b 20 66 6f 72 20 47 43 43 20 2a 2f 0a 23  ork for GCC */.#
1750: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 49   define SQLITE_I
1760: 4e 54 5f 54 4f 5f 50 54 52 28 58 29 20 20 28 28  NT_TO_PTR(X)  ((
1770: 76 6f 69 64 2a 29 28 5f 5f 50 54 52 44 49 46 46  void*)(__PTRDIFF
1780: 5f 54 59 50 45 5f 5f 29 28 58 29 29 0a 23 20 64  _TYPE__)(X)).# d
1790: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50 54 52  efine SQLITE_PTR
17a0: 5f 54 4f 5f 49 4e 54 28 58 29 20 20 28 28 73 71  _TO_INT(X)  ((sq
17b0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 5f 5f 50  lite3_int64)(__P
17c0: 54 52 44 49 46 46 5f 54 59 50 45 5f 5f 29 28 58  TRDIFF_TYPE__)(X
17d0: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
17e0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  e SQLITE_INT_TO_
17f0: 50 54 52 28 58 29 20 20 28 28 76 6f 69 64 2a 29  PTR(X)  ((void*)
1800: 28 69 6e 74 70 74 72 5f 74 29 28 58 29 29 0a 23  (intptr_t)(X)).#
1810: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 50   define SQLITE_P
1820: 54 52 5f 54 4f 5f 49 4e 54 28 58 29 20 20 28 28  TR_TO_INT(X)  ((
1830: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 69  sqlite3_int64)(i
1840: 6e 74 70 74 72 5f 74 29 28 58 29 29 0a 23 65 6e  ntptr_t)(X)).#en
1850: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20  dif../*.** Show 
1860: 74 68 71 65 20 68 65 6c 70 20 74 65 78 74 20 61  thqe help text a
1870: 6e 64 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74  nd quit..*/.stat
1880: 69 63 20 76 6f 69 64 20 73 68 6f 77 48 65 6c 70  ic void showHelp
1890: 28 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74  (void){.  fprint
18a0: 66 28 73 74 64 6f 75 74 2c 20 22 25 73 22 2c 20  f(stdout, "%s", 
18b0: 7a 48 65 6c 70 29 3b 0a 20 20 65 78 69 74 28 31  zHelp);.  exit(1
18c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77  );.}../*.** Show
18d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
18e0: 65 20 61 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74  e an quit..*/.st
18f0: 61 74 69 63 20 76 6f 69 64 20 66 61 74 61 6c 45  atic void fatalE
1900: 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  rror(const char 
1910: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1920: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1930: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
1940: 22 45 52 52 4f 52 3a 20 22 29 3b 0a 20 20 76 61  "ERROR: ");.  va
1950: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1960: 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28  at);.  vfprintf(
1970: 73 74 64 6f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c  stdout, zFormat,
1980: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1990: 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  p);.  fprintf(st
19a0: 64 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 65  dout, "\n");.  e
19b0: 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xit(1);.}../*.**
19c0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
19d0: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
19e0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
19f0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
1a00: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
1a10: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
1a20: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
1a30: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
1a40: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
1a50: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
1a60: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
1a70: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
1a80: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
1a90: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
1aa0: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
1ab0: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
1ac0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
1ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
1ae0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
1af0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
1b00: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
1b10: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  xes..*/.static i
1b20: 6e 74 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt integerValue(
1b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1b40: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
1b50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1b60: 74 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a 53  truct { char *zS
1b70: 75 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74  uffix; int iMult
1b80: 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a  ; } aMult[] = {.
1b90: 20 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30 32      { "KiB", 102
1ba0: 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22  4 },.    { "MiB"
1bb0: 2c 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20  , 1024*1024 },. 
1bc0: 20 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32 34     { "GiB", 1024
1bd0: 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20  *1024*1024 },.  
1be0: 20 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30 20    { "KB",  1000 
1bf0: 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20 20  },.    { "MB",  
1c00: 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
1c10: 20 22 47 42 22 2c 20 20 31 30 30 30 30 30 30 30   "GB",  10000000
1c20: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c  00 },.    { "K",
1c30: 20 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b     1000 },.    {
1c40: 20 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30 20   "M",   1000000 
1c50: 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20 20  },.    { "G",   
1c60: 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
1c70: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  };.  int i;.  in
1c80: 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69  t isNeg = 0;.  i
1c90: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20  f( zArg[0]=='-' 
1ca0: 29 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20 31  ){.    isNeg = 1
1cb0: 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  ;.    zArg++;.  
1cc0: 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b 30  }else if( zArg[0
1cd0: 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41  ]=='+' ){.    zA
1ce0: 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rg++;.  }.  if( 
1cf0: 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20  zArg[0]=='0' && 
1d00: 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a  zArg[1]=='x' ){.
1d10: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a      int x;.    z
1d20: 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68  Arg += 2;.    wh
1d30: 69 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69 67  ile( (x = hexDig
1d40: 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29  itValue(zArg[0])
1d50: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )>=0 ){.      v 
1d60: 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20  = (v<<4) + x;.  
1d70: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
1d80: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  }.  }else{.    w
1d90: 68 69 6c 65 28 20 7a 41 72 67 5b 30 5d 3e 3d 27  hile( zArg[0]>='
1da0: 30 27 20 26 26 20 7a 41 72 67 5b 30 5d 3c 3d 27  0' && zArg[0]<='
1db0: 39 27 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  9' ){.      v = 
1dc0: 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d  v*10 + zArg[0] -
1dd0: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67   '0';.      zArg
1de0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
1e00: 66 28 61 4d 75 6c 74 29 2f 73 69 7a 65 6f 66 28  f(aMult)/sizeof(
1e10: 61 4d 75 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b  aMult[0]); i++){
1e20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1e30: 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69  _stricmp(aMult[i
1e40: 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29  ].zSuffix, zArg)
1e50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a  ==0 ){.      v *
1e60: 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74  = aMult[i].iMult
1e70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e90: 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b  n isNeg? -v : v;
1ea0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
1eb0: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
1ec0: 6f 62 6a 65 63 74 20 7a 50 61 74 68 2e 20 20 44  object zPath.  D
1ed0: 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 69 74  etermine what it
1ee0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   is:.**.**    PA
1ef0: 54 48 5f 44 49 52 20 20 20 20 20 41 20 73 69 6e  TH_DIR     A sin
1f00: 67 6c 65 20 64 69 72 65 63 74 6f 72 79 20 68 6f  gle directory ho
1f10: 6c 64 69 6e 67 20 6d 61 6e 79 20 66 69 6c 65 73  lding many files
1f20: 0a 2a 2a 20 20 20 20 50 41 54 48 5f 54 52 45 45  .**    PATH_TREE
1f30: 20 20 20 20 41 20 64 69 72 65 63 74 6f 72 79 20      A directory 
1f40: 68 69 65 72 61 72 63 68 79 20 77 69 74 68 20 66  hierarchy with f
1f50: 69 6c 65 73 20 61 74 20 74 68 65 20 6c 65 61 76  iles at the leav
1f60: 65 73 0a 2a 2a 20 20 20 20 50 41 54 48 5f 44 42  es.**    PATH_DB
1f70: 20 20 20 20 20 20 41 6e 20 53 51 4c 69 74 65 20        An SQLite 
1f80: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 50  database.**    P
1f90: 41 54 48 5f 4e 45 58 49 53 54 20 20 44 6f 65 73  ATH_NEXIST  Does
1fa0: 20 6e 6f 74 20 65 78 69 73 74 0a 2a 2a 20 20 20   not exist.**   
1fb0: 20 50 41 54 48 5f 4f 54 48 45 52 20 20 20 53 6f   PATH_OTHER   So
1fc0: 6d 65 74 68 69 6e 67 20 65 6c 73 65 0a 2a 2a 0a  mething else.**.
1fd0: 2a 2a 20 50 41 54 48 5f 44 49 52 20 6d 65 61 6e  ** PATH_DIR mean
1fe0: 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 65 70  s all of the sep
1ff0: 61 72 61 74 65 20 66 69 6c 65 73 20 61 72 65 20  arate files are 
2000: 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2010: 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  .** into a singl
2020: 65 20 64 69 72 65 63 74 6f 72 79 20 77 69 74 68  e directory with
2030: 20 6e 61 6d 65 73 20 6c 69 6b 65 20 30 30 30 30   names like 0000
2040: 30 30 2c 20 30 30 30 30 30 31 2c 20 30 30 30 30  00, 000001, 0000
2050: 30 32 2c 20 61 6e 64 0a 2a 2a 20 73 6f 20 66 6f  02, and.** so fo
2060: 72 74 68 2e 20 20 50 41 54 48 5f 54 52 45 45 20  rth.  PATH_TREE 
2070: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 61  means there is a
2080: 20 68 69 65 72 61 72 63 68 79 20 6f 66 20 64 69   hierarchy of di
2090: 72 65 63 74 6f 72 69 65 73 20 73 6f 0a 2a 2a 20  rectories so.** 
20a0: 74 68 61 74 20 6e 6f 20 73 69 6e 67 6c 65 20 64  that no single d
20b0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 74 6f 6f  irectory has too
20c0: 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 2e 20 20   many entries.  
20d0: 54 68 65 20 66 69 6c 65 73 20 68 61 76 65 20 6e  The files have n
20e0: 61 6d 65 73 0a 2a 2a 20 6c 69 6b 65 20 30 30 2f  ames.** like 00/
20f0: 30 30 2f 30 30 2c 20 30 30 2f 30 30 2f 30 31 2c  00/00, 00/00/01,
2100: 20 30 30 2f 30 30 2f 30 32 20 61 6e 64 20 73 6f   00/00/02 and so
2110: 20 66 6f 72 74 68 2e 20 20 54 68 65 20 64 65 63   forth.  The dec
2120: 69 73 69 6f 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  ision between.**
2130: 20 50 41 54 48 5f 44 49 52 20 61 6e 64 20 50 41   PATH_DIR and PA
2140: 54 48 5f 54 52 45 45 20 69 73 20 64 65 74 65 72  TH_TREE is deter
2150: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 72 65  mined by the pre
2160: 73 65 6e 63 65 20 6f 66 20 61 20 73 75 62 64 69  sence of a subdi
2170: 72 65 63 74 6f 72 79 0a 2a 2a 20 6e 61 6d 65 64  rectory.** named
2180: 20 22 30 30 22 20 61 74 20 74 68 65 20 74 6f 70   "00" at the top
2190: 2d 6c 65 76 65 6c 2e 0a 2a 2f 0a 23 64 65 66 69  -level..*/.#defi
21a0: 6e 65 20 50 41 54 48 5f 44 49 52 20 20 20 20 20  ne PATH_DIR     
21b0: 31 0a 23 64 65 66 69 6e 65 20 50 41 54 48 5f 54  1.#define PATH_T
21c0: 52 45 45 20 20 20 20 32 0a 23 64 65 66 69 6e 65  REE    2.#define
21d0: 20 50 41 54 48 5f 44 42 20 20 20 20 20 20 33 0a   PATH_DB      3.
21e0: 23 64 65 66 69 6e 65 20 50 41 54 48 5f 4e 45 58  #define PATH_NEX
21f0: 49 53 54 20 20 30 0a 23 64 65 66 69 6e 65 20 50  IST  0.#define P
2200: 41 54 48 5f 4f 54 48 45 52 20 20 20 39 39 0a 73  ATH_OTHER   99.s
2210: 74 61 74 69 63 20 69 6e 74 20 70 61 74 68 54 79  tatic int pathTy
2220: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
2230: 50 61 74 68 29 7b 0a 20 20 73 74 72 75 63 74 20  Path){.  struct 
2240: 73 74 61 74 20 78 3b 0a 20 20 69 6e 74 20 72 63  stat x;.  int rc
2250: 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a  ;.  if( access(z
2260: 50 61 74 68 2c 52 5f 4f 4b 29 20 29 20 72 65 74  Path,R_OK) ) ret
2270: 75 72 6e 20 50 41 54 48 5f 4e 45 58 49 53 54 3b  urn PATH_NEXIST;
2280: 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c  .  memset(&x, 0,
2290: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 72   sizeof(x));.  r
22a0: 63 20 3d 20 73 74 61 74 28 7a 50 61 74 68 2c 20  c = stat(zPath, 
22b0: 26 78 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  &x);.  if( rc<0 
22c0: 29 20 72 65 74 75 72 6e 20 50 41 54 48 5f 4f 54  ) return PATH_OT
22d0: 48 45 52 3b 0a 20 20 69 66 28 20 53 5f 49 53 44  HER;.  if( S_ISD
22e0: 49 52 28 78 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  IR(x.st_mode) ){
22f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 61 79 65  .    char *zLaye
2300: 72 31 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  r1 = sqlite3_mpr
2310: 69 6e 74 66 28 22 25 73 2f 30 30 22 2c 20 7a 50  intf("%s/00", zP
2320: 61 74 68 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ath);.    memset
2330: 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
2340: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 74 61  ));.    rc = sta
2350: 74 28 7a 4c 61 79 65 72 31 2c 20 26 78 29 3b 0a  t(zLayer1, &x);.
2360: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2370: 28 7a 4c 61 79 65 72 31 29 3b 0a 20 20 20 20 69  (zLayer1);.    i
2380: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
2390: 20 50 41 54 48 5f 44 49 52 3b 0a 20 20 20 20 69   PATH_DIR;.    i
23a0: 66 28 20 53 5f 49 53 44 49 52 28 78 2e 73 74 5f  f( S_ISDIR(x.st_
23b0: 6d 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 50  mode) ) return P
23c0: 41 54 48 5f 54 52 45 45 3b 0a 20 20 20 20 72 65  ATH_TREE;.    re
23d0: 74 75 72 6e 20 50 41 54 48 5f 44 49 52 3b 0a 20  turn PATH_DIR;. 
23e0: 20 7d 0a 20 20 69 66 28 20 28 78 2e 73 74 5f 73   }.  if( (x.st_s
23f0: 69 7a 65 25 35 31 32 29 3d 3d 30 20 29 20 72 65  ize%512)==0 ) re
2400: 74 75 72 6e 20 50 41 54 48 5f 44 42 3b 0a 20 20  turn PATH_DB;.  
2410: 72 65 74 75 72 6e 20 50 41 54 48 5f 4f 54 48 45  return PATH_OTHE
2420: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
2430: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
2440: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 2e 20   file in bytes. 
2450: 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66   Or return -1 if
2460: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 64 20 6f 62   the.** named ob
2470: 6a 65 63 74 20 69 73 20 6e 6f 74 20 61 20 72 65  ject is not a re
2480: 67 75 6c 61 72 20 66 69 6c 65 20 6f 72 20 64 6f  gular file or do
2490: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
24a0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
24b0: 69 6e 74 36 34 20 66 69 6c 65 53 69 7a 65 28 63  int64 fileSize(c
24c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
24d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
24e0: 20 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   x;.  int rc;.  
24f0: 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69  memset(&x, 0, si
2500: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 72 63 20 3d  zeof(x));.  rc =
2510: 20 73 74 61 74 28 7a 50 61 74 68 2c 20 26 78 29   stat(zPath, &x)
2520: 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 72  ;.  if( rc<0 ) r
2530: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20  eturn -1;.  if( 
2540: 21 53 5f 49 53 52 45 47 28 78 2e 73 74 5f 6d 6f  !S_ISREG(x.st_mo
2550: 64 65 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  de) ) return -1;
2560: 0a 20 20 72 65 74 75 72 6e 20 78 2e 73 74 5f 73  .  return x.st_s
2570: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  ize;.}../*.** A 
2580: 50 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75  Pseudo-random nu
2590: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 77  mber generator w
25a0: 69 74 68 20 61 20 66 69 78 65 64 20 73 65 65 64  ith a fixed seed
25b0: 2e 20 20 55 73 65 20 74 68 69 73 20 73 6f 0a 2a  .  Use this so.*
25c0: 2a 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  * that the same 
25d0: 73 65 71 75 65 6e 63 65 20 6f 66 20 22 72 61 6e  sequence of "ran
25e0: 64 6f 6d 22 20 6e 75 6d 62 65 72 73 20 61 72 65  dom" numbers are
25f0: 20 67 65 6e 65 72 61 74 65 64 20 6f 6e 20 65 61   generated on ea
2600: 63 68 0a 2a 2a 20 72 75 6e 2c 20 66 6f 72 20 72  ch.** run, for r
2610: 65 70 65 61 74 61 62 69 6c 69 74 79 2e 0a 2a 2f  epeatability..*/
2620: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
2630: 20 69 6e 74 20 72 61 6e 64 49 6e 74 28 76 6f 69   int randInt(voi
2640: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 6e 73  d){.  static uns
2650: 69 67 6e 65 64 20 69 6e 74 20 78 20 3d 20 30 78  igned int x = 0x
2660: 33 33 33 61 31 33 63 64 3b 0a 20 20 73 74 61 74  333a13cd;.  stat
2670: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
2680: 79 20 3d 20 30 78 65 63 62 32 61 64 65 61 3b 0a  y = 0xecb2adea;.
2690: 20 20 78 20 3d 20 28 78 3e 3e 31 29 20 5e 20 28    x = (x>>1) ^ (
26a0: 28 31 2b 7e 28 78 26 31 29 29 20 26 20 30 78 64  (1+~(x&1)) & 0xd
26b0: 30 30 30 30 30 30 31 29 3b 0a 20 20 79 20 3d 20  0000001);.  y = 
26c0: 79 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20 31  y*1103515245 + 1
26d0: 32 33 34 35 3b 0a 20 20 72 65 74 75 72 6e 20 78  2345;.  return x
26e0: 5e 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  ^y;.}../*.** Do 
26f0: 64 61 74 61 62 61 73 65 20 69 6e 69 74 69 61 6c  database initial
2700: 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ization..*/.stat
2710: 69 63 20 69 6e 74 20 69 6e 69 74 4d 61 69 6e 28  ic int initMain(
2720: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
2730: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
2740: 7a 44 62 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63  zDb;.  int i, rc
2750: 3b 0a 20 20 69 6e 74 20 6e 43 6f 75 6e 74 20 3d  ;.  int nCount =
2760: 20 31 30 30 30 3b 0a 20 20 69 6e 74 20 73 7a 20   1000;.  int sz 
2770: 3d 20 31 30 30 30 30 3b 0a 20 20 69 6e 74 20 69  = 10000;.  int i
2780: 56 61 72 69 61 6e 63 65 20 3d 20 30 3b 0a 20 20  Variance = 0;.  
2790: 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b  int pgsz = 4096;
27a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27b0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
27c0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
27d0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 74  0;..  assert( st
27e0: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 69 6e  rcmp(argv[1],"in
27f0: 69 74 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  it")==0 );.  ass
2800: 65 72 74 28 20 61 72 67 63 3e 3d 33 20 29 3b 0a  ert( argc>=3 );.
2810: 20 20 7a 44 62 20 3d 20 61 72 67 76 5b 32 5d 3b    zDb = argv[2];
2820: 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69 3c 61 72  .  for(i=3; i<ar
2830: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  gc; i++){.    ch
2840: 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b  ar *z = argv[i];
2850: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27  .    if( z[0]!='
2860: 2d 27 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  -' ) fatalError(
2870: 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e  "unknown argumen
2880: 74 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 29 3b 0a  t: \"%s\"", z);.
2890: 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d      if( z[1]=='-
28a0: 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ' ) z++;.    if(
28b0: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 63 6f 75   strcmp(z, "-cou
28c0: 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt")==0 ){.     
28d0: 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29   if( i==argc-1 )
28e0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73   fatalError("mis
28f0: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
2900: 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69   \"%s\"", argv[i
2910: 5d 29 3b 0a 20 20 20 20 20 20 6e 43 6f 75 6e 74  ]);.      nCount
2920: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
2930: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
2940: 20 20 69 66 28 20 6e 43 6f 75 6e 74 3c 31 20 29    if( nCount<1 )
2950: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 68 65   fatalError("the
2960: 20 2d 2d 63 6f 75 6e 74 20 6d 75 73 74 20 62 65   --count must be
2970: 20 70 6f 73 69 74 69 76 65 22 29 3b 0a 20 20 20   positive");.   
2980: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2990: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
29a0: 70 28 7a 2c 20 22 2d 73 69 7a 65 22 29 3d 3d 30  p(z, "-size")==0
29b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
29c0: 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 45  =argc-1 ) fatalE
29d0: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
29e0: 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25 73 5c 22  gument on \"%s\"
29f0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
2a00: 20 20 20 73 7a 20 3d 20 69 6e 74 65 67 65 72 56     sz = integerV
2a10: 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b  alue(argv[++i]);
2a20: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3c 31 20  .      if( sz<1 
2a30: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 68  ) fatalError("th
2a40: 65 20 2d 2d 73 69 7a 65 20 6d 75 73 74 20 62 65  e --size must be
2a50: 20 70 6f 73 69 74 69 76 65 22 29 3b 0a 20 20 20   positive");.   
2a60: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2a70: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
2a80: 70 28 7a 2c 20 22 2d 76 61 72 69 61 6e 63 65 22  p(z, "-variance"
2a90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
2aa0: 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i==argc-1 ) fa
2ab0: 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  talError("missin
2ac0: 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22  g argument on \"
2ad0: 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b  %s\"", argv[i]);
2ae0: 0a 20 20 20 20 20 20 69 56 61 72 69 61 6e 63 65  .      iVariance
2af0: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
2b00: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
2b10: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2b20: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
2b30: 28 7a 2c 20 22 2d 70 61 67 65 73 69 7a 65 22 29  (z, "-pagesize")
2b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2b50: 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i==argc-1 ) fat
2b60: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
2b70: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25   argument on \"%
2b80: 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\"", argv[i]);.
2b90: 20 20 20 20 20 20 70 67 73 7a 20 3d 20 69 6e 74        pgsz = int
2ba0: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b  egerValue(argv[+
2bb0: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i]);.      if( 
2bc0: 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a  pgsz<512 || pgsz
2bd0: 3e 36 35 35 33 36 20 7c 7c 20 28 28 70 67 73 7a  >65536 || ((pgsz
2be0: 2d 31 29 26 70 67 73 7a 29 21 3d 30 20 29 7b 0a  -1)&pgsz)!=0 ){.
2bf0: 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72          fatalErr
2c00: 6f 72 28 22 74 68 65 20 2d 2d 70 61 67 65 73 69  or("the --pagesi
2c10: 7a 65 20 6d 75 73 74 20 62 65 20 70 6f 77 65 72  ze must be power
2c20: 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
2c30: 32 20 61 6e 64 20 36 35 35 33 36 22 29 3b 0a 20  2 and 65536");. 
2c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2c50: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
2c60: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e 6b   fatalError("unk
2c70: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22 25  nown option: \"%
2c80: 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\"", argv[i]);.
2c90: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2ca0: 65 33 5f 6f 70 65 6e 28 7a 44 62 2c 20 26 64 62  e3_open(zDb, &db
2cb0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2cc0: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
2cd0: 61 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74 61 62  annot open datab
2ce0: 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 22 2c  ase \"%s\": %s",
2cf0: 20 7a 44 62 2c 20 73 71 6c 69 74 65 33 5f 65 72   zDb, sqlite3_er
2d00: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 20  rmsg(db));.  }. 
2d10: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2d20: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 22 44 52  mprintf(.    "DR
2d30: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
2d40: 54 53 20 6b 76 3b 5c 6e 22 0a 20 20 20 20 22 50  TS kv;\n".    "P
2d50: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d  RAGMA page_size=
2d60: 25 64 3b 5c 6e 22 0a 20 20 20 20 22 56 41 43 55  %d;\n".    "VACU
2d70: 55 4d 3b 5c 6e 22 0a 20 20 20 20 22 42 45 47 49  UM;\n".    "BEGI
2d80: 4e 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54  N;\n".    "CREAT
2d90: 45 20 54 41 42 4c 45 20 6b 76 28 6b 20 49 4e 54  E TABLE kv(k INT
2da0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2db0: 2c 20 76 20 42 4c 4f 42 29 3b 5c 6e 22 0a 20 20  , v BLOB);\n".  
2dc0: 20 20 22 57 49 54 48 20 52 45 43 55 52 53 49 56    "WITH RECURSIV
2dd0: 45 20 63 28 78 29 20 41 53 20 28 56 41 4c 55 45  E c(x) AS (VALUE
2de0: 53 28 31 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  S(1) UNION ALL S
2df0: 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 63  ELECT x+1 FROM c
2e00: 20 57 48 45 52 45 20 78 3c 25 64 29 22 0a 20 20   WHERE x<%d)".  
2e10: 20 20 22 20 49 4e 53 45 52 54 20 49 4e 54 4f 20    " INSERT INTO 
2e20: 6b 76 28 6b 2c 76 29 20 53 45 4c 45 43 54 20 78  kv(k,v) SELECT x
2e30: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 25 64 2b  , randomblob(%d+
2e40: 28 72 61 6e 64 6f 6d 28 29 25 25 28 25 64 29 29  (random()%%(%d))
2e50: 29 20 46 52 4f 4d 20 63 3b 5c 6e 22 0a 20 20 20  ) FROM c;\n".   
2e60: 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 2c 0a 20 20   "COMMIT;\n",.  
2e70: 20 20 70 67 73 7a 2c 20 6e 43 6f 75 6e 74 2c 20    pgsz, nCount, 
2e80: 73 7a 2c 20 69 56 61 72 69 61 6e 63 65 2b 31 0a  sz, iVariance+1.
2e90: 20 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69    );.  rc = sqli
2ea0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2eb0: 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73  l, 0, 0, &zErrMs
2ec0: 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66  g);.  if( rc ) f
2ed0: 61 74 61 6c 45 72 72 6f 72 28 22 64 61 74 61 62  atalError("datab
2ee0: 61 73 65 20 63 72 65 61 74 65 20 66 61 69 6c 65  ase create faile
2ef0: 64 3a 20 25 73 22 2c 20 7a 45 72 72 4d 73 67 29  d: %s", zErrMsg)
2f00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2f10: 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zSql);.  sqlite
2f20: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72  3_close(db);.  r
2f30: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2f40: 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 20 65 78 69  * Analyze an exi
2f50: 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  sting database f
2f60: 69 6c 65 2e 20 20 52 65 70 6f 72 74 20 69 74 73  ile.  Report its
2f70: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61   content..*/.sta
2f80: 74 69 63 20 69 6e 74 20 73 74 61 74 4d 61 69 6e  tic int statMain
2f90: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
2fa0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20  **argv){.  char 
2fb0: 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 69 2c 20 72  *zDb;.  int i, r
2fc0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
2fd0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2fe0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2ff0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 64 6f 56  pStmt;.  int doV
3000: 61 63 75 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73  acuum = 0;..  as
3010: 73 65 72 74 28 20 73 74 72 63 6d 70 28 61 72 67  sert( strcmp(arg
3020: 76 5b 31 5d 2c 22 73 74 61 74 22 29 3d 3d 30 20  v[1],"stat")==0 
3030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  );.  assert( arg
3040: 63 3e 3d 33 20 29 3b 0a 20 20 7a 44 62 20 3d 20  c>=3 );.  zDb = 
3050: 61 72 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28 69  argv[2];.  for(i
3060: 3d 33 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =3; i<argc; i++)
3070: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
3080: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
3090: 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 66 61 74   z[0]!='-' ) fat
30a0: 61 6c 45 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e  alError("unknown
30b0: 20 61 72 67 75 6d 65 6e 74 3a 20 5c 22 25 73 5c   argument: \"%s\
30c0: 22 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20  "", z);.    if( 
30d0: 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
30e0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
30f0: 7a 2c 20 22 2d 76 61 63 75 75 6d 22 29 3d 3d 30  z, "-vacuum")==0
3100: 20 29 7b 0a 20 20 20 20 20 20 64 6f 56 61 63 75   ){.      doVacu
3110: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  um = 1;.      co
3120: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
3130: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e    fatalError("un
3140: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22  known option: \"
3150: 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b  %s\"", argv[i]);
3160: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
3170: 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c 20 26 64  te3_open(zDb, &d
3180: 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
3190: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
31a0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74 61  cannot open data
31b0: 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 22  base \"%s\": %s"
31c0: 2c 20 7a 44 62 2c 20 73 71 6c 69 74 65 33 5f 65  , zDb, sqlite3_e
31d0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
31e0: 20 20 69 66 28 20 64 6f 56 61 63 75 75 6d 20 29    if( doVacuum )
31f0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 56 61  {.    printf("Va
3200: 63 75 75 6d 69 6e 67 2e 2e 2e 2e 22 29 3b 20 66  cuuming...."); f
3210: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
3220: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
3230: 64 62 2c 20 22 56 41 43 55 55 4d 22 2c 20 30 2c  db, "VACUUM", 0,
3240: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e   0, 0);.    prin
3250: 74 66 28 22 20 20 20 20 20 20 20 64 6f 6e 65 5c  tf("       done\
3260: 6e 22 29 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20  n");.  }.  zSql 
3270: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3280: 66 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63  f(.    "SELECT c
3290: 6f 75 6e 74 28 2a 29 2c 20 6d 69 6e 28 6c 65 6e  ount(*), min(len
32a0: 67 74 68 28 76 29 29 2c 20 6d 61 78 28 6c 65 6e  gth(v)), max(len
32b0: 67 74 68 28 76 29 29 2c 20 61 76 67 28 6c 65 6e  gth(v)), avg(len
32c0: 67 74 68 28 76 29 29 22 0a 20 20 20 20 22 20 20  gth(v))".    "  
32d0: 46 52 4f 4d 20 6b 76 22 0a 20 20 29 3b 0a 20 20  FROM kv".  );.  
32e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
32f0: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
3300: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
3310: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66 61 74  ;.  if( rc ) fat
3320: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  alError("cannot 
3330: 70 72 65 70 61 72 65 20 53 51 4c 20 5b 25 73 5d  prepare SQL [%s]
3340: 3a 20 25 73 22 2c 20 7a 53 71 6c 2c 20 73 71 6c  : %s", zSql, sql
3350: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
3360: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
3370: 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 73 71  (zSql);.  if( sq
3380: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
3390: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
33a0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 4e 75 6d  .    printf("Num
33b0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 3a 20  ber of entries: 
33c0: 20 25 38 64 5c 6e 22 2c 20 73 71 6c 69 74 65 33   %8d\n", sqlite3
33d0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
33e0: 74 2c 20 30 29 29 3b 0a 20 20 20 20 70 72 69 6e  t, 0));.    prin
33f0: 74 66 28 22 41 76 65 72 61 67 65 20 76 61 6c 75  tf("Average valu
3400: 65 20 73 69 7a 65 3a 20 25 38 64 5c 6e 22 2c 20  e size: %8d\n", 
3410: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
3420: 6e 74 28 70 53 74 6d 74 2c 20 33 29 29 3b 0a 20  nt(pStmt, 3));. 
3430: 20 20 20 70 72 69 6e 74 66 28 22 4d 69 6e 69 6d     printf("Minim
3440: 75 6d 20 76 61 6c 75 65 20 73 69 7a 65 3a 20 25  um value size: %
3450: 38 64 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  8d\n", sqlite3_c
3460: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
3470: 20 31 29 29 3b 0a 20 20 20 20 70 72 69 6e 74 66   1));.    printf
3480: 28 22 4d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  ("Maximum value 
3490: 73 69 7a 65 3a 20 25 38 64 5c 6e 22 2c 20 73 71  size: %8d\n", sq
34a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
34b0: 28 70 53 74 6d 74 2c 20 32 29 29 3b 0a 20 20 7d  (pStmt, 2));.  }
34c0: 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 66  else{.    printf
34d0: 28 22 4e 6f 20 72 6f 77 73 5c 6e 22 29 3b 0a 20  ("No rows\n");. 
34e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
34f0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
3500: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
3510: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 70  printf("PRAGMA p
3520: 61 67 65 5f 73 69 7a 65 22 29 3b 0a 20 20 72 63  age_size");.  rc
3530: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
3540: 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
3550: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
3560: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
3570: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 70 72  Error("cannot pr
3580: 65 70 61 72 65 20 53 51 4c 20 5b 25 73 5d 3a 20  epare SQL [%s]: 
3590: 25 73 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74  %s", zSql, sqlit
35a0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
35b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
35c0: 53 71 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Sql);.  if( sqli
35d0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
35e0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
35f0: 20 20 20 70 72 69 6e 74 66 28 22 50 61 67 65 2d     printf("Page-
3600: 73 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 25  size:          %
3610: 38 64 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  8d\n", sqlite3_c
3620: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
3630: 20 30 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   0));.  }.  sqli
3640: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
3650: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
3660: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
3670: 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74  RAGMA page_count
3680: 22 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ");.  rc = sqlit
3690: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
36a0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
36b0: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
36c0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63   ) fatalError("c
36d0: 61 6e 6e 6f 74 20 70 72 65 70 61 72 65 20 53 51  annot prepare SQ
36e0: 4c 20 5b 25 73 5d 3a 20 25 73 22 2c 20 7a 53 71  L [%s]: %s", zSq
36f0: 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  l, sqlite3_errms
3700: 67 28 64 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  g(db));.  sqlite
3710: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
3720: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
3730: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
3740: 52 4f 57 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ROW ){.    print
3750: 66 28 22 50 61 67 65 2d 63 6f 75 6e 74 3a 20 20  f("Page-count:  
3760: 20 20 20 20 20 20 20 25 38 64 5c 6e 22 2c 20 73         %8d\n", s
3770: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
3780: 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  t(pStmt, 0));.  
3790: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
37a0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7a  lize(pStmt);.  z
37b0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
37c0: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 66 72  rintf("PRAGMA fr
37d0: 65 65 6c 69 73 74 5f 63 6f 75 6e 74 22 29 3b 0a  eelist_count");.
37e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
37f0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
3800: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
3810: 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66  0);.  if( rc ) f
3820: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
3830: 74 20 70 72 65 70 61 72 65 20 53 51 4c 20 5b 25  t prepare SQL [%
3840: 73 5d 3a 20 25 73 22 2c 20 7a 53 71 6c 2c 20 73  s]: %s", zSql, s
3850: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
3860: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ));.  sqlite3_fr
3870: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
3880: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
3890: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
38a0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 46  ){.    printf("F
38b0: 72 65 65 6c 69 73 74 2d 63 6f 75 6e 74 3a 20 20  reelist-count:  
38c0: 20 20 20 25 38 64 5c 6e 22 2c 20 73 71 6c 69 74     %8d\n", sqlit
38d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
38e0: 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20  tmt, 0));.  }.  
38f0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3900: 28 70 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20  (pStmt);.  rc = 
3910: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
3920: 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20 69  v2(db, "PRAGMA i
3930: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28 31  ntegrity_check(1
3940: 30 29 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  0)", -1, &pStmt,
3950: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
3960: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
3970: 6f 74 20 70 72 65 70 61 72 65 20 69 6e 74 65 67  ot prepare integ
3980: 72 69 74 79 20 63 68 65 63 6b 3a 20 25 73 22 2c  rity check: %s",
3990: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
39a0: 64 62 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 73  db));.  while( s
39b0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
39c0: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
39d0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 49 6e  {.    printf("In
39e0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 3a 20 20  tegrity-check:  
39f0: 20 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33    %s\n", sqlite3
3a00: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
3a10: 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 73  mt, 0));.  }.  s
3a20: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
3a30: 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
3a40: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72  3_close(db);.  r
3a50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3a60: 2a 20 20 20 20 20 20 72 65 6d 65 6d 62 65 72 28  *      remember(
3a70: 56 2c 50 54 52 29 0a 2a 2a 0a 2a 2a 20 52 65 74  V,PTR).**.** Ret
3a80: 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20  urn the integer 
3a90: 76 61 6c 75 65 20 56 2e 20 20 41 6c 73 6f 20 73  value V.  Also s
3aa0: 61 76 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ave the value of
3ab0: 20 56 20 69 6e 20 61 0a 2a 2a 20 43 2d 6c 61 6e   V in a.** C-lan
3ac0: 67 75 61 67 65 20 76 61 72 69 61 62 6c 65 20 77  guage variable w
3ad0: 68 6f 73 65 20 61 64 64 72 65 73 73 20 69 73 20  hose address is 
3ae0: 50 54 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  PTR..*/.static v
3af0: 6f 69 64 20 72 65 6d 65 6d 62 65 72 46 75 6e 63  oid rememberFunc
3b00: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3b10: 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  ext *pCtx,.  int
3b20: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
3b30: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
3b40: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3b50: 20 76 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   v;.  sqlite3_in
3b60: 74 36 34 20 70 74 72 3b 0a 20 20 61 73 73 65 72  t64 ptr;.  asser
3b70: 74 28 20 61 72 67 63 3d 3d 32 20 29 3b 0a 20 20  t( argc==2 );.  
3b80: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
3b90: 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
3ba0: 3b 0a 20 20 70 74 72 20 3d 20 73 71 6c 69 74 65  ;.  ptr = sqlite
3bb0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
3bc0: 67 76 5b 31 5d 29 3b 0a 20 20 2a 28 73 71 6c 69  gv[1]);.  *(sqli
3bd0: 74 65 33 5f 69 6e 74 36 34 2a 29 53 51 4c 49 54  te3_int64*)SQLIT
3be0: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 74 72  E_INT_TO_PTR(ptr
3bf0: 29 20 3d 20 76 3b 0a 20 20 73 71 6c 69 74 65 33  ) = v;.  sqlite3
3c00: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
3c10: 74 78 2c 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tx, v);.}../*.**
3c20: 20 4d 61 6b 65 20 73 75 72 65 20 61 20 64 69 72   Make sure a dir
3c30: 65 63 74 6f 72 79 20 6e 61 6d 65 64 20 7a 44 69  ectory named zDi
3c40: 72 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61  r exists..*/.sta
3c50: 74 69 63 20 76 6f 69 64 20 6b 76 74 65 73 74 5f  tic void kvtest_
3c60: 6d 6b 64 69 72 28 63 6f 6e 73 74 20 63 68 61 72  mkdir(const char
3c70: 20 2a 7a 44 69 72 29 7b 0a 23 69 66 20 64 65 66   *zDir){.#if def
3c80: 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 28  ined(_WIN32).  (
3c90: 76 6f 69 64 29 6d 6b 64 69 72 28 7a 44 69 72 29  void)mkdir(zDir)
3ca0: 3b 0a 23 65 6c 73 65 0a 20 20 28 76 6f 69 64 29  ;.#else.  (void)
3cb0: 6d 6b 64 69 72 28 7a 44 69 72 2c 20 30 37 35 35  mkdir(zDir, 0755
3cc0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
3cd0: 2a 2a 20 45 78 70 6f 72 74 20 74 68 65 20 6b 76  ** Export the kv
3ce0: 20 74 61 62 6c 65 20 74 6f 20 69 6e 64 69 76 69   table to indivi
3cf0: 64 75 61 6c 20 66 69 6c 65 73 20 69 6e 20 74 68  dual files in th
3d00: 65 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2f 0a  e filesystem.*/.
3d10: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 6f 72  static int expor
3d20: 74 4d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20  tMain(int argc, 
3d30: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
3d40: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61  char *zDb;.  cha
3d50: 72 20 2a 7a 44 69 72 3b 0a 20 20 73 71 6c 69 74  r *zDir;.  sqlit
3d60: 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
3d70: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
3d80: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
3d90: 50 61 74 68 54 79 70 65 3b 0a 20 20 69 6e 74 20  PathType;.  int 
3da0: 6e 46 4e 3b 0a 20 20 63 68 61 72 20 2a 7a 46 4e  nFN;.  char *zFN
3db0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b  ;.  char *zTail;
3dc0: 0a 20 20 73 69 7a 65 5f 74 20 6e 57 72 6f 74 65  .  size_t nWrote
3dd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
3de0: 73 65 72 74 28 20 73 74 72 63 6d 70 28 61 72 67  sert( strcmp(arg
3df0: 76 5b 31 5d 2c 22 65 78 70 6f 72 74 22 29 3d 3d  v[1],"export")==
3e00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3e10: 72 67 63 3e 3d 33 20 29 3b 0a 20 20 69 66 28 20  rgc>=3 );.  if( 
3e20: 61 72 67 63 3c 34 20 29 20 66 61 74 61 6c 45 72  argc<4 ) fatalEr
3e30: 72 6f 72 28 22 55 73 61 67 65 3a 20 6b 76 74 65  ror("Usage: kvte
3e40: 73 74 20 65 78 70 6f 72 74 20 44 41 54 41 42 41  st export DATABA
3e50: 53 45 20 44 49 52 45 43 54 4f 52 59 20 5b 4f 50  SE DIRECTORY [OP
3e60: 54 49 4f 4e 53 5d 22 29 3b 0a 20 20 7a 44 62 20  TIONS]");.  zDb 
3e70: 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 7a 44 69  = argv[2];.  zDi
3e80: 72 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20 6b  r = argv[3];.  k
3e90: 76 74 65 73 74 5f 6d 6b 64 69 72 28 7a 44 69 72  vtest_mkdir(zDir
3ea0: 29 3b 0a 20 20 66 6f 72 28 69 3d 34 3b 20 69 3c  );.  for(i=4; i<
3eb0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
3ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
3ed0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
3ee0: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[0]=='-' && z[
3ef0: 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
3f00: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
3f10: 22 2d 74 72 65 65 22 29 3d 3d 30 20 29 7b 0a 20  "-tree")==0 ){. 
3f20: 20 20 20 20 20 7a 46 4e 20 3d 20 73 71 6c 69 74       zFN = sqlit
3f30: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 30  e3_mprintf("%s/0
3f40: 30 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20  0", zDir);.     
3f50: 20 6b 76 74 65 73 74 5f 6d 6b 64 69 72 28 7a 46   kvtest_mkdir(zF
3f60: 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
3f70: 33 5f 66 72 65 65 28 7a 46 4e 29 3b 0a 20 20 20  3_free(zFN);.   
3f80: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3f90: 20 7d 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f   }.    fatalErro
3fa0: 72 28 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d  r("unknown argum
3fb0: 65 6e 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  ent: \"%s\"\n", 
3fc0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  argv[i]);.  }.  
3fd0: 65 50 61 74 68 54 79 70 65 20 3d 20 70 61 74 68  ePathType = path
3fe0: 54 79 70 65 28 7a 44 69 72 29 3b 0a 20 20 69 66  Type(zDir);.  if
3ff0: 28 20 65 50 61 74 68 54 79 70 65 21 3d 50 41 54  ( ePathType!=PAT
4000: 48 5f 44 49 52 20 26 26 20 65 50 61 74 68 54 79  H_DIR && ePathTy
4010: 70 65 21 3d 50 41 54 48 5f 54 52 45 45 20 29 7b  pe!=PATH_TREE ){
4020: 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28  .    fatalError(
4030: 22 6f 62 6a 65 63 74 20 5c 22 25 73 5c 22 20 69  "object \"%s\" i
4040: 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74 6f 72  s not a director
4050: 79 22 2c 20 7a 44 69 72 29 3b 0a 20 20 7d 0a 20  y", zDir);.  }. 
4060: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
4070: 65 6e 28 7a 44 62 2c 20 26 64 62 29 3b 0a 20 20  en(zDb, &db);.  
4080: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66 61  if( rc ){.    fa
4090: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
40a0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c   open database \
40b0: 22 25 73 5c 22 3a 20 25 73 22 2c 20 7a 44 62 2c  "%s\": %s", zDb,
40c0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
40d0: 64 62 29 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  db));.  }.  rc =
40e0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
40f0: 5f 76 32 28 64 62 2c 20 22 53 45 4c 45 43 54 20  _v2(db, "SELECT 
4100: 6b 2c 20 76 20 46 52 4f 4d 20 6b 76 20 4f 52 44  k, v FROM kv ORD
4110: 45 52 20 42 59 20 6b 22 2c 20 2d 31 2c 20 26 70  ER BY k", -1, &p
4120: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
4130: 72 63 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45  rc ){.    fatalE
4140: 72 72 6f 72 28 22 70 72 65 70 61 72 65 5f 76 32  rror("prepare_v2
4150: 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
4160: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
4170: 62 29 29 3b 0a 20 20 7d 0a 20 20 6e 46 4e 20 3d  b));.  }.  nFN =
4180: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69   (int)strlen(zDi
4190: 72 29 3b 0a 20 20 7a 46 4e 20 3d 20 73 71 6c 69  r);.  zFN = sqli
41a0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
41b0: 30 30 2f 30 30 2f 30 30 2e 65 78 74 72 61 2d 2d  00/00/00.extra--
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 22 2c 20 7a 44 69 72 29 3b 0a 20 20 69  ---", zDir);.  i
41e0: 66 28 20 7a 46 4e 3d 3d 30 20 29 7b 0a 20 20 20  f( zFN==0 ){.   
41f0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 61 6c   fatalError("mal
4200: 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
4210: 20 20 7d 0a 20 20 7a 54 61 69 6c 20 3d 20 7a 46    }.  zTail = zF
4220: 4e 20 2b 20 6e 46 4e 20 2b 20 31 3b 0a 20 20 77  N + nFN + 1;.  w
4230: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
4240: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
4250: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74  E_ROW ){.    int
4260: 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f   iKey = sqlite3_
4270: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
4280: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4290: 33 5f 69 6e 74 36 34 20 6e 44 61 74 61 20 3d 20  3_int64 nData = 
42a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
42b0: 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a  ytes(pStmt, 1);.
42c0: 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
42d0: 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
42e0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
42f0: 74 2c 20 31 29 3b 0a 20 20 20 20 46 49 4c 45 20  t, 1);.    FILE 
4300: 2a 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 65 50  *out;.    if( eP
4310: 61 74 68 54 79 70 65 3d 3d 50 41 54 48 5f 44 49  athType==PATH_DI
4320: 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R ){.      sqlit
4330: 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 20  e3_snprintf(20, 
4340: 7a 54 61 69 6c 2c 20 22 25 30 36 64 22 2c 20 69  zTail, "%06d", i
4350: 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Key);.    }else{
4360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4370: 6e 70 72 69 6e 74 66 28 32 30 2c 20 7a 54 61 69  nprintf(20, zTai
4380: 6c 2c 20 22 25 30 32 64 22 2c 20 69 4b 65 79 2f  l, "%02d", iKey/
4390: 31 30 30 30 30 29 3b 0a 20 20 20 20 20 20 6b 76  10000);.      kv
43a0: 74 65 73 74 5f 6d 6b 64 69 72 28 7a 46 4e 29 3b  test_mkdir(zFN);
43b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
43c0: 6e 70 72 69 6e 74 66 28 32 30 2c 20 7a 54 61 69  nprintf(20, zTai
43d0: 6c 2c 20 22 25 30 32 64 2f 25 30 32 64 22 2c 20  l, "%02d/%02d", 
43e0: 69 4b 65 79 2f 31 30 30 30 30 2c 20 28 69 4b 65  iKey/10000, (iKe
43f0: 79 2f 31 30 30 29 25 31 30 30 29 3b 0a 20 20 20  y/100)%100);.   
4400: 20 20 20 6b 76 74 65 73 74 5f 6d 6b 64 69 72 28     kvtest_mkdir(
4410: 7a 46 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  zFN);.      sqli
4420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c  te3_snprintf(20,
4430: 20 7a 54 61 69 6c 2c 20 22 25 30 32 64 2f 25 30   zTail, "%02d/%0
4440: 32 64 2f 25 30 32 64 22 2c 0a 20 20 20 20 20 20  2d/%02d",.      
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 69 4b 65 79 2f 31 30 30 30 30 2c 20 28 69 4b   iKey/10000, (iK
4470: 65 79 2f 31 30 30 29 25 31 30 30 2c 20 69 4b 65  ey/100)%100, iKe
4480: 79 25 31 30 30 29 3b 0a 20 20 20 20 7d 0a 20 20  y%100);.    }.  
4490: 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 46    out = fopen(zF
44a0: 4e 2c 20 22 77 62 22 29 3b 20 20 20 20 20 20 0a  N, "wb");      .
44b0: 20 20 20 20 6e 57 72 6f 74 65 20 3d 20 66 77 72      nWrote = fwr
44c0: 69 74 65 28 70 44 61 74 61 2c 20 31 2c 20 28 73  ite(pData, 1, (s
44d0: 69 7a 65 5f 74 29 6e 44 61 74 61 2c 20 6f 75 74  ize_t)nData, out
44e0: 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  );.    fclose(ou
44f0: 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  t);.    printf("
4500: 5c 72 25 73 20 20 20 22 2c 20 7a 54 61 69 6c 29  \r%s   ", zTail)
4510: 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
4520: 3b 0a 20 20 20 20 69 66 28 20 6e 57 72 6f 74 65  ;.    if( nWrote
4530: 21 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  !=nData ){.     
4540: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 57 72 6f   fatalError("Wro
4550: 74 65 20 6f 6e 6c 79 20 25 64 20 6f 66 20 25 64  te only %d of %d
4560: 20 62 79 74 65 73 20 74 6f 20 25 73 5c 6e 22 2c   bytes to %s\n",
4570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4580: 20 20 20 28 69 6e 74 29 6e 57 72 6f 74 65 2c 20     (int)nWrote, 
4590: 6e 44 61 74 61 2c 20 7a 46 4e 29 3b 0a 20 20 20  nData, zFN);.   
45a0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
45b0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
45c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
45d0: 65 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(db);.  sqlite3
45e0: 5f 66 72 65 65 28 7a 46 4e 29 3b 0a 20 20 70 72  _free(zFN);.  pr
45f0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 72 65  intf("\n");.  re
4600: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4610: 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
4620: 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
4630: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4640: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4650: 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
4660: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
4670: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
4680: 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
4690: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
46a0: 72 20 66 72 65 65 69 6e 67 20 0a 2a 2a 20 74 68  r freeing .** th
46b0: 65 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2a 0a 2a 2a  e memory. .**.**
46c0: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e   If parameter pn
46d0: 42 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Byte is not NULL
46e0: 2c 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73  , (*pnByte) is s
46f0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
4700: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
4710: 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e  d..**.** For con
4720: 76 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d  venience, a nul-
4730: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
4740: 69 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64  is always append
4750: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72  ed to the data r
4760: 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ead.** from the 
4770: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
4780: 62 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e  buffer is return
4790: 65 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73  ed. This byte is
47a0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e   not included in
47b0: 0a 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61  .** the final va
47c0: 6c 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29  lue of (*pnByte)
47d0: 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e  , if applicable.
47e0: 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  .**.** NULL is r
47f0: 65 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65  eturned if any e
4800: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
4810: 72 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76  red. The final v
4820: 61 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a  alue of *pnByte.
4830: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
4840: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
4850: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
4860: 20 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28   char *readFile(
4870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4880: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
4890: 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c   *pnByte){.  FIL
48a0: 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
48b0: 20 20 20 20 20 2f 2a 20 46 49 4c 45 20 66 72 6f       /* FILE fro
48c0: 6d 20 77 68 69 63 68 20 74 6f 20 72 65 61 64 20  m which to read 
48d0: 63 6f 6e 74 65 6e 74 20 6f 66 20 7a 4e 61 6d 65  content of zName
48e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
48f0: 74 36 34 20 6e 49 6e 3b 20 20 20 20 20 20 2f 2a  t64 nIn;      /*
4900: 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69   Size of zName i
4910: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 73 69 7a  n bytes */.  siz
4920: 65 5f 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20  e_t nRead;      
4930: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4940: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
4950: 20 72 65 61 64 20 2a 2f 0a 20 20 75 6e 73 69 67   read */.  unsig
4960: 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 3b 20  ned char *pBuf; 
4970: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 72 65     /* Content re
4980: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
4990: 0a 20 20 6e 49 6e 20 3d 20 66 69 6c 65 53 69 7a  .  nIn = fileSiz
49a0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  e(zName);.  if( 
49b0: 6e 49 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  nIn<0 ) return 0
49c0: 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
49d0: 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 69  Name, "rb");.  i
49e0: 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
49f0: 6e 20 30 3b 0a 20 20 70 42 75 66 20 3d 20 73 71  n 0;.  pBuf = sq
4a00: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
4a10: 6e 49 6e 20 29 3b 0a 20 20 69 66 28 20 70 42 75  nIn );.  if( pBu
4a20: 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  f==0 ) return 0;
4a30: 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64  .  nRead = fread
4a40: 28 70 42 75 66 2c 20 28 73 69 7a 65 5f 74 29 6e  (pBuf, (size_t)n
4a50: 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63  In, 1, in);.  fc
4a60: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20  lose(in);.  if( 
4a70: 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20  nRead!=1 ){.    
4a80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
4a90: 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  f);.    return 0
4aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 42 79  ;.  }.  if( pnBy
4ab0: 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e  te ) *pnByte = n
4ac0: 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75  In;.  return pBu
4ad0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72  f;.}../*.** Over
4ae0: 77 72 69 74 65 20 61 20 66 69 6c 65 20 77 69 74  write a file wit
4af0: 68 20 72 61 6e 64 6f 6d 6e 65 73 73 2e 20 20 44  h randomness.  D
4b00: 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
4b10: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
4b20: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
4b30: 76 6f 69 64 20 75 70 64 61 74 65 46 69 6c 65 28  void updateFile(
4b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4b50: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
4b60: 20 2a 70 6e 42 79 74 65 2c 20 69 6e 74 20 64 6f   *pnByte, int do
4b70: 46 73 79 6e 63 29 7b 0a 20 20 46 49 4c 45 20 2a  Fsync){.  FILE *
4b80: 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  out;            
4b90: 20 20 2f 2a 20 46 49 4c 45 20 66 72 6f 6d 20 77    /* FILE from w
4ba0: 68 69 63 68 20 74 6f 20 72 65 61 64 20 63 6f 6e  hich to read con
4bb0: 74 65 6e 74 20 6f 66 20 7a 4e 61 6d 65 20 2a 2f  tent of zName */
4bc0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
4bd0: 20 73 7a 3b 20 20 20 20 20 20 20 2f 2a 20 53 69   sz;       /* Si
4be0: 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
4bf0: 79 74 65 73 20 2a 2f 0a 20 20 73 69 7a 65 5f 74  ytes */.  size_t
4c00: 20 6e 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20   nWritten;      
4c10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4c20: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
4c30: 61 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ad */.  unsigned
4c40: 20 63 68 61 72 20 2a 70 42 75 66 3b 20 20 20 20   char *pBuf;    
4c50: 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 6f 20 73 74  /* Content to st
4c60: 6f 72 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ore on disk */. 
4c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
4c80: 64 65 20 3d 20 22 77 62 22 3b 20 20 20 2f 2a 20  de = "wb";   /* 
4c90: 4d 6f 64 65 20 66 6f 72 20 66 6f 70 65 6e 28 29  Mode for fopen()
4ca0: 20 2a 2f 0a 0a 20 20 73 7a 20 3d 20 66 69 6c 65   */..  sz = file
4cb0: 53 69 7a 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  Size(zName);.  i
4cc0: 66 28 20 73 7a 3c 30 20 29 7b 0a 20 20 20 20 66  f( sz<0 ){.    f
4cd0: 61 74 61 6c 45 72 72 6f 72 28 22 4e 6f 20 73 75  atalError("No su
4ce0: 63 68 20 66 69 6c 65 3a 20 5c 22 25 73 5c 22 22  ch file: \"%s\""
4cf0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , zName);.  }.  
4d00: 2a 70 6e 42 79 74 65 20 3d 20 73 7a 3b 0a 20 20  *pnByte = sz;.  
4d10: 69 66 28 20 73 7a 3d 3d 30 20 29 20 72 65 74 75  if( sz==0 ) retu
4d20: 72 6e 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  rn;.  pBuf = sql
4d30: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
4d40: 7a 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  z );.  if( pBuf=
4d50: 3d 30 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45  =0 ){.    fatalE
4d60: 72 72 6f 72 28 22 43 61 6e 6e 6f 74 20 61 6c 6c  rror("Cannot all
4d70: 6f 63 61 74 65 20 25 6c 6c 64 20 62 79 74 65 73  ocate %lld bytes
4d80: 5c 6e 22 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20  \n", sz);.  }.  
4d90: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
4da0: 73 73 28 28 69 6e 74 29 73 7a 2c 20 70 42 75 66  ss((int)sz, pBuf
4db0: 29 3b 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ); .#if defined(
4dc0: 5f 57 49 4e 33 32 29 0a 20 20 69 66 28 20 64 6f  _WIN32).  if( do
4dd0: 46 73 79 6e 63 20 29 20 7a 4d 6f 64 65 20 3d 20  Fsync ) zMode = 
4de0: 22 77 62 63 22 3b 0a 23 65 6e 64 69 66 0a 20 20  "wbc";.#endif.  
4df0: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d  out = fopen(zNam
4e00: 65 2c 20 7a 4d 6f 64 65 29 3b 0a 20 20 69 66 28  e, zMode);.  if(
4e10: 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66   out==0 ){.    f
4e20: 61 74 61 6c 45 72 72 6f 72 28 22 43 61 6e 6e 6f  atalError("Canno
4e30: 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
4e40: 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 4e  r writing\n", zN
4e50: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 57 72 69  ame);.  }.  nWri
4e60: 74 74 65 6e 20 3d 20 66 77 72 69 74 65 28 70 42  tten = fwrite(pB
4e70: 75 66 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73  uf, 1, (size_t)s
4e80: 7a 2c 20 6f 75 74 29 3b 0a 20 20 69 66 28 20 64  z, out);.  if( d
4e90: 6f 46 73 79 6e 63 20 29 7b 0a 23 69 66 20 64 65  oFsync ){.#if de
4ea0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
4eb0: 20 20 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a 23    fflush(out);.#
4ec0: 65 6c 73 65 0a 20 20 20 20 66 73 79 6e 63 28 66  else.    fsync(f
4ed0: 69 6c 65 6e 6f 28 6f 75 74 29 29 3b 0a 23 65 6e  ileno(out));.#en
4ee0: 64 69 66 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  dif.  }.  fclose
4ef0: 28 6f 75 74 29 3b 0a 20 20 69 66 28 20 6e 57 72  (out);.  if( nWr
4f00: 69 74 74 65 6e 21 3d 28 73 69 7a 65 5f 74 29 73  itten!=(size_t)s
4f10: 7a 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72  z ){.    fatalEr
4f20: 72 6f 72 28 22 57 72 6f 74 65 20 6f 6e 6c 79 20  ror("Wrote only 
4f30: 25 64 20 6f 66 20 25 64 20 62 79 74 65 73 20 74  %d of %d bytes t
4f40: 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  o \"%s\"\n",.   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
4f60: 29 6e 57 72 69 74 74 65 6e 2c 20 28 69 6e 74 29  )nWritten, (int)
4f70: 73 7a 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  sz, zName);.  }.
4f80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4f90: 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Buf);.}../*.** R
4fa0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
4fb0: 74 20 74 69 6d 65 20 69 6e 20 6d 69 6c 6c 69 73  t time in millis
4fc0: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
4fd0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
4fe0: 20 74 68 65 20 4a 75 6c 69 61 6e 20 65 70 6f 63   the Julian epoc
4ff0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  h..*/.static sql
5000: 69 74 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f  ite3_int64 timeO
5010: 66 44 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74  fDay(void){.  st
5020: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
5030: 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a   *clockVfs = 0;.
5040: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5050: 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  t;.  if( clockVf
5060: 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20  s==0 ) clockVfs 
5070: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
5080: 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f  nd(0);.  if( clo
5090: 63 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  ckVfs->iVersion>
50a0: 3d 32 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e  =2 && clockVfs->
50b0: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
50c0: 34 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63  4!=0 ){.    cloc
50d0: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
50e0: 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73  meInt64(clockVfs
50f0: 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , &t);.  }else{.
5100: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
5110: 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72    clockVfs->xCur
5120: 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66  rentTime(clockVf
5130: 73 2c 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20  s, &r);.    t = 
5140: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
5150: 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20  r*86400000.0);. 
5160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d   }.  return t;.}
5170: 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
5180: 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  __./*.** Attempt
5190: 20 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f 20   to display I/O 
51a0: 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75  stats on Linux u
51b0: 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69  sing /proc/PID/i
51c0: 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  o.*/.static void
51d0: 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53   displayLinuxIoS
51e0: 74 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b  tats(FILE *out){
51f0: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
5200: 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71  har z[200];.  sq
5210: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
5220: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70  izeof(z), z, "/p
5230: 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70  roc/%d/io", getp
5240: 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f  id());.  in = fo
5250: 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20  pen(z, "rb");.  
5260: 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
5270: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  rn;.  while( fge
5280: 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c  ts(z, sizeof(z),
5290: 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   in)!=0 ){.    s
52a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
52b0: 63 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ct {.      const
52c0: 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
52d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
52e0: 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20  r *zDesc;.    } 
52f0: 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  aTrans[] = {.   
5300: 20 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c 20     { "rchar: ", 
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5320: 20 22 42 79 74 65 73 20 72 65 63 65 69 76 65 64   "Bytes received
5330: 20 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a   by read():" },.
5340: 20 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a 20        { "wchar: 
5350: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5360: 20 20 20 20 22 42 79 74 65 73 20 73 65 6e 74 20      "Bytes sent 
5370: 74 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20 20  to write():"    
5380: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
5390: 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  r: ",           
53a0: 20 20 20 20 20 20 20 22 52 65 61 64 28 29 20 73         "Read() s
53b0: 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20  ystem calls:"   
53c0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73     },.      { "s
53d0: 79 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20 20  yscw: ",        
53e0: 20 20 20 20 20 20 20 20 20 20 22 57 72 69 74 65            "Write
53f0: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a  () system calls:
5400: 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b  "     },.      {
5410: 20 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22 2c   "read_bytes: ",
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
5430: 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73 74  tes read from st
5440: 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20  orage:"  },.    
5450: 20 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65 73    { "write_bytes
5460: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
5470: 22 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 74  "Bytes written t
5480: 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20  o storage:" },. 
5490: 20 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65       { "cancelle
54a0: 64 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22  d_write_bytes: "
54b0: 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77 72  ,  "Cancelled wr
54c0: 69 74 65 20 62 79 74 65 73 3a 22 20 20 20 20 7d  ite bytes:"    }
54d0: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ,.    };.    int
54e0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
54f0: 20 69 3c 73 69 7a 65 6f 66 28 61 54 72 61 6e 73   i<sizeof(aTrans
5500: 29 2f 73 69 7a 65 6f 66 28 61 54 72 61 6e 73 5b  )/sizeof(aTrans[
5510: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
5520: 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
5530: 72 6c 65 6e 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  rlen(aTrans[i].z
5540: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
5550: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61  if( strncmp(aTra
5560: 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20  ns[i].zPattern, 
5570: 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  z, n)==0 ){.    
5580: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
5590: 20 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72   "%-36s %s", aTr
55a0: 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a  ans[i].zDesc, &z
55b0: 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [n]);.        br
55c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
55d0: 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28   }.  }.  fclose(
55e0: 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  in);.}.#endif../
55f0: 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d  *.** Display mem
5600: 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74  ory stats..*/.st
5610: 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79  atic int display
5620: 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  _stats(.  sqlite
5630: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
5640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5650: 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
5660: 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20  /.  int bReset  
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5680: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
5690: 65 73 65 74 20 53 51 4c 69 74 65 20 73 74 61 74  eset SQLite stat
56a0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43  s */.){.  int iC
56b0: 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72  ur;.  int iHiwtr
56c0: 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  ;.  FILE *out = 
56d0: 73 74 64 6f 75 74 3b 0a 0a 20 20 66 70 72 69 6e  stdout;..  fprin
56e0: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 0a  tf(out, "\n");..
56f0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
5700: 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = -1;.  sqlite3_
5710: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
5720: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
5730: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
5740: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 70 72  , bReset);.  fpr
5750: 69 6e 74 66 28 6f 75 74 2c 0a 20 20 20 20 20 20  intf(out,.      
5760: 20 20 20 20 22 4d 65 6d 6f 72 79 20 55 73 65 64      "Memory Used
5770: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
5780: 20 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61            %d (ma
5790: 78 20 25 64 29 20 62 79 74 65 73 5c 6e 22 2c 0a  x %d) bytes\n",.
57a0: 20 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20            iCur, 
57b0: 69 48 69 77 74 72 29 3b 0a 20 20 69 48 69 77 74  iHiwtr);.  iHiwt
57c0: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
57d0: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
57e0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
57f0: 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 26 69 43 75  LLOC_COUNT, &iCu
5800: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
5810: 65 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  et);.  fprintf(o
5820: 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  ut, "Number of O
5830: 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
5840: 61 74 69 6f 6e 73 3a 20 20 20 25 64 20 28 6d 61  ations:   %d (ma
5850: 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  x %d)\n",.      
5860: 20 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72      iCur, iHiwtr
5870: 29 3b 0a 20 20 69 48 69 77 74 72 20 3d 20 69 43  );.  iHiwtr = iC
5880: 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74  ur = -1;.  sqlit
5890: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
58a0: 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
58b0: 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
58c0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
58d0: 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 0a  .  fprintf(out,.
58e0: 20 20 20 20 20 20 22 4e 75 6d 62 65 72 20 6f 66        "Number of
58f0: 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73   Pcache Pages Us
5900: 65 64 3a 20 20 20 20 20 20 20 20 20 25 64 20 28  ed:         %d (
5910: 6d 61 78 20 25 64 29 20 70 61 67 65 73 5c 6e 22  max %d) pages\n"
5920: 2c 0a 20 20 20 20 20 20 69 43 75 72 2c 20 69 48  ,.      iCur, iH
5930: 69 77 74 72 29 3b 0a 20 20 69 48 69 77 74 72 20  iwtr);.  iHiwtr 
5940: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  = iCur = -1;.  s
5950: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
5960: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
5970: 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20  CACHE_OVERFLOW, 
5980: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
5990: 62 52 65 73 65 74 29 3b 0a 20 20 66 70 72 69 6e  bReset);.  fprin
59a0: 74 66 28 6f 75 74 2c 0a 20 20 20 20 20 20 20 20  tf(out,.        
59b0: 20 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61    "Number of Pca
59c0: 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  che Overflow Byt
59d0: 65 73 3a 20 20 20 20 20 25 64 20 28 6d 61 78 20  es:     %d (max 
59e0: 25 64 29 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20  %d) bytes\n",.  
59f0: 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69 48          iCur, iH
5a00: 69 77 74 72 29 3b 0a 20 20 69 48 69 77 74 72 20  iwtr);.  iHiwtr 
5a10: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  = iCur = -1;.  s
5a20: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
5a30: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
5a40: 4f 43 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  OC_SIZE, &iCur, 
5a50: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
5a60: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
5a70: 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
5a80: 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20 20 20  tion:           
5a90: 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
5aa0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 48  n",.          iH
5ab0: 69 77 74 72 29 3b 0a 20 20 69 48 69 77 74 72 20  iwtr);.  iHiwtr 
5ac0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  = iCur = -1;.  s
5ad0: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
5ae0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
5af0: 43 41 43 48 45 5f 53 49 5a 45 2c 20 26 69 43 75  CACHE_SIZE, &iCu
5b00: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
5b10: 65 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  et);.  fprintf(o
5b20: 75 74 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61  ut, "Largest Pca
5b30: 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20  che Allocation: 
5b40: 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
5b50: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
5b60: 20 69 48 69 77 74 72 29 3b 0a 0a 20 20 69 48 69   iHiwtr);..  iHi
5b70: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
5b80: 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  .  sqlite3_db_st
5b90: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
5ba0: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55  DBSTATUS_CACHE_U
5bb0: 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
5bc0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
5bd0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 50 61  fprintf(out, "Pa
5be0: 67 65 72 20 48 65 61 70 20 55 73 61 67 65 3a 20  ger Heap Usage: 
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
5c10: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 69        iCur);.  i
5c20: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
5c30: 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  1;.  sqlite3_db_
5c40: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
5c50: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
5c60: 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48  _HIT, &iCur, &iH
5c70: 69 77 74 72 2c 20 31 29 3b 0a 20 20 66 70 72 69  iwtr, 1);.  fpri
5c80: 6e 74 66 28 6f 75 74 2c 20 22 50 61 67 65 20 63  ntf(out, "Page c
5c90: 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
5cb0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 69  d\n", iCur);.  i
5cc0: 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
5cd0: 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  1;.  sqlite3_db_
5ce0: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
5cf0: 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
5d00: 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69  _MISS, &iCur, &i
5d10: 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 66 70 72  Hiwtr, 1);.  fpr
5d20: 69 6e 74 66 28 6f 75 74 2c 20 22 50 61 67 65 20  intf(out, "Page 
5d30: 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
5d60: 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
5d70: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62  -1;.  sqlite3_db
5d80: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
5d90: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
5da0: 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20  E_WRITE, &iCur, 
5db0: 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 66  &iHiwtr, 1);.  f
5dc0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 50 61 67  printf(out, "Pag
5dd0: 65 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20  e cache writes: 
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
5e00: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
5e10: 3d 20 2d 31 3b 0a 0a 23 69 66 64 65 66 20 5f 5f  = -1;..#ifdef __
5e20: 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c 61  linux__.  displa
5e30: 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 6f 75  yLinuxIoStats(ou
5e40: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  t);.#endif..  re
5e50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 42 6c  turn 0;.}../* Bl
5e60: 6f 62 20 61 63 63 65 73 73 20 6f 72 64 65 72 20  ob access order 
5e70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 52 44 45 52  */.#define ORDER
5e80: 5f 41 53 43 20 20 20 20 20 31 0a 23 64 65 66 69  _ASC     1.#defi
5e90: 6e 65 20 4f 52 44 45 52 5f 44 45 53 43 20 20 20  ne ORDER_DESC   
5ea0: 20 32 0a 23 64 65 66 69 6e 65 20 4f 52 44 45 52   2.#define ORDER
5eb0: 5f 52 41 4e 44 4f 4d 20 20 33 0a 0a 0a 2f 2a 0a  _RANDOM  3.../*.
5ec0: 2a 2a 20 52 75 6e 20 61 20 70 65 72 66 6f 72 6d  ** Run a perform
5ed0: 61 6e 63 65 20 74 65 73 74 0a 2a 2f 0a 73 74 61  ance test.*/.sta
5ee0: 74 69 63 20 69 6e 74 20 72 75 6e 4d 61 69 6e 28  tic int runMain(
5ef0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
5f00: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 65 54  *argv){.  int eT
5f10: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
5f20: 20 20 20 20 20 20 2f 2a 20 49 73 20 7a 44 62 20        /* Is zDb 
5f30: 61 20 64 61 74 61 62 61 73 65 20 6f 72 20 61 20  a database or a 
5f40: 64 69 72 65 63 74 6f 72 79 3f 20 2a 2f 0a 20 20  directory? */.  
5f50: 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5f70: 61 74 61 62 61 73 65 20 6f 72 20 64 69 72 65 63  atabase or direc
5f80: 74 6f 72 79 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  tory name */.  i
5f90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
5fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5fb0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
5fc0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
5fe0: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
5ff0: 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 2a 2f 0a  SQLite calls */.
6000: 20 20 69 6e 74 20 6e 43 6f 75 6e 74 20 3d 20 31    int nCount = 1
6010: 30 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  000;          /*
6020: 20 4e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 62 20   Number of blob 
6030: 66 65 74 63 68 20 6f 70 65 72 61 74 69 6f 6e 73  fetch operations
6040: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
6050: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6060: 20 20 2f 2a 20 45 78 74 72 61 20 63 79 63 6c 65    /* Extra cycle
6070: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4b 65 79 20  s */.  int iKey 
6080: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
6090: 20 20 20 2f 2a 20 4e 65 78 74 20 62 6c 6f 62 20     /* Next blob 
60a0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 61  key */.  int iMa
60b0: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
60c0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
60d0: 61 6c 6c 6f 77 65 64 20 6b 65 79 20 2a 2f 0a 20  allowed key */. 
60e0: 20 69 6e 74 20 69 50 61 67 65 73 69 7a 65 20 3d   int iPagesize =
60f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
6100: 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  Database page si
6110: 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 61 63  ze */.  int iCac
6120: 68 65 20 3d 20 31 30 30 30 3b 20 20 20 20 20 20  he = 1000;      
6130: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6140: 63 61 63 68 65 20 73 69 7a 65 20 69 6e 20 6b 69  cache size in ki
6150: 62 69 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  bibytes */.  int
6160: 20 62 42 6c 6f 62 41 70 69 20 3d 20 30 3b 20 20   bBlobApi = 0;  
6170: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
6180: 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
6190: 62 6c 6f 62 20 49 2f 4f 20 41 50 49 20 2a 2f 0a  blob I/O API */.
61a0: 20 20 69 6e 74 20 62 53 74 61 74 73 20 3d 20 30    int bStats = 0
61b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61c0: 20 50 72 69 6e 74 20 73 74 61 74 73 20 62 65 66   Print stats bef
61d0: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
61e0: 20 69 6e 74 20 65 4f 72 64 65 72 20 3d 20 4f 52   int eOrder = OR
61f0: 44 45 52 5f 41 53 43 3b 20 20 20 20 20 2f 2a 20  DER_ASC;     /* 
6200: 41 63 63 65 73 73 20 6f 72 64 65 72 20 2a 2f 0a  Access order */.
6210: 20 20 69 6e 74 20 69 73 55 70 64 61 74 65 54 65    int isUpdateTe
6220: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  st = 0;       /*
6230: 20 44 6f 20 69 6e 2d 70 6c 61 63 65 20 75 70 64   Do in-place upd
6240: 61 74 65 73 20 72 61 74 68 65 72 20 74 68 61 6e  ates rather than
6250: 20 72 65 61 64 73 20 2a 2f 0a 20 20 69 6e 74 20   reads */.  int 
6260: 64 6f 49 6e 74 65 67 72 69 74 79 43 6b 20 3d 20  doIntegrityCk = 
6270: 30 3b 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 50  0;      /* Run P
6280: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
6290: 63 68 65 63 6b 20 61 66 74 65 72 20 74 68 65 20  check after the 
62a0: 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  test */.  int no
62b0: 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
62c0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
62d0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
62e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 46 73 79  e */.  int doFsy
62f0: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
6300: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 64 69 73     /* Update dis
6310: 6b 20 66 69 6c 65 73 20 73 79 6e 63 68 72 6f 6e  k files synchron
6320: 6f 75 73 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 64  ously */.  int d
6330: 6f 4d 75 6c 74 69 54 72 61 6e 73 20 3d 20 30 3b  oMultiTrans = 0;
6340: 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 6f         /* Each o
6350: 70 65 72 61 74 69 6f 6e 20 69 6e 20 69 74 73 20  peration in its 
6360: 6f 77 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  own transaction 
6370: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 68 65 63 6b  */.  int noCheck
6380: 70 6f 69 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  point = 0;      
6390: 20 2f 2a 20 4f 6d 69 74 20 74 68 65 20 63 68 65   /* Omit the che
63a0: 63 6b 70 6f 69 6e 74 20 69 6e 20 57 41 4c 20 6d  ckpoint in WAL m
63b0: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
63c0: 20 2a 64 62 20 3d 20 30 3b 20 20 20 20 20 20 20   *db = 0;       
63d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
63e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
63f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
6400: 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Stmt = 0;    /* 
6410: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
6420: 6e 74 20 66 6f 72 20 53 51 4c 20 61 63 63 65 73  nt for SQL acces
6430: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  s */.  sqlite3_b
6440: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 20  lob *pBlob = 0; 
6450: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
6460: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 42 6c 6f   incremental Blo
6470: 62 20 49 2f 4f 20 2a 2f 0a 20 20 73 71 6c 69 74  b I/O */.  sqlit
6480: 65 33 5f 69 6e 74 36 34 20 74 6d 53 74 61 72 74  e3_int64 tmStart
6490: 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  ;      /* Start 
64a0: 74 69 6d 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  time */.  sqlite
64b0: 33 5f 69 6e 74 36 34 20 74 6d 45 6c 61 70 73 65  3_int64 tmElapse
64c0: 64 3b 20 20 20 20 2f 2a 20 45 6c 61 70 73 65 64  d;    /* Elapsed
64d0: 20 74 69 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6d   time */.  int m
64e0: 6d 61 70 53 69 7a 65 20 3d 20 30 3b 20 20 20 20  mapSize = 0;    
64f0: 20 20 20 20 20 20 20 2f 2a 20 2d 2d 6d 6d 61 70         /* --mmap
6500: 20 4e 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20   N argument */. 
6510: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
6520: 44 61 74 61 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Data = 0;    /* 
6530: 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
6540: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6550: 20 6e 54 6f 74 61 6c 20 3d 20 30 3b 20 20 20 2f   nTotal = 0;   /
6560: 2a 20 54 6f 74 61 6c 20 64 61 74 61 20 72 65 61  * Total data rea
6570: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
6580: 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 30 3b  char *pData = 0;
6590: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
65a0: 20 74 68 65 20 62 6c 6f 62 20 2a 2f 0a 20 20 73   the blob */.  s
65b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c  qlite3_int64 nAl
65c0: 6c 6f 63 20 3d 20 30 3b 20 20 20 2f 2a 20 53 70  loc = 0;   /* Sp
65d0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
65e0: 72 20 70 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 63  r pData[] */.  c
65f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 4d 6f 64  onst char *zJMod
6600: 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4a 6f  e = 0;     /* Jo
6610: 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20  urnal mode */.  
6620: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 63  ..  assert( strc
6630: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 72 75 6e 22  mp(argv[1],"run"
6640: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6650: 28 20 61 72 67 63 3e 3d 33 20 29 3b 0a 20 20 7a  ( argc>=3 );.  z
6660: 44 62 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  Db = argv[2];.  
6670: 65 54 79 70 65 20 3d 20 70 61 74 68 54 79 70 65  eType = pathType
6680: 28 7a 44 62 29 3b 0a 20 20 69 66 28 20 65 54 79  (zDb);.  if( eTy
6690: 70 65 3d 3d 50 41 54 48 5f 4f 54 48 45 52 20 29  pe==PATH_OTHER )
66a0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e 6b   fatalError("unk
66b0: 6e 6f 77 6e 20 6f 62 6a 65 63 74 20 74 79 70 65  nown object type
66c0: 3a 20 5c 22 25 73 5c 22 22 2c 20 7a 44 62 29 3b  : \"%s\"", zDb);
66d0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 41  .  if( eType==PA
66e0: 54 48 5f 4e 45 58 49 53 54 20 29 20 66 61 74 61  TH_NEXIST ) fata
66f0: 6c 45 72 72 6f 72 28 22 6f 62 6a 65 63 74 20 64  lError("object d
6700: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 3a 20 5c  oes not exist: \
6710: 22 25 73 5c 22 22 2c 20 7a 44 62 29 3b 0a 20 20  "%s\"", zDb);.  
6720: 66 6f 72 28 69 3d 33 3b 20 69 3c 61 72 67 63 3b  for(i=3; i<argc;
6730: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
6740: 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  *z = argv[i];.  
6750: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
6760: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e  ) fatalError("un
6770: 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a 20  known argument: 
6780: 5c 22 25 73 5c 22 22 2c 20 7a 29 3b 0a 20 20 20  \"%s\"", z);.   
6790: 20 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29   if( z[1]=='-' )
67a0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 74   z++;.    if( st
67b0: 72 63 6d 70 28 7a 2c 20 22 2d 61 73 63 22 29 3d  rcmp(z, "-asc")=
67c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 4f 72 64  =0 ){.      eOrd
67d0: 65 72 20 3d 20 4f 52 44 45 52 5f 41 53 43 3b 0a  er = ORDER_ASC;.
67e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
67f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
6800: 72 63 6d 70 28 7a 2c 20 22 2d 62 6c 6f 62 2d 61  rcmp(z, "-blob-a
6810: 70 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pi")==0 ){.     
6820: 20 62 42 6c 6f 62 41 70 69 20 3d 20 31 3b 0a 20   bBlobApi = 1;. 
6830: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
6850: 63 6d 70 28 7a 2c 20 22 2d 63 61 63 68 65 2d 73  cmp(z, "-cache-s
6860: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
6870: 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31 20    if( i==argc-1 
6880: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69  ) fatalError("mi
6890: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
68a0: 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b  n \"%s\"", argv[
68b0: 69 5d 29 3b 0a 20 20 20 20 20 20 69 43 61 63 68  i]);.      iCach
68c0: 65 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65  e = integerValue
68d0: 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20  (argv[++i]);.   
68e0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
68f0: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
6900: 70 28 7a 2c 20 22 2d 63 6f 75 6e 74 22 29 3d 3d  p(z, "-count")==
6910: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
6920: 3d 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c  ==argc-1 ) fatal
6930: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
6940: 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25 73 5c  rgument on \"%s\
6950: 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  "", argv[i]);.  
6960: 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 69 6e 74      nCount = int
6970: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b  egerValue(argv[+
6980: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +i]);.      if( 
6990: 6e 43 6f 75 6e 74 3c 31 20 29 20 66 61 74 61 6c  nCount<1 ) fatal
69a0: 45 72 72 6f 72 28 22 74 68 65 20 2d 2d 63 6f 75  Error("the --cou
69b0: 6e 74 20 6d 75 73 74 20 62 65 20 70 6f 73 69 74  nt must be posit
69c0: 69 76 65 22 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ive");.      con
69d0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
69e0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
69f0: 2d 64 65 73 63 22 29 3d 3d 30 20 29 7b 0a 20 20  -desc")==0 ){.  
6a00: 20 20 20 20 65 4f 72 64 65 72 20 3d 20 4f 52 44      eOrder = ORD
6a10: 45 52 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 63  ER_DESC;.      c
6a20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6a30: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6a40: 20 22 2d 66 73 79 6e 63 22 29 3d 3d 30 20 29 7b   "-fsync")==0 ){
6a50: 0a 20 20 20 20 20 20 64 6f 46 73 79 6e 63 20 3d  .      doFsync =
6a60: 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
6a70: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
6a80: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 69 6e  ( strcmp(z, "-in
6a90: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 29 3d  tegrity-check")=
6aa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 49 6e  =0 ){.      doIn
6ab0: 74 65 67 72 69 74 79 43 6b 20 3d 20 31 3b 0a 20  tegrityCk = 1;. 
6ac0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6ad0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
6ae0: 63 6d 70 28 7a 2c 20 22 2d 6a 6d 6f 64 65 22 29  cmp(z, "-jmode")
6af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6b00: 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i==argc-1 ) fat
6b10: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
6b20: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25   argument on \"%
6b30: 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\"", argv[i]);.
6b40: 20 20 20 20 20 20 7a 4a 4d 6f 64 65 20 3d 20 61        zJMode = a
6b50: 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  rgv[++i];.      
6b60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
6b70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6b80: 2c 20 22 2d 6d 6d 61 70 22 29 3d 3d 30 20 29 7b  , "-mmap")==0 ){
6b90: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72  .      if( i==ar
6ba0: 67 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f  gc-1 ) fatalErro
6bb0: 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r("missing argum
6bc0: 65 6e 74 20 6f 6e 20 5c 22 25 73 5c 22 22 2c 20  ent on \"%s\"", 
6bd0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
6be0: 6d 6d 61 70 53 69 7a 65 20 3d 20 69 6e 74 65 67  mmapSize = integ
6bf0: 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69  erValue(argv[++i
6c00: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ]);.      if( nC
6c10: 6f 75 6e 74 3c 30 20 29 20 66 61 74 61 6c 45 72  ount<0 ) fatalEr
6c20: 72 6f 72 28 22 74 68 65 20 2d 2d 6d 6d 61 70 20  ror("the --mmap 
6c30: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
6c40: 74 69 76 65 22 29 3b 0a 20 20 20 20 20 20 63 6f  tive");.      co
6c50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6c60: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
6c70: 22 2d 6d 61 78 2d 69 64 22 29 3d 3d 30 20 29 7b  "-max-id")==0 ){
6c80: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72  .      if( i==ar
6c90: 67 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f  gc-1 ) fatalErro
6ca0: 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r("missing argum
6cb0: 65 6e 74 20 6f 6e 20 5c 22 25 73 5c 22 22 2c 20  ent on \"%s\"", 
6cc0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
6cd0: 69 4d 61 78 20 3d 20 69 6e 74 65 67 65 72 56 61  iMax = integerVa
6ce0: 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a  lue(argv[++i]);.
6cf0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6d00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
6d10: 72 63 6d 70 28 7a 2c 20 22 2d 6d 75 6c 74 69 74  rcmp(z, "-multit
6d20: 72 61 6e 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rans")==0 ){.   
6d30: 20 20 20 64 6f 4d 75 6c 74 69 54 72 61 6e 73 20     doMultiTrans 
6d40: 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
6d50: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
6d60: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6e  f( strcmp(z, "-n
6d70: 6f 63 68 65 63 6b 70 6f 69 6e 74 22 29 3d 3d 30  ocheckpoint")==0
6d80: 20 29 7b 0a 20 20 20 20 20 20 6e 6f 43 68 65 63   ){.      noChec
6d90: 6b 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20  kpoint = 1;.    
6da0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6db0: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
6dc0: 28 7a 2c 20 22 2d 6e 6f 73 79 6e 63 22 29 3d 3d  (z, "-nosync")==
6dd0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 6f 53 79 6e  0 ){.      noSyn
6de0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  c = 1;.      con
6df0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
6e00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
6e10: 2d 72 61 6e 64 6f 6d 22 29 3d 3d 30 20 29 7b 0a  -random")==0 ){.
6e20: 20 20 20 20 20 20 65 4f 72 64 65 72 20 3d 20 4f        eOrder = O
6e30: 52 44 45 52 5f 52 41 4e 44 4f 4d 3b 0a 20 20 20  RDER_RANDOM;.   
6e40: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6e50: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
6e60: 70 28 7a 2c 20 22 2d 73 74 61 72 74 22 29 3d 3d  p(z, "-start")==
6e70: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
6e80: 3d 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c  ==argc-1 ) fatal
6e90: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
6ea0: 72 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25 73 5c  rgument on \"%s\
6eb0: 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  "", argv[i]);.  
6ec0: 20 20 20 20 69 4b 65 79 20 3d 20 69 6e 74 65 67      iKey = integ
6ed0: 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69  erValue(argv[++i
6ee0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4b  ]);.      if( iK
6ef0: 65 79 3c 31 20 29 20 66 61 74 61 6c 45 72 72 6f  ey<1 ) fatalErro
6f00: 72 28 22 74 68 65 20 2d 2d 73 74 61 72 74 20 6d  r("the --start m
6f10: 75 73 74 20 62 65 20 70 6f 73 69 74 69 76 65 22  ust be positive"
6f20: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
6f30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
6f40: 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 73 74 61   strcmp(z, "-sta
6f50: 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ts")==0 ){.     
6f60: 20 62 53 74 61 74 73 20 3d 20 31 3b 0a 20 20 20   bStats = 1;.   
6f70: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6f80: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
6f90: 70 28 7a 2c 20 22 2d 75 70 64 61 74 65 22 29 3d  p(z, "-update")=
6fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 73 55 70  =0 ){.      isUp
6fb0: 64 61 74 65 54 65 73 74 20 3d 20 31 3b 0a 20 20  dateTest = 1;.  
6fc0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
6fd0: 20 20 7d 0a 20 20 20 20 66 61 74 61 6c 45 72 72    }.    fatalErr
6fe0: 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  or("unknown opti
6ff0: 6f 6e 3a 20 5c 22 25 73 5c 22 22 2c 20 61 72 67  on: \"%s\"", arg
7000: 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  v[i]);.  }.  if(
7010: 20 65 54 79 70 65 3d 3d 50 41 54 48 5f 44 42 20   eType==PATH_DB 
7020: 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 76 65  ){.    /* Recove
7030: 72 20 61 6e 79 20 70 72 69 6f 72 20 63 72 61 73  r any prior cras
7040: 68 65 73 20 70 72 69 6f 72 20 74 6f 20 73 74 61  hes prior to sta
7050: 72 74 69 6e 67 20 74 68 65 20 74 69 6d 65 72 20  rting the timer 
7060: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  */.    sqlite3_o
7070: 70 65 6e 28 7a 44 62 2c 20 26 64 62 29 3b 0a 20  pen(zDb, &db);. 
7080: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
7090: 64 62 2c 20 22 53 45 4c 45 43 54 20 72 6f 77 69  db, "SELECT rowi
70a0: 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  d FROM sqlite_ma
70b0: 73 74 65 72 20 4c 49 4d 49 54 20 31 22 2c 20 30  ster LIMIT 1", 0
70c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
70d0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
70e0: 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a      db = 0;.  }.
70f0: 20 20 74 6d 53 74 61 72 74 20 3d 20 74 69 6d 65    tmStart = time
7100: 4f 66 44 61 79 28 29 3b 0a 20 20 69 66 28 20 65  OfDay();.  if( e
7110: 54 79 70 65 3d 3d 50 41 54 48 5f 44 42 20 29 7b  Type==PATH_DB ){
7120: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
7130: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7140: 33 5f 6f 70 65 6e 28 7a 44 62 2c 20 26 64 62 29  3_open(zDb, &db)
7150: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
7160: 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72        fatalError
7170: 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 64 61  ("cannot open da
7180: 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25  tabase \"%s\": %
7190: 73 22 2c 20 7a 44 62 2c 20 73 71 6c 69 74 65 33  s", zDb, sqlite3
71a0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
71b0: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
71c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
71d0: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
71e0: 3d 25 64 22 2c 20 6d 6d 61 70 53 69 7a 65 29 3b  =%d", mmapSize);
71f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
7200: 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  c(db, zSql, 0, 0
7210: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
7220: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
7230: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
7240: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
7250: 20 63 61 63 68 65 5f 73 69 7a 65 3d 25 64 22 2c   cache_size=%d",
7260: 20 69 43 61 63 68 65 29 3b 0a 20 20 20 20 73 71   iCache);.    sq
7270: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
7280: 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
7290: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
72a0: 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  zSql);.    if( n
72b0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 73  oSync ){.      s
72c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
72d0: 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
72e0: 6f 75 73 3d 4f 46 46 22 2c 20 30 2c 20 30 2c 20  ous=OFF", 0, 0, 
72f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  0);.    }.    pS
7300: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  tmt = 0;.    sql
7310: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7320: 64 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  db, "PRAGMA page
7330: 5f 73 69 7a 65 22 2c 20 2d 31 2c 20 26 70 53 74  _size", -1, &pSt
7340: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
7350: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
7360: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
7370: 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 73 69  ){.      iPagesi
7380: 7a 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ze = sqlite3_col
7390: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
73a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
73b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
73c0: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
73d0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
73e0: 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
73f0: 69 7a 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  ize", -1, &pStmt
7400: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 71  , 0);.    if( sq
7410: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
7420: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
7430: 0a 20 20 20 20 20 20 69 43 61 63 68 65 20 3d 20  .      iCache = 
7440: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
7450: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
7460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
7470: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Cache = 0;.    }
7480: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
7490: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
74a0: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
74b0: 20 69 66 28 20 7a 4a 4d 6f 64 65 20 29 7b 0a 20   if( zJMode ){. 
74c0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
74d0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
74e0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
74f0: 3d 25 51 22 2c 20 7a 4a 4d 6f 64 65 29 3b 0a 20  =%Q", zJMode);. 
7500: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
7510: 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  c(db, zSql, 0, 0
7520: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
7530: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
7540: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 68 65 63        if( noChec
7550: 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  kpoint ){.      
7560: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
7570: 62 2c 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 61  b, "PRAGMA wal_a
7580: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d 30 22  utocheckpoint=0"
7590: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
75a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
75b0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
75c0: 28 64 62 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75  (db, "PRAGMA jou
75d0: 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20  rnal_mode", -1, 
75e0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
75f0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
7600: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
7610: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4a 4d  ROW ){.      zJM
7620: 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ode = sqlite3_mp
7630: 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
7640: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
7650: 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20  pStmt, 0));.    
7660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4a 4d  }else{.      zJM
7670: 6f 64 65 20 3d 20 22 3f 3f 3f 22 3b 0a 20 20 20  ode = "???";.   
7680: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
7690: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
76a0: 20 20 20 20 69 66 28 20 69 4d 61 78 3c 3d 30 20      if( iMax<=0 
76b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
76c0: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
76d0: 22 53 45 4c 45 43 54 20 6d 61 78 28 6b 29 20 46  "SELECT max(k) F
76e0: 52 4f 4d 20 6b 76 22 2c 20 2d 31 2c 20 26 70 53  ROM kv", -1, &pS
76f0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tmt, 0);.      i
7700: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
7710: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
7720: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d  OW ){.        iM
7730: 61 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ax = sqlite3_col
7740: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
7750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7760: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
7770: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  e(pStmt);.    }.
7780: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
7790: 20 20 20 69 66 28 20 21 64 6f 4d 75 6c 74 69 54     if( !doMultiT
77a0: 72 61 6e 73 20 29 20 73 71 6c 69 74 65 33 5f 65  rans ) sqlite3_e
77b0: 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e 22 2c  xec(db, "BEGIN",
77c0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
77d0: 20 69 66 28 20 69 4d 61 78 3c 3d 30 20 29 20 69   if( iMax<=0 ) i
77e0: 4d 61 78 20 3d 20 31 30 30 30 3b 0a 20 20 66 6f  Max = 1000;.  fo
77f0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 75 6e 74 3b  r(i=0; i<nCount;
7800: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
7810: 54 79 70 65 3d 3d 50 41 54 48 5f 44 49 52 20 7c  Type==PATH_DIR |
7820: 7c 20 65 54 79 70 65 3d 3d 50 41 54 48 5f 54 52  | eType==PATH_TR
7830: 45 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  EE ){.      /* C
7840: 41 53 45 20 31 3a 20 52 65 61 64 69 6e 67 20 6f  ASE 1: Reading o
7850: 72 20 77 72 69 74 69 6e 67 20 62 6c 6f 62 73 20  r writing blobs 
7860: 6f 75 74 20 6f 66 20 73 65 70 61 72 61 74 65 20  out of separate 
7870: 66 69 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 63  files */.      c
7880: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 20  har *zKey;.     
7890: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 41 54 48   if( eType==PATH
78a0: 5f 44 49 52 20 29 7b 0a 20 20 20 20 20 20 20 20  _DIR ){.        
78b0: 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zKey = sqlite3_m
78c0: 70 72 69 6e 74 66 28 22 25 73 2f 25 30 36 64 22  printf("%s/%06d"
78d0: 2c 20 7a 44 62 2c 20 69 4b 65 79 29 3b 0a 20 20  , zDb, iKey);.  
78e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
78f0: 20 20 20 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65     zKey = sqlite
7900: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 25 30  3_mprintf("%s/%0
7910: 32 64 2f 25 30 32 64 2f 25 30 32 64 22 2c 20 7a  2d/%02d/%02d", z
7920: 44 62 2c 20 69 4b 65 79 2f 31 30 30 30 30 2c 0a  Db, iKey/10000,.
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7950: 69 4b 65 79 2f 31 30 30 29 25 31 30 30 2c 20 69  iKey/100)%100, i
7960: 4b 65 79 25 31 30 30 29 3b 0a 20 20 20 20 20 20  Key%100);.      
7970: 7d 0a 20 20 20 20 20 20 6e 44 61 74 61 20 3d 20  }.      nData = 
7980: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 55  0;.      if( isU
7990: 70 64 61 74 65 54 65 73 74 20 29 7b 0a 20 20 20  pdateTest ){.   
79a0: 20 20 20 20 20 75 70 64 61 74 65 46 69 6c 65 28       updateFile(
79b0: 7a 4b 65 79 2c 20 26 6e 44 61 74 61 2c 20 64 6f  zKey, &nData, do
79c0: 46 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 65  Fsync);.      }e
79d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 61  lse{.        pDa
79e0: 74 61 20 3d 20 72 65 61 64 46 69 6c 65 28 7a 4b  ta = readFile(zK
79f0: 65 79 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  ey, &nData);.   
7a00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7a10: 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
7a20: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
7a30: 66 72 65 65 28 7a 4b 65 79 29 3b 0a 20 20 20 20  free(zKey);.    
7a40: 7d 65 6c 73 65 20 69 66 28 20 62 42 6c 6f 62 41  }else if( bBlobA
7a50: 70 69 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  pi ){.      /* C
7a60: 41 53 45 20 32 3a 20 52 65 61 64 69 6e 67 20 66  ASE 2: Reading f
7a70: 72 6f 6d 20 64 61 74 61 62 61 73 65 20 75 73 69  rom database usi
7a80: 6e 67 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  ng the increment
7a90: 61 6c 20 42 4c 4f 42 20 49 2f 4f 20 41 50 49 20  al BLOB I/O API 
7aa0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 6c  */.      if( pBl
7ab0: 6f 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ob==0 ){.       
7ac0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
7ad0: 6f 62 5f 6f 70 65 6e 28 64 62 2c 20 22 6d 61 69  ob_open(db, "mai
7ae0: 6e 22 2c 20 22 6b 76 22 2c 20 22 76 22 2c 20 69  n", "kv", "v", i
7af0: 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 69 73 55 70 64 61 74 65 54 65 73 74      isUpdateTest
7b20: 2c 20 26 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20  , &pBlob);.     
7b30: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
7b40: 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f         fatalErro
7b50: 72 28 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65  r("could not ope
7b60: 6e 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68  n sqlite3_blob h
7b70: 61 6e 64 6c 65 3a 20 25 73 22 2c 0a 20 20 20 20  andle: %s",.    
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
7ba0: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
7bb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7bc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7bd0: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42  3_blob_reopen(pB
7be0: 6c 6f 62 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  lob, iKey);.    
7bf0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
7c00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7c10: 20 20 20 20 20 20 20 6e 44 61 74 61 20 3d 20 73         nData = s
7c20: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
7c30: 73 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  s(pBlob);.      
7c40: 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3c 6e 44 61    if( nAlloc<nDa
7c50: 74 61 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ta+1 ){.        
7c60: 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 44 61 74 61    nAlloc = nData
7c70: 2b 31 30 30 3b 0a 20 20 20 20 20 20 20 20 20 20  +100;.          
7c80: 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
7c90: 72 65 61 6c 6c 6f 63 36 34 28 70 44 61 74 61 2c  realloc64(pData,
7ca0: 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20   nAlloc);.      
7cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7cc0: 70 44 61 74 61 3d 3d 30 20 29 20 66 61 74 61 6c  pData==0 ) fatal
7cd0: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 61 6c  Error("cannot al
7ce0: 6c 6f 63 61 74 65 20 25 64 20 62 79 74 65 73 22  locate %d bytes"
7cf0: 2c 20 6e 44 61 74 61 2b 31 29 3b 0a 20 20 20 20  , nData+1);.    
7d00: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
7d10: 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Test ){.        
7d20: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
7d30: 6e 65 73 73 28 28 69 6e 74 29 6e 44 61 74 61 2c  ness((int)nData,
7d40: 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
7d50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7d60: 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
7d70: 2c 20 70 44 61 74 61 2c 20 28 69 6e 74 29 6e 44  , pData, (int)nD
7d80: 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ata, 0);.       
7d90: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7da0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7db0: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
7dc0: 63 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  could not write 
7dd0: 74 68 65 20 62 6c 6f 62 20 61 74 20 25 64 3a 20  the blob at %d: 
7de0: 25 73 22 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20  %s", iKey,.     
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
7e10: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  db));.          
7e20: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
7e30: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7e40: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
7e50: 64 28 70 42 6c 6f 62 2c 20 70 44 61 74 61 2c 20  d(pBlob, pData, 
7e60: 28 69 6e 74 29 6e 44 61 74 61 2c 20 30 29 3b 0a  (int)nData, 0);.
7e70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
7e80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7e90: 20 20 20 20 20 20 20 20 20 20 20 66 61 74 61 6c             fatal
7ea0: 45 72 72 6f 72 28 22 63 6f 75 6c 64 20 6e 6f 74  Error("could not
7eb0: 20 72 65 61 64 20 74 68 65 20 62 6c 6f 62 20 61   read the blob a
7ec0: 74 20 25 64 3a 20 25 73 22 2c 20 69 4b 65 79 2c  t %d: %s", iKey,
7ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
7ef0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
7f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7f10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
7f20: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 41  lse{.      /* CA
7f30: 53 45 20 33 3a 20 52 65 61 64 69 6e 67 20 66 72  SE 3: Reading fr
7f40: 6f 6d 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  om database usin
7f50: 67 20 53 51 4c 20 2a 2f 0a 20 20 20 20 20 20 69  g SQL */.      i
7f60: 66 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( pStmt==0 ){. 
7f70: 20 20 20 20 20 20 20 69 66 28 20 69 73 55 70 64         if( isUpd
7f80: 61 74 65 54 65 73 74 20 29 7b 0a 20 20 20 20 20  ateTest ){.     
7f90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65       sqlite3_cre
7fa0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7fb0: 20 22 72 65 6d 65 6d 62 65 72 22 2c 20 32 2c 20   "remember", 2, 
7fc0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 72 65 6d 65 6d 62 65 72 46 75 6e 63 2c 20    rememberFunc, 
8000: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20 20  0, 0);..        
8010: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
8020: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 0a 20  repare_v2(db, . 
8030: 20 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41             "UPDA
8040: 54 45 20 6b 76 20 53 45 54 20 76 3d 72 61 6e 64  TE kv SET v=rand
8050: 6f 6d 62 6c 6f 62 28 72 65 6d 65 6d 62 65 72 28  omblob(remember(
8060: 6c 65 6e 67 74 68 28 76 29 2c 3f 32 29 29 22 0a  length(v),?2))".
8070: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
8080: 45 52 45 20 6b 3d 3f 31 22 2c 20 2d 31 2c 20 26  ERE k=?1", -1, &
8090: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
80a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
80b0: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32  d_int64(pStmt, 2
80c0: 2c 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  , SQLITE_PTR_TO_
80d0: 49 4e 54 28 26 6e 44 61 74 61 29 29 3b 0a 20 20  INT(&nData));.  
80e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
80f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8100: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
8110: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
8120: 20 20 20 20 20 22 53 45 4c 45 43 54 20 76 20 46       "SELECT v F
8130: 52 4f 4d 20 6b 76 20 57 48 45 52 45 20 6b 3d 3f  ROM kv WHERE k=?
8140: 31 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  1", -1, &pStmt, 
8150: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
8160: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
8170: 20 20 20 20 20 20 20 20 20 20 66 61 74 61 6c 45            fatalE
8180: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 70 72 65  rror("cannot pre
8190: 70 61 72 65 20 71 75 65 72 79 3a 20 25 73 22 2c  pare query: %s",
81a0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
81b0: 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
81c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
81d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
81e0: 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  et(pStmt);.     
81f0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8200: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
8210: 20 31 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20   1, iKey);.     
8220: 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
8230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
8240: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
8250: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8260: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
8270: 6e 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  nData = sqlite3_
8280: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
8290: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
82a0: 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  pData = (unsigne
82b0: 64 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  d char*)sqlite3_
82c0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
82d0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
82e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 4f 72     }.    if( eOr
82f0: 64 65 72 3d 3d 4f 52 44 45 52 5f 41 53 43 20 29  der==ORDER_ASC )
8300: 7b 0a 20 20 20 20 20 20 69 4b 65 79 2b 2b 3b 0a  {.      iKey++;.
8310: 20 20 20 20 20 20 69 66 28 20 69 4b 65 79 3e 69        if( iKey>i
8320: 4d 61 78 20 29 20 69 4b 65 79 20 3d 20 31 3b 0a  Max ) iKey = 1;.
8330: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
8340: 72 64 65 72 3d 3d 4f 52 44 45 52 5f 44 45 53 43  rder==ORDER_DESC
8350: 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 2d 2d   ){.      iKey--
8360: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4b 65 79  ;.      if( iKey
8370: 3c 3d 30 20 29 20 69 4b 65 79 20 3d 20 69 4d 61  <=0 ) iKey = iMa
8380: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
8390: 20 20 20 20 69 4b 65 79 20 3d 20 28 72 61 6e 64      iKey = (rand
83a0: 49 6e 74 28 29 25 69 4d 61 78 29 2b 31 3b 0a 20  Int()%iMax)+1;. 
83b0: 20 20 20 7d 0a 20 20 20 20 6e 54 6f 74 61 6c 20     }.    nTotal 
83c0: 2b 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 69 66  += nData;.    if
83d0: 28 20 6e 44 61 74 61 3d 3d 30 20 29 7b 20 6e 43  ( nData==0 ){ nC
83e0: 6f 75 6e 74 2b 2b 3b 20 6e 45 78 74 72 61 2b 2b  ount++; nExtra++
83f0: 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 41  ; }.  }.  if( nA
8400: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 5f 66  lloc ) sqlite3_f
8410: 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 69 66  ree(pData);.  if
8420: 28 20 70 53 74 6d 74 20 29 20 73 71 6c 69 74 65  ( pStmt ) sqlite
8430: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
8440: 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62 20 29  );.  if( pBlob )
8450: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
8460: 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 69 66  ose(pBlob);.  if
8470: 28 20 62 53 74 61 74 73 20 29 7b 0a 20 20 20 20  ( bStats ){.    
8480: 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62  display_stats(db
8490: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
84a0: 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64  db ){.    if( !d
84b0: 6f 4d 75 6c 74 69 54 72 61 6e 73 20 29 20 73 71  oMultiTrans ) sq
84c0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
84d0: 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
84e0: 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 68  );.    if( !noCh
84f0: 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  eckpoint ){.    
8500: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
8510: 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
8520: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74  0;.    }.  }.  t
8530: 6d 45 6c 61 70 73 65 64 20 3d 20 74 69 6d 65 4f  mElapsed = timeO
8540: 66 44 61 79 28 29 20 2d 20 74 6d 53 74 61 72 74  fDay() - tmStart
8550: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 6e 6f  ;.  if( db && no
8560: 43 68 65 63 6b 70 6f 69 6e 74 20 29 7b 0a 20 20  Checkpoint ){.  
8570: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
8580: 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
8590: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 45 78 74 72  .  }.  if( nExtr
85a0: 61 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  a ){.    printf(
85b0: 22 25 64 20 63 79 63 6c 65 73 20 64 75 65 20 74  "%d cycles due t
85c0: 6f 20 25 64 20 6d 69 73 73 65 73 5c 6e 22 2c 20  o %d misses\n", 
85d0: 6e 43 6f 75 6e 74 2c 20 6e 45 78 74 72 61 29 3b  nCount, nExtra);
85e0: 0a 20 20 7d 0a 20 20 69 66 28 20 65 54 79 70 65  .  }.  if( eType
85f0: 3d 3d 50 41 54 48 5f 44 42 20 29 7b 0a 20 20 20  ==PATH_DB ){.   
8600: 20 70 72 69 6e 74 66 28 22 53 51 4c 69 74 65 20   printf("SQLite 
8610: 76 65 72 73 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20  version: %s\n", 
8620: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
8630: 6f 6e 28 29 29 3b 0a 20 20 20 20 69 66 28 20 64  on());.    if( d
8640: 6f 49 6e 74 65 67 72 69 74 79 43 6b 20 29 7b 0a  oIntegrityCk ){.
8650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
8660: 65 6e 28 7a 44 62 2c 20 26 64 62 29 3b 0a 20 20  en(zDb, &db);.  
8670: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
8680: 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41 47  are_v2(db, "PRAG
8690: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
86a0: 63 6b 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ck", -1, &pStmt,
86b0: 20 30 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65   0);.      while
86c0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
86d0: 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
86e0: 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  W ){.        pri
86f0: 6e 74 66 28 22 69 6e 74 65 67 72 69 74 79 2d 63  ntf("integrity-c
8700: 68 65 63 6b 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  heck: %s\n", sql
8710: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
8720: 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20  (pStmt, 0));.   
8730: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8740: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
8750: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8760: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
8770: 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d     db = 0;.    }
8780: 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 2d  .  }.  printf("-
8790: 2d 63 6f 75 6e 74 20 25 64 20 2d 2d 6d 61 78 2d  -count %d --max-
87a0: 69 64 20 25 64 22 2c 20 6e 43 6f 75 6e 74 2d 6e  id %d", nCount-n
87b0: 45 78 74 72 61 2c 20 69 4d 61 78 29 3b 0a 20 20  Extra, iMax);.  
87c0: 73 77 69 74 63 68 28 20 65 4f 72 64 65 72 20 29  switch( eOrder )
87d0: 7b 0a 20 20 20 20 63 61 73 65 20 4f 52 44 45 52  {.    case ORDER
87e0: 5f 52 41 4e 44 4f 4d 3a 20 20 70 72 69 6e 74 66  _RANDOM:  printf
87f0: 28 22 20 2d 2d 72 61 6e 64 6f 6d 5c 6e 22 29 3b  (" --random\n");
8800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8810: 65 20 4f 52 44 45 52 5f 44 45 53 43 3a 20 20 20  e ORDER_DESC:   
8820: 20 70 72 69 6e 74 66 28 22 20 2d 2d 64 65 73 63   printf(" --desc
8830: 5c 6e 22 29 3b 20 20 20 20 62 72 65 61 6b 3b 0a  \n");    break;.
8840: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
8850: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
8860: 20 2d 2d 61 73 63 5c 6e 22 29 3b 20 20 20 20 20   --asc\n");     
8870: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
8880: 20 65 54 79 70 65 3d 3d 50 41 54 48 5f 44 42 20   eType==PATH_DB 
8890: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d  ){.    printf("-
88a0: 2d 63 61 63 68 65 2d 73 69 7a 65 20 25 64 20 2d  -cache-size %d -
88b0: 2d 6a 6d 6f 64 65 20 25 73 5c 6e 22 2c 20 69 43  -jmode %s\n", iC
88c0: 61 63 68 65 2c 20 7a 4a 4d 6f 64 65 29 3b 0a 20  ache, zJMode);. 
88d0: 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 6d 6d 61     printf("--mma
88e0: 70 20 25 64 25 73 5c 6e 22 2c 20 6d 6d 61 70 53  p %d%s\n", mmapS
88f0: 69 7a 65 2c 20 62 42 6c 6f 62 41 70 69 20 3f 20  ize, bBlobApi ? 
8900: 22 20 2d 2d 62 6c 6f 62 2d 61 70 69 22 20 3a 20  " --blob-api" : 
8910: 22 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 6f 53  "");.    if( noS
8920: 79 6e 63 20 29 20 70 72 69 6e 74 66 28 22 2d 2d  ync ) printf("--
8930: 6e 6f 73 79 6e 63 5c 6e 22 29 3b 0a 20 20 7d 0a  nosync\n");.  }.
8940: 20 20 69 66 28 20 69 50 61 67 65 73 69 7a 65 20    if( iPagesize 
8950: 29 20 70 72 69 6e 74 66 28 22 44 61 74 61 62 61  ) printf("Databa
8960: 73 65 20 70 61 67 65 20 73 69 7a 65 3a 20 25 64  se page size: %d
8970: 5c 6e 22 2c 20 69 50 61 67 65 73 69 7a 65 29 3b  \n", iPagesize);
8980: 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74 61 6c  .  printf("Total
8990: 20 65 6c 61 70 73 65 64 20 74 69 6d 65 3a 20 25   elapsed time: %
89a0: 2e 33 66 5c 6e 22 2c 20 74 6d 45 6c 61 70 73 65  .3f\n", tmElapse
89b0: 64 2f 31 30 30 30 2e 30 29 3b 0a 20 20 69 66 28  d/1000.0);.  if(
89c0: 20 69 73 55 70 64 61 74 65 54 65 73 74 20 29 7b   isUpdateTest ){
89d0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 4d 69 63  .    printf("Mic
89e0: 72 6f 73 65 63 6f 6e 64 73 20 70 65 72 20 42 4c  roseconds per BL
89f0: 4f 42 20 77 72 69 74 65 3a 20 25 2e 33 66 5c 6e  OB write: %.3f\n
8a00: 22 2c 20 74 6d 45 6c 61 70 73 65 64 2a 31 30 30  ", tmElapsed*100
8a10: 30 2e 30 2f 6e 43 6f 75 6e 74 29 3b 0a 20 20 20  0.0/nCount);.   
8a20: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
8a30: 20 77 72 69 74 65 20 72 61 74 65 3a 20 25 2e 31   write rate: %.1
8a40: 66 20 4d 42 2f 73 5c 6e 22 2c 20 6e 54 6f 74 61  f MB/s\n", nTota
8a50: 6c 2f 28 31 30 30 30 2e 30 2a 74 6d 45 6c 61 70  l/(1000.0*tmElap
8a60: 73 65 64 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  sed));.  }else{.
8a70: 20 20 20 20 70 72 69 6e 74 66 28 22 4d 69 63 72      printf("Micr
8a80: 6f 73 65 63 6f 6e 64 73 20 70 65 72 20 42 4c 4f  oseconds per BLO
8a90: 42 20 72 65 61 64 3a 20 25 2e 33 66 5c 6e 22 2c  B read: %.3f\n",
8aa0: 20 74 6d 45 6c 61 70 73 65 64 2a 31 30 30 30 2e   tmElapsed*1000.
8ab0: 30 2f 6e 43 6f 75 6e 74 29 3b 0a 20 20 20 20 70  0/nCount);.    p
8ac0: 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74 20 72  rintf("Content r
8ad0: 65 61 64 20 72 61 74 65 3a 20 25 2e 31 66 20 4d  ead rate: %.1f M
8ae0: 42 2f 73 5c 6e 22 2c 20 6e 54 6f 74 61 6c 2f 28  B/s\n", nTotal/(
8af0: 31 30 30 30 2e 30 2a 74 6d 45 6c 61 70 73 65 64  1000.0*tmElapsed
8b00: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
8b10: 20 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69 6e   0;.}...int main
8b20: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
8b30: 2a 2a 61 72 67 76 29 7b 0a 20 20 69 66 28 20 61  **argv){.  if( a
8b40: 72 67 63 3c 33 20 29 20 73 68 6f 77 48 65 6c 70  rgc<3 ) showHelp
8b50: 28 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  ();.  if( strcmp
8b60: 28 61 72 67 76 5b 31 5d 2c 22 69 6e 69 74 22 29  (argv[1],"init")
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8b80: 6e 20 69 6e 69 74 4d 61 69 6e 28 61 72 67 63 2c  n initMain(argc,
8b90: 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20 69 66   argv);.  }.  if
8ba0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
8bb0: 2c 22 65 78 70 6f 72 74 22 29 3d 3d 30 20 29 7b  ,"export")==0 ){
8bc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 6f  .    return expo
8bd0: 72 74 4d 61 69 6e 28 61 72 67 63 2c 20 61 72 67  rtMain(argc, arg
8be0: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  v);.  }.  if( st
8bf0: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 72 75  rcmp(argv[1],"ru
8c00: 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  n")==0 ){.    re
8c10: 74 75 72 6e 20 72 75 6e 4d 61 69 6e 28 61 72 67  turn runMain(arg
8c20: 63 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20  c, argv);.  }.  
8c30: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
8c40: 31 5d 2c 22 73 74 61 74 22 29 3d 3d 30 20 29 7b  1],"stat")==0 ){
8c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74  .    return stat
8c60: 4d 61 69 6e 28 61 72 67 63 2c 20 61 72 67 76 29  Main(argc, argv)
8c70: 3b 0a 20 20 7d 0a 20 20 73 68 6f 77 48 65 6c 70  ;.  }.  showHelp
8c80: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ();.  return 0;.
8c90: 7d 0a                                            }.