/ Hex Artifact Content
Login

Artifact 8cd89ead95410f70e7fb02c79f1e040f9c5ad5cf:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 35 2d 30 37  /*.** 2016-05-07
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 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 75  */...#include <u
0180: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0190: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63  e <stdio.h>.#inc
01a0: 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e  lude <pthread.h>
01b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
01c0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
01d0: 79 73 2f 74 79 70 65 73 2e 68 3e 20 0a 23 69 6e  ys/types.h> .#in
01e0: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
01f0: 68 3e 20 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  h> .#include <st
0200: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
0210: 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c   <fcntl.h>.#incl
0220: 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69  ude <errno.h>.#i
0230: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6e 74 2e 68  nclude <stdint.h
0240: 3e 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 22 53  >../* .** The "S
0250: 65 74 20 45 72 72 6f 72 20 4c 69 6e 65 22 20 6d  et Error Line" m
0260: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
0270: 20 53 45 4c 28 65 29 20 28 28 65 29 2d 3e 69 4c   SEL(e) ((e)->iL
0280: 69 6e 65 20 3d 20 28 28 65 29 2d 3e 72 63 20 3f  ine = ((e)->rc ?
0290: 20 28 65 29 2d 3e 69 4c 69 6e 65 20 3a 20 5f 5f   (e)->iLine : __
02a0: 4c 49 4e 45 5f 5f 29 29 0a 0a 2f 2a 20 44 61 74  LINE__))../* Dat
02b0: 61 62 61 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  abase functions 
02c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 70 65 6e 64  */.#define opend
02d0: 62 28 77 2c 78 2c 79 2c 7a 29 20 20 20 20 20 20  b(w,x,y,z)      
02e0: 20 20 20 28 53 45 4c 28 77 29 2c 20 6f 70 65 6e     (SEL(w), open
02f0: 64 62 5f 78 28 77 2c 78 2c 79 2c 7a 29 29 0a 23  db_x(w,x,y,z)).#
0300: 64 65 66 69 6e 65 20 63 6c 6f 73 65 64 62 28 79  define closedb(y
0310: 2c 7a 29 20 20 20 20 20 20 20 20 20 20 20 20 28  ,z)            (
0320: 53 45 4c 28 79 29 2c 20 63 6c 6f 73 65 64 62 5f  SEL(y), closedb_
0330: 78 28 79 2c 7a 29 29 0a 0a 2f 2a 20 46 75 6e 63  x(y,z))../* Func
0340: 74 69 6f 6e 73 20 74 6f 20 65 78 65 63 75 74 65  tions to execute
0350: 20 53 51 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20   SQL */.#define 
0360: 73 71 6c 5f 73 63 72 69 70 74 28 78 2c 79 2c 7a  sql_script(x,y,z
0370: 29 20 20 20 20 20 20 20 28 53 45 4c 28 78 29 2c  )       (SEL(x),
0380: 20 73 71 6c 5f 73 63 72 69 70 74 5f 78 28 78 2c   sql_script_x(x,
0390: 79 2c 7a 29 29 0a 23 64 65 66 69 6e 65 20 69 6e  y,z)).#define in
03a0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 28 78 2c  tegrity_check(x,
03b0: 79 29 20 20 20 20 28 53 45 4c 28 78 29 2c 20 69  y)    (SEL(x), i
03c0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 5f 78  ntegrity_check_x
03d0: 28 78 2c 79 29 29 0a 23 64 65 66 69 6e 65 20 65  (x,y)).#define e
03e0: 78 65 63 73 71 6c 5f 69 36 34 28 78 2c 79 2c 2e  xecsql_i64(x,y,.
03f0: 2e 2e 29 20 20 20 20 28 53 45 4c 28 78 29 2c 20  ..)    (SEL(x), 
0400: 65 78 65 63 73 71 6c 5f 69 36 34 5f 78 28 78 2c  execsql_i64_x(x,
0410: 79 2c 5f 5f 56 41 5f 41 52 47 53 5f 5f 29 29 0a  y,__VA_ARGS__)).
0420: 23 64 65 66 69 6e 65 20 65 78 65 63 73 71 6c 5f  #define execsql_
0430: 74 65 78 74 28 78 2c 79 2c 7a 2c 2e 2e 2e 29 20  text(x,y,z,...) 
0440: 28 53 45 4c 28 78 29 2c 20 65 78 65 63 73 71 6c  (SEL(x), execsql
0450: 5f 74 65 78 74 5f 78 28 78 2c 79 2c 7a 2c 5f 5f  _text_x(x,y,z,__
0460: 56 41 5f 41 52 47 53 5f 5f 29 29 0a 23 64 65 66  VA_ARGS__)).#def
0470: 69 6e 65 20 65 78 65 63 73 71 6c 28 78 2c 79 2c  ine execsql(x,y,
0480: 2e 2e 2e 29 20 20 20 20 20 20 20 20 28 53 45 4c  ...)        (SEL
0490: 28 78 29 2c 20 28 76 6f 69 64 29 65 78 65 63 73  (x), (void)execs
04a0: 71 6c 5f 69 36 34 5f 78 28 78 2c 79 2c 5f 5f 56  ql_i64_x(x,y,__V
04b0: 41 5f 41 52 47 53 5f 5f 29 29 0a 23 64 65 66 69  A_ARGS__)).#defi
04c0: 6e 65 20 73 71 6c 5f 73 63 72 69 70 74 5f 70 72  ne sql_script_pr
04d0: 69 6e 74 66 28 78 2c 79 2c 7a 2c 2e 2e 2e 29 20  intf(x,y,z,...) 
04e0: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
04f0: 20 5c 0a 20 20 20 20 53 45 4c 28 78 29 2c 20 73   \.    SEL(x), s
0500: 71 6c 5f 73 63 72 69 70 74 5f 70 72 69 6e 74 66  ql_script_printf
0510: 5f 78 28 78 2c 79 2c 7a 2c 5f 5f 56 41 5f 41 52  _x(x,y,z,__VA_AR
0520: 47 53 5f 5f 29 20 20 20 20 5c 0a 29 20 0a 0a 2f  GS__)    \.) ../
0530: 2a 20 54 68 72 65 61 64 20 66 75 6e 63 74 69 6f  * Thread functio
0540: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6c 61  ns */.#define la
0550: 75 6e 63 68 5f 74 68 72 65 61 64 28 77 2c 78 2c  unch_thread(w,x,
0560: 79 2c 7a 29 20 20 20 20 20 28 53 45 4c 28 77 29  y,z)     (SEL(w)
0570: 2c 20 6c 61 75 6e 63 68 5f 74 68 72 65 61 64 5f  , launch_thread_
0580: 78 28 77 2c 78 2c 79 2c 7a 29 29 0a 23 64 65 66  x(w,x,y,z)).#def
0590: 69 6e 65 20 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72  ine join_all_thr
05a0: 65 61 64 73 28 79 2c 7a 29 20 20 20 20 20 20 28  eads(y,z)      (
05b0: 53 45 4c 28 79 29 2c 20 6a 6f 69 6e 5f 61 6c 6c  SEL(y), join_all
05c0: 5f 74 68 72 65 61 64 73 5f 78 28 79 2c 7a 29 29  _threads_x(y,z))
05d0: 0a 0a 2f 2a 20 54 69 6d 65 72 20 66 75 6e 63 74  ../* Timer funct
05e0: 69 6f 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ions */.#define 
05f0: 73 65 74 73 74 6f 70 74 69 6d 65 28 79 2c 7a 29  setstoptime(y,z)
0600: 20 20 20 20 20 20 20 20 28 53 45 4c 28 79 29 2c          (SEL(y),
0610: 20 73 65 74 73 74 6f 70 74 69 6d 65 5f 78 28 79   setstoptime_x(y
0620: 2c 7a 29 29 0a 23 64 65 66 69 6e 65 20 74 69 6d  ,z)).#define tim
0630: 65 74 6f 73 74 6f 70 28 7a 29 20 20 20 20 20 20  etostop(z)      
0640: 20 20 20 20 20 28 53 45 4c 28 7a 29 2c 20 74 69       (SEL(z), ti
0650: 6d 65 74 6f 73 74 6f 70 5f 78 28 7a 29 29 0a 0a  metostop_x(z))..
0660: 2f 2a 20 52 65 70 6f 72 74 2f 63 6c 65 61 72 20  /* Report/clear 
0670: 65 72 72 6f 72 73 2e 20 2a 2f 0a 23 64 65 66 69  errors. */.#defi
0680: 6e 65 20 74 65 73 74 5f 65 72 72 6f 72 28 7a 2c  ne test_error(z,
0690: 20 2e 2e 2e 29 20 20 20 20 20 20 74 65 73 74 5f   ...)      test_
06a0: 65 72 72 6f 72 5f 78 28 7a 2c 20 73 71 6c 69 74  error_x(z, sqlit
06b0: 65 33 5f 6d 70 72 69 6e 74 66 28 5f 5f 56 41 5f  e3_mprintf(__VA_
06c0: 41 52 47 53 5f 5f 29 29 0a 23 64 65 66 69 6e 65  ARGS__)).#define
06d0: 20 63 6c 65 61 72 5f 65 72 72 6f 72 28 79 2c 7a   clear_error(y,z
06e0: 29 20 20 20 20 20 20 20 20 63 6c 65 61 72 5f 65  )        clear_e
06f0: 72 72 6f 72 5f 78 28 79 2c 20 7a 29 0a 0a 2f 2a  rror_x(y, z)../*
0700: 20 46 69 6c 65 2d 73 79 73 74 65 6d 20 6f 70 65   File-system ope
0710: 72 61 74 69 6f 6e 73 20 2a 2f 0a 23 64 65 66 69  rations */.#defi
0720: 6e 65 20 66 69 6c 65 73 69 7a 65 28 79 2c 7a 29  ne filesize(y,z)
0730: 20 20 20 20 20 20 20 20 20 20 20 28 53 45 4c 28             (SEL(
0740: 79 29 2c 20 66 69 6c 65 73 69 7a 65 5f 78 28 79  y), filesize_x(y
0750: 2c 7a 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6c  ,z)).#define fil
0760: 65 63 6f 70 79 28 78 2c 79 2c 7a 29 20 20 20 20  ecopy(x,y,z)    
0770: 20 20 20 20 20 28 53 45 4c 28 78 29 2c 20 66 69       (SEL(x), fi
0780: 6c 65 63 6f 70 79 5f 78 28 78 2c 79 2c 7a 29 29  lecopy_x(x,y,z))
0790: 0a 0a 23 64 65 66 69 6e 65 20 50 54 52 32 49 4e  ..#define PTR2IN
07a0: 54 28 78 29 20 28 28 69 6e 74 29 28 28 69 6e 74  T(x) ((int)((int
07b0: 70 74 72 5f 74 29 78 29 29 0a 23 64 65 66 69 6e  ptr_t)x)).#defin
07c0: 65 20 49 4e 54 32 50 54 52 28 78 29 20 28 28 76  e INT2PTR(x) ((v
07d0: 6f 69 64 2a 29 28 28 69 6e 74 70 74 72 5f 74 29  oid*)((intptr_t)
07e0: 78 29 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  x))../*.** End o
07f0: 66 20 74 65 73 74 20 63 6f 64 65 2f 69 6e 66 72  f test code/infr
0800: 61 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72  astructure inter
0810: 66 61 63 65 20 6d 61 63 72 6f 73 2e 0a 2a 2a 2a  face macros..***
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0860: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
0870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08b0: 2a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 6f 66 20  ***.** Start of 
08c0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 6f  command line pro
08d0: 63 65 73 73 69 6e 67 20 75 74 69 6c 69 74 69 65  cessing utilitie
08e0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4d  s..*/.#define CM
08f0: 44 4c 49 4e 45 5f 49 4e 54 20 20 20 20 20 31 0a  DLINE_INT     1.
0900: 23 64 65 66 69 6e 65 20 43 4d 44 4c 49 4e 45 5f  #define CMDLINE_
0910: 42 4f 4f 4c 20 20 20 20 32 0a 23 64 65 66 69 6e  BOOL    2.#defin
0920: 65 20 43 4d 44 4c 49 4e 45 5f 53 54 52 49 4e 47  e CMDLINE_STRING
0930: 20 20 33 0a 0a 74 79 70 65 64 65 66 20 73 74 72    3..typedef str
0940: 75 63 74 20 43 6d 64 6c 69 6e 65 41 72 67 20 43  uct CmdlineArg C
0950: 6d 64 6c 69 6e 65 41 72 67 3b 0a 73 74 72 75 63  mdlineArg;.struc
0960: 74 20 43 6d 64 6c 69 6e 65 41 72 67 20 7b 0a 20  t CmdlineArg {. 
0970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 77   const char *zSw
0980: 69 74 63 68 3b 0a 20 20 69 6e 74 20 65 54 79 70  itch;.  int eTyp
0990: 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  e;.  int iOffset
09a0: 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.};..static voi
09b0: 64 20 63 6d 64 6c 69 6e 65 5f 65 72 72 6f 72 28  d cmdline_error(
09c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
09d0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
09e0: 74 20 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  t ap;           
09f0: 20 20 20 20 20 20 20 20 2f 2a 20 2e 2e 2e 20 61          /* ... a
0a00: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
0a10: 61 72 20 2a 7a 4d 73 67 20 3d 20 30 3b 0a 20 20  ar *zMsg = 0;.  
0a20: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
0a30: 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c  t);.  zMsg = sql
0a40: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
0a50: 6d 74 2c 20 61 70 29 3b 0a 20 20 66 70 72 69 6e  mt, ap);.  fprin
0a60: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
0a70: 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 73 71 6c 69  ", zMsg);.  sqli
0a80: 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a  te3_free(zMsg);.
0a90: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
0aa0: 65 78 69 74 28 2d 31 29 3b 0a 7d 0a 0a 73 74 61  exit(-1);.}..sta
0ab0: 74 69 63 20 76 6f 69 64 20 63 6d 64 6c 69 6e 65  tic void cmdline
0ac0: 5f 75 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61  _usage(const cha
0ad0: 72 20 2a 7a 50 72 67 2c 20 43 6d 64 6c 69 6e 65  r *zPrg, Cmdline
0ae0: 41 72 67 20 2a 61 70 41 72 67 29 7b 0a 20 20 69  Arg *apArg){.  i
0af0: 6e 74 20 69 3b 0a 20 20 66 70 72 69 6e 74 66 28  nt i;.  fprintf(
0b00: 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
0b10: 25 73 20 53 57 49 54 43 48 45 53 5c 6e 22 2c 20  %s SWITCHES\n", 
0b20: 7a 50 72 67 29 3b 0a 20 20 66 70 72 69 6e 74 66  zPrg);.  fprintf
0b30: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
0b40: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0b50: 2c 20 22 77 68 65 72 65 20 73 77 69 74 63 68 65  , "where switche
0b60: 73 20 61 72 65 5c 6e 22 29 3b 0a 20 20 66 6f 72  s are\n");.  for
0b70: 28 69 3d 30 3b 20 61 70 41 72 67 5b 69 5d 2e 7a  (i=0; apArg[i].z
0b80: 53 77 69 74 63 68 3b 20 69 2b 2b 29 7b 0a 20 20  Switch; i++){.  
0b90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
0ba0: 78 74 72 61 20 3d 20 22 22 3b 0a 20 20 20 20 73  xtra = "";.    s
0bb0: 77 69 74 63 68 28 20 61 70 41 72 67 5b 69 5d 2e  witch( apArg[i].
0bc0: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
0bd0: 61 73 65 20 43 4d 44 4c 49 4e 45 5f 53 54 52 49  ase CMDLINE_STRI
0be0: 4e 47 3a 20 7a 45 78 74 72 61 20 3d 20 22 53 54  NG: zExtra = "ST
0bf0: 52 49 4e 47 22 3b 20 62 72 65 61 6b 3b 0a 20 20  RING"; break;.  
0c00: 20 20 20 20 63 61 73 65 20 43 4d 44 4c 49 4e 45      case CMDLINE
0c10: 5f 49 4e 54 3a 20 7a 45 78 74 72 61 20 3d 20 22  _INT: zExtra = "
0c20: 4e 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  N"; break;.     
0c30: 20 63 61 73 65 20 43 4d 44 4c 49 4e 45 5f 42 4f   case CMDLINE_BO
0c40: 4f 4c 3a 20 7a 45 78 74 72 61 20 3d 20 22 22 3b  OL: zExtra = "";
0c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
0c60: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 7a  fault:.        z
0c70: 45 78 74 72 61 20 3d 20 22 3f 3f 3f 22 3b 0a 20  Extra = "???";. 
0c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c90: 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
0ca0: 73 74 64 65 72 72 2c 20 22 20 20 25 73 20 25 73  stderr, "  %s %s
0cb0: 5c 6e 22 2c 20 61 70 41 72 67 5b 69 5d 2e 7a 53  \n", apArg[i].zS
0cc0: 77 69 74 63 68 2c 20 7a 45 78 74 72 61 29 3b 0a  witch, zExtra);.
0cd0: 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 73 74    }.  fprintf(st
0ce0: 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20 20 65  derr, "\n");.  e
0cf0: 78 69 74 28 2d 32 29 3b 0a 7d 0a 0a 73 74 61 74  xit(-2);.}..stat
0d00: 69 63 20 63 68 61 72 20 2a 63 6d 64 6c 69 6e 65  ic char *cmdline
0d10: 5f 63 6f 6e 73 74 72 75 63 74 28 43 6d 64 6c 69  _construct(Cmdli
0d20: 6e 65 41 72 67 20 2a 61 70 41 72 67 2c 20 76 6f  neArg *apArg, vo
0d30: 69 64 20 2a 70 4f 62 6a 29 7b 0a 20 20 75 6e 73  id *pObj){.  uns
0d40: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d 20  igned char *p = 
0d50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
0d60: 70 4f 62 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 52  pObj;.  char *zR
0d70: 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 41  et = 0;.  int iA
0d80: 72 67 3b 0a 0a 20 20 66 6f 72 28 69 41 72 67 3d  rg;..  for(iArg=
0d90: 30 3b 20 61 70 41 72 67 5b 69 41 72 67 5d 2e 7a  0; apArg[iArg].z
0da0: 53 77 69 74 63 68 3b 20 69 41 72 67 2b 2b 29 7b  Switch; iArg++){
0db0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
0dc0: 2a 7a 53 70 61 63 65 20 3d 20 28 7a 52 65 74 20  *zSpace = (zRet 
0dd0: 3f 20 22 20 22 20 3a 20 22 22 29 3b 0a 20 20 20  ? " " : "");.   
0de0: 20 43 6d 64 6c 69 6e 65 41 72 67 20 2a 70 41 72   CmdlineArg *pAr
0df0: 67 20 3d 20 26 61 70 41 72 67 5b 69 41 72 67 5d  g = &apArg[iArg]
0e00: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ;..    switch( p
0e10: 41 72 67 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  Arg->eType ){.  
0e20: 20 20 20 20 63 61 73 65 20 43 4d 44 4c 49 4e 45      case CMDLINE
0e30: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
0e40: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
0e50: 2a 28 63 68 61 72 2a 2a 29 28 70 20 2b 20 70 41  *(char**)(p + pA
0e60: 72 67 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20  rg->iOffset);.  
0e70: 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c 20 29        if( zVal )
0e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 52 65 74  {.          zRet
0e90: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
0ea0: 74 66 28 22 25 7a 25 73 25 73 20 25 73 22 2c 20  tf("%z%s%s %s", 
0eb0: 7a 52 65 74 2c 20 7a 53 70 61 63 65 2c 20 70 41  zRet, zSpace, pA
0ec0: 72 67 2d 3e 7a 53 77 69 74 63 68 2c 7a 56 61 6c  rg->zSwitch,zVal
0ed0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0ef0: 20 20 7d 3b 0a 0a 20 20 20 20 20 20 63 61 73 65    };..      case
0f00: 20 43 4d 44 4c 49 4e 45 5f 49 4e 54 3a 20 7b 0a   CMDLINE_INT: {.
0f10: 20 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 73          zRet = s
0f20: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
0f30: 25 7a 25 73 25 73 20 25 64 22 2c 20 7a 52 65 74  %z%s%s %d", zRet
0f40: 2c 20 7a 53 70 61 63 65 2c 20 70 41 72 67 2d 3e  , zSpace, pArg->
0f50: 7a 53 77 69 74 63 68 2c 20 0a 20 20 20 20 20 20  zSwitch, .      
0f60: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 70 20        *(int*)(p 
0f70: 2b 20 70 41 72 67 2d 3e 69 4f 66 66 73 65 74 29  + pArg->iOffset)
0f80: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
0f90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
0fa0: 20 7d 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20   };..      case 
0fb0: 43 4d 44 4c 49 4e 45 5f 42 4f 4f 4c 3a 20 0a 20  CMDLINE_BOOL: . 
0fc0: 20 20 20 20 20 20 20 69 66 28 20 2a 28 69 6e 74         if( *(int
0fd0: 2a 29 28 70 20 2b 20 70 41 72 67 2d 3e 69 4f 66  *)(p + pArg->iOf
0fe0: 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  fset) ){.       
0ff0: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
1000: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25  3_mprintf("%z%s%
1010: 73 22 2c 20 7a 52 65 74 2c 20 7a 53 70 61 63 65  s", zRet, zSpace
1020: 2c 20 70 41 72 67 2d 3e 7a 53 77 69 74 63 68 29  , pArg->zSwitch)
1030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1050: 20 20 20 0a 20 20 20 20 20 20 64 65 66 61 75 6c     .      defaul
1060: 74 3a 0a 20 20 20 20 20 20 20 20 7a 52 65 74 20  t:.        zRet 
1070: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1080: 66 28 22 25 7a 25 73 25 73 20 3f 3f 3f 22 2c 20  f("%z%s%s ???", 
1090: 7a 52 65 74 2c 20 7a 53 70 61 63 65 2c 20 70 41  zRet, zSpace, pA
10a0: 72 67 2d 3e 7a 53 77 69 74 63 68 29 3b 0a 20 20  rg->zSwitch);.  
10b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10c0: 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69  n zRet;.}..stati
10d0: 63 20 76 6f 69 64 20 63 6d 64 6c 69 6e 65 5f 70  c void cmdline_p
10e0: 72 6f 63 65 73 73 28 0a 20 43 6d 64 6c 69 6e 65  rocess(. Cmdline
10f0: 41 72 67 20 2a 61 70 41 72 67 2c 20 0a 20 69 6e  Arg *apArg, . in
1100: 74 20 61 72 67 63 2c 0a 20 63 6f 6e 73 74 20 63  t argc,. const c
1110: 68 61 72 20 2a 2a 61 72 67 76 2c 0a 20 76 6f 69  har **argv,. voi
1120: 64 20 2a 70 4f 62 6a 0a 29 7b 0a 20 20 69 6e 74  d *pObj.){.  int
1130: 20 69 3b 0a 20 20 69 6e 74 20 69 41 72 67 3b 0a   i;.  int iArg;.
1140: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1150: 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  *p = (unsigned c
1160: 68 61 72 2a 29 70 4f 62 6a 3b 0a 0a 20 20 66 6f  har*)pObj;..  fo
1170: 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=1; i<argc; i
1180: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1190: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
11a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74  ;.    int n = st
11b0: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 6e 74  rlen(z);.    int
11c0: 20 69 4f 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 20   iOpt = -1;..   
11d0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
11e0: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
11f0: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
1200: 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n--;.    }..    
1210: 66 6f 72 28 69 41 72 67 3d 30 3b 20 61 70 41 72  for(iArg=0; apAr
1220: 67 5b 69 41 72 67 5d 2e 7a 53 77 69 74 63 68 3b  g[iArg].zSwitch;
1230: 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
1240: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
1250: 74 72 6e 69 63 6d 70 28 61 70 41 72 67 5b 69 41  trnicmp(apArg[iA
1260: 72 67 5d 2e 7a 53 77 69 74 63 68 2c 20 7a 2c 20  rg].zSwitch, z, 
1270: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  n) ){.        if
1280: 28 20 69 4f 70 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iOpt>=0 ){.   
1290: 20 20 20 20 20 20 20 63 6d 64 6c 69 6e 65 5f 65         cmdline_e
12a0: 72 72 6f 72 28 22 61 6d 62 69 67 75 6f 75 73 20  rror("ambiguous 
12b0: 73 77 69 74 63 68 3a 20 25 73 22 2c 20 7a 29 3b  switch: %s", z);
12c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12d0: 20 20 20 69 4f 70 74 20 3d 20 69 41 72 67 3b 0a     iOpt = iArg;.
12e0: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
12f0: 61 70 41 72 67 5b 69 41 72 67 5d 2e 65 54 79 70  apArg[iArg].eTyp
1300: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  e ){.          c
1310: 61 73 65 20 43 4d 44 4c 49 4e 45 5f 49 4e 54 3a  ase CMDLINE_INT:
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b  .            i++
1330: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1340: 28 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20  ( i==argc ){.   
1350: 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 6c 69             cmdli
1360: 6e 65 5f 65 72 72 6f 72 28 22 6f 70 74 69 6f 6e  ne_error("option
1370: 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
1380: 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a  ument: %s", z);.
1390: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
13a0: 20 20 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a            *(int*
13b0: 29 28 70 20 2b 20 61 70 41 72 67 5b 69 41 72 67  )(p + apArg[iArg
13c0: 5d 2e 69 4f 66 66 73 65 74 29 20 3d 20 61 74 6f  ].iOffset) = ato
13d0: 69 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  i(argv[i]);.    
13e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
13f0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 43            case C
1400: 4d 44 4c 49 4e 45 5f 53 54 52 49 4e 47 3a 0a 20  MDLINE_STRING:. 
1410: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
1420: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1430: 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20 20 20  i==argc ){.     
1440: 20 20 20 20 20 20 20 20 20 63 6d 64 6c 69 6e 65           cmdline
1450: 5f 65 72 72 6f 72 28 22 6f 70 74 69 6f 6e 20 72  _error("option r
1460: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
1470: 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ent: %s", z);.  
1480: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1490: 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
14a0: 29 28 70 20 2b 20 61 70 41 72 67 5b 69 41 72 67  )(p + apArg[iArg
14b0: 5d 2e 69 4f 66 66 73 65 74 29 20 3d 20 73 71 6c  ].iOffset) = sql
14c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
14d0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
14e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14f0: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1500: 43 4d 44 4c 49 4e 45 5f 42 4f 4f 4c 3a 0a 20 20  CMDLINE_BOOL:.  
1510: 20 20 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a            *(int*
1520: 29 28 70 20 2b 20 61 70 41 72 67 5b 69 41 72 67  )(p + apArg[iArg
1530: 5d 2e 69 4f 66 66 73 65 74 29 20 3d 20 31 3b 0a  ].iOffset) = 1;.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1550: 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 64 65  k;..          de
1560: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
1570: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
1580: 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 6c              cmdl
1590: 69 6e 65 5f 65 72 72 6f 72 28 22 69 6e 74 65 72  ine_error("inter
15a0: 6e 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20 20  nal error");.   
15b0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
15c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
15e0: 28 20 69 4f 70 74 3c 30 20 29 7b 0a 20 20 20 20  ( iOpt<0 ){.    
15f0: 20 20 63 6d 64 6c 69 6e 65 5f 75 73 61 67 65 28    cmdline_usage(
1600: 61 72 67 76 5b 30 5d 2c 20 61 70 41 72 67 29 3b  argv[0], apArg);
1610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1620: 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 6d 6d 61  .** End of comma
1630: 6e 64 20 6c 69 6e 65 20 70 72 6f 63 65 73 73 69  nd line processi
1640: 6e 67 20 75 74 69 6c 69 74 69 65 73 2e 0a 2a 2a  ng utilities..**
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1690: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a 20 2a  *******/.../*. *
16a0: 20 54 68 69 73 20 63 6f 64 65 20 69 6d 70 6c 65   This code imple
16b0: 6d 65 6e 74 73 20 74 68 65 20 4d 44 35 20 6d 65  ments the MD5 me
16c0: 73 73 61 67 65 2d 64 69 67 65 73 74 20 61 6c 67  ssage-digest alg
16d0: 6f 72 69 74 68 6d 2e 0a 20 2a 20 54 68 65 20 61  orithm.. * The a
16e0: 6c 67 6f 72 69 74 68 6d 20 69 73 20 64 75 65 20  lgorithm is due 
16f0: 74 6f 20 52 6f 6e 20 52 69 76 65 73 74 2e 20 20  to Ron Rivest.  
1700: 54 68 69 73 20 63 6f 64 65 20 77 61 73 0a 20 2a  This code was. *
1710: 20 77 72 69 74 74 65 6e 20 62 79 20 43 6f 6c 69   written by Coli
1720: 6e 20 50 6c 75 6d 62 20 69 6e 20 31 39 39 33 2c  n Plumb in 1993,
1730: 20 6e 6f 20 63 6f 70 79 72 69 67 68 74 20 69 73   no copyright is
1740: 20 63 6c 61 69 6d 65 64 2e 0a 20 2a 20 54 68 69   claimed.. * Thi
1750: 73 20 63 6f 64 65 20 69 73 20 69 6e 20 74 68 65  s code is in the
1760: 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 3b 20   public domain; 
1770: 64 6f 20 77 69 74 68 20 69 74 20 77 68 61 74 20  do with it what 
1780: 79 6f 75 20 77 69 73 68 2e 0a 20 2a 0a 20 2a 20  you wish.. *. * 
1790: 45 71 75 69 76 61 6c 65 6e 74 20 63 6f 64 65 20  Equivalent code 
17a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  is available fro
17b0: 6d 20 52 53 41 20 44 61 74 61 20 53 65 63 75 72  m RSA Data Secur
17c0: 69 74 79 2c 20 49 6e 63 2e 0a 20 2a 20 54 68 69  ity, Inc.. * Thi
17d0: 73 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  s code has been 
17e0: 74 65 73 74 65 64 20 61 67 61 69 6e 73 74 20 74  tested against t
17f0: 68 61 74 2c 20 61 6e 64 20 69 73 20 65 71 75 69  hat, and is equi
1800: 76 61 6c 65 6e 74 2c 0a 20 2a 20 65 78 63 65 70  valent,. * excep
1810: 74 20 74 68 61 74 20 79 6f 75 20 64 6f 6e 27 74  t that you don't
1820: 20 6e 65 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   need to include
1830: 20 74 77 6f 20 70 61 67 65 73 20 6f 66 20 6c 65   two pages of le
1840: 67 61 6c 65 73 65 0a 20 2a 20 77 69 74 68 20 65  galese. * with e
1850: 76 65 72 79 20 63 6f 70 79 2e 0a 20 2a 0a 20 2a  very copy.. *. *
1860: 20 54 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   To compute the 
1870: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
1880: 66 20 61 20 63 68 75 6e 6b 20 6f 66 20 62 79 74  f a chunk of byt
1890: 65 73 2c 20 64 65 63 6c 61 72 65 20 61 6e 0a 20  es, declare an. 
18a0: 2a 20 4d 44 35 43 6f 6e 74 65 78 74 20 73 74 72  * MD5Context str
18b0: 75 63 74 75 72 65 2c 20 70 61 73 73 20 69 74 20  ucture, pass it 
18c0: 74 6f 20 4d 44 35 49 6e 69 74 2c 20 63 61 6c 6c  to MD5Init, call
18d0: 20 4d 44 35 55 70 64 61 74 65 20 61 73 0a 20 2a   MD5Update as. *
18e0: 20 6e 65 65 64 65 64 20 6f 6e 20 62 75 66 66 65   needed on buffe
18f0: 72 73 20 66 75 6c 6c 20 6f 66 20 62 79 74 65 73  rs full of bytes
1900: 2c 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  , and then call 
1910: 4d 44 35 46 69 6e 61 6c 2c 20 77 68 69 63 68 0a  MD5Final, which.
1920: 20 2a 20 77 69 6c 6c 20 66 69 6c 6c 20 61 20 73   * will fill a s
1930: 75 70 70 6c 69 65 64 20 31 36 2d 62 79 74 65 20  upplied 16-byte 
1940: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 64  array with the d
1950: 69 67 65 73 74 2e 0a 20 2a 2f 0a 0a 2f 2a 0a 20  igest.. */../*. 
1960: 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 6f 6e  * If compiled on
1970: 20 61 20 6d 61 63 68 69 6e 65 20 74 68 61 74 20   a machine that 
1980: 64 6f 65 73 6e 27 74 20 68 61 76 65 20 61 20 33  doesn't have a 3
1990: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 0a 20  2-bit integer,. 
19a0: 2a 20 79 6f 75 20 6a 75 73 74 20 73 65 74 20 22  * you just set "
19b0: 75 69 6e 74 33 32 22 20 74 6f 20 74 68 65 20 61  uint32" to the a
19c0: 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 74  ppropriate datat
19d0: 79 70 65 20 66 6f 72 20 61 6e 0a 20 2a 20 75 6e  ype for an. * un
19e0: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
19f0: 74 65 67 65 72 2e 20 20 46 6f 72 20 65 78 61 6d  teger.  For exam
1a00: 70 6c 65 3a 0a 20 2a 0a 20 2a 20 20 20 20 20 20  ple:. *. *      
1a10: 20 63 63 20 2d 44 75 69 6e 74 33 32 3d 27 75 6e   cc -Duint32='un
1a20: 73 69 67 6e 65 64 20 6c 6f 6e 67 27 20 6d 64 35  signed long' md5
1a30: 2e 63 0a 20 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  .c. *. */.#ifnde
1a40: 66 20 75 69 6e 74 33 32 0a 23 20 20 64 65 66 69  f uint32.#  defi
1a50: 6e 65 20 75 69 6e 74 33 32 20 75 6e 73 69 67 6e  ne uint32 unsign
1a60: 65 64 20 69 6e 74 0a 23 65 6e 64 69 66 0a 0a 73  ed int.#endif..s
1a70: 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
1a80: 20 7b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 3b   {.  int isInit;
1a90: 0a 20 20 75 69 6e 74 33 32 20 62 75 66 5b 34 5d  .  uint32 buf[4]
1aa0: 3b 0a 20 20 75 69 6e 74 33 32 20 62 69 74 73 5b  ;.  uint32 bits[
1ab0: 32 5d 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  2];.  union {.  
1ac0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ad0: 69 6e 5b 36 34 5d 3b 0a 20 20 20 20 75 69 6e 74  in[64];.    uint
1ae0: 33 32 20 69 6e 33 32 5b 31 36 5d 3b 0a 20 20 7d  32 in32[16];.  }
1af0: 20 75 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   u;.};.typedef s
1b00: 74 72 75 63 74 20 4d 44 35 43 6f 6e 74 65 78 74  truct MD5Context
1b10: 20 4d 44 35 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a   MD5Context;../*
1b20: 0a 20 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63  . * Note: this c
1b30: 6f 64 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ode is harmless 
1b40: 6f 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  on little-endian
1b50: 20 6d 61 63 68 69 6e 65 73 2e 0a 20 2a 2f 0a 73   machines.. */.s
1b60: 74 61 74 69 63 20 76 6f 69 64 20 62 79 74 65 52  tatic void byteR
1b70: 65 76 65 72 73 65 20 28 75 6e 73 69 67 6e 65 64  everse (unsigned
1b80: 20 63 68 61 72 20 2a 62 75 66 2c 20 75 6e 73 69   char *buf, unsi
1b90: 67 6e 65 64 20 6c 6f 6e 67 73 29 7b 0a 20 20 75  gned longs){.  u
1ba0: 69 6e 74 33 32 20 74 3b 0a 20 20 64 6f 20 7b 0a  int32 t;.  do {.
1bb0: 20 20 20 20 74 20 3d 20 28 75 69 6e 74 33 32 29      t = (uint32)
1bc0: 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b 33  ((unsigned)buf[3
1bd0: 5d 3c 3c 38 20 7c 20 62 75 66 5b 32 5d 29 20 3c  ]<<8 | buf[2]) <
1be0: 3c 20 31 36 20 7c 0a 20 20 20 20 20 20 20 20 20  < 16 |.         
1bf0: 20 28 28 75 6e 73 69 67 6e 65 64 29 62 75 66 5b   ((unsigned)buf[
1c00: 31 5d 3c 3c 38 20 7c 20 62 75 66 5b 30 5d 29 3b  1]<<8 | buf[0]);
1c10: 0a 20 20 20 20 2a 28 75 69 6e 74 33 32 20 2a 29  .    *(uint32 *)
1c20: 62 75 66 20 3d 20 74 3b 0a 20 20 20 20 62 75 66  buf = t;.    buf
1c30: 20 2b 3d 20 34 3b 0a 20 20 7d 20 77 68 69 6c 65   += 4;.  } while
1c40: 20 28 2d 2d 6c 6f 6e 67 73 29 3b 0a 7d 0a 2f 2a   (--longs);.}./*
1c50: 20 54 68 65 20 66 6f 75 72 20 63 6f 72 65 20 66   The four core f
1c60: 75 6e 63 74 69 6f 6e 73 20 2d 20 46 31 20 69 73  unctions - F1 is
1c70: 20 6f 70 74 69 6d 69 7a 65 64 20 73 6f 6d 65 77   optimized somew
1c80: 68 61 74 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69  hat */../* #defi
1c90: 6e 65 20 46 31 28 78 2c 20 79 2c 20 7a 29 20 28  ne F1(x, y, z) (
1ca0: 78 20 26 20 79 20 7c 20 7e 78 20 26 20 7a 29 20  x & y | ~x & z) 
1cb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 31 28 78 2c  */.#define F1(x,
1cc0: 20 79 2c 20 7a 29 20 28 7a 20 5e 20 28 78 20 26   y, z) (z ^ (x &
1cd0: 20 28 79 20 5e 20 7a 29 29 29 0a 23 64 65 66 69   (y ^ z))).#defi
1ce0: 6e 65 20 46 32 28 78 2c 20 79 2c 20 7a 29 20 46  ne F2(x, y, z) F
1cf0: 31 28 7a 2c 20 78 2c 20 79 29 0a 23 64 65 66 69  1(z, x, y).#defi
1d00: 6e 65 20 46 33 28 78 2c 20 79 2c 20 7a 29 20 28  ne F3(x, y, z) (
1d10: 78 20 5e 20 79 20 5e 20 7a 29 0a 23 64 65 66 69  x ^ y ^ z).#defi
1d20: 6e 65 20 46 34 28 78 2c 20 79 2c 20 7a 29 20 28  ne F4(x, y, z) (
1d30: 79 20 5e 20 28 78 20 7c 20 7e 7a 29 29 0a 0a 2f  y ^ (x | ~z))../
1d40: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 65  * This is the ce
1d50: 6e 74 72 61 6c 20 73 74 65 70 20 69 6e 20 74 68  ntral step in th
1d60: 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2e  e MD5 algorithm.
1d70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 44 35 53   */.#define MD5S
1d80: 54 45 50 28 66 2c 20 77 2c 20 78 2c 20 79 2c 20  TEP(f, w, x, y, 
1d90: 7a 2c 20 64 61 74 61 2c 20 73 29 20 5c 0a 20 20  z, data, s) \.  
1da0: 28 20 77 20 2b 3d 20 66 28 78 2c 20 79 2c 20 7a  ( w += f(x, y, z
1db0: 29 20 2b 20 64 61 74 61 2c 20 20 77 20 3d 20 77  ) + data,  w = w
1dc0: 3c 3c 73 20 7c 20 77 3e 3e 28 33 32 2d 73 29 2c  <<s | w>>(32-s),
1dd0: 20 20 77 20 2b 3d 20 78 20 29 0a 0a 2f 2a 0a 20    w += x )../*. 
1de0: 2a 20 54 68 65 20 63 6f 72 65 20 6f 66 20 74 68  * The core of th
1df0: 65 20 4d 44 35 20 61 6c 67 6f 72 69 74 68 6d 2c  e MD5 algorithm,
1e00: 20 74 68 69 73 20 61 6c 74 65 72 73 20 61 6e 20   this alters an 
1e10: 65 78 69 73 74 69 6e 67 20 4d 44 35 20 68 61 73  existing MD5 has
1e20: 68 20 74 6f 0a 20 2a 20 72 65 66 6c 65 63 74 20  h to. * reflect 
1e30: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
1e40: 31 36 20 6c 6f 6e 67 77 6f 72 64 73 20 6f 66 20  16 longwords of 
1e50: 6e 65 77 20 64 61 74 61 2e 20 20 4d 44 35 55 70  new data.  MD5Up
1e60: 64 61 74 65 20 62 6c 6f 63 6b 73 0a 20 2a 20 74  date blocks. * t
1e70: 68 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e 76  he data and conv
1e80: 65 72 74 73 20 62 79 74 65 73 20 69 6e 74 6f 20  erts bytes into 
1e90: 6c 6f 6e 67 77 6f 72 64 73 20 66 6f 72 20 74 68  longwords for th
1ea0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 2a 2f 0a  is routine.. */.
1eb0: 73 74 61 74 69 63 20 76 6f 69 64 20 4d 44 35 54  static void MD5T
1ec0: 72 61 6e 73 66 6f 72 6d 28 75 69 6e 74 33 32 20  ransform(uint32 
1ed0: 62 75 66 5b 34 5d 2c 20 63 6f 6e 73 74 20 75 69  buf[4], const ui
1ee0: 6e 74 33 32 20 69 6e 5b 31 36 5d 29 7b 0a 20 20  nt32 in[16]){.  
1ef0: 72 65 67 69 73 74 65 72 20 75 69 6e 74 33 32 20  register uint32 
1f00: 61 2c 20 62 2c 20 63 2c 20 64 3b 0a 0a 20 20 61  a, b, c, d;..  a
1f10: 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 62 20 3d   = buf[0];.  b =
1f20: 20 62 75 66 5b 31 5d 3b 0a 20 20 63 20 3d 20 62   buf[1];.  c = b
1f30: 75 66 5b 32 5d 3b 0a 20 20 64 20 3d 20 62 75 66  uf[2];.  d = buf
1f40: 5b 33 5d 3b 0a 0a 20 20 4d 44 35 53 54 45 50 28  [3];..  MD5STEP(
1f50: 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F1, a, b, c, d, 
1f60: 69 6e 5b 20 30 5d 2b 30 78 64 37 36 61 61 34 37  in[ 0]+0xd76aa47
1f70: 38 2c 20 20 37 29 3b 0a 20 20 4d 44 35 53 54 45  8,  7);.  MD5STE
1f80: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
1f90: 2c 20 69 6e 5b 20 31 5d 2b 30 78 65 38 63 37 62  , in[ 1]+0xe8c7b
1fa0: 37 35 36 2c 20 31 32 29 3b 0a 20 20 4d 44 35 53  756, 12);.  MD5S
1fb0: 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
1fc0: 20 62 2c 20 69 6e 5b 20 32 5d 2b 30 78 32 34 32   b, in[ 2]+0x242
1fd0: 30 37 30 64 62 2c 20 31 37 29 3b 0a 20 20 4d 44  070db, 17);.  MD
1fe0: 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20  5STEP(F1, b, c, 
1ff0: 64 2c 20 61 2c 20 69 6e 5b 20 33 5d 2b 30 78 63  d, a, in[ 3]+0xc
2000: 31 62 64 63 65 65 65 2c 20 32 32 29 3b 0a 20 20  1bdceee, 22);.  
2010: 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
2020: 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34 5d 2b 30  , c, d, in[ 4]+0
2030: 78 66 35 37 63 30 66 61 66 2c 20 20 37 29 3b 0a  xf57c0faf,  7);.
2040: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
2050: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 35 5d   a, b, c, in[ 5]
2060: 2b 30 78 34 37 38 37 63 36 32 61 2c 20 31 32 29  +0x4787c62a, 12)
2070: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20  ;.  MD5STEP(F1, 
2080: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 20  c, d, a, b, in[ 
2090: 36 5d 2b 30 78 61 38 33 30 34 36 31 33 2c 20 31  6]+0xa8304613, 1
20a0: 37 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31  7);.  MD5STEP(F1
20b0: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
20c0: 5b 20 37 5d 2b 30 78 66 64 34 36 39 35 30 31 2c  [ 7]+0xfd469501,
20d0: 20 32 32 29 3b 0a 20 20 4d 44 35 53 54 45 50 28   22);.  MD5STEP(
20e0: 46 31 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c 20  F1, a, b, c, d, 
20f0: 69 6e 5b 20 38 5d 2b 30 78 36 39 38 30 39 38 64  in[ 8]+0x698098d
2100: 38 2c 20 20 37 29 3b 0a 20 20 4d 44 35 53 54 45  8,  7);.  MD5STE
2110: 50 28 46 31 2c 20 64 2c 20 61 2c 20 62 2c 20 63  P(F1, d, a, b, c
2120: 2c 20 69 6e 5b 20 39 5d 2b 30 78 38 62 34 34 66  , in[ 9]+0x8b44f
2130: 37 61 66 2c 20 31 32 29 3b 0a 20 20 4d 44 35 53  7af, 12);.  MD5S
2140: 54 45 50 28 46 31 2c 20 63 2c 20 64 2c 20 61 2c  TEP(F1, c, d, a,
2150: 20 62 2c 20 69 6e 5b 31 30 5d 2b 30 78 66 66 66   b, in[10]+0xfff
2160: 66 35 62 62 31 2c 20 31 37 29 3b 0a 20 20 4d 44  f5bb1, 17);.  MD
2170: 35 53 54 45 50 28 46 31 2c 20 62 2c 20 63 2c 20  5STEP(F1, b, c, 
2180: 64 2c 20 61 2c 20 69 6e 5b 31 31 5d 2b 30 78 38  d, a, in[11]+0x8
2190: 39 35 63 64 37 62 65 2c 20 32 32 29 3b 0a 20 20  95cd7be, 22);.  
21a0: 4d 44 35 53 54 45 50 28 46 31 2c 20 61 2c 20 62  MD5STEP(F1, a, b
21b0: 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32 5d 2b 30  , c, d, in[12]+0
21c0: 78 36 62 39 30 31 31 32 32 2c 20 20 37 29 3b 0a  x6b901122,  7);.
21d0: 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20 64 2c    MD5STEP(F1, d,
21e0: 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 33 5d   a, b, c, in[13]
21f0: 2b 30 78 66 64 39 38 37 31 39 33 2c 20 31 32 29  +0xfd987193, 12)
2200: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31 2c 20  ;.  MD5STEP(F1, 
2210: 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b 31  c, d, a, b, in[1
2220: 34 5d 2b 30 78 61 36 37 39 34 33 38 65 2c 20 31  4]+0xa679438e, 1
2230: 37 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 31  7);.  MD5STEP(F1
2240: 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69 6e  , b, c, d, a, in
2250: 5b 31 35 5d 2b 30 78 34 39 62 34 30 38 32 31 2c  [15]+0x49b40821,
2260: 20 32 32 29 3b 0a 0a 20 20 4d 44 35 53 54 45 50   22);..  MD5STEP
2270: 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F2, a, b, c, d,
2280: 20 69 6e 5b 20 31 5d 2b 30 78 66 36 31 65 32 35   in[ 1]+0xf61e25
2290: 36 32 2c 20 20 35 29 3b 0a 20 20 4d 44 35 53 54  62,  5);.  MD5ST
22a0: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
22b0: 63 2c 20 69 6e 5b 20 36 5d 2b 30 78 63 30 34 30  c, in[ 6]+0xc040
22c0: 62 33 34 30 2c 20 20 39 29 3b 0a 20 20 4d 44 35  b340,  9);.  MD5
22d0: 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
22e0: 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 32 36  , b, in[11]+0x26
22f0: 35 65 35 61 35 31 2c 20 31 34 29 3b 0a 20 20 4d  5e5a51, 14);.  M
2300: 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c  D5STEP(F2, b, c,
2310: 20 64 2c 20 61 2c 20 69 6e 5b 20 30 5d 2b 30 78   d, a, in[ 0]+0x
2320: 65 39 62 36 63 37 61 61 2c 20 32 30 29 3b 0a 20  e9b6c7aa, 20);. 
2330: 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
2340: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 35 5d 2b  b, c, d, in[ 5]+
2350: 30 78 64 36 32 66 31 30 35 64 2c 20 20 35 29 3b  0xd62f105d,  5);
2360: 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64  .  MD5STEP(F2, d
2370: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31 30  , a, b, c, in[10
2380: 5d 2b 30 78 30 32 34 34 31 34 35 33 2c 20 20 39  ]+0x02441453,  9
2390: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c  );.  MD5STEP(F2,
23a0: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
23b0: 31 35 5d 2b 30 78 64 38 61 31 65 36 38 31 2c 20  15]+0xd8a1e681, 
23c0: 31 34 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  14);.  MD5STEP(F
23d0: 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
23e0: 6e 5b 20 34 5d 2b 30 78 65 37 64 33 66 62 63 38  n[ 4]+0xe7d3fbc8
23f0: 2c 20 32 30 29 3b 0a 20 20 4d 44 35 53 54 45 50  , 20);.  MD5STEP
2400: 28 46 32 2c 20 61 2c 20 62 2c 20 63 2c 20 64 2c  (F2, a, b, c, d,
2410: 20 69 6e 5b 20 39 5d 2b 30 78 32 31 65 31 63 64   in[ 9]+0x21e1cd
2420: 65 36 2c 20 20 35 29 3b 0a 20 20 4d 44 35 53 54  e6,  5);.  MD5ST
2430: 45 50 28 46 32 2c 20 64 2c 20 61 2c 20 62 2c 20  EP(F2, d, a, b, 
2440: 63 2c 20 69 6e 5b 31 34 5d 2b 30 78 63 33 33 37  c, in[14]+0xc337
2450: 30 37 64 36 2c 20 20 39 29 3b 0a 20 20 4d 44 35  07d6,  9);.  MD5
2460: 53 54 45 50 28 46 32 2c 20 63 2c 20 64 2c 20 61  STEP(F2, c, d, a
2470: 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 66 34  , b, in[ 3]+0xf4
2480: 64 35 30 64 38 37 2c 20 31 34 29 3b 0a 20 20 4d  d50d87, 14);.  M
2490: 44 35 53 54 45 50 28 46 32 2c 20 62 2c 20 63 2c  D5STEP(F2, b, c,
24a0: 20 64 2c 20 61 2c 20 69 6e 5b 20 38 5d 2b 30 78   d, a, in[ 8]+0x
24b0: 34 35 35 61 31 34 65 64 2c 20 32 30 29 3b 0a 20  455a14ed, 20);. 
24c0: 20 4d 44 35 53 54 45 50 28 46 32 2c 20 61 2c 20   MD5STEP(F2, a, 
24d0: 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 33 5d 2b  b, c, d, in[13]+
24e0: 30 78 61 39 65 33 65 39 30 35 2c 20 20 35 29 3b  0xa9e3e905,  5);
24f0: 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c 20 64  .  MD5STEP(F2, d
2500: 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20 32  , a, b, c, in[ 2
2510: 5d 2b 30 78 66 63 65 66 61 33 66 38 2c 20 20 39  ]+0xfcefa3f8,  9
2520: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 32 2c  );.  MD5STEP(F2,
2530: 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e 5b   c, d, a, b, in[
2540: 20 37 5d 2b 30 78 36 37 36 66 30 32 64 39 2c 20   7]+0x676f02d9, 
2550: 31 34 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  14);.  MD5STEP(F
2560: 32 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20 69  2, b, c, d, a, i
2570: 6e 5b 31 32 5d 2b 30 78 38 64 32 61 34 63 38 61  n[12]+0x8d2a4c8a
2580: 2c 20 32 30 29 3b 0a 0a 20 20 4d 44 35 53 54 45  , 20);..  MD5STE
2590: 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F3, a, b, c, d
25a0: 2c 20 69 6e 5b 20 35 5d 2b 30 78 66 66 66 61 33  , in[ 5]+0xfffa3
25b0: 39 34 32 2c 20 20 34 29 3b 0a 20 20 4d 44 35 53  942,  4);.  MD5S
25c0: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
25d0: 20 63 2c 20 69 6e 5b 20 38 5d 2b 30 78 38 37 37   c, in[ 8]+0x877
25e0: 31 66 36 38 31 2c 20 31 31 29 3b 0a 20 20 4d 44  1f681, 11);.  MD
25f0: 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
2600: 61 2c 20 62 2c 20 69 6e 5b 31 31 5d 2b 30 78 36  a, b, in[11]+0x6
2610: 64 39 64 36 31 32 32 2c 20 31 36 29 3b 0a 20 20  d9d6122, 16);.  
2620: 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63  MD5STEP(F3, b, c
2630: 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 34 5d 2b 30  , d, a, in[14]+0
2640: 78 66 64 65 35 33 38 30 63 2c 20 32 33 29 3b 0a  xfde5380c, 23);.
2650: 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
2660: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 31 5d   b, c, d, in[ 1]
2670: 2b 30 78 61 34 62 65 65 61 34 34 2c 20 20 34 29  +0xa4beea44,  4)
2680: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20  ;.  MD5STEP(F3, 
2690: 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 20  d, a, b, c, in[ 
26a0: 34 5d 2b 30 78 34 62 64 65 63 66 61 39 2c 20 31  4]+0x4bdecfa9, 1
26b0: 31 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33  1);.  MD5STEP(F3
26c0: 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
26d0: 5b 20 37 5d 2b 30 78 66 36 62 62 34 62 36 30 2c  [ 7]+0xf6bb4b60,
26e0: 20 31 36 29 3b 0a 20 20 4d 44 35 53 54 45 50 28   16);.  MD5STEP(
26f0: 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
2700: 69 6e 5b 31 30 5d 2b 30 78 62 65 62 66 62 63 37  in[10]+0xbebfbc7
2710: 30 2c 20 32 33 29 3b 0a 20 20 4d 44 35 53 54 45  0, 23);.  MD5STE
2720: 50 28 46 33 2c 20 61 2c 20 62 2c 20 63 2c 20 64  P(F3, a, b, c, d
2730: 2c 20 69 6e 5b 31 33 5d 2b 30 78 32 38 39 62 37  , in[13]+0x289b7
2740: 65 63 36 2c 20 20 34 29 3b 0a 20 20 4d 44 35 53  ec6,  4);.  MD5S
2750: 54 45 50 28 46 33 2c 20 64 2c 20 61 2c 20 62 2c  TEP(F3, d, a, b,
2760: 20 63 2c 20 69 6e 5b 20 30 5d 2b 30 78 65 61 61   c, in[ 0]+0xeaa
2770: 31 32 37 66 61 2c 20 31 31 29 3b 0a 20 20 4d 44  127fa, 11);.  MD
2780: 35 53 54 45 50 28 46 33 2c 20 63 2c 20 64 2c 20  5STEP(F3, c, d, 
2790: 61 2c 20 62 2c 20 69 6e 5b 20 33 5d 2b 30 78 64  a, b, in[ 3]+0xd
27a0: 34 65 66 33 30 38 35 2c 20 31 36 29 3b 0a 20 20  4ef3085, 16);.  
27b0: 4d 44 35 53 54 45 50 28 46 33 2c 20 62 2c 20 63  MD5STEP(F3, b, c
27c0: 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 36 5d 2b 30  , d, a, in[ 6]+0
27d0: 78 30 34 38 38 31 64 30 35 2c 20 32 33 29 3b 0a  x04881d05, 23);.
27e0: 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20 61 2c    MD5STEP(F3, a,
27f0: 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 39 5d   b, c, d, in[ 9]
2800: 2b 30 78 64 39 64 34 64 30 33 39 2c 20 20 34 29  +0xd9d4d039,  4)
2810: 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33 2c 20  ;.  MD5STEP(F3, 
2820: 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b 31  d, a, b, c, in[1
2830: 32 5d 2b 30 78 65 36 64 62 39 39 65 35 2c 20 31  2]+0xe6db99e5, 1
2840: 31 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 33  1);.  MD5STEP(F3
2850: 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69 6e  , c, d, a, b, in
2860: 5b 31 35 5d 2b 30 78 31 66 61 32 37 63 66 38 2c  [15]+0x1fa27cf8,
2870: 20 31 36 29 3b 0a 20 20 4d 44 35 53 54 45 50 28   16);.  MD5STEP(
2880: 46 33 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c 20  F3, b, c, d, a, 
2890: 69 6e 5b 20 32 5d 2b 30 78 63 34 61 63 35 36 36  in[ 2]+0xc4ac566
28a0: 35 2c 20 32 33 29 3b 0a 0a 20 20 4d 44 35 53 54  5, 23);..  MD5ST
28b0: 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F4, a, b, c, 
28c0: 64 2c 20 69 6e 5b 20 30 5d 2b 30 78 66 34 32 39  d, in[ 0]+0xf429
28d0: 32 32 34 34 2c 20 20 36 29 3b 0a 20 20 4d 44 35  2244,  6);.  MD5
28e0: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
28f0: 2c 20 63 2c 20 69 6e 5b 20 37 5d 2b 30 78 34 33  , c, in[ 7]+0x43
2900: 32 61 66 66 39 37 2c 20 31 30 29 3b 0a 20 20 4d  2aff97, 10);.  M
2910: 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
2920: 20 61 2c 20 62 2c 20 69 6e 5b 31 34 5d 2b 30 78   a, b, in[14]+0x
2930: 61 62 39 34 32 33 61 37 2c 20 31 35 29 3b 0a 20  ab9423a7, 15);. 
2940: 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20   MD5STEP(F4, b, 
2950: 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 20 35 5d 2b  c, d, a, in[ 5]+
2960: 30 78 66 63 39 33 61 30 33 39 2c 20 32 31 29 3b  0xfc93a039, 21);
2970: 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61  .  MD5STEP(F4, a
2980: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 31 32  , b, c, d, in[12
2990: 5d 2b 30 78 36 35 35 62 35 39 63 33 2c 20 20 36  ]+0x655b59c3,  6
29a0: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c  );.  MD5STEP(F4,
29b0: 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
29c0: 20 33 5d 2b 30 78 38 66 30 63 63 63 39 32 2c 20   3]+0x8f0ccc92, 
29d0: 31 30 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  10);.  MD5STEP(F
29e0: 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
29f0: 6e 5b 31 30 5d 2b 30 78 66 66 65 66 66 34 37 64  n[10]+0xffeff47d
2a00: 2c 20 31 35 29 3b 0a 20 20 4d 44 35 53 54 45 50  , 15);.  MD5STEP
2a10: 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
2a20: 20 69 6e 5b 20 31 5d 2b 30 78 38 35 38 34 35 64   in[ 1]+0x85845d
2a30: 64 31 2c 20 32 31 29 3b 0a 20 20 4d 44 35 53 54  d1, 21);.  MD5ST
2a40: 45 50 28 46 34 2c 20 61 2c 20 62 2c 20 63 2c 20  EP(F4, a, b, c, 
2a50: 64 2c 20 69 6e 5b 20 38 5d 2b 30 78 36 66 61 38  d, in[ 8]+0x6fa8
2a60: 37 65 34 66 2c 20 20 36 29 3b 0a 20 20 4d 44 35  7e4f,  6);.  MD5
2a70: 53 54 45 50 28 46 34 2c 20 64 2c 20 61 2c 20 62  STEP(F4, d, a, b
2a80: 2c 20 63 2c 20 69 6e 5b 31 35 5d 2b 30 78 66 65  , c, in[15]+0xfe
2a90: 32 63 65 36 65 30 2c 20 31 30 29 3b 0a 20 20 4d  2ce6e0, 10);.  M
2aa0: 44 35 53 54 45 50 28 46 34 2c 20 63 2c 20 64 2c  D5STEP(F4, c, d,
2ab0: 20 61 2c 20 62 2c 20 69 6e 5b 20 36 5d 2b 30 78   a, b, in[ 6]+0x
2ac0: 61 33 30 31 34 33 31 34 2c 20 31 35 29 3b 0a 20  a3014314, 15);. 
2ad0: 20 4d 44 35 53 54 45 50 28 46 34 2c 20 62 2c 20   MD5STEP(F4, b, 
2ae0: 63 2c 20 64 2c 20 61 2c 20 69 6e 5b 31 33 5d 2b  c, d, a, in[13]+
2af0: 30 78 34 65 30 38 31 31 61 31 2c 20 32 31 29 3b  0x4e0811a1, 21);
2b00: 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c 20 61  .  MD5STEP(F4, a
2b10: 2c 20 62 2c 20 63 2c 20 64 2c 20 69 6e 5b 20 34  , b, c, d, in[ 4
2b20: 5d 2b 30 78 66 37 35 33 37 65 38 32 2c 20 20 36  ]+0xf7537e82,  6
2b30: 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46 34 2c  );.  MD5STEP(F4,
2b40: 20 64 2c 20 61 2c 20 62 2c 20 63 2c 20 69 6e 5b   d, a, b, c, in[
2b50: 31 31 5d 2b 30 78 62 64 33 61 66 32 33 35 2c 20  11]+0xbd3af235, 
2b60: 31 30 29 3b 0a 20 20 4d 44 35 53 54 45 50 28 46  10);.  MD5STEP(F
2b70: 34 2c 20 63 2c 20 64 2c 20 61 2c 20 62 2c 20 69  4, c, d, a, b, i
2b80: 6e 5b 20 32 5d 2b 30 78 32 61 64 37 64 32 62 62  n[ 2]+0x2ad7d2bb
2b90: 2c 20 31 35 29 3b 0a 20 20 4d 44 35 53 54 45 50  , 15);.  MD5STEP
2ba0: 28 46 34 2c 20 62 2c 20 63 2c 20 64 2c 20 61 2c  (F4, b, c, d, a,
2bb0: 20 69 6e 5b 20 39 5d 2b 30 78 65 62 38 36 64 33   in[ 9]+0xeb86d3
2bc0: 39 31 2c 20 32 31 29 3b 0a 0a 20 20 62 75 66 5b  91, 21);..  buf[
2bd0: 30 5d 20 2b 3d 20 61 3b 0a 20 20 62 75 66 5b 31  0] += a;.  buf[1
2be0: 5d 20 2b 3d 20 62 3b 0a 20 20 62 75 66 5b 32 5d  ] += b;.  buf[2]
2bf0: 20 2b 3d 20 63 3b 0a 20 20 62 75 66 5b 33 5d 20   += c;.  buf[3] 
2c00: 2b 3d 20 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  += d;.}../*. * S
2c10: 74 61 72 74 20 4d 44 35 20 61 63 63 75 6d 75 6c  tart MD5 accumul
2c20: 61 74 69 6f 6e 2e 20 20 53 65 74 20 62 69 74 20  ation.  Set bit 
2c30: 63 6f 75 6e 74 20 74 6f 20 30 20 61 6e 64 20 62  count to 0 and b
2c40: 75 66 66 65 72 20 74 6f 20 6d 79 73 74 65 72 69  uffer to mysteri
2c50: 6f 75 73 0a 20 2a 20 69 6e 69 74 69 61 6c 69 7a  ous. * initializ
2c60: 61 74 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 2e  ation constants.
2c70: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
2c80: 20 4d 44 35 49 6e 69 74 28 4d 44 35 43 6f 6e 74   MD5Init(MD5Cont
2c90: 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 63 74 78  ext *ctx){.  ctx
2ca0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
2cb0: 63 74 78 2d 3e 62 75 66 5b 30 5d 20 3d 20 30 78  ctx->buf[0] = 0x
2cc0: 36 37 34 35 32 33 30 31 3b 0a 20 20 63 74 78 2d  67452301;.  ctx-
2cd0: 3e 62 75 66 5b 31 5d 20 3d 20 30 78 65 66 63 64  >buf[1] = 0xefcd
2ce0: 61 62 38 39 3b 0a 20 20 63 74 78 2d 3e 62 75 66  ab89;.  ctx->buf
2cf0: 5b 32 5d 20 3d 20 30 78 39 38 62 61 64 63 66 65  [2] = 0x98badcfe
2d00: 3b 0a 20 20 63 74 78 2d 3e 62 75 66 5b 33 5d 20  ;.  ctx->buf[3] 
2d10: 3d 20 30 78 31 30 33 32 35 34 37 36 3b 0a 20 20  = 0x10325476;.  
2d20: 63 74 78 2d 3e 62 69 74 73 5b 30 5d 20 3d 20 30  ctx->bits[0] = 0
2d30: 3b 0a 20 20 63 74 78 2d 3e 62 69 74 73 5b 31 5d  ;.  ctx->bits[1]
2d40: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 55   = 0;.}../*. * U
2d50: 70 64 61 74 65 20 63 6f 6e 74 65 78 74 20 74 6f  pdate context to
2d60: 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 6f 6e   reflect the con
2d70: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  catenation of an
2d80: 6f 74 68 65 72 20 62 75 66 66 65 72 20 66 75 6c  other buffer ful
2d90: 6c 0a 20 2a 20 6f 66 20 62 79 74 65 73 2e 0a 20  l. * of bytes.. 
2da0: 2a 2f 0a 73 74 61 74 69 63 20 0a 76 6f 69 64 20  */.static .void 
2db0: 4d 44 35 55 70 64 61 74 65 28 4d 44 35 43 6f 6e  MD5Update(MD5Con
2dc0: 74 65 78 74 20 2a 63 74 78 2c 20 63 6f 6e 73 74  text *ctx, const
2dd0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2de0: 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  buf, unsigned in
2df0: 74 20 6c 65 6e 29 7b 0a 20 20 75 69 6e 74 33 32  t len){.  uint32
2e00: 20 74 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65   t;..  /* Update
2e10: 20 62 69 74 63 6f 75 6e 74 20 2a 2f 0a 0a 20 20   bitcount */..  
2e20: 74 20 3d 20 63 74 78 2d 3e 62 69 74 73 5b 30 5d  t = ctx->bits[0]
2e30: 3b 0a 20 20 69 66 20 28 28 63 74 78 2d 3e 62 69  ;.  if ((ctx->bi
2e40: 74 73 5b 30 5d 20 3d 20 74 20 2b 20 28 28 75 69  ts[0] = t + ((ui
2e50: 6e 74 33 32 29 6c 65 6e 20 3c 3c 20 33 29 29 20  nt32)len << 3)) 
2e60: 3c 20 74 29 0a 20 20 20 20 63 74 78 2d 3e 62 69  < t).    ctx->bi
2e70: 74 73 5b 31 5d 2b 2b 3b 20 2f 2a 20 43 61 72 72  ts[1]++; /* Carr
2e80: 79 20 66 72 6f 6d 20 6c 6f 77 20 74 6f 20 68 69  y from low to hi
2e90: 67 68 20 2a 2f 0a 20 20 63 74 78 2d 3e 62 69 74  gh */.  ctx->bit
2ea0: 73 5b 31 5d 20 2b 3d 20 6c 65 6e 20 3e 3e 20 32  s[1] += len >> 2
2eb0: 39 3b 0a 0a 20 20 74 20 3d 20 28 74 20 3e 3e 20  9;..  t = (t >> 
2ec0: 33 29 20 26 20 30 78 33 66 3b 20 20 20 20 2f 2a  3) & 0x3f;    /*
2ed0: 20 42 79 74 65 73 20 61 6c 72 65 61 64 79 20 69   Bytes already i
2ee0: 6e 20 73 68 73 49 6e 66 6f 2d 3e 64 61 74 61 20  n shsInfo->data 
2ef0: 2a 2f 0a 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  */..  /* Handle 
2f00: 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f 64 64 2d  any leading odd-
2f10: 73 69 7a 65 64 20 63 68 75 6e 6b 73 20 2a 2f 0a  sized chunks */.
2f20: 0a 20 20 69 66 20 28 20 74 20 29 20 7b 0a 20 20  .  if ( t ) {.  
2f30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2f40: 2a 70 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  *p = (unsigned c
2f50: 68 61 72 20 2a 29 63 74 78 2d 3e 75 2e 69 6e 20  har *)ctx->u.in 
2f60: 2b 20 74 3b 0a 0a 20 20 20 20 74 20 3d 20 36 34  + t;..    t = 64
2f70: 2d 74 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  -t;.    if (len 
2f80: 3c 20 74 29 20 7b 0a 20 20 20 20 20 20 6d 65 6d  < t) {.      mem
2f90: 63 70 79 28 70 2c 20 62 75 66 2c 20 6c 65 6e 29  cpy(p, buf, len)
2fa0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2fb0: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
2fc0: 28 70 2c 20 62 75 66 2c 20 74 29 3b 0a 20 20 20  (p, buf, t);.   
2fd0: 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
2fe0: 2d 3e 75 2e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  ->u.in, 16);.   
2ff0: 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
3000: 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
3010: 2a 29 63 74 78 2d 3e 75 2e 69 6e 29 3b 0a 20 20  *)ctx->u.in);.  
3020: 20 20 62 75 66 20 2b 3d 20 74 3b 0a 20 20 20 20    buf += t;.    
3030: 6c 65 6e 20 2d 3d 20 74 3b 0a 20 20 7d 0a 0a 20  len -= t;.  }.. 
3040: 20 2f 2a 20 50 72 6f 63 65 73 73 20 64 61 74 61   /* Process data
3050: 20 69 6e 20 36 34 2d 62 79 74 65 20 63 68 75 6e   in 64-byte chun
3060: 6b 73 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 20 28  ks */..  while (
3070: 6c 65 6e 20 3e 3d 20 36 34 29 20 7b 0a 20 20 20  len >= 64) {.   
3080: 20 6d 65 6d 63 70 79 28 63 74 78 2d 3e 75 2e 69   memcpy(ctx->u.i
3090: 6e 2c 20 62 75 66 2c 20 36 34 29 3b 0a 20 20 20  n, buf, 64);.   
30a0: 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74 78   byteReverse(ctx
30b0: 2d 3e 75 2e 69 6e 2c 20 31 36 29 3b 0a 20 20 20  ->u.in, 16);.   
30c0: 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63 74   MD5Transform(ct
30d0: 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32 20  x->buf, (uint32 
30e0: 2a 29 63 74 78 2d 3e 75 2e 69 6e 29 3b 0a 20 20  *)ctx->u.in);.  
30f0: 20 20 62 75 66 20 2b 3d 20 36 34 3b 0a 20 20 20    buf += 64;.   
3100: 20 6c 65 6e 20 2d 3d 20 36 34 3b 0a 20 20 7d 0a   len -= 64;.  }.
3110: 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 61 6e 79  .  /* Handle any
3120: 20 72 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73   remaining bytes
3130: 20 6f 66 20 64 61 74 61 2e 20 2a 2f 0a 0a 20 20   of data. */..  
3140: 6d 65 6d 63 70 79 28 63 74 78 2d 3e 75 2e 69 6e  memcpy(ctx->u.in
3150: 2c 20 62 75 66 2c 20 6c 65 6e 29 3b 0a 7d 0a 0a  , buf, len);.}..
3160: 2f 2a 0a 20 2a 20 46 69 6e 61 6c 20 77 72 61 70  /*. * Final wrap
3170: 75 70 20 2d 20 70 61 64 20 74 6f 20 36 34 2d 62  up - pad to 64-b
3180: 79 74 65 20 62 6f 75 6e 64 61 72 79 20 77 69 74  yte boundary wit
3190: 68 20 74 68 65 20 62 69 74 20 70 61 74 74 65 72  h the bit patter
31a0: 6e 20 0a 20 2a 20 31 20 30 2a 20 28 36 34 2d 62  n . * 1 0* (64-b
31b0: 69 74 20 63 6f 75 6e 74 20 6f 66 20 62 69 74 73  it count of bits
31c0: 20 70 72 6f 63 65 73 73 65 64 2c 20 4d 53 42 2d   processed, MSB-
31d0: 66 69 72 73 74 29 0a 20 2a 2f 0a 73 74 61 74 69  first). */.stati
31e0: 63 20 76 6f 69 64 20 4d 44 35 46 69 6e 61 6c 28  c void MD5Final(
31f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 69  unsigned char di
3200: 67 65 73 74 5b 31 36 5d 2c 20 4d 44 35 43 6f 6e  gest[16], MD5Con
3210: 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 75 6e  text *ctx){.  un
3220: 73 69 67 6e 65 64 20 63 6f 75 6e 74 3b 0a 20 20  signed count;.  
3230: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
3240: 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
3250: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
3260: 6d 6f 64 20 36 34 20 2a 2f 0a 20 20 63 6f 75 6e  mod 64 */.  coun
3270: 74 20 3d 20 28 63 74 78 2d 3e 62 69 74 73 5b 30  t = (ctx->bits[0
3280: 5d 20 3e 3e 20 33 29 20 26 20 30 78 33 46 3b 0a  ] >> 3) & 0x3F;.
3290: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
32a0: 72 73 74 20 63 68 61 72 20 6f 66 20 70 61 64 64  rst char of padd
32b0: 69 6e 67 20 74 6f 20 30 78 38 30 2e 20 20 54 68  ing to 0x80.  Th
32c0: 69 73 20 69 73 20 73 61 66 65 20 73 69 6e 63 65  is is safe since
32d0: 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 61   there is.     a
32e0: 6c 77 61 79 73 20 61 74 20 6c 65 61 73 74 20 6f  lways at least o
32f0: 6e 65 20 62 79 74 65 20 66 72 65 65 20 2a 2f 0a  ne byte free */.
3300: 20 20 70 20 3d 20 63 74 78 2d 3e 75 2e 69 6e 20    p = ctx->u.in 
3310: 2b 20 63 6f 75 6e 74 3b 0a 20 20 2a 70 2b 2b 20  + count;.  *p++ 
3320: 3d 20 30 78 38 30 3b 0a 0a 20 20 2f 2a 20 42 79  = 0x80;..  /* By
3330: 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 6e  tes of padding n
3340: 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 36 34  eeded to make 64
3350: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 75 6e   bytes */.  coun
3360: 74 20 3d 20 36 34 20 2d 20 31 20 2d 20 63 6f 75  t = 64 - 1 - cou
3370: 6e 74 3b 0a 0a 20 20 2f 2a 20 50 61 64 20 6f 75  nt;..  /* Pad ou
3380: 74 20 74 6f 20 35 36 20 6d 6f 64 20 36 34 20 2a  t to 56 mod 64 *
3390: 2f 0a 20 20 69 66 20 28 63 6f 75 6e 74 20 3c 20  /.  if (count < 
33a0: 38 29 20 7b 0a 20 20 20 20 2f 2a 20 54 77 6f 20  8) {.    /* Two 
33b0: 6c 6f 74 73 20 6f 66 20 70 61 64 64 69 6e 67 3a  lots of padding:
33c0: 20 20 50 61 64 20 74 68 65 20 66 69 72 73 74 20    Pad the first 
33d0: 62 6c 6f 63 6b 20 74 6f 20 36 34 20 62 79 74 65  block to 64 byte
33e0: 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
33f0: 70 2c 20 30 2c 20 63 6f 75 6e 74 29 3b 0a 20 20  p, 0, count);.  
3400: 20 20 62 79 74 65 52 65 76 65 72 73 65 28 63 74    byteReverse(ct
3410: 78 2d 3e 75 2e 69 6e 2c 20 31 36 29 3b 0a 20 20  x->u.in, 16);.  
3420: 20 20 4d 44 35 54 72 61 6e 73 66 6f 72 6d 28 63    MD5Transform(c
3430: 74 78 2d 3e 62 75 66 2c 20 28 75 69 6e 74 33 32  tx->buf, (uint32
3440: 20 2a 29 63 74 78 2d 3e 75 2e 69 6e 29 3b 0a 0a   *)ctx->u.in);..
3450: 20 20 20 20 2f 2a 20 4e 6f 77 20 66 69 6c 6c 20      /* Now fill 
3460: 74 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 77  the next block w
3470: 69 74 68 20 35 36 20 62 79 74 65 73 20 2a 2f 0a  ith 56 bytes */.
3480: 20 20 20 20 6d 65 6d 73 65 74 28 63 74 78 2d 3e      memset(ctx->
3490: 75 2e 69 6e 2c 20 30 2c 20 35 36 29 3b 0a 20 20  u.in, 0, 56);.  
34a0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
34b0: 50 61 64 20 62 6c 6f 63 6b 20 74 6f 20 35 36 20  Pad block to 56 
34c0: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  bytes */.    mem
34d0: 73 65 74 28 70 2c 20 30 2c 20 63 6f 75 6e 74 2d  set(p, 0, count-
34e0: 38 29 3b 0a 20 20 7d 0a 20 20 62 79 74 65 52 65  8);.  }.  byteRe
34f0: 76 65 72 73 65 28 63 74 78 2d 3e 75 2e 69 6e 2c  verse(ctx->u.in,
3500: 20 31 34 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65   14);..  /* Appe
3510: 6e 64 20 6c 65 6e 67 74 68 20 69 6e 20 62 69 74  nd length in bit
3520: 73 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20  s and transform 
3530: 2a 2f 0a 20 20 63 74 78 2d 3e 75 2e 69 6e 33 32  */.  ctx->u.in32
3540: 5b 31 34 5d 20 3d 20 63 74 78 2d 3e 62 69 74 73  [14] = ctx->bits
3550: 5b 30 5d 3b 0a 20 20 63 74 78 2d 3e 75 2e 69 6e  [0];.  ctx->u.in
3560: 33 32 5b 31 35 5d 20 3d 20 63 74 78 2d 3e 62 69  32[15] = ctx->bi
3570: 74 73 5b 31 5d 3b 0a 0a 20 20 4d 44 35 54 72 61  ts[1];..  MD5Tra
3580: 6e 73 66 6f 72 6d 28 63 74 78 2d 3e 62 75 66 2c  nsform(ctx->buf,
3590: 20 28 75 69 6e 74 33 32 20 2a 29 63 74 78 2d 3e   (uint32 *)ctx->
35a0: 75 2e 69 6e 29 3b 0a 20 20 62 79 74 65 52 65 76  u.in);.  byteRev
35b0: 65 72 73 65 28 28 75 6e 73 69 67 6e 65 64 20 63  erse((unsigned c
35c0: 68 61 72 20 2a 29 63 74 78 2d 3e 62 75 66 2c 20  har *)ctx->buf, 
35d0: 34 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 69 67  4);.  memcpy(dig
35e0: 65 73 74 2c 20 63 74 78 2d 3e 62 75 66 2c 20 31  est, ctx->buf, 1
35f0: 36 29 3b 0a 20 20 6d 65 6d 73 65 74 28 63 74 78  6);.  memset(ctx
3600: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 63 74 78  , 0, sizeof(*ctx
3610: 29 29 3b 20 20 20 20 2f 2a 20 49 6e 20 63 61 73  ));    /* In cas
3620: 65 20 69 74 20 69 73 20 73 65 6e 73 69 74 69 76  e it is sensitiv
3630: 65 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e */.}../*.** Co
3640: 6e 76 65 72 74 20 61 20 31 32 38 2d 62 69 74 20  nvert a 128-bit 
3650: 4d 44 35 20 64 69 67 65 73 74 20 69 6e 74 6f 20  MD5 digest into 
3660: 61 20 33 32 2d 64 69 67 69 74 20 62 61 73 65 2d  a 32-digit base-
3670: 31 36 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  16 number..*/.st
3680: 61 74 69 63 20 76 6f 69 64 20 4d 44 35 44 69 67  atic void MD5Dig
3690: 65 73 74 54 6f 42 61 73 65 31 36 28 75 6e 73 69  estToBase16(unsi
36a0: 67 6e 65 64 20 63 68 61 72 20 2a 64 69 67 65 73  gned char *diges
36b0: 74 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  t, char *zBuf){.
36c0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 63 6f    static char co
36d0: 6e 73 74 20 7a 45 6e 63 6f 64 65 5b 5d 20 3d 20  nst zEncode[] = 
36e0: 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  "0123456789abcde
36f0: 66 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  f";.  int i, j;.
3700: 0a 20 20 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c  .  for(j=i=0; i<
3710: 31 36 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  16; i++){.    in
3720: 74 20 61 20 3d 20 64 69 67 65 73 74 5b 69 5d 3b  t a = digest[i];
3730: 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d  .    zBuf[j++] =
3740: 20 7a 45 6e 63 6f 64 65 5b 28 61 3e 3e 34 29 26   zEncode[(a>>4)&
3750: 30 78 66 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 6a  0xf];.    zBuf[j
3760: 2b 2b 5d 20 3d 20 7a 45 6e 63 6f 64 65 5b 61 20  ++] = zEncode[a 
3770: 26 20 30 78 66 5d 3b 0a 20 20 7d 0a 20 20 7a 42  & 0xf];.  }.  zB
3780: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  uf[j] = 0;.}../*
3790: 0a 2a 2a 20 44 75 72 69 6e 67 20 74 65 73 74 69  .** During testi
37a0: 6e 67 2c 20 74 68 65 20 73 70 65 63 69 61 6c 20  ng, the special 
37b0: 6d 64 35 73 75 6d 28 29 20 61 67 67 72 65 67 61  md5sum() aggrega
37c0: 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
37d0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 69 6e 73  vailable..** ins
37e0: 69 64 65 20 53 51 4c 69 74 65 2e 20 20 54 68 65  ide SQLite.  The
37f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
3800: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
3810: 61 74 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  at function..*/.
3820: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 73  static void md5s
3830: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
3840: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e  ext *context, in
3850: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
3860: 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20  value **argv){. 
3870: 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a 70 3b 0a   MD5Context *p;.
3880: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
3890: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
38a0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
38b0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
38c0: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
38d0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  *p));.  if( p==0
38e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
38f0: 20 21 70 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20   !p->isInit ){. 
3900: 20 20 20 4d 44 35 49 6e 69 74 28 70 29 3b 0a 20     MD5Init(p);. 
3910: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
3920: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
3930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
3940: 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  a = (char*)sqlit
3950: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
3960: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
3970: 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 4d  zData ){.      M
3980: 44 35 55 70 64 61 74 65 28 70 2c 20 28 75 6e 73  D5Update(p, (uns
3990: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 44 61 74  igned char*)zDat
39a0: 61 2c 20 73 74 72 6c 65 6e 28 7a 44 61 74 61 29  a, strlen(zData)
39b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73  );.    }.  }.}.s
39c0: 74 61 74 69 63 20 76 6f 69 64 20 6d 64 35 66 69  tatic void md5fi
39d0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
39e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
39f0: 7b 0a 20 20 4d 44 35 43 6f 6e 74 65 78 74 20 2a  {.  MD5Context *
3a00: 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  p;.  unsigned ch
3a10: 61 72 20 64 69 67 65 73 74 5b 31 36 5d 3b 0a 20  ar digest[16];. 
3a20: 20 63 68 61 72 20 7a 42 75 66 5b 33 33 5d 3b 0a   char zBuf[33];.
3a30: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
3a40: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3a50: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
3a60: 2a 70 29 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c  *p));.  MD5Final
3a70: 28 64 69 67 65 73 74 2c 70 29 3b 0a 20 20 4d 44  (digest,p);.  MD
3a80: 35 44 69 67 65 73 74 54 6f 42 61 73 65 31 36 28  5DigestToBase16(
3a90: 64 69 67 65 73 74 2c 20 7a 42 75 66 29 3b 0a 20  digest, zBuf);. 
3aa0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3ab0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
3ac0: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
3ad0: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a  RANSIENT);.}../*
3ae0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 63 6f 70 69 65  .** End of copie
3af0: 64 20 6d 64 35 73 75 6d 28 29 20 63 6f 64 65 2e  d md5sum() code.
3b00: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
3b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 74 79  ***********/..ty
3b50: 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f 69 6e  pedef sqlite3_in
3b60: 74 36 34 20 69 36 34 3b 0a 0a 74 79 70 65 64 65  t64 i64;..typede
3b70: 66 20 73 74 72 75 63 74 20 45 72 72 6f 72 20 45  f struct Error E
3b80: 72 72 6f 72 3b 0a 74 79 70 65 64 65 66 20 73 74  rror;.typedef st
3b90: 72 75 63 74 20 53 71 6c 69 74 65 20 53 71 6c 69  ruct Sqlite Sqli
3ba0: 74 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  te;.typedef stru
3bb0: 63 74 20 53 74 61 74 65 6d 65 6e 74 20 53 74 61  ct Statement Sta
3bc0: 74 65 6d 65 6e 74 3b 0a 0a 74 79 70 65 64 65 66  tement;..typedef
3bd0: 20 73 74 72 75 63 74 20 54 68 72 65 61 64 73 65   struct Threadse
3be0: 74 20 54 68 72 65 61 64 73 65 74 3b 0a 74 79 70  t Threadset;.typ
3bf0: 65 64 65 66 20 73 74 72 75 63 74 20 54 68 72 65  edef struct Thre
3c00: 61 64 20 54 68 72 65 61 64 3b 0a 0a 2f 2a 20 54  ad Thread;../* T
3c10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65  otal number of e
3c20: 72 72 6f 72 73 20 69 6e 20 74 68 69 73 20 70 72  rrors in this pr
3c30: 6f 63 65 73 73 20 73 6f 20 66 61 72 2e 20 2a 2f  ocess so far. */
3c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 47 6c 6f  .static int nGlo
3c50: 62 61 6c 45 72 72 20 3d 20 30 3b 0a 0a 73 74 72  balErr = 0;..str
3c60: 75 63 74 20 45 72 72 6f 72 20 7b 0a 20 20 69 6e  uct Error {.  in
3c70: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 4c 69 6e  t rc;.  int iLin
3c80: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  e;.  char *zErr;
3c90: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 53 71 6c 69  .};..struct Sqli
3ca0: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
3cb0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
3cc0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
3cd0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  se handle */.  S
3ce0: 74 61 74 65 6d 65 6e 74 20 2a 70 43 61 63 68 65  tatement *pCache
3cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3d00: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
3d10: 20 63 61 63 68 65 64 20 73 74 61 74 65 6d 65 6e   cached statemen
3d20: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 78  ts */.  int nTex
3d30: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3d40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
3d50: 6f 66 20 61 72 72 61 79 20 61 74 20 61 54 65 78  of array at aTex
3d60: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  t[] */.  char **
3d70: 61 54 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  aText;          
3d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
3d90: 65 64 20 74 65 78 74 20 72 65 73 75 6c 74 73 20  ed text results 
3da0: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 53 74  */.};..struct St
3db0: 61 74 65 6d 65 6e 74 20 7b 0a 20 20 73 71 6c 69  atement {.  sqli
3dc0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3de0: 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
3df0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a  ement handle */.
3e00: 20 20 53 74 61 74 65 6d 65 6e 74 20 2a 70 4e 65    Statement *pNe
3e10: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
3e20: 20 20 2f 2a 20 4e 65 78 74 20 73 74 61 74 65 6d    /* Next statem
3e30: 65 6e 74 20 69 6e 20 6c 69 6e 6b 65 64 2d 6c 69  ent in linked-li
3e40: 73 74 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  st */.};..struct
3e50: 20 54 68 72 65 61 64 20 7b 0a 20 20 69 6e 74 20   Thread {.  int 
3e60: 69 54 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  iTid;           
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3e80: 68 72 65 61 64 20 6e 75 6d 62 65 72 20 77 69 74  hread number wit
3e90: 68 69 6e 20 74 65 73 74 20 2a 2f 0a 20 20 76 6f  hin test */.  vo
3ea0: 69 64 2a 20 70 41 72 67 3b 20 20 20 20 20 20 20  id* pArg;       
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ec0: 20 50 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e   Pointer argumen
3ed0: 74 20 70 61 73 73 65 64 20 62 79 20 63 61 6c 6c  t passed by call
3ee0: 65 72 20 2a 2f 0a 0a 20 20 70 74 68 72 65 61 64  er */..  pthread
3ef0: 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20 20  _t tid;         
3f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65           /* Thre
3f10: 61 64 20 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  ad id */.  char 
3f20: 2a 28 2a 78 50 72 6f 63 29 28 69 6e 74 2c 20 76  *(*xProc)(int, v
3f30: 6f 69 64 2a 29 3b 20 20 20 20 20 2f 2a 20 54 68  oid*);     /* Th
3f40: 72 65 61 64 20 6d 61 69 6e 20 70 72 6f 63 20 2a  read main proc *
3f50: 2f 0a 20 20 54 68 72 65 61 64 20 2a 70 4e 65 78  /.  Thread *pNex
3f60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3f70: 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 74      /* Next in t
3f80: 68 69 73 20 6c 69 73 74 20 6f 66 20 74 68 72 65  his list of thre
3f90: 61 64 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63  ads */.};..struc
3fa0: 74 20 54 68 72 65 61 64 73 65 74 20 7b 0a 20 20  t Threadset {.  
3fb0: 69 6e 74 20 69 4d 61 78 54 69 64 3b 20 20 20 20  int iMaxTid;    
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 2f 2a 20 4c 61 72 67 65 73 74 20 69 54 69 64 20  /* Largest iTid 
3fe0: 76 61 6c 75 65 20 61 6c 6c 6f 63 61 74 65 64 20  value allocated 
3ff0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 54 68 72 65  so far */.  Thre
4000: 61 64 20 2a 70 54 68 72 65 61 64 3b 20 20 20 20  ad *pThread;    
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4020: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 74 68  inked list of th
4030: 72 65 61 64 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 61  reads */.};..sta
4040: 74 69 63 20 76 6f 69 64 20 66 72 65 65 5f 65 72  tic void free_er
4050: 72 28 45 72 72 6f 72 20 2a 70 29 7b 0a 20 20 73  r(Error *p){.  s
4060: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
4070: 45 72 72 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 20  Err);.  p->zErr 
4080: 3d 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 30  = 0;.  p->rc = 0
4090: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
40a0: 20 70 72 69 6e 74 5f 65 72 72 28 45 72 72 6f 72   print_err(Error
40b0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72   *p){.  if( p->r
40c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
40d0: 20 20 20 20 69 6e 74 20 69 73 57 61 72 6e 20 3d      int isWarn =
40e0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
40f0: 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  c==SQLITE_SCHEMA
4100: 20 29 20 69 73 57 61 72 6e 20 3d 20 31 3b 0a 20   ) isWarn = 1;. 
4110: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4120: 74 72 67 6c 6f 62 28 22 2a 20 2d 20 6e 6f 20 73  trglob("* - no s
4130: 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 70 2d  uch table: *",p-
4140: 3e 7a 45 72 72 29 3d 3d 30 20 29 20 69 73 57 61  >zErr)==0 ) isWa
4150: 72 6e 20 3d 20 31 3b 0a 20 20 20 20 70 72 69 6e  rn = 1;.    prin
4160: 74 66 28 22 25 73 3a 20 28 25 64 29 20 5c 22 25  tf("%s: (%d) \"%
4170: 73 5c 22 20 61 74 20 6c 69 6e 65 20 25 64 5c 6e  s\" at line %d\n
4180: 22 2c 20 69 73 57 61 72 6e 20 3f 20 22 57 61 72  ", isWarn ? "War
4190: 6e 69 6e 67 22 20 3a 20 22 45 72 72 6f 72 22 2c  ning" : "Error",
41a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
41b0: 72 63 2c 20 70 2d 3e 7a 45 72 72 2c 20 70 2d 3e  rc, p->zErr, p->
41c0: 69 4c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20  iLine);.    if( 
41d0: 21 69 73 57 61 72 6e 20 29 20 6e 47 6c 6f 62 61  !isWarn ) nGloba
41e0: 6c 45 72 72 2b 2b 3b 0a 20 20 20 20 66 66 6c 75  lErr++;.    fflu
41f0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 7d 0a  sh(stdout);.  }.
4200: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  }..static void p
4210: 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65 5f 65 72  rint_and_free_er
4220: 72 28 45 72 72 6f 72 20 2a 70 29 7b 0a 20 20 70  r(Error *p){.  p
4230: 72 69 6e 74 5f 65 72 72 28 70 29 3b 0a 20 20 66  rint_err(p);.  f
4240: 72 65 65 5f 65 72 72 28 70 29 3b 0a 7d 0a 0a 73  ree_err(p);.}..s
4250: 74 61 74 69 63 20 76 6f 69 64 20 73 79 73 74 65  tatic void syste
4260: 6d 5f 65 72 72 6f 72 28 45 72 72 6f 72 20 2a 70  m_error(Error *p
4270: 45 72 72 2c 20 69 6e 74 20 69 53 79 73 29 7b 0a  Err, int iSys){.
4280: 20 20 70 45 72 72 2d 3e 72 63 20 3d 20 69 53 79    pErr->rc = iSy
4290: 73 3b 0a 20 20 70 45 72 72 2d 3e 7a 45 72 72 20  s;.  pErr->zErr 
42a0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
42b0: 33 5f 6d 61 6c 6c 6f 63 28 35 31 32 29 3b 0a 20  3_malloc(512);. 
42c0: 20 73 74 72 65 72 72 6f 72 5f 72 28 69 53 79 73   strerror_r(iSys
42d0: 2c 20 70 45 72 72 2d 3e 7a 45 72 72 2c 20 35 31  , pErr->zErr, 51
42e0: 32 29 3b 0a 20 20 70 45 72 72 2d 3e 7a 45 72 72  2);.  pErr->zErr
42f0: 5b 35 31 31 5d 20 3d 20 27 5c 30 27 3b 0a 7d 0a  [511] = '\0';.}.
4300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
4310: 69 74 65 5f 65 72 72 6f 72 28 0a 20 20 45 72 72  ite_error(.  Err
4320: 6f 72 20 2a 70 45 72 72 2c 20 0a 20 20 53 71 6c  or *pErr, .  Sql
4330: 69 74 65 20 2a 70 44 62 2c 20 0a 20 20 63 6f 6e  ite *pDb, .  con
4340: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 0a 29  st char *zFunc.)
4350: 7b 0a 20 20 70 45 72 72 2d 3e 72 63 20 3d 20 73  {.  pErr->rc = s
4360: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70  qlite3_errcode(p
4370: 44 62 2d 3e 64 62 29 3b 0a 20 20 70 45 72 72 2d  Db->db);.  pErr-
4380: 3e 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  >zErr = sqlite3_
4390: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
43a0: 73 71 6c 69 74 65 33 5f 25 73 28 29 20 2d 20 25  sqlite3_%s() - %
43b0: 73 20 28 25 64 29 22 2c 20 7a 46 75 6e 63 2c 20  s (%d)", zFunc, 
43c0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
43d0: 44 62 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 73  Db->db),.      s
43e0: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
43f0: 65 72 72 63 6f 64 65 28 70 44 62 2d 3e 64 62 29  errcode(pDb->db)
4400: 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  .  );.}..static 
4410: 76 6f 69 64 20 74 65 73 74 5f 65 72 72 6f 72 5f  void test_error_
4420: 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72  x(.  Error *pErr
4430: 2c 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 0a 29  ,.  char *zErr.)
4440: 7b 0a 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63  {.  if( pErr->rc
4450: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4460: 20 20 20 70 45 72 72 2d 3e 72 63 20 3d 20 31 3b     pErr->rc = 1;
4470: 0a 20 20 20 20 70 45 72 72 2d 3e 7a 45 72 72 20  .    pErr->zErr 
4480: 3d 20 7a 45 72 72 3b 0a 20 20 7d 65 6c 73 65 7b  = zErr;.  }else{
4490: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
44a0: 65 28 7a 45 72 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zErr);.  }.}..
44b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
44c0: 72 5f 65 72 72 6f 72 5f 78 28 0a 20 20 45 72 72  r_error_x(.  Err
44d0: 6f 72 20 2a 70 45 72 72 2c 0a 20 20 69 6e 74 20  or *pErr,.  int 
44e0: 72 63 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72  rc.){.  if( pErr
44f0: 2d 3e 72 63 3d 3d 72 63 20 29 7b 0a 20 20 20 20  ->rc==rc ){.    
4500: 70 45 72 72 2d 3e 72 63 20 3d 20 53 51 4c 49 54  pErr->rc = SQLIT
4510: 45 5f 4f 4b 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_OK;.    sqlite
4520: 33 5f 66 72 65 65 28 70 45 72 72 2d 3e 7a 45 72  3_free(pErr->zEr
4530: 72 29 3b 0a 20 20 20 20 70 45 72 72 2d 3e 7a 45  r);.    pErr->zE
4540: 72 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73  rr = 0;.  }.}..s
4550: 74 61 74 69 63 20 69 6e 74 20 62 75 73 79 68 61  tatic int busyha
4560: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
4570: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 75 73 6c 65  , int n){.  usle
4580: 65 70 28 31 30 2a 31 30 30 30 29 3b 0a 20 20 72  ep(10*1000);.  r
4590: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74  eturn 1;.}..stat
45a0: 69 63 20 76 6f 69 64 20 6f 70 65 6e 64 62 5f 78  ic void opendb_x
45b0: 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c  (.  Error *pErr,
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
45e0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53  rror code */.  S
45f0: 71 6c 69 74 65 20 2a 70 44 62 2c 20 20 20 20 20  qlite *pDb,     
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4610: 2a 20 4f 55 54 3a 20 44 61 74 61 62 61 73 65 20  * OUT: Database 
4620: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
4630: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20  t char *zFile,  
4640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4650: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
4660: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  e */.  int bDele
4670: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
4680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4690: 6f 20 64 65 6c 65 74 65 20 64 62 20 66 69 6c 65  o delete db file
46a0: 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20   before opening 
46b0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72  */.){.  if( pErr
46c0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
46d0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
46e0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53     int flags = S
46f0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
4700: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
4710: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
4720: 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 20  TE_OPEN_URI;.   
4730: 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 20 75   if( bDelete ) u
4740: 6e 6c 69 6e 6b 28 7a 46 69 6c 65 29 3b 0a 20 20  nlink(zFile);.  
4750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
4760: 70 65 6e 5f 76 32 28 7a 46 69 6c 65 2c 20 26 70  pen_v2(zFile, &p
4770: 44 62 2d 3e 64 62 2c 20 66 6c 61 67 73 2c 20 30  Db->db, flags, 0
4780: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
4790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 65 72  .      sqlite_er
47a0: 72 6f 72 28 70 45 72 72 2c 20 70 44 62 2c 20 22  ror(pErr, pDb, "
47b0: 6f 70 65 6e 22 29 3b 0a 20 20 20 20 20 20 73 71  open");.      sq
47c0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44 62 2d  lite3_close(pDb-
47d0: 3e 64 62 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  >db);.      pDb-
47e0: 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >db = 0;.    }el
47f0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
4800: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
4810: 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  n(.          pDb
4820: 2d 3e 64 62 2c 20 22 6d 64 35 73 75 6d 22 2c 20  ->db, "md5sum", 
4830: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
4840: 20 30 2c 20 30 2c 20 6d 64 35 73 74 65 70 2c 20   0, 0, md5step, 
4850: 6d 64 35 66 69 6e 61 6c 69 7a 65 0a 20 20 20 20  md5finalize.    
4860: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
4870: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
4880: 70 44 62 2d 3e 64 62 2c 20 62 75 73 79 68 61 6e  pDb->db, busyhan
4890: 64 6c 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  dler, 0);.      
48a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62  sqlite3_exec(pDb
48b0: 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 73 79  ->db, "PRAGMA sy
48c0: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 22 2c 20  nchronous=OFF", 
48d0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
48e0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
48f0: 69 64 20 63 6c 6f 73 65 64 62 5f 78 28 0a 20 20  id closedb_x(.  
4900: 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20 20  Error *pErr,    
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
4930: 20 63 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74   code */.  Sqlit
4940: 65 20 2a 70 44 62 20 20 20 20 20 20 20 20 20 20  e *pDb          
4950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
4960: 54 3a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  T: Database hand
4970: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
4980: 63 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 74  c;.  int i;.  St
4990: 61 74 65 6d 65 6e 74 20 2a 70 49 74 65 72 3b 0a  atement *pIter;.
49a0: 20 20 53 74 61 74 65 6d 65 6e 74 20 2a 70 4e 65    Statement *pNe
49b0: 78 74 3b 0a 20 20 66 6f 72 28 70 49 74 65 72 3d  xt;.  for(pIter=
49c0: 70 44 62 2d 3e 70 43 61 63 68 65 3b 20 70 49 74  pDb->pCache; pIt
49d0: 65 72 3b 20 70 49 74 65 72 3d 70 4e 65 78 74 29  er; pIter=pNext)
49e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
49f0: 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ter->pNext;.    
4a00: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4a10: 28 70 49 74 65 72 2d 3e 70 53 74 6d 74 29 3b 0a  (pIter->pStmt);.
4a20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4a30: 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66  (pIter);.  }.  f
4a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 62 2d 3e 6e  or(i=0; i<pDb->n
4a50: 54 65 78 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Text; i++){.    
4a60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 62  sqlite3_free(pDb
4a70: 2d 3e 61 54 65 78 74 5b 69 5d 29 3b 0a 20 20 7d  ->aText[i]);.  }
4a80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4a90: 70 44 62 2d 3e 61 54 65 78 74 29 3b 0a 20 20 72  pDb->aText);.  r
4aa0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  c = sqlite3_clos
4ab0: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 69 66  e(pDb->db);.  if
4ac0: 28 20 72 63 20 26 26 20 70 45 72 72 2d 3e 72 63  ( rc && pErr->rc
4ad0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4ae0: 20 20 20 70 45 72 72 2d 3e 7a 45 72 72 20 3d 20     pErr->zErr = 
4af0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
4b00: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
4b10: 72 6d 73 67 28 70 44 62 2d 3e 64 62 29 29 3b 0a  rmsg(pDb->db));.
4b20: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 44 62    }.  memset(pDb
4b30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 71 6c 69  , 0, sizeof(Sqli
4b40: 74 65 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  te));.}..static 
4b50: 76 6f 69 64 20 73 71 6c 5f 73 63 72 69 70 74 5f  void sql_script_
4b60: 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72  x(.  Error *pErr
4b70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b80: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
4b90: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
4ba0: 53 71 6c 69 74 65 20 2a 70 44 62 2c 20 20 20 20  Sqlite *pDb,    
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
4bd0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
4be0: 61 72 20 2a 7a 53 71 6c 20 20 20 20 20 20 20 20  ar *zSql        
4bf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73          /* SQL s
4c00: 63 72 69 70 74 20 74 6f 20 65 78 65 63 75 74 65  cript to execute
4c10: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 72   */.){.  if( pEr
4c20: 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  r->rc==SQLITE_OK
4c30: 20 29 7b 0a 20 20 20 20 70 45 72 72 2d 3e 72 63   ){.    pErr->rc
4c40: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4c50: 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pDb->db, zSql, 0
4c60: 2c 20 30 2c 20 26 70 45 72 72 2d 3e 7a 45 72 72  , 0, &pErr->zErr
4c70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4c80: 20 76 6f 69 64 20 73 71 6c 5f 73 63 72 69 70 74   void sql_script
4c90: 5f 70 72 69 6e 74 66 5f 78 28 0a 20 20 45 72 72  _printf_x(.  Err
4ca0: 6f 72 20 2a 70 45 72 72 2c 20 20 20 20 20 20 20  or *pErr,       
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cc0: 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
4cd0: 64 65 20 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a  de */.  Sqlite *
4ce0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
4cf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4d00: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
4d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
4d20: 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mat,            
4d30: 2f 2a 20 53 51 4c 20 70 72 69 6e 74 66 20 66 6f  /* SQL printf fo
4d40: 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  rmat string */. 
4d50: 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20   ...            
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 2f 2a 20 50 72 69 6e 74 66 20 61 72 67 73 20   /* Printf args 
4d80: 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  */.){.  va_list 
4d90: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 2e 2e 2e 20 70          /* ... p
4db0: 72 69 6e 74 66 20 61 72 67 75 6d 65 6e 74 73 20  rintf arguments 
4dc0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
4dd0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66  , zFormat);.  if
4de0: 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49  ( pErr->rc==SQLI
4df0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61  TE_OK ){.    cha
4e00: 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
4e10: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
4e20: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 45 72  at, ap);.    pEr
4e30: 72 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  r->rc = sqlite3_
4e40: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 53  exec(pDb->db, zS
4e50: 71 6c 2c 20 30 2c 20 30 2c 20 26 70 45 72 72 2d  ql, 0, 0, &pErr-
4e60: 3e 7a 45 72 72 29 3b 0a 20 20 20 20 73 71 6c 69  >zErr);.    sqli
4e70: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
4e80: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
4e90: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 53 74 61 74  ;.}..static Stat
4ea0: 65 6d 65 6e 74 20 2a 67 65 74 53 71 6c 53 74 61  ement *getSqlSta
4eb0: 74 65 6d 65 6e 74 28 0a 20 20 45 72 72 6f 72 20  tement(.  Error 
4ec0: 2a 70 45 72 72 2c 20 20 20 20 20 20 20 20 20 20  *pErr,          
4ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
4ee0: 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
4ef0: 2a 2f 0a 20 20 53 71 6c 69 74 65 20 2a 70 44 62  */.  Sqlite *pDb
4f00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f10: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4f20: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
4f30: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 20 20  st char *zSql   
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
4f60: 0a 29 7b 0a 20 20 53 74 61 74 65 6d 65 6e 74 20  .){.  Statement 
4f70: 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b  *pRet;.  int rc;
4f80: 0a 0a 20 20 66 6f 72 28 70 52 65 74 3d 70 44 62  ..  for(pRet=pDb
4f90: 2d 3e 70 43 61 63 68 65 3b 20 70 52 65 74 3b 20  ->pCache; pRet; 
4fa0: 70 52 65 74 3d 70 52 65 74 2d 3e 70 4e 65 78 74  pRet=pRet->pNext
4fb0: 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74  ){.    if( 0==st
4fc0: 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 73 71 6c  rcmp(sqlite3_sql
4fd0: 28 70 52 65 74 2d 3e 70 53 74 6d 74 29 2c 20 7a  (pRet->pStmt), z
4fe0: 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Sql) ){.      re
4ff0: 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
5000: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 73  .  }..  pRet = s
5010: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
5020: 7a 65 6f 66 28 53 74 61 74 65 6d 65 6e 74 29 29  zeof(Statement))
5030: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5040: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 44 62 2d  _prepare_v2(pDb-
5050: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
5060: 70 52 65 74 2d 3e 70 53 74 6d 74 2c 20 30 29 3b  pRet->pStmt, 0);
5070: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5080: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
5090: 74 65 5f 65 72 72 6f 72 28 70 45 72 72 2c 20 70  te_error(pErr, p
50a0: 44 62 2c 20 22 70 72 65 70 61 72 65 5f 76 32 22  Db, "prepare_v2"
50b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
50c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
50d0: 3d 3d 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33  ==strcmp(sqlite3
50e0: 5f 73 71 6c 28 70 52 65 74 2d 3e 70 53 74 6d 74  _sql(pRet->pStmt
50f0: 29 2c 20 7a 53 71 6c 29 20 29 3b 0a 0a 20 20 70  ), zSql) );..  p
5100: 52 65 74 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62  Ret->pNext = pDb
5110: 2d 3e 70 43 61 63 68 65 3b 0a 20 20 70 44 62 2d  ->pCache;.  pDb-
5120: 3e 70 43 61 63 68 65 20 3d 20 70 52 65 74 3b 0a  >pCache = pRet;.
5130: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
5140: 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
5150: 5f 73 74 6d 74 20 2a 67 65 74 41 6e 64 42 69 6e  _stmt *getAndBin
5160: 64 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 0a 20  dSqlStatement(. 
5170: 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20   Error *pErr,   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
51a0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69  r code */.  Sqli
51b0: 74 65 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  te *pDb,        
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
51d0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
51e0: 2f 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 20 20  /.  va_list ap  
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 2f 2a 20 53 51 4c 20 66 6f 6c 6c 6f      /* SQL follo
5210: 77 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  wed by parameter
5220: 73 20 2a 2f 0a 29 7b 0a 20 20 53 74 61 74 65 6d  s */.){.  Statem
5230: 65 6e 74 20 2a 70 53 74 61 74 65 6d 65 6e 74 3b  ent *pStatement;
5240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5250: 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65 6e   SQLite statemen
5260: 74 20 77 72 61 70 70 65 72 20 2a 2f 0a 20 20 73  t wrapper */.  s
5270: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
5280: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
5290: 2a 20 54 68 65 20 53 51 4c 69 74 65 20 73 74 61  * The SQLite sta
52a0: 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  tement to return
52b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
52e0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
52f0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 0a   parameters */..
5300: 20 20 70 53 74 61 74 65 6d 65 6e 74 20 3d 20 67    pStatement = g
5310: 65 74 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 70  etSqlStatement(p
5320: 45 72 72 2c 20 70 44 62 2c 20 76 61 5f 61 72 67  Err, pDb, va_arg
5330: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  (ap, const char 
5340: 2a 29 29 3b 0a 20 20 69 66 28 20 21 70 53 74 61  *));.  if( !pSta
5350: 74 65 6d 65 6e 74 20 29 20 72 65 74 75 72 6e 20  tement ) return 
5360: 30 3b 0a 20 20 70 53 74 6d 74 20 3d 20 70 53 74  0;.  pStmt = pSt
5370: 61 74 65 6d 65 6e 74 2d 3e 70 53 74 6d 74 3b 0a  atement->pStmt;.
5380: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 71    for(i=1; i<=sq
5390: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
53a0: 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
53b0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  ); i++){.    con
53c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
53d0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
53e0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
53f0: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 76 6f 69 64  mt, i);.    void
5400: 20 2a 20 70 41 72 67 20 3d 20 76 61 5f 61 72 67   * pArg = va_arg
5410: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 0a 20 20  (ap, void*);..  
5420: 20 20 73 77 69 74 63 68 28 20 7a 4e 61 6d 65 5b    switch( zName[
5430: 31 5d 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  1] ){.      case
5440: 20 27 69 27 3a 0a 20 20 20 20 20 20 20 20 73 71   'i':.        sq
5450: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
5460: 28 70 53 74 6d 74 2c 20 69 2c 20 2a 28 69 36 34  (pStmt, i, *(i64
5470: 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
5480: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
5490: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
54a0: 20 70 45 72 72 2d 3e 72 63 20 3d 20 31 3b 0a 20   pErr->rc = 1;. 
54b0: 20 20 20 20 20 20 20 70 45 72 72 2d 3e 7a 45 72         pErr->zEr
54c0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
54d0: 6e 74 66 28 22 43 61 6e 6e 6f 74 20 64 69 73 63  ntf("Cannot disc
54e0: 65 72 6e 20 74 79 70 65 3a 20 5c 22 25 73 5c 22  ern type: \"%s\"
54f0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
5500: 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
5510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5520: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
5530: 20 70 53 74 6d 74 3b 0a 7d 0a 0a 73 74 61 74 69   pStmt;.}..stati
5540: 63 20 69 36 34 20 65 78 65 63 73 71 6c 5f 69 36  c i64 execsql_i6
5550: 34 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  4_x(.  Error *pE
5560: 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rr,             
5570: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
5580: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
5590: 20 20 53 71 6c 69 74 65 20 2a 70 44 62 2c 20 20    Sqlite *pDb,  
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
55c0: 6e 64 6c 65 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20  ndle */.  ...   
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
55f0: 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 20 74 6f   and pointers to
5600: 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65   parameter value
5610: 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52  s */.){.  i64 iR
5620: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45  et = 0;.  if( pE
5630: 72 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rr->rc==SQLITE_O
5640: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5650: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
5660: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
5670: 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
5680: 74 65 20 2a 2f 0a 20 20 20 20 76 61 5f 6c 69 73  te */.    va_lis
5690: 74 20 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  t ap;           
56a0: 20 20 20 20 20 20 20 20 2f 2a 20 2e 2e 2e 20 61          /* ... a
56b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
56c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 70 44 62  va_start(ap, pDb
56d0: 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 67  );.    pStmt = g
56e0: 65 74 41 6e 64 42 69 6e 64 53 71 6c 53 74 61 74  etAndBindSqlStat
56f0: 65 6d 65 6e 74 28 70 45 72 72 2c 20 70 44 62 2c  ement(pErr, pDb,
5700: 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 70 53   ap);.    if( pS
5710: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  tmt ){.      int
5720: 20 66 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20   first = 1;.    
5730: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
5740: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
5750: 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
5760: 20 20 20 20 69 66 28 20 66 69 72 73 74 20 26 26      if( first &&
5770: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
5780: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3e 30 20 29  count(pStmt)>0 )
5790: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 65 74  {.          iRet
57a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
57b0: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30  n_int64(pStmt, 0
57c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
57d0: 20 20 20 20 20 66 69 72 73 74 20 3d 20 30 3b 0a       first = 0;.
57e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
57f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5800: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
5810: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
5820: 69 74 65 5f 65 72 72 6f 72 28 70 45 72 72 2c 20  ite_error(pErr, 
5830: 70 44 62 2c 20 22 72 65 73 65 74 22 29 3b 0a 20  pDb, "reset");. 
5840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5850: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
5860: 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
5870: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
5880: 20 65 78 65 63 73 71 6c 5f 74 65 78 74 5f 78 28   execsql_text_x(
5890: 0a 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20  .  Error *pErr, 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72     /* IN/OUT: Er
58c0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53 71  ror code */.  Sq
58d0: 6c 69 74 65 20 2a 70 44 62 2c 20 20 20 20 20 20  lite *pDb,      
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
58f0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
5900: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6c 6f 74 2c   */.  int iSlot,
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 20 20 20 2f 2a 20 44 62 20 68 61 6e 64        /* Db hand
5930: 6c 65 20 73 6c 6f 74 20 74 6f 20 73 74 6f 72 65  le slot to store
5940: 20 74 65 78 74 20 69 6e 20 2a 2f 0a 20 20 2e 2e   text in */.  ..
5950: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5970: 20 53 51 4c 20 61 6e 64 20 70 6f 69 6e 74 65 72   SQL and pointer
5980: 73 20 74 6f 20 70 61 72 61 6d 65 74 65 72 20 76  s to parameter v
5990: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  alues */.){.  ch
59a0: 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 0a 20  ar *zRet = 0;.. 
59b0: 20 69 66 28 20 69 53 6c 6f 74 3e 3d 70 44 62 2d   if( iSlot>=pDb-
59c0: 3e 6e 54 65 78 74 20 29 7b 0a 20 20 20 20 69 6e  >nText ){.    in
59d0: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
59e0: 28 63 68 61 72 20 2a 29 2a 28 69 53 6c 6f 74 2b  (char *)*(iSlot+
59f0: 31 29 3b 0a 20 20 20 20 70 44 62 2d 3e 61 54 65  1);.    pDb->aTe
5a00: 78 74 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  xt = (char **)sq
5a10: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 44  lite3_realloc(pD
5a20: 62 2d 3e 61 54 65 78 74 2c 20 6e 42 79 74 65 29  b->aText, nByte)
5a30: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 44  ;.    memset(&pD
5a40: 62 2d 3e 61 54 65 78 74 5b 70 44 62 2d 3e 6e 54  b->aText[pDb->nT
5a50: 65 78 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ext], 0, sizeof(
5a60: 63 68 61 72 2a 29 2a 28 69 53 6c 6f 74 2b 31 2d  char*)*(iSlot+1-
5a70: 70 44 62 2d 3e 6e 54 65 78 74 29 29 3b 0a 20 20  pDb->nText));.  
5a80: 20 20 70 44 62 2d 3e 6e 54 65 78 74 20 3d 20 69    pDb->nText = i
5a90: 53 6c 6f 74 2b 31 3b 0a 20 20 7d 0a 0a 20 20 69  Slot+1;.  }..  i
5aa0: 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c  f( pErr->rc==SQL
5ab0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
5ad0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
5ae0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
5af0: 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 20 20 76  execute */.    v
5b00: 61 5f 6c 69 73 74 20 61 70 3b 20 20 20 20 20 20  a_list ap;      
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b20: 2e 2e 2e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ... arguments */
5b30: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
5b40: 2c 20 69 53 6c 6f 74 29 3b 0a 20 20 20 20 70 53  , iSlot);.    pS
5b50: 74 6d 74 20 3d 20 67 65 74 41 6e 64 42 69 6e 64  tmt = getAndBind
5b60: 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 70 45 72  SqlStatement(pEr
5b70: 72 2c 20 70 44 62 2c 20 61 70 29 3b 0a 20 20 20  r, pDb, ap);.   
5b80: 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
5b90: 20 20 20 20 69 6e 74 20 66 69 72 73 74 20 3d 20      int first = 
5ba0: 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
5bb0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
5bc0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
5bd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
5be0: 69 72 73 74 20 26 26 20 73 71 6c 69 74 65 33 5f  irst && sqlite3_
5bf0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
5c00: 6d 74 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  mt)>0 ){.       
5c10: 20 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65     zRet = sqlite
5c20: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
5c30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5c40: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
5c50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5c60: 33 5f 66 72 65 65 28 70 44 62 2d 3e 61 54 65 78  3_free(pDb->aTex
5c70: 74 5b 69 53 6c 6f 74 5d 29 3b 0a 20 20 20 20 20  t[iSlot]);.     
5c80: 20 20 20 20 20 70 44 62 2d 3e 61 54 65 78 74 5b       pDb->aText[
5c90: 69 53 6c 6f 74 5d 20 3d 20 7a 52 65 74 3b 0a 20  iSlot] = zRet;. 
5ca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5cb0: 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
5cc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 53 51    }.      if( SQ
5cd0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
5ce0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 20 29 7b  _reset(pStmt) ){
5cf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f  .        sqlite_
5d00: 65 72 72 6f 72 28 70 45 72 72 2c 20 70 44 62 2c  error(pErr, pDb,
5d10: 20 22 72 65 73 65 74 22 29 3b 0a 20 20 20 20 20   "reset");.     
5d20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 76 61 5f   }.    }.    va_
5d30: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  end(ap);.  }..  
5d40: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a  return zRet;.}..
5d50: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65  static void inte
5d60: 67 72 69 74 79 5f 63 68 65 63 6b 5f 78 28 0a 20  grity_check_x(. 
5d70: 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20   Error *pErr,   
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
5da0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53 71 6c 69  r code */.  Sqli
5db0: 74 65 20 2a 70 44 62 20 20 20 20 20 20 20 20 20  te *pDb         
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5dd0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
5de0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72 2d  /.){.  if( pErr-
5df0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
5e00: 7b 0a 20 20 20 20 53 74 61 74 65 6d 65 6e 74 20  {.    Statement 
5e10: 2a 70 53 74 61 74 65 6d 65 6e 74 3b 20 20 20 20  *pStatement;    
5e20: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
5e30: 20 74 6f 20 65 78 65 63 75 74 65 20 2a 2f 0a 20   to execute */. 
5e40: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
5e50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5e60: 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68   /* Integrity ch
5e70: 65 63 6b 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  eck error */..  
5e80: 20 20 70 53 74 61 74 65 6d 65 6e 74 20 3d 20 67    pStatement = g
5e90: 65 74 53 71 6c 53 74 61 74 65 6d 65 6e 74 28 70  etSqlStatement(p
5ea0: 45 72 72 2c 20 70 44 62 2c 20 22 50 52 41 47 4d  Err, pDb, "PRAGM
5eb0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
5ec0: 6b 22 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  k");.    if( pSt
5ed0: 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  atement ){.     
5ee0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5ef0: 53 74 6d 74 20 3d 20 70 53 74 61 74 65 6d 65 6e  Stmt = pStatemen
5f00: 74 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t->pStmt;.      
5f10: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
5f20: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
5f30: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
5f40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
5f50: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5f60: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5f70: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
5f80: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
5f90: 28 7a 2c 20 22 6f 6b 22 29 20 29 7b 0a 20 20 20  (z, "ok") ){.   
5fa0: 20 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 3d         if( zErr=
5fb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5fc0: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
5fd0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
5fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
5ff0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6000: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
6010: 70 72 69 6e 74 66 28 22 25 7a 5c 6e 25 73 22 2c  printf("%z\n%s",
6020: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 20   zErr, z);.     
6030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6050: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
6060: 6d 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  mt);..      if( 
6070: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
6080: 70 45 72 72 2d 3e 7a 45 72 72 20 3d 20 7a 45 72  pErr->zErr = zEr
6090: 72 3b 0a 20 20 20 20 20 20 20 20 70 45 72 72 2d  r;.        pErr-
60a0: 3e 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  >rc = 1;.      }
60b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
60c0: 61 74 69 63 20 76 6f 69 64 20 2a 6c 61 75 6e 63  atic void *launc
60d0: 68 5f 74 68 72 65 61 64 5f 6d 61 69 6e 28 76 6f  h_thread_main(vo
60e0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 54 68 72  id *pArg){.  Thr
60f0: 65 61 64 20 2a 70 20 3d 20 28 54 68 72 65 61 64  ead *p = (Thread
6100: 20 2a 29 70 41 72 67 3b 0a 20 20 72 65 74 75 72   *)pArg;.  retur
6110: 6e 20 28 76 6f 69 64 20 2a 29 70 2d 3e 78 50 72  n (void *)p->xPr
6120: 6f 63 28 70 2d 3e 69 54 69 64 2c 20 70 2d 3e 70  oc(p->iTid, p->p
6130: 41 72 67 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Arg);.}..static 
6140: 76 6f 69 64 20 6c 61 75 6e 63 68 5f 74 68 72 65  void launch_thre
6150: 61 64 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70  ad_x(.  Error *p
6160: 45 72 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Err,            
6170: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
6180: 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
6190: 0a 20 20 54 68 72 65 61 64 73 65 74 20 2a 70 54  .  Threadset *pT
61a0: 68 72 65 61 64 73 2c 20 20 20 20 20 20 20 20 20  hreads,         
61b0: 20 20 20 2f 2a 20 54 68 72 65 61 64 20 73 65 74     /* Thread set
61c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 28 2a 78 50   */.  char *(*xP
61d0: 72 6f 63 29 28 69 6e 74 2c 20 76 6f 69 64 2a 29  roc)(int, void*)
61e0: 2c 20 20 20 20 20 2f 2a 20 50 72 6f 63 20 74 6f  ,     /* Proc to
61f0: 20 72 75 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a   run */.  void *
6200: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
6210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
6220: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
6230: 74 68 72 65 61 64 20 70 72 6f 63 20 2a 2f 0a 29  thread proc */.)
6240: 7b 0a 20 20 69 66 28 20 70 45 72 72 2d 3e 72 63  {.  if( pErr->rc
6250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6260: 20 20 20 69 6e 74 20 69 54 69 64 20 3d 20 2b 2b     int iTid = ++
6270: 70 54 68 72 65 61 64 73 2d 3e 69 4d 61 78 54 69  pThreads->iMaxTi
6280: 64 3b 0a 20 20 20 20 54 68 72 65 61 64 20 2a 70  d;.    Thread *p
6290: 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
62a0: 20 20 20 70 20 3d 20 28 54 68 72 65 61 64 20 2a     p = (Thread *
62b0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
62c0: 73 69 7a 65 6f 66 28 54 68 72 65 61 64 29 29 3b  sizeof(Thread));
62d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  .    memset(p, 0
62e0: 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64 29  , sizeof(Thread)
62f0: 29 3b 0a 20 20 20 20 70 2d 3e 69 54 69 64 20 3d  );.    p->iTid =
6300: 20 69 54 69 64 3b 0a 20 20 20 20 70 2d 3e 70 41   iTid;.    p->pA
6310: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 20 20 70  rg = pArg;.    p
6320: 2d 3e 78 50 72 6f 63 20 3d 20 78 50 72 6f 63 3b  ->xProc = xProc;
6330: 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 68 72 65  ..    rc = pthre
6340: 61 64 5f 63 72 65 61 74 65 28 26 70 2d 3e 74 69  ad_create(&p->ti
6350: 64 2c 20 4e 55 4c 4c 2c 20 6c 61 75 6e 63 68 5f  d, NULL, launch_
6360: 74 68 72 65 61 64 5f 6d 61 69 6e 2c 20 28 76 6f  thread_main, (vo
6370: 69 64 20 2a 29 70 29 3b 0a 20 20 20 20 69 66 28  id *)p);.    if(
6380: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
6390: 73 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45 72  system_error(pEr
63a0: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 73 71  r, rc);.      sq
63b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
63c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 54 68 72 65  p->pNext = pThre
63e0: 61 64 73 2d 3e 70 54 68 72 65 61 64 3b 0a 20 20  ads->pThread;.  
63f0: 20 20 20 20 70 54 68 72 65 61 64 73 2d 3e 70 54      pThreads->pT
6400: 68 72 65 61 64 20 3d 20 70 3b 0a 20 20 20 20 7d  hread = p;.    }
6410: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
6420: 6f 69 64 20 6a 6f 69 6e 5f 61 6c 6c 5f 74 68 72  oid join_all_thr
6430: 65 61 64 73 5f 78 28 0a 20 20 45 72 72 6f 72 20  eads_x(.  Error 
6440: 2a 70 45 72 72 2c 20 20 20 20 20 20 20 20 20 20  *pErr,          
6450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
6460: 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
6470: 2a 2f 0a 20 20 54 68 72 65 61 64 73 65 74 20 2a  */.  Threadset *
6480: 70 54 68 72 65 61 64 73 20 20 20 20 20 20 20 20  pThreads        
6490: 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20 73       /* Thread s
64a0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 54 68 72 65 61  et */.){.  Threa
64b0: 64 20 2a 70 3b 0a 20 20 54 68 72 65 61 64 20 2a  d *p;.  Thread *
64c0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
64d0: 54 68 72 65 61 64 73 2d 3e 70 54 68 72 65 61 64  Threads->pThread
64e0: 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
64f0: 20 20 20 76 6f 69 64 20 2a 72 65 74 3b 0a 20 20     void *ret;.  
6500: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
6510: 78 74 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  xt;.    int rc;.
6520: 20 20 20 20 72 63 20 3d 20 70 74 68 72 65 61 64      rc = pthread
6530: 5f 6a 6f 69 6e 28 70 2d 3e 74 69 64 2c 20 26 72  _join(p->tid, &r
6540: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  et);.    if( rc!
6550: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
6560: 70 45 72 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  pErr->rc==SQLITE
6570: 5f 4f 4b 20 29 20 73 79 73 74 65 6d 5f 65 72 72  _OK ) system_err
6580: 6f 72 28 70 45 72 72 2c 20 72 63 29 3b 0a 20 20  or(pErr, rc);.  
6590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
65a0: 72 69 6e 74 66 28 22 54 68 72 65 61 64 20 25 64  rintf("Thread %d
65b0: 20 73 61 79 73 3a 20 25 73 5c 6e 22 2c 20 70 2d   says: %s\n", p-
65c0: 3e 69 54 69 64 2c 20 28 72 65 74 3d 3d 30 20 3f  >iTid, (ret==0 ?
65d0: 20 22 2e 2e 2e 22 20 3a 20 28 63 68 61 72 20 2a   "..." : (char *
65e0: 29 72 65 74 29 29 3b 0a 20 20 20 20 20 20 66 66  )ret));.      ff
65f0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
6600: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
6610: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 70  free(p);.  }.  p
6620: 54 68 72 65 61 64 73 2d 3e 70 54 68 72 65 61 64  Threads->pThread
6630: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
6640: 69 36 34 20 66 69 6c 65 73 69 7a 65 5f 78 28 0a  i64 filesize_x(.
6650: 20 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 0a 20    Error *pErr,. 
6660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
6670: 6c 65 0a 29 7b 0a 20 20 69 36 34 20 69 52 65 74  le.){.  i64 iRet
6680: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 72 72   = 0;.  if( pErr
6690: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
66a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
66b0: 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20 69 66  at sStat;.    if
66c0: 28 20 73 74 61 74 28 7a 46 69 6c 65 2c 20 26 73  ( stat(zFile, &s
66d0: 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stat) ){.      i
66e0: 52 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  Ret = -1;.    }e
66f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 74 20  lse{.      iRet 
6700: 3d 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b  = sStat.st_size;
6710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6720: 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn iRet;.}..sta
6730: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 63 6f 70  tic void filecop
6740: 79 5f 78 28 0a 20 20 45 72 72 6f 72 20 2a 70 45  y_x(.  Error *pE
6750: 72 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rr,.  const char
6760: 20 2a 7a 46 72 6f 6d 2c 0a 20 20 63 6f 6e 73 74   *zFrom,.  const
6770: 20 63 68 61 72 20 2a 7a 54 6f 0a 29 7b 0a 20 20   char *zTo.){.  
6780: 69 66 28 20 70 45 72 72 2d 3e 72 63 3d 3d 53 51  if( pErr->rc==SQ
6790: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
67a0: 36 34 20 6e 42 79 74 65 20 3d 20 66 69 6c 65 73  64 nByte = files
67b0: 69 7a 65 5f 78 28 70 45 72 72 2c 20 7a 46 72 6f  ize_x(pErr, zFro
67c0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  m);.    if( nByt
67d0: 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  e<0 ){.      tes
67e0: 74 5f 65 72 72 6f 72 5f 78 28 70 45 72 72 2c 20  t_error_x(pErr, 
67f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6800: 22 6e 6f 20 73 75 63 68 20 66 69 6c 65 3a 20 25  "no such file: %
6810: 73 22 2c 20 7a 46 72 6f 6d 29 29 3b 0a 20 20 20  s", zFrom));.   
6820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
6830: 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 63 68  4 iOff;.      ch
6840: 61 72 20 61 42 75 66 5b 31 30 32 34 5d 3b 0a 20  ar aBuf[1024];. 
6850: 20 20 20 20 20 69 6e 74 20 66 64 31 3b 0a 20 20       int fd1;.  
6860: 20 20 20 20 69 6e 74 20 66 64 32 3b 0a 20 20 20      int fd2;.   
6870: 20 20 20 75 6e 6c 69 6e 6b 28 7a 54 6f 29 3b 0a     unlink(zTo);.
6880: 0a 20 20 20 20 20 20 66 64 31 20 3d 20 6f 70 65  .      fd1 = ope
6890: 6e 28 7a 46 72 6f 6d 2c 20 4f 5f 52 44 4f 4e 4c  n(zFrom, O_RDONL
68a0: 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 64  Y);.      if( fd
68b0: 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  1<0 ){.        s
68c0: 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45 72 72  ystem_error(pErr
68d0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
68e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
68f0: 7d 0a 20 20 20 20 20 20 66 64 32 20 3d 20 6f 70  }.      fd2 = op
6900: 65 6e 28 7a 54 6f 2c 20 4f 5f 52 44 57 52 7c 4f  en(zTo, O_RDWR|O
6910: 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 20 30  _CREAT|O_EXCL, 0
6920: 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  644);.      if( 
6930: 66 64 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  fd2<0 ){.       
6940: 20 73 79 73 74 65 6d 5f 65 72 72 6f 72 28 70 45   system_error(pE
6950: 72 72 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  rr, errno);.    
6960: 20 20 20 20 63 6c 6f 73 65 28 66 64 31 29 3b 0a      close(fd1);.
6970: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
6980: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
6990: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  Off = 0;.      w
69a0: 68 69 6c 65 28 20 69 4f 66 66 3c 6e 42 79 74 65  hile( iOff<nByte
69b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
69c0: 6e 43 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 61  nCopy = sizeof(a
69d0: 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Buf);.        if
69e0: 28 20 6e 43 6f 70 79 2b 69 4f 66 66 3e 6e 42 79  ( nCopy+iOff>nBy
69f0: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
6a00: 6e 43 6f 70 79 20 3d 20 6e 42 79 74 65 20 2d 20  nCopy = nByte - 
6a10: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iOff;.        }.
6a20: 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 6f 70          if( nCop
6a30: 79 21 3d 72 65 61 64 28 66 64 31 2c 20 61 42 75  y!=read(fd1, aBu
6a40: 66 2c 20 6e 43 6f 70 79 29 20 29 7b 0a 20 20 20  f, nCopy) ){.   
6a50: 20 20 20 20 20 20 20 73 79 73 74 65 6d 5f 65 72         system_er
6a60: 72 6f 72 28 70 45 72 72 2c 20 65 72 72 6e 6f 29  ror(pErr, errno)
6a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
6a80: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6a90: 20 20 20 20 20 69 66 28 20 6e 43 6f 70 79 21 3d       if( nCopy!=
6aa0: 77 72 69 74 65 28 66 64 32 2c 20 61 42 75 66 2c  write(fd2, aBuf,
6ab0: 20 6e 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20   nCopy) ){.     
6ac0: 20 20 20 20 20 73 79 73 74 65 6d 5f 65 72 72 6f       system_erro
6ad0: 72 28 70 45 72 72 2c 20 65 72 72 6e 6f 29 3b 0a  r(pErr, errno);.
6ae0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6b00: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
6b10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6b20: 20 63 6c 6f 73 65 28 66 64 31 29 3b 0a 20 20 20   close(fd1);.   
6b30: 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a 20     close(fd2);. 
6b40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a     }.  }.}../* .
6b50: 2a 2a 20 55 73 65 64 20 62 79 20 73 65 74 73 74  ** Used by setst
6b60: 6f 70 74 69 6d 65 28 29 20 61 6e 64 20 74 69 6d  optime() and tim
6b70: 65 74 6f 73 74 6f 70 28 29 2e 0a 2a 2f 0a 73 74  etostop()..*/.st
6b80: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
6b90: 6c 69 6d 69 74 20 3d 20 30 2e 30 3b 0a 0a 73 74  limit = 0.0;..st
6ba0: 61 74 69 63 20 64 6f 75 62 6c 65 20 63 75 72 72  atic double curr
6bb0: 65 6e 74 54 69 6d 65 28 76 6f 69 64 29 7b 0a 20  entTime(void){. 
6bc0: 20 64 6f 75 62 6c 65 20 74 3b 0a 20 20 73 74 61   double t;.  sta
6bd0: 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
6be0: 2a 70 54 69 6d 65 6c 69 6d 69 74 56 66 73 20 3d  *pTimelimitVfs =
6bf0: 20 30 3b 0a 20 20 69 66 28 20 70 54 69 6d 65 6c   0;.  if( pTimel
6c00: 69 6d 69 74 56 66 73 3d 3d 30 20 29 20 70 54 69  imitVfs==0 ) pTi
6c10: 6d 65 6c 69 6d 69 74 56 66 73 20 3d 20 73 71 6c  melimitVfs = sql
6c20: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
6c30: 3b 0a 20 20 69 66 28 20 70 54 69 6d 65 6c 69 6d  ;.  if( pTimelim
6c40: 69 74 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  itVfs->iVersion>
6c50: 3d 32 20 26 26 20 70 54 69 6d 65 6c 69 6d 69 74  =2 && pTimelimit
6c60: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
6c70: 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20  eInt64!=0 ){.   
6c80: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
6c90: 6d 3b 0a 20 20 20 20 70 54 69 6d 65 6c 69 6d 69  m;.    pTimelimi
6ca0: 74 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  tVfs->xCurrentTi
6cb0: 6d 65 49 6e 74 36 34 28 70 54 69 6d 65 6c 69 6d  meInt64(pTimelim
6cc0: 69 74 56 66 73 2c 20 26 74 6d 29 3b 0a 20 20 20  itVfs, &tm);.   
6cd0: 20 74 20 3d 20 74 6d 2f 38 36 34 30 30 30 30 30   t = tm/86400000
6ce0: 2e 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .0;.  }else{.   
6cf0: 20 70 54 69 6d 65 6c 69 6d 69 74 56 66 73 2d 3e   pTimelimitVfs->
6d00: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 70 54 69  xCurrentTime(pTi
6d10: 6d 65 6c 69 6d 69 74 56 66 73 2c 20 26 74 29 3b  melimitVfs, &t);
6d20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b  .  }.  return t;
6d30: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
6d40: 73 65 74 73 74 6f 70 74 69 6d 65 5f 78 28 0a 20  setstoptime_x(. 
6d50: 20 45 72 72 6f 72 20 2a 70 45 72 72 2c 20 20 20   Error *pErr,   
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
6d80: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
6d90: 6e 4d 73 20 20 20 20 20 20 20 20 20 20 20 20 20  nMs             
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6db0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 75 6e 74 69  illiseconds unti
6dc0: 6c 20 22 73 74 6f 70 20 74 69 6d 65 22 20 2a 2f  l "stop time" */
6dd0: 0a 29 7b 0a 20 20 69 66 28 20 70 45 72 72 2d 3e  .){.  if( pErr->
6de0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6df0: 0a 20 20 20 20 64 6f 75 62 6c 65 20 74 20 3d 20  .    double t = 
6e00: 63 75 72 72 65 6e 74 54 69 6d 65 28 29 3b 0a 20  currentTime();. 
6e10: 20 20 20 74 69 6d 65 6c 69 6d 69 74 20 3d 20 74     timelimit = t
6e20: 20 2b 20 28 28 64 6f 75 62 6c 65 29 6e 4d 73 29   + ((double)nMs)
6e30: 2f 28 31 30 30 30 2e 30 2a 36 30 2e 30 2a 36 30  /(1000.0*60.0*60
6e40: 2e 30 2a 32 34 2e 30 29 3b 0a 20 20 7d 0a 7d 0a  .0*24.0);.  }.}.
6e50: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 69 6d 65  .static int time
6e60: 74 6f 73 74 6f 70 5f 78 28 0a 20 20 45 72 72 6f  tostop_x(.  Erro
6e70: 72 20 2a 70 45 72 72 20 20 20 20 20 20 20 20 20  r *pErr         
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6e90: 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
6ea0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  e */.){.  int re
6eb0: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 45 72  t = 1;.  if( pEr
6ec0: 72 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  r->rc==SQLITE_OK
6ed0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 74   ){.    double t
6ee0: 20 3d 20 63 75 72 72 65 6e 74 54 69 6d 65 28 29   = currentTime()
6ef0: 3b 0a 20 20 20 20 72 65 74 20 3d 20 28 74 20 3e  ;.    ret = (t >
6f00: 3d 20 74 69 6d 65 6c 69 6d 69 74 29 3b 0a 20 20  = timelimit);.  
6f10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
6f20: 7d 0a 0a                                         }..