/ Hex Artifact Content
Login

Artifact 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba:


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 28 73 69 7a 65 5f 74 29 6e 44 61 74 61 20  !=(size_t)nData 
4540: 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45 72  ){.      fatalEr
4550: 72 6f 72 28 22 57 72 6f 74 65 20 6f 6e 6c 79 20  ror("Wrote only 
4560: 25 64 20 6f 66 20 25 64 20 62 79 74 65 73 20 74  %d of %d bytes t
4570: 6f 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %s\n",.       
4580: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
4590: 6e 57 72 6f 74 65 2c 20 6e 44 61 74 61 2c 20 7a  nWrote, nData, z
45a0: 46 4e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  FN);.    }.  }. 
45b0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
45c0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  e(pStmt);.  sqli
45d0: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
45e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
45f0: 4e 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e  N);.  printf("\n
4600: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ");.  return 0;.
4610: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
4620: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c  e content of fil
4630: 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d  e zName into mem
4640: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4650: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4660: 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75  64().** and retu
4670: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
4680: 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20  the buffer. The 
4690: 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
46a0: 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
46b0: 67 20 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  g .** the memory
46c0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  . .**.** If para
46d0: 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
46e0: 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
46f0: 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
4700: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
4710: 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
4720: 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
4730: 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
4740: 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
4750: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
4760: 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
4770: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
4780: 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
4790: 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
47a0: 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
47b0: 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
47c0: 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
47d0: 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
47e0: 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
47f0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
4800: 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
4810: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
4820: 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
4830: 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
4840: 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
4850: 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
4860: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
4870: 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  eadFile(const ch
4880: 61 72 20 2a 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  ar *zName, sqlit
4890: 65 33 5f 69 6e 74 36 34 20 2a 70 6e 42 79 74 65  e3_int64 *pnByte
48a0: 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20  ){.  FILE *in;  
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
48c0: 46 49 4c 45 20 66 72 6f 6d 20 77 68 69 63 68 20  FILE from which 
48d0: 74 6f 20 72 65 61 64 20 63 6f 6e 74 65 6e 74 20  to read content 
48e0: 6f 66 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 73 71  of zName */.  sq
48f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 49 6e 3b  lite3_int64 nIn;
4900: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4910: 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
4920: 2a 2f 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  */.  size_t nRea
4930: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4940: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
4950: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 2a 2f  actually read */
4960: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4970: 20 2a 70 42 75 66 3b 20 20 20 20 2f 2a 20 43 6f   *pBuf;    /* Co
4980: 6e 74 65 6e 74 20 72 65 61 64 20 66 72 6f 6d 20  ntent read from 
4990: 64 69 73 6b 20 2a 2f 0a 0a 20 20 6e 49 6e 20 3d  disk */..  nIn =
49a0: 20 66 69 6c 65 53 69 7a 65 28 7a 4e 61 6d 65 29   fileSize(zName)
49b0: 3b 0a 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 20  ;.  if( nIn<0 ) 
49c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 6e 20 3d  return 0;.  in =
49d0: 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72   fopen(zName, "r
49e0: 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
49f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
4a00: 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
4a10: 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 29 3b 0a 20  lloc64( nIn );. 
4a20: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20 72   if( pBuf==0 ) r
4a30: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64  eturn 0;.  nRead
4a40: 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 28   = fread(pBuf, (
4a50: 73 69 7a 65 5f 74 29 6e 49 6e 2c 20 31 2c 20 69  size_t)nIn, 1, i
4a60: 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  n);.  fclose(in)
4a70: 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31  ;.  if( nRead!=1
4a80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4a90: 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20  free(pBuf);.    
4aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4ab0: 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
4ac0: 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65  Byte = nIn;.  re
4ad0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
4ae0: 0a 2a 2a 20 4f 76 65 72 77 72 69 74 65 20 61 20  .** Overwrite a 
4af0: 66 69 6c 65 20 77 69 74 68 20 72 61 6e 64 6f 6d  file with random
4b00: 6e 65 73 73 2e 20 20 44 6f 20 6e 6f 74 20 63 68  ness.  Do not ch
4b10: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
4b20: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
4b30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
4b40: 61 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  ateFile(const ch
4b50: 61 72 20 2a 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  ar *zName, sqlit
4b60: 65 33 5f 69 6e 74 36 34 20 2a 70 6e 42 79 74 65  e3_int64 *pnByte
4b70: 2c 20 69 6e 74 20 64 6f 46 73 79 6e 63 29 7b 0a  , int doFsync){.
4b80: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
4b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 49 4c            /* FIL
4ba0: 45 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  E from which to 
4bb0: 72 65 61 64 20 63 6f 6e 74 65 6e 74 20 6f 66 20  read content of 
4bc0: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 73 71 6c 69 74  zName */.  sqlit
4bd0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20  e3_int64 sz;    
4be0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
4bf0: 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
4c00: 20 20 73 69 7a 65 5f 74 20 6e 57 72 69 74 74 65    size_t nWritte
4c10: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  n;        /* Num
4c20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
4c30: 75 61 6c 6c 79 20 72 65 61 64 20 2a 2f 0a 20 20  ually read */.  
4c40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
4c50: 42 75 66 3b 20 20 20 20 2f 2a 20 43 6f 6e 74 65  Buf;    /* Conte
4c60: 6e 74 20 74 6f 20 73 74 6f 72 65 20 6f 6e 20 64  nt to store on d
4c70: 69 73 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  isk */.  const c
4c80: 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 22 77 62  har *zMode = "wb
4c90: 22 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 66 6f 72  ";   /* Mode for
4ca0: 20 66 6f 70 65 6e 28 29 20 2a 2f 0a 0a 20 20 73   fopen() */..  s
4cb0: 7a 20 3d 20 66 69 6c 65 53 69 7a 65 28 7a 4e 61  z = fileSize(zNa
4cc0: 6d 65 29 3b 0a 20 20 69 66 28 20 73 7a 3c 30 20  me);.  if( sz<0 
4cd0: 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f  ){.    fatalErro
4ce0: 72 28 22 4e 6f 20 73 75 63 68 20 66 69 6c 65 3a  r("No such file:
4cf0: 20 5c 22 25 73 5c 22 22 2c 20 7a 4e 61 6d 65 29   \"%s\"", zName)
4d00: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 42 79 74 65 20  ;.  }.  *pnByte 
4d10: 3d 20 73 7a 3b 0a 20 20 69 66 28 20 73 7a 3d 3d  = sz;.  if( sz==
4d20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42  0 ) return;.  pB
4d30: 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  uf = sqlite3_mal
4d40: 6c 6f 63 36 34 28 20 73 7a 20 29 3b 0a 20 20 69  loc64( sz );.  i
4d50: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
4d60: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 43 61    fatalError("Ca
4d70: 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25 6c  nnot allocate %l
4d80: 6c 64 20 62 79 74 65 73 5c 6e 22 2c 20 73 7a 29  ld bytes\n", sz)
4d90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
4da0: 72 61 6e 64 6f 6d 6e 65 73 73 28 28 69 6e 74 29  randomness((int)
4db0: 73 7a 2c 20 70 42 75 66 29 3b 20 0a 23 69 66 20  sz, pBuf); .#if 
4dc0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
4dd0: 20 20 69 66 28 20 64 6f 46 73 79 6e 63 20 29 20    if( doFsync ) 
4de0: 7a 4d 6f 64 65 20 3d 20 22 77 62 63 22 3b 0a 23  zMode = "wbc";.#
4df0: 65 6e 64 69 66 0a 20 20 6f 75 74 20 3d 20 66 6f  endif.  out = fo
4e00: 70 65 6e 28 7a 4e 61 6d 65 2c 20 7a 4d 6f 64 65  pen(zName, zMode
4e10: 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
4e20: 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f  ){.    fatalErro
4e30: 72 28 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r("Cannot open \
4e40: 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e  "%s\" for writin
4e50: 67 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  g\n", zName);.  
4e60: 7d 0a 20 20 6e 57 72 69 74 74 65 6e 20 3d 20 66  }.  nWritten = f
4e70: 77 72 69 74 65 28 70 42 75 66 2c 20 31 2c 20 28  write(pBuf, 1, (
4e80: 73 69 7a 65 5f 74 29 73 7a 2c 20 6f 75 74 29 3b  size_t)sz, out);
4e90: 0a 20 20 69 66 28 20 64 6f 46 73 79 6e 63 20 29  .  if( doFsync )
4ea0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
4eb0: 49 4e 33 32 29 0a 20 20 20 20 66 66 6c 75 73 68  IN32).    fflush
4ec0: 28 6f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20  (out);.#else.   
4ed0: 20 66 73 79 6e 63 28 66 69 6c 65 6e 6f 28 6f 75   fsync(fileno(ou
4ee0: 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  t));.#endif.  }.
4ef0: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
4f00: 20 69 66 28 20 6e 57 72 69 74 74 65 6e 21 3d 28   if( nWritten!=(
4f10: 73 69 7a 65 5f 74 29 73 7a 20 29 7b 0a 20 20 20  size_t)sz ){.   
4f20: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 57 72 6f   fatalError("Wro
4f30: 74 65 20 6f 6e 6c 79 20 25 64 20 6f 66 20 25 64  te only %d of %d
4f40: 20 62 79 74 65 73 20 74 6f 20 5c 22 25 73 5c 22   bytes to \"%s\"
4f50: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
4f60: 20 20 20 20 28 69 6e 74 29 6e 57 72 69 74 74 65      (int)nWritte
4f70: 6e 2c 20 28 69 6e 74 29 73 7a 2c 20 7a 4e 61 6d  n, (int)sz, zNam
4f80: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
4f90: 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 7d 0a  3_free(pBuf);.}.
4fa0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4fb0: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69  e current time i
4fc0: 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  n milliseconds s
4fd0: 69 6e 63 65 20 74 68 65 20 62 65 67 69 6e 6e 69  ince the beginni
4fe0: 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 4a 75 6c  ng of.** the Jul
4ff0: 69 61 6e 20 65 70 6f 63 68 2e 0a 2a 2f 0a 73 74  ian epoch..*/.st
5000: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
5010: 36 34 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69  64 timeOfDay(voi
5020: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
5030: 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56  ite3_vfs *clockV
5040: 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  fs = 0;.  sqlite
5050: 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28  3_int64 t;.  if(
5060: 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63   clockVfs==0 ) c
5070: 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65  lockVfs = sqlite
5080: 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
5090: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69   if( clockVfs->i
50a0: 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c  Version>=2 && cl
50b0: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
50c0: 54 69 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a  TimeInt64!=0 ){.
50d0: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
50e0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
50f0: 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20  clockVfs, &t);. 
5100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62   }else{.    doub
5110: 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56  le r;.    clockV
5120: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
5130: 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a  (clockVfs, &r);.
5140: 20 20 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33      t = (sqlite3
5150: 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30  _int64)(r*864000
5160: 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  00.0);.  }.  ret
5170: 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn t;.}..#ifdef
5180: 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a   __linux__./*.**
5190: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70   Attempt to disp
51a0: 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e  lay I/O stats on
51b0: 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72   Linux using /pr
51c0: 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61  oc/PID/io.*/.sta
51d0: 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
51e0: 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c  LinuxIoStats(FIL
51f0: 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20  E *out){.  FILE 
5200: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30  *in;.  char z[20
5210: 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0];.  sqlite3_sn
5220: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
5230: 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69  , z, "/proc/%d/i
5240: 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  o", getpid());. 
5250: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22   in = fopen(z, "
5260: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
5270: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
5280: 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69  ile( fgets(z, si
5290: 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20  zeof(z), in)!=0 
52a0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
52b0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
52c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
52d0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63  Pattern;.      c
52e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63  onst char *zDesc
52f0: 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d  ;.    } aTrans[]
5300: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63   = {.      { "rc
5310: 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
5320: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
5330: 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64  received by read
5340: 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ():" },.      { 
5350: 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "wchar: ",      
5360: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
5370: 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65  es sent to write
5380: 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20  ():"    },.     
5390: 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20   { "syscr: ",   
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
53b0: 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61  Read() system ca
53c0: 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20  lls:"      },.  
53d0: 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c      { "syscw: ",
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65    "Write() syste
5400: 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c  m calls:"     },
5410: 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62  .      { "read_b
5420: 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20  ytes: ",        
5430: 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64       "Bytes read
5440: 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20   from storage:" 
5450: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69   },.      { "wri
5460: 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20  te_bytes: ",    
5470: 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77          "Bytes w
5480: 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67  ritten to storag
5490: 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  e:" },.      { "
54a0: 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f  cancelled_write_
54b0: 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63  bytes: ",  "Canc
54c0: 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65  elled write byte
54d0: 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b  s:"    },.    };
54e0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
54f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
5500: 66 28 61 54 72 61 6e 73 29 2f 73 69 7a 65 6f 66  f(aTrans)/sizeof
5510: 28 61 54 72 61 6e 73 5b 30 5d 29 3b 20 69 2b 2b  (aTrans[0]); i++
5520: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
5530: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 54 72   (int)strlen(aTr
5540: 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29  ans[i].zPattern)
5550: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
5560: 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  cmp(aTrans[i].zP
5570: 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30  attern, z, n)==0
5580: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
5590: 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
55a0: 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a  %s", aTrans[i].z
55b0: 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20  Desc, &z[n]);.  
55c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
55d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
55e0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23   fclose(in);.}.#
55f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  endif../*.** Dis
5600: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
5610: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5620: 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a   display_stats(.
5630: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
5660: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
5670: 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
5680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5690: 72 75 65 20 74 6f 20 72 65 73 65 74 20 53 51 4c  rue to reset SQL
56a0: 69 74 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a  ite stats */.){.
56b0: 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e    int iCur;.  in
56c0: 74 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c 45  t iHiwtr;.  FILE
56d0: 20 2a 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   *out = stdout;.
56e0: 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
56f0: 22 5c 6e 22 29 3b 0a 0a 20 20 69 48 69 77 74 72  "\n");..  iHiwtr
5700: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
5710: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
5720: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
5730: 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  ORY_USED, &iCur,
5740: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
5750: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
5760: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 65 6d  ,.          "Mem
5770: 6f 72 79 20 55 73 65 64 3a 20 20 20 20 20 20 20  ory Used:       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 25 64 20 28 6d 61 78 20 25 64 29 20 62 79    %d (max %d) by
57a0: 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
57b0: 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
57c0: 0a 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72  .  iHiwtr = iCur
57d0: 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33   = -1;.  sqlite3
57e0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
57f0: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
5800: 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  NT, &iCur, &iHiw
5810: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66  tr, bReset);.  f
5820: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 4e 75 6d  printf(out, "Num
5830: 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64 69  ber of Outstandi
5840: 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 20  ng Allocations: 
5850: 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22    %d (max %d)\n"
5860: 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 75 72  ,.          iCur
5870: 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 69 48 69  , iHiwtr);.  iHi
5880: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
5890: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  .  sqlite3_statu
58a0: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
58b0: 50 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20  PAGECACHE_USED, 
58c0: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
58d0: 62 52 65 73 65 74 29 3b 0a 20 20 66 70 72 69 6e  bReset);.  fprin
58e0: 74 66 28 6f 75 74 2c 0a 20 20 20 20 20 20 22 4e  tf(out,.      "N
58f0: 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
5900: 50 61 67 65 73 20 55 73 65 64 3a 20 20 20 20 20  Pages Used:     
5910: 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 20      %d (max %d) 
5920: 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
5930: 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20  iCur, iHiwtr);. 
5940: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
5950: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   -1;.  sqlite3_s
5960: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
5970: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
5980: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
5990: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
59a0: 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 0a  .  fprintf(out,.
59b0: 20 20 20 20 20 20 20 20 20 20 22 4e 75 6d 62 65            "Numbe
59c0: 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72  r of Pcache Over
59d0: 66 6c 6f 77 20 42 79 74 65 73 3a 20 20 20 20 20  flow Bytes:     
59e0: 25 64 20 28 6d 61 78 20 25 64 29 20 62 79 74 65  %d (max %d) byte
59f0: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
5a00: 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20  iCur, iHiwtr);. 
5a10: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
5a20: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   -1;.  sqlite3_s
5a30: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
5a40: 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c  TUS_MALLOC_SIZE,
5a50: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
5a60: 20 62 52 65 73 65 74 29 3b 0a 20 20 66 70 72 69   bReset);.  fpri
5a70: 6e 74 66 28 6f 75 74 2c 20 22 4c 61 72 67 65 73  ntf(out, "Larges
5a80: 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20  t Allocation:   
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
5aa0: 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
5ab0: 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
5ac0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
5ad0: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   -1;.  sqlite3_s
5ae0: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
5af0: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49  TUS_PAGECACHE_SI
5b00: 5a 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ZE, &iCur, &iHiw
5b10: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66  tr, bReset);.  f
5b20: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 4c 61 72  printf(out, "Lar
5b30: 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f  gest Pcache Allo
5b40: 63 61 74 69 6f 6e 3a 20 20 20 20 20 20 20 20 20  cation:         
5b50: 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
5b60: 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
5b70: 3b 0a 0a 20 20 69 48 69 77 74 72 20 3d 20 69 43  ;..  iHiwtr = iC
5b80: 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74  ur = -1;.  sqlit
5b90: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
5ba0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
5bb0: 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43  _CACHE_USED, &iC
5bc0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
5bd0: 73 65 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  set);.  fprintf(
5be0: 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70  out, "Pager Heap
5bf0: 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
5c00: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79             %d by
5c10: 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 69 43  tes\n",.      iC
5c20: 75 72 29 3b 0a 20 20 69 48 69 77 74 72 20 3d 20  ur);.  iHiwtr = 
5c30: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c  iCur = -1;.  sql
5c40: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
5c50: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
5c60: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69  US_CACHE_HIT, &i
5c70: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
5c80: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
5c90: 20 22 50 61 67 65 20 63 61 63 68 65 20 68 69 74   "Page cache hit
5ca0: 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
5cb0: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
5cc0: 75 72 29 3b 0a 20 20 69 48 69 77 74 72 20 3d 20  ur);.  iHiwtr = 
5cd0: 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c  iCur = -1;.  sql
5ce0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
5cf0: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
5d00: 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26  US_CACHE_MISS, &
5d10: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
5d20: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
5d30: 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d 69  , "Page cache mi
5d40: 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20 20  sses:           
5d50: 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
5d60: 43 75 72 29 3b 0a 20 20 69 48 69 77 74 72 20 3d  Cur);.  iHiwtr =
5d70: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
5d80: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
5d90: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
5da0: 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c  TUS_CACHE_WRITE,
5db0: 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
5dc0: 20 31 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f   1);.  fprintf(o
5dd0: 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
5de0: 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20  writes:         
5df0: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
5e00: 20 69 43 75 72 29 3b 0a 20 20 69 48 69 77 74 72   iCur);.  iHiwtr
5e10: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 0a 23   = iCur = -1;..#
5e20: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
5e30: 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f    displayLinuxIo
5e40: 53 74 61 74 73 28 6f 75 74 29 3b 0a 23 65 6e 64  Stats(out);.#end
5e50: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  if..  return 0;.
5e60: 7d 0a 0a 2f 2a 20 42 6c 6f 62 20 61 63 63 65 73  }../* Blob acces
5e70: 73 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69  s order */.#defi
5e80: 6e 65 20 4f 52 44 45 52 5f 41 53 43 20 20 20 20  ne ORDER_ASC    
5e90: 20 31 0a 23 64 65 66 69 6e 65 20 4f 52 44 45 52   1.#define ORDER
5ea0: 5f 44 45 53 43 20 20 20 20 32 0a 23 64 65 66 69  _DESC    2.#defi
5eb0: 6e 65 20 4f 52 44 45 52 5f 52 41 4e 44 4f 4d 20  ne ORDER_RANDOM 
5ec0: 20 33 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61   3.../*.** Run a
5ed0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 65 73   performance tes
5ee0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
5ef0: 72 75 6e 4d 61 69 6e 28 69 6e 74 20 61 72 67 63  runMain(int argc
5f00: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
5f10: 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f30: 20 49 73 20 7a 44 62 20 61 20 64 61 74 61 62 61   Is zDb a databa
5f40: 73 65 20 6f 72 20 61 20 64 69 72 65 63 74 6f 72  se or a director
5f50: 79 3f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  y? */.  char *zD
5f60: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
5f70: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5f80: 6f 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  or directory nam
5f90: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
5fc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
5ff0: 64 65 20 66 72 6f 6d 20 53 51 4c 69 74 65 20 63  de from SQLite c
6000: 61 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  alls */.  int nC
6010: 6f 75 6e 74 20 3d 20 31 30 30 30 3b 20 20 20 20  ount = 1000;    
6020: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6030: 6f 66 20 62 6c 6f 62 20 66 65 74 63 68 20 6f 70  of blob fetch op
6040: 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  erations */.  in
6050: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
6060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
6070: 72 61 20 63 79 63 6c 65 73 20 2a 2f 0a 20 20 69  ra cycles */.  i
6080: 6e 74 20 69 4b 65 79 20 3d 20 31 3b 20 20 20 20  nt iKey = 1;    
6090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
60a0: 78 74 20 62 6c 6f 62 20 6b 65 79 20 2a 2f 0a 20  xt blob key */. 
60b0: 20 69 6e 74 20 69 4d 61 78 20 3d 20 30 3b 20 20   int iMax = 0;  
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60d0: 4c 61 72 67 65 73 74 20 61 6c 6c 6f 77 65 64 20  Largest allowed 
60e0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  key */.  int iPa
60f0: 67 65 73 69 7a 65 20 3d 20 30 3b 20 20 20 20 20  gesize = 0;     
6100: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6110: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
6120: 69 6e 74 20 69 43 61 63 68 65 20 3d 20 31 30 30  int iCache = 100
6130: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  0;          /* D
6140: 61 74 61 62 61 73 65 20 63 61 63 68 65 20 73 69  atabase cache si
6150: 7a 65 20 69 6e 20 6b 69 62 69 62 79 74 65 73 20  ze in kibibytes 
6160: 2a 2f 0a 20 20 69 6e 74 20 62 42 6c 6f 62 41 70  */.  int bBlobAp
6170: 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
6180: 20 2f 2a 20 55 73 65 20 74 68 65 20 69 6e 63 72   /* Use the incr
6190: 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 49 2f 4f  emental blob I/O
61a0: 20 41 50 49 20 2a 2f 0a 20 20 69 6e 74 20 62 53   API */.  int bS
61b0: 74 61 74 73 20 3d 20 30 3b 20 20 20 20 20 20 20  tats = 0;       
61c0: 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 73        /* Print s
61d0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 78 69 74  tats before exit
61e0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 72  ing */.  int eOr
61f0: 64 65 72 20 3d 20 4f 52 44 45 52 5f 41 53 43 3b  der = ORDER_ASC;
6200: 20 20 20 20 20 2f 2a 20 41 63 63 65 73 73 20 6f       /* Access o
6210: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rder */.  int is
6220: 55 70 64 61 74 65 54 65 73 74 20 3d 20 30 3b 20  UpdateTest = 0; 
6230: 20 20 20 20 20 20 2f 2a 20 44 6f 20 69 6e 2d 70        /* Do in-p
6240: 6c 61 63 65 20 75 70 64 61 74 65 73 20 72 61 74  lace updates rat
6250: 68 65 72 20 74 68 61 6e 20 72 65 61 64 73 20 2a  her than reads *
6260: 2f 0a 20 20 69 6e 74 20 64 6f 49 6e 74 65 67 72  /.  int doIntegr
6270: 69 74 79 43 6b 20 3d 20 30 3b 20 20 20 20 20 20  ityCk = 0;      
6280: 2f 2a 20 52 75 6e 20 50 52 41 47 4d 41 20 69 6e  /* Run PRAGMA in
6290: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 61 66  tegrity_check af
62a0: 74 65 72 20 74 68 65 20 74 65 73 74 20 2a 2f 0a  ter the test */.
62b0: 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 3d 20 30    int noSync = 0
62c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
62d0: 20 44 69 73 61 62 6c 65 20 73 79 6e 63 68 72 6f   Disable synchro
62e0: 6e 6f 75 73 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  nous mode */.  i
62f0: 6e 74 20 64 6f 46 73 79 6e 63 20 3d 20 30 3b 20  nt doFsync = 0; 
6300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 70             /* Up
6310: 64 61 74 65 20 64 69 73 6b 20 66 69 6c 65 73 20  date disk files 
6320: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2a 2f  synchronously */
6330: 0a 20 20 69 6e 74 20 64 6f 4d 75 6c 74 69 54 72  .  int doMultiTr
6340: 61 6e 73 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ans = 0;       /
6350: 2a 20 45 61 63 68 20 6f 70 65 72 61 74 69 6f 6e  * Each operation
6360: 20 69 6e 20 69 74 73 20 6f 77 6e 20 74 72 61 6e   in its own tran
6370: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
6380: 20 6e 6f 43 68 65 63 6b 70 6f 69 6e 74 20 3d 20   noCheckpoint = 
6390: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6d 69 74  0;       /* Omit
63a0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
63b0: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  in WAL mode */. 
63c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
63e0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
63f0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
6400: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
6410: 3b 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64  ;    /* Prepared
6420: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 53   statement for S
6430: 51 4c 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 73  QL access */.  s
6440: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c  qlite3_blob *pBl
6450: 6f 62 20 3d 20 30 3b 20 20 20 20 2f 2a 20 48 61  ob = 0;    /* Ha
6460: 6e 64 6c 65 20 66 6f 72 20 69 6e 63 72 65 6d 65  ndle for increme
6470: 6e 74 61 6c 20 42 6c 6f 62 20 49 2f 4f 20 2a 2f  ntal Blob I/O */
6480: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6490: 20 74 6d 53 74 61 72 74 3b 20 20 20 20 20 20 2f   tmStart;      /
64a0: 2a 20 53 74 61 72 74 20 74 69 6d 65 20 2a 2f 0a  * Start time */.
64b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
64c0: 74 6d 45 6c 61 70 73 65 64 3b 20 20 20 20 2f 2a  tmElapsed;    /*
64d0: 20 45 6c 61 70 73 65 64 20 74 69 6d 65 20 2a 2f   Elapsed time */
64e0: 0a 20 20 69 6e 74 20 6d 6d 61 70 53 69 7a 65 20  .  int mmapSize 
64f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
6500: 2a 20 2d 2d 6d 6d 61 70 20 4e 20 61 72 67 75 6d  * --mmap N argum
6510: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
6520: 5f 69 6e 74 36 34 20 6e 44 61 74 61 20 3d 20 30  _int64 nData = 0
6530: 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66  ;    /* Bytes of
6540: 20 64 61 74 61 20 2a 2f 0a 20 20 73 71 6c 69 74   data */.  sqlit
6550: 65 33 5f 69 6e 74 36 34 20 6e 54 6f 74 61 6c 20  e3_int64 nTotal 
6560: 3d 20 30 3b 20 20 20 2f 2a 20 54 6f 74 61 6c 20  = 0;   /* Total 
6570: 64 61 74 61 20 72 65 61 64 20 2a 2f 0a 20 20 75  data read */.  u
6580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
6590: 61 74 61 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  ata = 0;   /* Co
65a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 62 6c 6f  ntent of the blo
65b0: 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  b */.  sqlite3_i
65c0: 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b  nt64 nAlloc = 0;
65d0: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
65e0: 63 61 74 65 64 20 66 6f 72 20 70 44 61 74 61 5b  cated for pData[
65f0: 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
6600: 72 20 2a 7a 4a 4d 6f 64 65 20 3d 20 30 3b 20 20  r *zJMode = 0;  
6610: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 6d 6f     /* Journal mo
6620: 64 65 20 2a 2f 0a 20 20 0a 0a 20 20 61 73 73 65  de */.  ..  asse
6630: 72 74 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  rt( strcmp(argv[
6640: 31 5d 2c 22 72 75 6e 22 29 3d 3d 30 20 29 3b 0a  1],"run")==0 );.
6650: 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 3d    assert( argc>=
6660: 33 20 29 3b 0a 20 20 7a 44 62 20 3d 20 61 72 67  3 );.  zDb = arg
6670: 76 5b 32 5d 3b 0a 20 20 65 54 79 70 65 20 3d 20  v[2];.  eType = 
6680: 70 61 74 68 54 79 70 65 28 7a 44 62 29 3b 0a 20  pathType(zDb);. 
6690: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 41 54 48   if( eType==PATH
66a0: 5f 4f 54 48 45 52 20 29 20 66 61 74 61 6c 45 72  _OTHER ) fatalEr
66b0: 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 62 6a  ror("unknown obj
66c0: 65 63 74 20 74 79 70 65 3a 20 5c 22 25 73 5c 22  ect type: \"%s\"
66d0: 22 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 65  ", zDb);.  if( e
66e0: 54 79 70 65 3d 3d 50 41 54 48 5f 4e 45 58 49 53  Type==PATH_NEXIS
66f0: 54 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  T ) fatalError("
6700: 6f 62 6a 65 63 74 20 64 6f 65 73 20 6e 6f 74 20  object does not 
6710: 65 78 69 73 74 3a 20 5c 22 25 73 5c 22 22 2c 20  exist: \"%s\"", 
6720: 7a 44 62 29 3b 0a 20 20 66 6f 72 28 69 3d 33 3b  zDb);.  for(i=3;
6730: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
6740: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67     char *z = arg
6750: 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
6760: 30 5d 21 3d 27 2d 27 20 29 20 66 61 74 61 6c 45  0]!='-' ) fatalE
6770: 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 61 72  rror("unknown ar
6780: 67 75 6d 65 6e 74 3a 20 5c 22 25 73 5c 22 22 2c  gument: \"%s\"",
6790: 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 31   z);.    if( z[1
67a0: 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
67b0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
67c0: 22 2d 61 73 63 22 29 3d 3d 30 20 29 7b 0a 20 20  "-asc")==0 ){.  
67d0: 20 20 20 20 65 4f 72 64 65 72 20 3d 20 4f 52 44      eOrder = ORD
67e0: 45 52 5f 41 53 43 3b 0a 20 20 20 20 20 20 63 6f  ER_ASC;.      co
67f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6800: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
6810: 22 2d 62 6c 6f 62 2d 61 70 69 22 29 3d 3d 30 20  "-blob-api")==0 
6820: 29 7b 0a 20 20 20 20 20 20 62 42 6c 6f 62 41 70  ){.      bBlobAp
6830: 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  i = 1;.      con
6840: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
6850: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
6860: 2d 63 61 63 68 65 2d 73 69 7a 65 22 29 3d 3d 30  -cache-size")==0
6870: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
6880: 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 45  =argc-1 ) fatalE
6890: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
68a0: 67 75 6d 65 6e 74 20 6f 6e 20 5c 22 25 73 5c 22  gument on \"%s\"
68b0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
68c0: 20 20 20 69 43 61 63 68 65 20 3d 20 69 6e 74 65     iCache = inte
68d0: 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b  gerValue(argv[++
68e0: 69 5d 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  i]);.      conti
68f0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
6900: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 63  f( strcmp(z, "-c
6910: 6f 75 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ount")==0 ){.   
6920: 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31     if( i==argc-1
6930: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
6940: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
6950: 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76  on \"%s\"", argv
6960: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6e 43 6f 75  [i]);.      nCou
6970: 6e 74 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75  nt = integerValu
6980: 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20  e(argv[++i]);.  
6990: 20 20 20 20 69 66 28 20 6e 43 6f 75 6e 74 3c 31      if( nCount<1
69a0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74   ) fatalError("t
69b0: 68 65 20 2d 2d 63 6f 75 6e 74 20 6d 75 73 74 20  he --count must 
69c0: 62 65 20 70 6f 73 69 74 69 76 65 22 29 3b 0a 20  be positive");. 
69d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
69e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
69f0: 63 6d 70 28 7a 2c 20 22 2d 64 65 73 63 22 29 3d  cmp(z, "-desc")=
6a00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 4f 72 64  =0 ){.      eOrd
6a10: 65 72 20 3d 20 4f 52 44 45 52 5f 44 45 53 43 3b  er = ORDER_DESC;
6a20: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
6a30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
6a40: 74 72 63 6d 70 28 7a 2c 20 22 2d 66 73 79 6e 63  trcmp(z, "-fsync
6a50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ")==0 ){.      d
6a60: 6f 46 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  oFsync = 1;.    
6a70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6a80: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
6a90: 28 7a 2c 20 22 2d 69 6e 74 65 67 72 69 74 79 2d  (z, "-integrity-
6aa0: 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  check")==0 ){.  
6ab0: 20 20 20 20 64 6f 49 6e 74 65 67 72 69 74 79 43      doIntegrityC
6ac0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  k = 1;.      con
6ad0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
6ae0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
6af0: 2d 6a 6d 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20  -jmode")==0 ){. 
6b00: 20 20 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63       if( i==argc
6b10: 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  -1 ) fatalError(
6b20: 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  "missing argumen
6b30: 74 20 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72  t on \"%s\"", ar
6b40: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a 4a  gv[i]);.      zJ
6b50: 4d 6f 64 65 20 3d 20 61 72 67 76 5b 2b 2b 69 5d  Mode = argv[++i]
6b60: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
6b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6b80: 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6d 6d 61 70  strcmp(z, "-mmap
6b90: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6ba0: 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66  f( i==argc-1 ) f
6bb0: 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69  atalError("missi
6bc0: 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c  ng argument on \
6bd0: 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29  "%s\"", argv[i])
6be0: 3b 0a 20 20 20 20 20 20 6d 6d 61 70 53 69 7a 65  ;.      mmapSize
6bf0: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
6c00: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
6c10: 20 20 69 66 28 20 6e 43 6f 75 6e 74 3c 30 20 29    if( nCount<0 )
6c20: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 68 65   fatalError("the
6c30: 20 2d 2d 6d 6d 61 70 20 6d 75 73 74 20 62 65 20   --mmap must be 
6c40: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 29 3b 0a  non-negative");.
6c50: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6c60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
6c70: 72 63 6d 70 28 7a 2c 20 22 2d 6d 61 78 2d 69 64  rcmp(z, "-max-id
6c80: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6c90: 66 28 20 69 3d 3d 61 72 67 63 2d 31 20 29 20 66  f( i==argc-1 ) f
6ca0: 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69  atalError("missi
6cb0: 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 5c  ng argument on \
6cc0: 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29  "%s\"", argv[i])
6cd0: 3b 0a 20 20 20 20 20 20 69 4d 61 78 20 3d 20 69  ;.      iMax = i
6ce0: 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76  ntegerValue(argv
6cf0: 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 63 6f  [++i]);.      co
6d00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6d10: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
6d20: 22 2d 6d 75 6c 74 69 74 72 61 6e 73 22 29 3d 3d  "-multitrans")==
6d30: 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 4d 75 6c  0 ){.      doMul
6d40: 74 69 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  tiTrans = 1;.   
6d50: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
6d60: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
6d70: 70 28 7a 2c 20 22 2d 6e 6f 63 68 65 63 6b 70 6f  p(z, "-nocheckpo
6d80: 69 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  int")==0 ){.    
6d90: 20 20 6e 6f 43 68 65 63 6b 70 6f 69 6e 74 20 3d    noCheckpoint =
6da0: 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   1;.      contin
6db0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
6dc0: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6e 6f  ( strcmp(z, "-no
6dd0: 73 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20  sync")==0 ){.   
6de0: 20 20 20 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20     noSync = 1;. 
6df0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
6e10: 63 6d 70 28 7a 2c 20 22 2d 72 61 6e 64 6f 6d 22  cmp(z, "-random"
6e20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 4f  )==0 ){.      eO
6e30: 72 64 65 72 20 3d 20 4f 52 44 45 52 5f 52 41 4e  rder = ORDER_RAN
6e40: 44 4f 4d 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  DOM;.      conti
6e50: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
6e60: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 73  f( strcmp(z, "-s
6e70: 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tart")==0 ){.   
6e80: 20 20 20 69 66 28 20 69 3d 3d 61 72 67 63 2d 31     if( i==argc-1
6e90: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
6ea0: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
6eb0: 6f 6e 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76  on \"%s\"", argv
6ec0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 4b 65 79  [i]);.      iKey
6ed0: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
6ee0: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
6ef0: 20 20 69 66 28 20 69 4b 65 79 3c 31 20 29 20 66    if( iKey<1 ) f
6f00: 61 74 61 6c 45 72 72 6f 72 28 22 74 68 65 20 2d  atalError("the -
6f10: 2d 73 74 61 72 74 20 6d 75 73 74 20 62 65 20 70  -start must be p
6f20: 6f 73 69 74 69 76 65 22 29 3b 0a 20 20 20 20 20  ositive");.     
6f30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
6f40: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6f50: 7a 2c 20 22 2d 73 74 61 74 73 22 29 3d 3d 30 20  z, "-stats")==0 
6f60: 29 7b 0a 20 20 20 20 20 20 62 53 74 61 74 73 20  ){.      bStats 
6f70: 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 1;.      conti
6f80: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
6f90: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 75  f( strcmp(z, "-u
6fa0: 70 64 61 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  pdate")==0 ){.  
6fb0: 20 20 20 20 69 73 55 70 64 61 74 65 54 65 73 74      isUpdateTest
6fc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
6fd0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
6fe0: 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e 6b 6e  fatalError("unkn
6ff0: 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 5c 22 25 73  own option: \"%s
7000: 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  \"", argv[i]);. 
7010: 20 7d 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d   }.  if( eType==
7020: 50 41 54 48 5f 44 42 20 29 7b 0a 20 20 20 20 2f  PATH_DB ){.    /
7030: 2a 20 52 65 63 6f 76 65 72 20 61 6e 79 20 70 72  * Recover any pr
7040: 69 6f 72 20 63 72 61 73 68 65 73 20 70 72 69 6f  ior crashes prio
7050: 72 20 74 6f 20 73 74 61 72 74 69 6e 67 20 74 68  r to starting th
7060: 65 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 73  e timer */.    s
7070: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c  qlite3_open(zDb,
7080: 20 26 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   &db);.    sqlit
7090: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 53 45 4c  e3_exec(db, "SEL
70a0: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73  ECT rowid FROM s
70b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49 4d  qlite_master LIM
70c0: 49 54 20 31 22 2c 20 30 2c 20 30 2c 20 30 29 3b  IT 1", 0, 0, 0);
70d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
70e0: 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
70f0: 20 30 3b 0a 20 20 7d 0a 20 20 74 6d 53 74 61 72   0;.  }.  tmStar
7100: 74 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  t = timeOfDay();
7110: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 41  .  if( eType==PA
7120: 54 48 5f 44 42 20 29 7b 0a 20 20 20 20 63 68 61  TH_DB ){.    cha
7130: 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 72 63 20  r *zSql;.    rc 
7140: 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
7150: 44 62 2c 20 26 64 62 29 3b 0a 20 20 20 20 69 66  Db, &db);.    if
7160: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 61  ( rc ){.      fa
7170: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
7180: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c   open database \
7190: 22 25 73 5c 22 3a 20 25 73 22 2c 20 7a 44 62 2c  "%s\": %s", zDb,
71a0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
71b0: 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  db));.    }.    
71c0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
71d0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 6d  printf("PRAGMA m
71e0: 6d 61 70 5f 73 69 7a 65 3d 25 64 22 2c 20 6d 6d  map_size=%d", mm
71f0: 61 70 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c  apSize);.    sql
7200: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
7210: 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
7220: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7230: 53 71 6c 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d  Sql);.    zSql =
7240: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7250: 28 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73  ("PRAGMA cache_s
7260: 69 7a 65 3d 25 64 22 2c 20 69 43 61 63 68 65 29  ize=%d", iCache)
7270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
7280: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  ec(db, zSql, 0, 
7290: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
72a0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
72b0: 20 20 20 69 66 28 20 6e 6f 53 79 6e 63 20 29 7b     if( noSync ){
72c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
72d0: 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41 20  xec(db, "PRAGMA 
72e0: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 22  synchronous=OFF"
72f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7300: 7d 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  }.    pStmt = 0;
7310: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65  .    sqlite3_pre
7320: 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41  pare_v2(db, "PRA
7330: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 22 2c 20  GMA page_size", 
7340: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
7350: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
7360: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
7370: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
7380: 20 69 50 61 67 65 73 69 7a 65 20 3d 20 73 71 6c   iPagesize = sql
7390: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
73a0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
73b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
73c0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
73d0: 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
73e0: 65 5f 76 32 28 64 62 2c 20 22 50 52 41 47 4d 41  e_v2(db, "PRAGMA
73f0: 20 63 61 63 68 65 5f 73 69 7a 65 22 2c 20 2d 31   cache_size", -1
7400: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
7410: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
7420: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
7430: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
7440: 43 61 63 68 65 20 3d 20 73 71 6c 69 74 65 33 5f  Cache = sqlite3_
7450: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
7460: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
7470: 0a 20 20 20 20 20 20 69 43 61 63 68 65 20 3d 20  .      iCache = 
7480: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
7490: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
74a0: 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
74b0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4a 4d  = 0;.    if( zJM
74c0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  ode ){.      zSq
74d0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
74e0: 6e 74 66 28 22 50 52 41 47 4d 41 20 6a 6f 75 72  ntf("PRAGMA jour
74f0: 6e 61 6c 5f 6d 6f 64 65 3d 25 51 22 2c 20 7a 4a  nal_mode=%Q", zJ
7500: 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Mode);.      sql
7510: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
7520: 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
7530: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7540: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66  (zSql);.      if
7550: 28 20 6e 6f 43 68 65 63 6b 70 6f 69 6e 74 20 29  ( noCheckpoint )
7560: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7570: 33 5f 65 78 65 63 28 64 62 2c 20 22 50 52 41 47  3_exec(db, "PRAG
7580: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
7590: 70 6f 69 6e 74 3d 30 22 2c 20 30 2c 20 30 2c 20  point=0", 0, 0, 
75a0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
75b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72  }.    sqlite3_pr
75c0: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52  epare_v2(db, "PR
75d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
75e0: 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  e", -1, &pStmt, 
75f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  0);.    if( sqli
7600: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
7610: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
7620: 20 20 20 20 20 7a 4a 4d 6f 64 65 20 3d 20 73 71       zJMode = sq
7630: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
7640: 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s", sqlite3_colu
7650: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
7660: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
7670: 20 20 20 20 20 7a 4a 4d 6f 64 65 20 3d 20 22 3f       zJMode = "?
7680: 3f 3f 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ??";.    }.    s
7690: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
76a0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
76b0: 69 4d 61 78 3c 3d 30 20 29 7b 0a 20 20 20 20 20  iMax<=0 ){.     
76c0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
76d0: 5f 76 32 28 64 62 2c 20 22 53 45 4c 45 43 54 20  _v2(db, "SELECT 
76e0: 6d 61 78 28 6b 29 20 46 52 4f 4d 20 6b 76 22 2c  max(k) FROM kv",
76f0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
7700: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
7710: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
7720: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
7730: 20 20 20 20 20 20 69 4d 61 78 20 3d 20 73 71 6c        iMax = sql
7740: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
7750: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
7760: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7770: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
7780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 6d  ;.    }.    pStm
7790: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
77a0: 64 6f 4d 75 6c 74 69 54 72 61 6e 73 20 29 20 73  doMultiTrans ) s
77b0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
77c0: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
77d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4d 61  );.  }.  if( iMa
77e0: 78 3c 3d 30 20 29 20 69 4d 61 78 20 3d 20 31 30  x<=0 ) iMax = 10
77f0: 30 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  00;.  for(i=0; i
7800: 3c 6e 43 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  <nCount; i++){. 
7810: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 41     if( eType==PA
7820: 54 48 5f 44 49 52 20 7c 7c 20 65 54 79 70 65 3d  TH_DIR || eType=
7830: 3d 50 41 54 48 5f 54 52 45 45 20 29 7b 0a 20 20  =PATH_TREE ){.  
7840: 20 20 20 20 2f 2a 20 43 41 53 45 20 31 3a 20 52      /* CASE 1: R
7850: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
7860: 67 20 62 6c 6f 62 73 20 6f 75 74 20 6f 66 20 73  g blobs out of s
7870: 65 70 61 72 61 74 65 20 66 69 6c 65 73 20 2a 2f  eparate files */
7880: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4b 65  .      char *zKe
7890: 79 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  y;.      if( eTy
78a0: 70 65 3d 3d 50 41 54 48 5f 44 49 52 20 29 7b 0a  pe==PATH_DIR ){.
78b0: 20 20 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 73          zKey = s
78c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
78d0: 25 73 2f 25 30 36 64 22 2c 20 7a 44 62 2c 20 69  %s/%06d", zDb, i
78e0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Key);.      }els
78f0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 4b 65 79 20  e{.        zKey 
7900: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
7910: 66 28 22 25 73 2f 25 30 32 64 2f 25 30 32 64 2f  f("%s/%02d/%02d/
7920: 25 30 32 64 22 2c 20 7a 44 62 2c 20 69 4b 65 79  %02d", zDb, iKey
7930: 2f 31 30 30 30 30 2c 0a 20 20 20 20 20 20 20 20  /10000,.        
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 20 20 20 20 28 69 4b 65 79 2f 31 30 30         (iKey/100
7960: 29 25 31 30 30 2c 20 69 4b 65 79 25 31 30 30 29  )%100, iKey%100)
7970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7980: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  nData = 0;.     
7990: 20 69 66 28 20 69 73 55 70 64 61 74 65 54 65 73   if( isUpdateTes
79a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70 64  t ){.        upd
79b0: 61 74 65 46 69 6c 65 28 7a 4b 65 79 2c 20 26 6e  ateFile(zKey, &n
79c0: 44 61 74 61 2c 20 64 6f 46 73 79 6e 63 29 3b 0a  Data, doFsync);.
79d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
79e0: 20 20 20 20 20 70 44 61 74 61 20 3d 20 72 65 61       pData = rea
79f0: 64 46 69 6c 65 28 7a 4b 65 79 2c 20 26 6e 44 61  dFile(zKey, &nDa
7a00: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ta);.        sql
7a10: 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
7a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 65  sqlite3_free(zKe
7a40: 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  y);.    }else if
7a50: 28 20 62 42 6c 6f 62 41 70 69 20 29 7b 0a 20 20  ( bBlobApi ){.  
7a60: 20 20 20 20 2f 2a 20 43 41 53 45 20 32 3a 20 52      /* CASE 2: R
7a70: 65 61 64 69 6e 67 20 66 72 6f 6d 20 64 61 74 61  eading from data
7a80: 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 69  base using the i
7a90: 6e 63 72 65 6d 65 6e 74 61 6c 20 42 4c 4f 42 20  ncremental BLOB 
7aa0: 49 2f 4f 20 41 50 49 20 2a 2f 0a 20 20 20 20 20  I/O API */.     
7ab0: 20 69 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b   if( pBlob==0 ){
7ac0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7ad0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
7ae0: 64 62 2c 20 22 6d 61 69 6e 22 2c 20 22 6b 76 22  db, "main", "kv"
7af0: 2c 20 22 76 22 2c 20 69 4b 65 79 2c 0a 20 20 20  , "v", iKey,.   
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 55 70              isUp
7b20: 64 61 74 65 54 65 73 74 2c 20 26 70 42 6c 6f 62  dateTest, &pBlob
7b30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
7b40: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  c ){.          f
7b50: 61 74 61 6c 45 72 72 6f 72 28 22 63 6f 75 6c 64  atalError("could
7b60: 20 6e 6f 74 20 6f 70 65 6e 20 73 71 6c 69 74 65   not open sqlite
7b70: 33 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 3a 20 25  3_blob handle: %
7b80: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
7b90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7ba0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7bc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
7bd0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
7be0: 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 4b 65  eopen(pBlob, iKe
7bf0: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
7c00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7c10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
7c20: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 62  Data = sqlite3_b
7c30: 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62 29  lob_bytes(pBlob)
7c40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  ;.        if( nA
7c50: 6c 6c 6f 63 3c 6e 44 61 74 61 2b 31 20 29 7b 0a  lloc<nData+1 ){.
7c60: 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63            nAlloc
7c70: 20 3d 20 6e 44 61 74 61 2b 31 30 30 3b 0a 20 20   = nData+100;.  
7c80: 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
7c90: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
7ca0: 34 28 70 44 61 74 61 2c 20 6e 41 6c 6c 6f 63 29  4(pData, nAlloc)
7cb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7cc0: 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
7cd0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63   ) fatalError("c
7ce0: 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25  annot allocate %
7cf0: 64 20 62 79 74 65 73 22 2c 20 6e 44 61 74 61 2b  d bytes", nData+
7d00: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
7d10: 69 73 55 70 64 61 74 65 54 65 73 74 20 29 7b 0a  isUpdateTest ){.
7d20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7d30: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 28 69 6e  3_randomness((in
7d40: 74 29 6e 44 61 74 61 2c 20 70 44 61 74 61 29 3b  t)nData, pData);
7d50: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
7d60: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
7d70: 74 65 28 70 42 6c 6f 62 2c 20 70 44 61 74 61 2c  te(pBlob, pData,
7d80: 20 28 69 6e 74 29 6e 44 61 74 61 2c 20 30 29 3b   (int)nData, 0);
7d90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
7da0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 74 61              fata
7dc0: 6c 45 72 72 6f 72 28 22 63 6f 75 6c 64 20 6e 6f  lError("could no
7dd0: 74 20 77 72 69 74 65 20 74 68 65 20 62 6c 6f 62  t write the blob
7de0: 20 61 74 20 25 64 3a 20 25 73 22 2c 20 69 4b 65   at %d: %s", iKe
7df0: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
7e00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7e10: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
7e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7e40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7e50: 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c  blob_read(pBlob,
7e60: 20 70 44 61 74 61 2c 20 28 69 6e 74 29 6e 44 61   pData, (int)nDa
7e70: 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ta, 0);.        
7e80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7e90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
7ea0: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
7eb0: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 74 68  ould not read th
7ec0: 65 20 62 6c 6f 62 20 61 74 20 25 64 3a 20 25 73  e blob at %d: %s
7ed0: 22 2c 20 69 4b 65 79 2c 0a 20 20 20 20 20 20 20  ", iKey,.       
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7ef0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
7f00: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
7f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7f20: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
7f30: 20 20 20 2f 2a 20 43 41 53 45 20 33 3a 20 52 65     /* CASE 3: Re
7f40: 61 64 69 6e 67 20 66 72 6f 6d 20 64 61 74 61 62  ading from datab
7f50: 61 73 65 20 75 73 69 6e 67 20 53 51 4c 20 2a 2f  ase using SQL */
7f60: 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74  .      if( pStmt
7f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
7f80: 66 28 20 69 73 55 70 64 61 74 65 54 65 73 74 20  f( isUpdateTest 
7f90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7fa0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7fb0: 74 69 6f 6e 28 64 62 2c 20 22 72 65 6d 65 6d 62  tion(db, "rememb
7fc0: 65 72 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  er", 2, SQLITE_U
7fd0: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 20 20 20 20 20 20 72 65 6d 65 6d 62            rememb
8000: 65 72 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a  erFunc, 0, 0);..
8010: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
8020: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
8030: 32 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  2(db, .         
8040: 20 20 20 22 55 50 44 41 54 45 20 6b 76 20 53 45     "UPDATE kv SE
8050: 54 20 76 3d 72 61 6e 64 6f 6d 62 6c 6f 62 28 72  T v=randomblob(r
8060: 65 6d 65 6d 62 65 72 28 6c 65 6e 67 74 68 28 76  emember(length(v
8070: 29 2c 3f 32 29 29 22 0a 20 20 20 20 20 20 20 20  ),?2))".        
8080: 20 20 20 20 22 20 57 48 45 52 45 20 6b 3d 3f 31      " WHERE k=?1
8090: 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  ", -1, &pStmt, 0
80a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
80b0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
80c0: 70 53 74 6d 74 2c 20 32 2c 20 53 51 4c 49 54 45  pStmt, 2, SQLITE
80d0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 26 6e 44 61  _PTR_TO_INT(&nDa
80e0: 74 61 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ta));.        }e
80f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
8100: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
8110: 61 72 65 5f 76 32 28 64 62 2c 20 0a 20 20 20 20  are_v2(db, .    
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
8130: 4c 45 43 54 20 76 20 46 52 4f 4d 20 6b 76 20 57  LECT v FROM kv W
8140: 48 45 52 45 20 6b 3d 3f 31 22 2c 20 2d 31 2c 20  HERE k=?1", -1, 
8150: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
8160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8170: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
8180: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61    fatalError("ca
8190: 6e 6e 6f 74 20 70 72 65 70 61 72 65 20 71 75 65  nnot prepare que
81a0: 72 79 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33  ry: %s", sqlite3
81b0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
81c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
81d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
81e0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
81f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8200: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
8210: 74 28 70 53 74 6d 74 2c 20 31 2c 20 69 4b 65 79  t(pStmt, 1, iKey
8220: 29 3b 0a 20 20 20 20 20 20 6e 44 61 74 61 20 3d  );.      nData =
8230: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
8240: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
8250: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
8260: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
8270: 20 20 20 20 20 20 20 20 6e 44 61 74 61 20 3d 20          nData = 
8280: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
8290: 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a  ytes(pStmt, 0);.
82a0: 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
82b0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
82c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
82d0: 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  lob(pStmt, 0);. 
82e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
82f0: 20 69 66 28 20 65 4f 72 64 65 72 3d 3d 4f 52 44   if( eOrder==ORD
8300: 45 52 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20  ER_ASC ){.      
8310: 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 69 66  iKey++;.      if
8320: 28 20 69 4b 65 79 3e 69 4d 61 78 20 29 20 69 4b  ( iKey>iMax ) iK
8330: 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
8340: 65 20 69 66 28 20 65 4f 72 64 65 72 3d 3d 4f 52  e if( eOrder==OR
8350: 44 45 52 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  DER_DESC ){.    
8360: 20 20 69 4b 65 79 2d 2d 3b 0a 20 20 20 20 20 20    iKey--;.      
8370: 69 66 28 20 69 4b 65 79 3c 3d 30 20 29 20 69 4b  if( iKey<=0 ) iK
8380: 65 79 20 3d 20 69 4d 61 78 3b 0a 20 20 20 20 7d  ey = iMax;.    }
8390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79  else{.      iKey
83a0: 20 3d 20 28 72 61 6e 64 49 6e 74 28 29 25 69 4d   = (randInt()%iM
83b0: 61 78 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ax)+1;.    }.   
83c0: 20 6e 54 6f 74 61 6c 20 2b 3d 20 6e 44 61 74 61   nTotal += nData
83d0: 3b 0a 20 20 20 20 69 66 28 20 6e 44 61 74 61 3d  ;.    if( nData=
83e0: 3d 30 20 29 7b 20 6e 43 6f 75 6e 74 2b 2b 3b 20  =0 ){ nCount++; 
83f0: 6e 45 78 74 72 61 2b 2b 3b 20 7d 0a 20 20 7d 0a  nExtra++; }.  }.
8400: 20 20 69 66 28 20 6e 41 6c 6c 6f 63 20 29 20 73    if( nAlloc ) s
8410: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
8420: 61 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  a);.  if( pStmt 
8430: 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
8440: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
8450: 20 70 42 6c 6f 62 20 29 20 73 71 6c 69 74 65 33   pBlob ) sqlite3
8460: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f  _blob_close(pBlo
8470: 62 29 3b 0a 20 20 69 66 28 20 62 53 74 61 74 73  b);.  if( bStats
8480: 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 5f   ){.    display_
8490: 73 74 61 74 73 28 64 62 2c 20 30 29 3b 0a 20 20  stats(db, 0);.  
84a0: 7d 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  }.  if( db ){.  
84b0: 20 20 69 66 28 20 21 64 6f 4d 75 6c 74 69 54 72    if( !doMultiTr
84c0: 61 6e 73 20 29 20 73 71 6c 69 74 65 33 5f 65 78  ans ) sqlite3_ex
84d0: 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c  ec(db, "COMMIT",
84e0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
84f0: 66 28 20 21 6e 6f 43 68 65 63 6b 70 6f 69 6e 74  f( !noCheckpoint
8500: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8510: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
8520: 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d     db = 0;.    }
8530: 0a 20 20 7d 0a 20 20 74 6d 45 6c 61 70 73 65 64  .  }.  tmElapsed
8540: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 20 2d   = timeOfDay() -
8550: 20 74 6d 53 74 61 72 74 3b 0a 20 20 69 66 28 20   tmStart;.  if( 
8560: 64 62 20 26 26 20 6e 6f 43 68 65 63 6b 70 6f 69  db && noCheckpoi
8570: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
8580: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
8590: 20 64 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69   db = 0;.  }.  i
85a0: 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 20 20  f( nExtra ){.   
85b0: 20 70 72 69 6e 74 66 28 22 25 64 20 63 79 63 6c   printf("%d cycl
85c0: 65 73 20 64 75 65 20 74 6f 20 25 64 20 6d 69 73  es due to %d mis
85d0: 73 65 73 5c 6e 22 2c 20 6e 43 6f 75 6e 74 2c 20  ses\n", nCount, 
85e0: 6e 45 78 74 72 61 29 3b 0a 20 20 7d 0a 20 20 69  nExtra);.  }.  i
85f0: 66 28 20 65 54 79 70 65 3d 3d 50 41 54 48 5f 44  f( eType==PATH_D
8600: 42 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  B ){.    printf(
8610: 22 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 3a  "SQLite version:
8620: 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
8630: 6c 69 62 76 65 72 73 69 6f 6e 28 29 29 3b 0a 20  libversion());. 
8640: 20 20 20 69 66 28 20 64 6f 49 6e 74 65 67 72 69     if( doIntegri
8650: 74 79 43 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  tyCk ){.      sq
8660: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 2c 20  lite3_open(zDb, 
8670: 26 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  &db);.      sqli
8680: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
8690: 62 2c 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67  b, "PRAGMA integ
86a0: 72 69 74 79 5f 63 68 65 63 6b 22 2c 20 2d 31 2c  rity_check", -1,
86b0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
86c0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
86d0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
86e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
86f0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 69 6e 74       printf("int
8700: 65 67 72 69 74 79 2d 63 68 65 63 6b 3a 20 25 73  egrity-check: %s
8710: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
8720: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
8730: 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0));.      }.   
8740: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
8750: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
8760: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
8770: 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
8780: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  0;.    }.  }.  p
8790: 72 69 6e 74 66 28 22 2d 2d 63 6f 75 6e 74 20 25  rintf("--count %
87a0: 64 20 2d 2d 6d 61 78 2d 69 64 20 25 64 22 2c 20  d --max-id %d", 
87b0: 6e 43 6f 75 6e 74 2d 6e 45 78 74 72 61 2c 20 69  nCount-nExtra, i
87c0: 4d 61 78 29 3b 0a 20 20 73 77 69 74 63 68 28 20  Max);.  switch( 
87d0: 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 63 61  eOrder ){.    ca
87e0: 73 65 20 4f 52 44 45 52 5f 52 41 4e 44 4f 4d 3a  se ORDER_RANDOM:
87f0: 20 20 70 72 69 6e 74 66 28 22 20 2d 2d 72 61 6e    printf(" --ran
8800: 64 6f 6d 5c 6e 22 29 3b 20 20 62 72 65 61 6b 3b  dom\n");  break;
8810: 0a 20 20 20 20 63 61 73 65 20 4f 52 44 45 52 5f  .    case ORDER_
8820: 44 45 53 43 3a 20 20 20 20 70 72 69 6e 74 66 28  DESC:    printf(
8830: 22 20 2d 2d 64 65 73 63 5c 6e 22 29 3b 20 20 20  " --desc\n");   
8840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
8850: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  ult:            
8860: 70 72 69 6e 74 66 28 22 20 2d 2d 61 73 63 5c 6e  printf(" --asc\n
8870: 22 29 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ");     break;. 
8880: 20 7d 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d   }.  if( eType==
8890: 50 41 54 48 5f 44 42 20 29 7b 0a 20 20 20 20 70  PATH_DB ){.    p
88a0: 72 69 6e 74 66 28 22 2d 2d 63 61 63 68 65 2d 73  rintf("--cache-s
88b0: 69 7a 65 20 25 64 20 2d 2d 6a 6d 6f 64 65 20 25  ize %d --jmode %
88c0: 73 5c 6e 22 2c 20 69 43 61 63 68 65 2c 20 7a 4a  s\n", iCache, zJ
88d0: 4d 6f 64 65 29 3b 0a 20 20 20 20 70 72 69 6e 74  Mode);.    print
88e0: 66 28 22 2d 2d 6d 6d 61 70 20 25 64 25 73 5c 6e  f("--mmap %d%s\n
88f0: 22 2c 20 6d 6d 61 70 53 69 7a 65 2c 20 62 42 6c  ", mmapSize, bBl
8900: 6f 62 41 70 69 20 3f 20 22 20 2d 2d 62 6c 6f 62  obApi ? " --blob
8910: 2d 61 70 69 22 20 3a 20 22 22 29 3b 0a 20 20 20  -api" : "");.   
8920: 20 69 66 28 20 6e 6f 53 79 6e 63 20 29 20 70 72   if( noSync ) pr
8930: 69 6e 74 66 28 22 2d 2d 6e 6f 73 79 6e 63 5c 6e  intf("--nosync\n
8940: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 50  ");.  }.  if( iP
8950: 61 67 65 73 69 7a 65 20 29 20 70 72 69 6e 74 66  agesize ) printf
8960: 28 22 44 61 74 61 62 61 73 65 20 70 61 67 65 20  ("Database page 
8970: 73 69 7a 65 3a 20 25 64 5c 6e 22 2c 20 69 50 61  size: %d\n", iPa
8980: 67 65 73 69 7a 65 29 3b 0a 20 20 70 72 69 6e 74  gesize);.  print
8990: 66 28 22 54 6f 74 61 6c 20 65 6c 61 70 73 65 64  f("Total elapsed
89a0: 20 74 69 6d 65 3a 20 25 2e 33 66 5c 6e 22 2c 20   time: %.3f\n", 
89b0: 74 6d 45 6c 61 70 73 65 64 2f 31 30 30 30 2e 30  tmElapsed/1000.0
89c0: 29 3b 0a 20 20 69 66 28 20 69 73 55 70 64 61 74  );.  if( isUpdat
89d0: 65 54 65 73 74 20 29 7b 0a 20 20 20 20 70 72 69  eTest ){.    pri
89e0: 6e 74 66 28 22 4d 69 63 72 6f 73 65 63 6f 6e 64  ntf("Microsecond
89f0: 73 20 70 65 72 20 42 4c 4f 42 20 77 72 69 74 65  s per BLOB write
8a00: 3a 20 25 2e 33 66 5c 6e 22 2c 20 74 6d 45 6c 61  : %.3f\n", tmEla
8a10: 70 73 65 64 2a 31 30 30 30 2e 30 2f 6e 43 6f 75  psed*1000.0/nCou
8a20: 6e 74 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nt);.    printf(
8a30: 22 43 6f 6e 74 65 6e 74 20 77 72 69 74 65 20 72  "Content write r
8a40: 61 74 65 3a 20 25 2e 31 66 20 4d 42 2f 73 5c 6e  ate: %.1f MB/s\n
8a50: 22 2c 20 6e 54 6f 74 61 6c 2f 28 31 30 30 30 2e  ", nTotal/(1000.
8a60: 30 2a 74 6d 45 6c 61 70 73 65 64 29 29 3b 0a 20  0*tmElapsed));. 
8a70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e   }else{.    prin
8a80: 74 66 28 22 4d 69 63 72 6f 73 65 63 6f 6e 64 73  tf("Microseconds
8a90: 20 70 65 72 20 42 4c 4f 42 20 72 65 61 64 3a 20   per BLOB read: 
8aa0: 25 2e 33 66 5c 6e 22 2c 20 74 6d 45 6c 61 70 73  %.3f\n", tmElaps
8ab0: 65 64 2a 31 30 30 30 2e 30 2f 6e 43 6f 75 6e 74  ed*1000.0/nCount
8ac0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  );.    printf("C
8ad0: 6f 6e 74 65 6e 74 20 72 65 61 64 20 72 61 74 65  ontent read rate
8ae0: 3a 20 25 2e 31 66 20 4d 42 2f 73 5c 6e 22 2c 20  : %.1f MB/s\n", 
8af0: 6e 54 6f 74 61 6c 2f 28 31 30 30 30 2e 30 2a 74  nTotal/(1000.0*t
8b00: 6d 45 6c 61 70 73 65 64 29 29 3b 0a 20 20 7d 0a  mElapsed));.  }.
8b10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
8b20: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
8b30: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
8b40: 0a 20 20 69 66 28 20 61 72 67 63 3c 33 20 29 20  .  if( argc<3 ) 
8b50: 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20 20 69 66  showHelp();.  if
8b60: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
8b70: 2c 22 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"init")==0 ){. 
8b80: 20 20 20 72 65 74 75 72 6e 20 69 6e 69 74 4d 61     return initMa
8b90: 69 6e 28 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  in(argc, argv);.
8ba0: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70    }.  if( strcmp
8bb0: 28 61 72 67 76 5b 31 5d 2c 22 65 78 70 6f 72 74  (argv[1],"export
8bc0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
8bd0: 75 72 6e 20 65 78 70 6f 72 74 4d 61 69 6e 28 61  urn exportMain(a
8be0: 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a  rgc, argv);.  }.
8bf0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
8c00: 76 5b 31 5d 2c 22 72 75 6e 22 29 3d 3d 30 20 29  v[1],"run")==0 )
8c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 75 6e  {.    return run
8c20: 4d 61 69 6e 28 61 72 67 63 2c 20 61 72 67 76 29  Main(argc, argv)
8c30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
8c40: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 61 74  mp(argv[1],"stat
8c50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")==0 ){.    ret
8c60: 75 72 6e 20 73 74 61 74 4d 61 69 6e 28 61 72 67  urn statMain(arg
8c70: 63 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20  c, argv);.  }.  
8c80: 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20 20 72 65  showHelp();.  re
8c90: 74 75 72 6e 20 30 3b 0a 7d 0a                    turn 0;.}.