/ Hex Artifact Content
Login

Artifact e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ode that modifie
01a0: 64 20 74 68 65 20 4f 53 20 6c 61 79 65 72 20 69  d the OS layer i
01b0: 6e 20 6f 72 64 65 72 20 74 6f 20 73 69 6d 75 6c  n order to simul
01c0: 61 74 65 0a 2a 2a 20 74 68 65 20 65 66 66 65 63  ate.** the effec
01d0: 74 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  t on the databas
01e0: 65 20 66 69 6c 65 20 6f 66 20 61 6e 20 4f 53 20  e file of an OS 
01f0: 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 66  crash or power f
0200: 61 69 6c 75 72 65 2e 20 20 54 68 69 73 0a 2a 2a  ailure.  This.**
0210: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
0220: 20 74 68 65 20 61 62 69 6c 69 74 79 20 6f 66 20   the ability of 
0230: 53 51 4c 69 74 65 20 74 6f 20 72 65 63 6f 76 65  SQLite to recove
0240: 72 20 66 72 6f 6d 20 74 68 6f 73 65 20 73 69 74  r from those sit
0250: 75 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 20  uations..*/.#if 
0260: 53 51 4c 49 54 45 5f 54 45 53 54 20 20 20 20 20  SQLITE_TEST     
0270: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c       /* This fil
0280: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
0290: 73 74 69 6e 67 20 6f 6e 6c 79 20 2a 2f 0a 23 69  sting only */.#i
02a0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02b0: 74 2e 68 22 0a 23 69 66 20 64 65 66 69 6e 65 64  t.h".#if defined
02c0: 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54 45 5f  (INCLUDE_SQLITE_
02d0: 54 43 4c 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64  TCL_H).#  includ
02e0: 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68 22  e "sqlite_tcl.h"
02f0: 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64  .#else.#  includ
0300: 65 20 22 74 63 6c 2e 68 22 0a 23 65 6e 64 69 66  e "tcl.h".#endif
0310: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0320: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 20 2f 2a  _OMIT_DISKIO  /*
0330: 20 54 68 69 73 20 66 69 6c 65 20 69 73 20 61 20   This file is a 
0340: 6e 6f 2d 6f 70 20 69 66 20 64 69 73 6b 20 49 2f  no-op if disk I/
0350: 4f 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  O is disabled */
0360: 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 52 41  ../* #define TRA
0370: 43 45 5f 43 52 41 53 48 54 45 53 54 20 2a 2f 0a  CE_CRASHTEST */.
0380: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0390: 43 72 61 73 68 46 69 6c 65 20 43 72 61 73 68 46  CrashFile CrashF
03a0: 69 6c 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ile;.typedef str
03b0: 75 63 74 20 43 72 61 73 68 47 6c 6f 62 61 6c 20  uct CrashGlobal 
03c0: 43 72 61 73 68 47 6c 6f 62 61 6c 3b 0a 74 79 70  CrashGlobal;.typ
03d0: 65 64 65 66 20 73 74 72 75 63 74 20 57 72 69 74  edef struct Writ
03e0: 65 42 75 66 66 65 72 20 57 72 69 74 65 42 75 66  eBuffer WriteBuf
03f0: 66 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68  fer;../*.** Meth
0400: 6f 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  od:.**.**   This
0410: 20 6c 61 79 65 72 20 69 73 20 69 6d 70 6c 65 6d   layer is implem
0420: 65 6e 74 65 64 20 61 73 20 61 20 77 72 61 70 70  ented as a wrapp
0430: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 72  er around the "r
0440: 65 61 6c 22 20 0a 2a 2a 20 20 20 73 71 6c 69 74  eal" .**   sqlit
0450: 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  e3_file object f
0460: 6f 72 20 74 68 65 20 68 6f 73 74 20 73 79 73 74  or the host syst
0470: 65 6d 2e 20 45 61 63 68 20 74 69 6d 65 20 64 61  em. Each time da
0480: 74 61 20 69 73 20 0a 2a 2a 20 20 20 77 72 69 74  ta is .**   writ
0490: 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ten to the file 
04a0: 6f 62 6a 65 63 74 2c 20 69 6e 73 74 65 61 64 20  object, instead 
04b0: 6f 66 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  of being written
04c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 75 6e 64   to the.**   und
04d0: 65 72 6c 79 69 6e 67 20 66 69 6c 65 2c 20 74 68  erlying file, th
04e0: 65 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  e write operatio
04f0: 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  n is stored in a
0500: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 0a 2a 2a 20  n in-memory .** 
0510: 20 20 73 74 72 75 63 74 75 72 65 20 28 74 79 70    structure (typ
0520: 65 20 57 72 69 74 65 42 75 66 66 65 72 29 2e 20  e WriteBuffer). 
0530: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  This structure i
0540: 73 20 70 6c 61 63 65 64 20 61 74 20 74 68 65 0a  s placed at the.
0550: 2a 2a 20 20 20 65 6e 64 20 6f 66 20 61 20 67 6c  **   end of a gl
0560: 6f 62 61 6c 20 6f 72 64 65 72 65 64 20 6c 69 73  obal ordered lis
0570: 74 20 28 74 68 65 20 77 72 69 74 65 2d 6c 69 73  t (the write-lis
0580: 74 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  t)..**.**   When
0590: 20 64 61 74 61 20 69 73 20 72 65 61 64 20 66 72   data is read fr
05a0: 6f 6d 20 61 20 66 69 6c 65 20 6f 62 6a 65 63 74  om a file object
05b0: 2c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  , the requested 
05c0: 72 65 67 69 6f 6e 20 69 73 0a 2a 2a 20 20 20 66  region is.**   f
05d0: 69 72 73 74 20 72 65 74 72 69 65 76 65 64 20 66  irst retrieved f
05e0: 72 6f 6d 20 74 68 65 20 72 65 61 6c 20 66 69 6c  rom the real fil
05f0: 65 2e 20 54 68 65 20 77 72 69 74 65 2d 6c 69 73  e. The write-lis
0600: 74 20 69 73 20 74 68 65 6e 20 0a 2a 2a 20 20 20  t is then .**   
0610: 74 72 61 76 65 72 73 65 64 20 61 6e 64 20 64 61  traversed and da
0620: 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 61  ta copied from a
0630: 6e 79 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 57  ny overlapping W
0640: 72 69 74 65 42 75 66 66 65 72 20 0a 2a 2a 20 20  riteBuffer .**  
0650: 20 73 74 72 75 63 74 75 72 65 73 20 74 6f 20 74   structures to t
0660: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
0670: 2e 20 69 2e 65 2e 20 61 20 72 65 61 64 28 29 20  . i.e. a read() 
0680: 6f 70 65 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77  operation follow
0690: 69 6e 67 0a 2a 2a 20 20 20 6f 6e 65 20 6f 72 20  ing.**   one or 
06a0: 6d 6f 72 65 20 77 72 69 74 65 28 29 20 6f 70 65  more write() ope
06b0: 72 61 74 69 6f 6e 73 20 77 6f 72 6b 73 20 61 73  rations works as
06c0: 20 65 78 70 65 63 74 65 64 2c 20 65 76 65 6e 20   expected, even 
06d0: 69 66 20 6e 6f 0a 2a 2a 20 20 20 64 61 74 61 20  if no.**   data 
06e0: 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
06f0: 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  n written out to
0700: 20 74 68 65 20 72 65 61 6c 20 66 69 6c 65 2e 0a   the real file..
0710: 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 61 20 66  **.**   When a f
0720: 73 79 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e  sync() operation
0730: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2c 20 61   is performed, a
0740: 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  n operating syst
0750: 65 6d 20 63 72 61 73 68 20 0a 2a 2a 20 20 20 6d  em crash .**   m
0760: 61 79 20 62 65 20 73 69 6d 75 6c 61 74 65 64 2c  ay be simulated,
0770: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 65   in which case e
0780: 78 69 74 28 2d 31 29 20 69 73 20 63 61 6c 6c 65  xit(-1) is calle
0790: 64 20 28 74 68 65 20 63 61 6c 6c 20 74 6f 20 0a  d (the call to .
07a0: 2a 2a 20 20 20 78 53 79 6e 63 28 29 20 6e 65 76  **   xSync() nev
07b0: 65 72 20 72 65 74 75 72 6e 73 29 2e 20 57 68 65  er returns). Whe
07c0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 72  ther or not a cr
07d0: 61 73 68 20 69 73 20 73 69 6d 75 6c 61 74 65 64  ash is simulated
07e0: 2c 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 20  ,.**   the data 
07f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0800: 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20  a subset of the 
0810: 57 72 69 74 65 42 75 66 66 65 72 20 73 74 72 75  WriteBuffer stru
0820: 63 74 75 72 65 73 20 0a 2a 2a 20 20 20 73 74 6f  ctures .**   sto
0830: 72 65 64 20 69 6e 20 74 68 65 20 77 72 69 74 65  red in the write
0840: 2d 6c 69 73 74 20 69 73 20 77 72 69 74 74 65 6e  -list is written
0850: 20 74 6f 20 74 68 65 20 72 65 61 6c 20 75 6e 64   to the real und
0860: 65 72 6c 79 69 6e 67 20 66 69 6c 65 73 20 0a 2a  erlying files .*
0870: 2a 20 20 20 61 6e 64 20 74 68 65 20 65 6e 74 72  *   and the entr
0880: 69 65 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  ies removed from
0890: 20 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 2e   the write-list.
08a0: 20 49 66 20 61 20 63 72 61 73 68 20 69 73 20 73   If a crash is s
08b0: 69 6d 75 6c 61 74 65 64 2c 0a 2a 2a 20 20 20 61  imulated,.**   a
08c0: 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 20 62   subset of the b
08d0: 75 66 66 65 72 73 20 6d 61 79 20 62 65 20 63 6f  uffers may be co
08e0: 72 72 75 70 74 65 64 20 62 65 66 6f 72 65 20 74  rrupted before t
08f0: 68 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  he data is writt
0900: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  en..**.**   The 
0910: 65 78 61 63 74 20 73 75 62 73 65 74 20 6f 66 20  exact subset of 
0920: 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 20 77  the write-list w
0930: 72 69 74 74 65 6e 20 61 6e 64 2f 6f 72 20 63 6f  ritten and/or co
0940: 72 72 75 70 74 65 64 20 69 73 0a 2a 2a 20 20 20  rrupted is.**   
0950: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
0960: 65 20 73 69 6d 75 6c 61 74 65 64 20 64 65 76 69  e simulated devi
0970: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
0980: 63 73 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  cs and sector-si
0990: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 22 4e 6f 72 6d 61  ze..**.** "Norma
09a0: 6c 22 20 6d 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  l" mode:.**.**  
09b0: 20 4e 6f 72 6d 61 6c 20 6d 6f 64 65 20 69 73 20   Normal mode is 
09c0: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 73 69  used when the si
09d0: 6d 75 6c 61 74 65 64 20 64 65 76 69 63 65 20 68  mulated device h
09e0: 61 73 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0a 2a  as none of the.*
09f0: 2a 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  *   SQLITE_IOCAP
0a00: 5f 58 58 58 20 66 6c 61 67 73 20 73 65 74 2e 0a  _XXX flags set..
0a10: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 6e 6f 72 6d 61  **.**   In norma
0a20: 6c 20 6d 6f 64 65 2c 20 69 66 20 74 68 65 20 66  l mode, if the f
0a30: 73 79 6e 63 28 29 20 69 73 20 6e 6f 74 20 61 20  sync() is not a 
0a40: 73 69 6d 75 6c 61 74 65 64 20 63 72 61 73 68 2c  simulated crash,
0a50: 20 74 68 65 20 0a 2a 2a 20 20 20 77 72 69 74 65   the .**   write
0a60: 2d 6c 69 73 74 20 69 73 20 74 72 61 76 65 72 73  -list is travers
0a70: 65 64 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  ed from beginnin
0a80: 67 20 74 6f 20 65 6e 64 2e 20 45 61 63 68 20 57  g to end. Each W
0a90: 72 69 74 65 42 75 66 66 65 72 0a 2a 2a 20 20 20  riteBuffer.**   
0aa0: 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
0ab0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
0ac0: 6c 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74  le handle used t
0ad0: 6f 20 63 61 6c 6c 20 78 53 79 6e 63 28 29 0a 2a  o call xSync().*
0ae0: 2a 20 20 20 69 73 20 77 72 69 74 74 65 6e 20 74  *   is written t
0af0: 6f 20 74 68 65 20 72 65 61 6c 20 66 69 6c 65 20  o the real file 
0b00: 61 6e 64 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  and removed from
0b10: 20 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 2e   the write-list.
0b20: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20 63 72  .**.**   If a cr
0b30: 61 73 68 20 69 73 20 73 69 6d 75 6c 61 74 65 64  ash is simulated
0b40: 2c 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  , one of the fol
0b50: 6c 6f 77 69 6e 67 20 74 61 6b 65 73 20 70 6c 61  lowing takes pla
0b60: 63 65 20 66 6f 72 20 0a 2a 2a 20 20 20 65 61 63  ce for .**   eac
0b70: 68 20 57 72 69 74 65 42 75 66 66 65 72 20 69 6e  h WriteBuffer in
0b80: 20 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 2c   the write-list,
0b90: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
0ba0: 68 69 63 68 20 0a 2a 2a 20 20 20 66 69 6c 65 2d  hich .**   file-
0bb0: 68 61 6e 64 6c 65 20 69 74 20 69 73 20 61 73 73  handle it is ass
0bc0: 6f 63 69 61 74 65 64 20 77 69 74 68 3a 0a 2a 2a  ociated with:.**
0bd0: 0a 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 62  .**     1. The b
0be0: 75 66 66 65 72 20 69 73 20 63 6f 72 72 65 63 74  uffer is correct
0bf0: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
0c00: 65 20 66 69 6c 65 2c 20 6a 75 73 74 20 61 73 20  e file, just as 
0c10: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 63  if.**        a c
0c20: 72 61 73 68 20 77 65 72 65 20 6e 6f 74 20 62 65  rash were not be
0c30: 69 6e 67 20 73 69 6d 75 6c 61 74 65 64 2e 0a 2a  ing simulated..*
0c40: 2a 0a 2a 2a 20 20 20 20 20 32 2e 20 4e 6f 74 68  *.**     2. Noth
0c50: 69 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a  ing is done..**.
0c60: 2a 2a 20 20 20 20 20 33 2e 20 47 61 72 62 61 67  **     3. Garbag
0c70: 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  e data is writte
0c80: 6e 20 74 6f 20 61 6c 6c 20 73 65 63 74 6f 72 73  n to all sectors
0c90: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
0ca0: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 76 65  t .**        ove
0cb0: 72 6c 61 70 20 74 68 65 20 72 65 67 69 6f 6e 20  rlap the region 
0cc0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
0cd0: 20 57 72 69 74 65 42 75 66 66 65 72 2e 20 4f 72   WriteBuffer. Or
0ce0: 20 67 61 72 62 61 67 65 0a 2a 2a 20 20 20 20 20   garbage.**     
0cf0: 20 20 20 64 61 74 61 20 69 73 20 77 72 69 74 74     data is writt
0d00: 65 6e 20 74 6f 20 73 6f 6d 65 20 63 6f 6e 74 69  en to some conti
0d10: 67 75 6f 75 73 20 73 65 63 74 69 6f 6e 20 77 69  guous section wi
0d20: 74 68 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20  thin the .**    
0d30: 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 20 73      overlapped s
0d40: 65 63 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 44 65  ectors..**.** De
0d50: 76 69 63 65 20 43 68 61 72 61 63 74 65 72 69 73  vice Characteris
0d60: 74 69 63 20 66 6c 61 67 20 68 61 6e 64 6c 69 6e  tic flag handlin
0d70: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68  g:.**.**   If th
0d80: 65 20 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 66  e IOCAP_ATOMIC f
0d90: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
0da0: 20 6f 70 74 69 6f 6e 20 28 33 29 20 61 62 6f 76   option (3) abov
0db0: 65 20 69 73 20 0a 2a 2a 20 20 20 6e 65 76 65 72  e is .**   never
0dc0: 20 73 65 6c 65 63 74 65 64 2e 0a 2a 2a 0a 2a 2a   selected..**.**
0dd0: 20 20 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f     If the IOCAP_
0de0: 41 54 4f 4d 49 43 35 31 32 20 66 6c 61 67 20 69  ATOMIC512 flag i
0df0: 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 57  s set, and the W
0e00: 72 69 74 65 42 75 66 66 65 72 20 72 65 70 72 65  riteBuffer repre
0e10: 73 65 6e 74 73 0a 2a 2a 20 20 20 61 6e 20 61 6c  sents.**   an al
0e20: 69 67 6e 65 64 20 77 72 69 74 65 28 29 20 6f 66  igned write() of
0e30: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
0e40: 65 72 20 6f 66 20 35 31 32 20 62 79 74 65 20 72  er of 512 byte r
0e50: 65 67 69 6f 6e 73 2c 20 74 68 65 6e 0a 2a 2a 20  egions, then.** 
0e60: 20 20 6f 70 74 69 6f 6e 20 28 33 29 20 61 62 6f    option (3) abo
0e70: 76 65 20 69 73 20 6e 65 76 65 72 20 73 65 6c 65  ve is never sele
0e80: 63 74 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 65  cted. Instead, e
0e90: 61 63 68 20 35 31 32 20 62 79 74 65 20 72 65 67  ach 512 byte reg
0ea0: 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 65 69 74 68  ion.**   is eith
0eb0: 65 72 20 63 6f 72 72 65 63 74 6c 79 20 77 72 69  er correctly wri
0ec0: 74 74 65 6e 20 6f 72 20 6c 65 66 74 20 63 6f 6d  tten or left com
0ed0: 70 6c 65 74 65 6c 79 20 75 6e 74 6f 75 63 68 65  pletely untouche
0ee0: 64 2e 20 53 69 6d 69 6c 61 72 0a 2a 2a 20 20 20  d. Similar.**   
0ef0: 6c 6f 67 69 63 20 67 6f 76 65 72 6e 73 20 74 68  logic governs th
0f00: 65 20 62 65 68 61 76 69 6f 72 20 69 66 20 61 6e  e behavior if an
0f10: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 41  y of the other A
0f20: 54 4f 4d 49 43 58 58 58 20 66 6c 61 67 73 0a 2a  TOMICXXX flags.*
0f30: 2a 20 20 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  *   is set..**.*
0f40: 2a 20 20 20 49 66 20 65 69 74 68 65 72 20 74 68  *   If either th
0f50: 65 20 49 4f 43 41 50 5f 53 41 46 45 41 50 50 45  e IOCAP_SAFEAPPE
0f60: 4e 44 20 6f 72 20 49 4f 43 41 50 5f 53 45 51 55  ND or IOCAP_SEQU
0f70: 45 4e 54 49 41 4c 20 66 6c 61 67 73 20 61 72 65  ENTIAL flags are
0f80: 20 73 65 74 0a 2a 2a 20 20 20 61 6e 64 20 61 20   set.**   and a 
0f90: 63 72 61 73 68 20 69 73 20 62 65 69 6e 67 20 73  crash is being s
0fa0: 69 6d 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 61  imulated, then a
0fb0: 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 77  n entry of the w
0fc0: 72 69 74 65 2d 6c 69 73 74 20 69 73 0a 2a 2a 20  rite-list is.** 
0fd0: 20 20 73 65 6c 65 63 74 65 64 20 61 74 20 72 61    selected at ra
0fe0: 6e 64 6f 6d 2e 20 45 76 65 72 79 74 68 69 6e 67  ndom. Everything
0ff0: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 61 66 74   in the list aft
1000: 65 72 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  er the selected 
1010: 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20 64  entry .**   is d
1020: 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20  iscarded before 
1030: 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e  processing begin
1040: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 49 4f  s..**.**   If IO
1050: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 69  CAP_SEQUENTIAL i
1060: 73 20 73 65 74 20 61 6e 64 20 61 20 63 72 61 73  s set and a cras
1070: 68 20 69 73 20 62 65 69 6e 67 20 73 69 6d 75 6c  h is being simul
1080: 61 74 65 64 2c 20 6f 70 74 69 6f 6e 20 0a 2a 2a  ated, option .**
1090: 20 20 20 28 31 29 20 69 73 20 73 65 6c 65 63 74     (1) is select
10a0: 65 64 20 66 6f 72 20 61 6c 6c 20 77 72 69 74 65  ed for all write
10b0: 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 20 65 78  -list entries ex
10c0: 63 65 70 74 20 74 68 65 20 6c 61 73 74 2e 20 49  cept the last. I
10d0: 66 20 61 20 0a 2a 2a 20 20 20 63 72 61 73 68 20  f a .**   crash 
10e0: 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 69 6d  is not being sim
10f0: 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 61 6c 6c  ulated, then all
1100: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1110: 77 72 69 74 65 2d 6c 69 73 74 0a 2a 2a 20 20 20  write-list.**   
1120: 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
1130: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 77  e at least one w
1140: 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 66 69  rite() on the fi
1150: 6c 65 2d 68 61 6e 64 6c 65 20 73 70 65 63 69 66  le-handle specif
1160: 69 65 64 0a 2a 2a 20 20 20 61 73 20 70 61 72 74  ied.**   as part
1170: 20 6f 66 20 74 68 65 20 78 53 79 6e 63 28 29 20   of the xSync() 
1180: 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  are written to t
1190: 68 65 69 72 20 61 73 73 6f 63 69 61 74 65 64 20  heir associated 
11a0: 72 65 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  real files..**.*
11b0: 2a 20 20 20 49 66 20 49 4f 43 41 50 5f 53 41 46  *   If IOCAP_SAF
11c0: 45 41 50 50 45 4e 44 20 69 73 20 73 65 74 20 61  EAPPEND is set a
11d0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 62 79 74  nd the first byt
11e0: 65 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65  e written by the
11f0: 20 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 6f 70   write().**   op
1200: 65 72 61 74 69 6f 6e 20 69 73 20 6f 6e 65 20 62  eration is one b
1210: 79 74 65 20 70 61 73 74 20 74 68 65 20 63 75 72  yte past the cur
1220: 72 65 6e 74 20 65 6e 64 20 6f 66 20 74 68 65 20  rent end of the 
1230: 66 69 6c 65 2c 20 74 68 65 6e 20 6f 70 74 69 6f  file, then optio
1240: 6e 0a 2a 2a 20 20 20 28 31 29 20 69 73 20 61 6c  n.**   (1) is al
1250: 77 61 79 73 20 73 65 6c 65 63 74 65 64 2e 0a 2a  ways selected..*
1260: 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 77 72  /../*.** Each wr
1270: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  ite operation in
1280: 20 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 20   the write-list 
1290: 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  is represented b
12a0: 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  y an instance.**
12b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12c0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
12d0: 2a 2a 20 49 66 20 7a 42 75 66 20 69 73 20 30 2c  ** If zBuf is 0,
12e0: 20 74 68 65 6e 20 74 68 69 73 20 73 74 72 75 63   then this struc
12f0: 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 73 20  ture represents 
1300: 61 20 63 61 6c 6c 20 74 6f 20 78 54 72 75 6e 63  a call to xTrunc
1310: 61 74 65 28 29 2c 20 0a 2a 2a 20 6e 6f 74 20 78  ate(), .** not x
1320: 57 72 69 74 65 28 29 2e 20 49 6e 20 74 68 61 74  Write(). In that
1330: 20 63 61 73 65 2c 20 69 4f 66 66 73 65 74 20 69   case, iOffset i
1340: 73 20 74 68 65 20 73 69 7a 65 20 74 68 61 74 20  s the size that 
1350: 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 74  the file is.** t
1360: 72 75 6e 63 61 74 65 64 20 74 6f 2e 0a 2a 2f 0a  runcated to..*/.
1370: 73 74 72 75 63 74 20 57 72 69 74 65 42 75 66 66  struct WriteBuff
1380: 65 72 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73  er {.  i64 iOffs
1390: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
13a0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
13b0: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
13c0: 6f 66 20 74 68 69 73 20 77 72 69 74 65 28 29 20  of this write() 
13d0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 3b 20 20  */.  int nBuf;  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1400: 79 74 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ytes written */.
1410: 20 20 75 38 20 2a 7a 42 75 66 3b 20 20 20 20 20    u8 *zBuf;     
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1430: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 70  * Pointer to cop
1440: 79 20 6f 66 20 77 72 69 74 74 65 6e 20 64 61 74  y of written dat
1450: 61 20 2a 2f 0a 20 20 43 72 61 73 68 46 69 6c 65  a */.  CrashFile
1460: 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *pFile;        
1470: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 68 69 73      /* File this
1480: 20 77 72 69 74 65 28 29 20 61 70 70 6c 69 65 73   write() applies
1490: 20 74 6f 20 2a 2f 0a 0a 20 20 57 72 69 74 65 42   to */..  WriteB
14a0: 75 66 66 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  uffer *pNext;   
14b0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
14c0: 6e 20 43 72 61 73 68 47 6c 6f 62 61 6c 2e 70 57  n CrashGlobal.pW
14d0: 72 69 74 65 4c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  riteList */.};..
14e0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
14f0: 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74   {.  const sqlit
1500: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
1510: 4d 65 74 68 6f 64 3b 20 20 20 2f 2a 20 4d 75 73  Method;   /* Mus
1520: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
1530: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52  sqlite3_file *pR
1540: 65 61 6c 46 69 6c 65 3b 20 20 20 20 20 20 20 20  ealFile;        
1550: 20 20 20 20 20 2f 2a 20 55 6e 64 65 72 6c 79 69       /* Underlyi
1560: 6e 67 20 22 72 65 61 6c 22 20 66 69 6c 65 20 68  ng "real" file h
1570: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20  andle */.  char 
1580: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 66 6c  *zName;.  int fl
1590: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b0: 2a 20 46 6c 61 67 73 20 74 68 65 20 66 69 6c 65  * Flags the file
15c0: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
15d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 63 68 65 20   */..  /* Cache 
15e0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  of the entire fi
15f0: 6c 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  le. This is used
1600: 20 74 6f 20 73 70 65 65 64 20 75 70 20 4f 73 52   to speed up OsR
1610: 65 61 64 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ead() and .  ** 
1620: 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 63 61 6c  OsFileSize() cal
1630: 6c 73 2e 20 41 6c 74 68 6f 75 67 68 20 62 6f 74  ls. Although bot
1640: 68 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20  h could be done 
1650: 62 79 20 74 72 61 76 65 72 73 69 6e 67 20 74 68  by traversing th
1660: 65 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 69 73  e.  ** write-lis
1670: 74 2c 20 69 6e 20 70 72 61 63 74 69 63 65 20 74  t, in practice t
1680: 68 69 73 20 69 73 20 69 6d 70 72 61 63 74 69 63  his is impractic
1690: 61 6c 6c 79 20 73 6c 6f 77 2e 0a 20 20 2a 2f 0a  ally slow..  */.
16a0: 20 20 75 38 20 2a 7a 44 61 74 61 3b 20 20 20 20    u8 *zData;    
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
16d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
16e0: 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20 69   contents */.  i
16f0: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
1720: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
1730: 61 74 20 7a 44 61 74 61 20 2a 2f 0a 20 20 69 36  at zData */.  i6
1740: 34 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 iSize;        
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69     /* Size of fi
1770: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d  le in bytes */.}
1780: 3b 0a 0a 73 74 72 75 63 74 20 43 72 61 73 68 47  ;..struct CrashG
1790: 6c 6f 62 61 6c 20 7b 0a 20 20 57 72 69 74 65 42  lobal {.  WriteB
17a0: 75 66 66 65 72 20 2a 70 57 72 69 74 65 4c 69 73  uffer *pWriteLis
17b0: 74 3b 20 20 20 20 20 2f 2a 20 48 65 61 64 20 6f  t;     /* Head o
17c0: 66 20 77 72 69 74 65 2d 6c 69 73 74 20 2a 2f 0a  f write-list */.
17d0: 20 20 57 72 69 74 65 42 75 66 66 65 72 20 2a 70    WriteBuffer *p
17e0: 57 72 69 74 65 4c 69 73 74 45 6e 64 3b 20 20 2f  WriteListEnd;  /
17f0: 2a 20 45 6e 64 20 6f 66 20 77 72 69 74 65 2d 6c  * End of write-l
1800: 69 73 74 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 53  ist */..  int iS
1810: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
1820: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1830: 6f 66 20 73 69 6d 75 6c 61 74 65 64 20 73 65 63  of simulated sec
1840: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
1850: 74 20 69 44 65 76 69 63 65 43 68 61 72 61 63 74  t iDeviceCharact
1860: 65 72 69 73 74 69 63 73 3b 20 20 2f 2a 20 56 61  eristics;  /* Va
1870: 6c 75 65 20 6f 66 20 73 69 6d 75 6c 61 74 65 64  lue of simulated
1880: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1890: 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 69 6e  ristics */..  in
18a0: 74 20 69 43 72 61 73 68 3b 20 20 20 20 20 20 20  t iCrash;       
18b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 72             /* Cr
18c0: 61 73 68 20 6f 6e 20 74 68 65 20 69 43 72 61 73  ash on the iCras
18d0: 68 27 74 68 20 63 61 6c 6c 20 74 6f 20 78 53 79  h'th call to xSy
18e0: 6e 63 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 7a  nc() */.  char z
18f0: 43 72 61 73 68 46 69 6c 65 5b 35 30 30 5d 3b 20  CrashFile[500]; 
1900: 20 20 20 20 20 20 20 2f 2a 20 43 72 61 73 68 20         /* Crash 
1910: 64 75 72 69 6e 67 20 61 6e 20 78 53 79 6e 63 28  during an xSync(
1920: 29 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  ) on this file *
1930: 2f 20 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 43 72  / .};..static Cr
1940: 61 73 68 47 6c 6f 62 61 6c 20 67 20 3d 20 7b 30  ashGlobal g = {0
1950: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  , 0, SQLITE_DEFA
1960: 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2c  ULT_SECTOR_SIZE,
1970: 20 30 2c 20 30 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53   0, 0};../*.** S
1980: 65 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76  et this global v
1990: 61 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20  ariable to 1 to 
19a0: 65 6e 61 62 6c 65 20 63 72 61 73 68 20 74 65 73  enable crash tes
19b0: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
19c0: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73 68  int sqlite3Crash
19d0: 54 65 73 74 45 6e 61 62 6c 65 20 3d 20 30 3b 0a  TestEnable = 0;.
19e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 72  .static void *cr
19f0: 61 73 68 5f 6d 61 6c 6c 6f 63 28 69 6e 74 20 6e  ash_malloc(int n
1a00: 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Byte){.  return 
1a10: 28 76 6f 69 64 20 2a 29 54 63 6c 5f 41 74 74 65  (void *)Tcl_Atte
1a20: 6d 70 74 41 6c 6c 6f 63 28 28 73 69 7a 65 5f 74  mptAlloc((size_t
1a30: 29 6e 42 79 74 65 29 3b 0a 7d 0a 73 74 61 74 69  )nByte);.}.stati
1a40: 63 20 76 6f 69 64 20 63 72 61 73 68 5f 66 72 65  c void crash_fre
1a50: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 54 63  e(void *p){.  Tc
1a60: 6c 5f 46 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61  l_Free(p);.}.sta
1a70: 74 69 63 20 76 6f 69 64 20 2a 63 72 61 73 68 5f  tic void *crash_
1a80: 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 2c  realloc(void *p,
1a90: 20 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72   int n){.  retur
1aa0: 6e 20 28 76 6f 69 64 20 2a 29 54 63 6c 5f 41 74  n (void *)Tcl_At
1ab0: 74 65 6d 70 74 52 65 61 6c 6c 6f 63 28 70 2c 20  temptRealloc(p, 
1ac0: 28 73 69 7a 65 5f 74 29 6e 29 3b 0a 7d 0a 0a 2f  (size_t)n);.}../
1ad0: 2a 0a 2a 2a 20 57 72 61 70 70 65 72 20 61 72 6f  *.** Wrapper aro
1ae0: 75 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 4f  und the sqlite3O
1af0: 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  sWrite() functio
1b00: 6e 20 74 68 61 74 20 61 76 6f 69 64 73 20 77 72  n that avoids wr
1b10: 69 74 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  iting to the.** 
1b20: 35 31 32 20 62 79 74 65 20 62 6c 6f 63 6b 20 62  512 byte block b
1b30: 65 67 69 6e 69 6e 67 20 61 74 20 6f 66 66 73 65  egining at offse
1b40: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2e 0a  t PENDING_BYTE..
1b50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
1b60: 69 74 65 44 62 46 69 6c 65 28 43 72 61 73 68 46  iteDbFile(CrashF
1b70: 69 6c 65 20 2a 70 2c 20 75 38 20 2a 7a 2c 20 69  ile *p, u8 *z, i
1b80: 36 34 20 69 41 6d 74 2c 20 69 36 34 20 69 4f 66  64 iAmt, i64 iOf
1b90: 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  f){.  int rc = S
1ba0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1bb0: 69 53 6b 69 70 20 3d 20 30 3b 0a 20 20 69 66 28  iSkip = 0;.  if(
1bc0: 20 28 69 41 6d 74 2d 69 53 6b 69 70 29 3e 30 20   (iAmt-iSkip)>0 
1bd0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1be0: 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e 70 52  te3OsWrite(p->pR
1bf0: 65 61 6c 46 69 6c 65 2c 20 26 7a 5b 69 53 6b 69  ealFile, &z[iSki
1c00: 70 5d 2c 20 28 69 6e 74 29 28 69 41 6d 74 2d 69  p], (int)(iAmt-i
1c10: 53 6b 69 70 29 2c 20 69 4f 66 66 2b 69 53 6b 69  Skip), iOff+iSki
1c20: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1c30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c   rc;.}../*.** Fl
1c40: 75 73 68 20 74 68 65 20 77 72 69 74 65 2d 6c 69  ush the write-li
1c50: 73 74 20 61 73 20 69 66 20 78 53 79 6e 63 28 29  st as if xSync()
1c60: 20 68 61 64 20 62 65 65 6e 20 63 61 6c 6c 65 64   had been called
1c70: 20 6f 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 0a   on file handle.
1c80: 2a 2a 20 70 46 69 6c 65 2e 20 49 66 20 69 73 43  ** pFile. If isC
1c90: 72 61 73 68 20 69 73 20 74 72 75 65 2c 20 73 69  rash is true, si
1ca0: 6d 75 6c 61 74 65 20 61 20 63 72 61 73 68 2e 0a  mulate a crash..
1cb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
1cc0: 69 74 65 4c 69 73 74 53 79 6e 63 28 43 72 61 73  iteListSync(Cras
1cd0: 68 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  hFile *pFile, in
1ce0: 74 20 69 73 43 72 61 73 68 29 7b 0a 20 20 69 6e  t isCrash){.  in
1cf0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d00: 3b 0a 20 20 69 6e 74 20 69 44 63 20 3d 20 67 2e  ;.  int iDc = g.
1d10: 69 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  iDeviceCharacter
1d20: 69 73 74 69 63 73 3b 0a 0a 20 20 57 72 69 74 65  istics;..  Write
1d30: 42 75 66 66 65 72 20 2a 70 57 72 69 74 65 3b 0a  Buffer *pWrite;.
1d40: 20 20 57 72 69 74 65 42 75 66 66 65 72 20 2a 2a    WriteBuffer **
1d50: 70 70 50 74 72 3b 0a 0a 20 20 2f 2a 20 49 66 20  ppPtr;..  /* If 
1d60: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 72  this is not a cr
1d70: 61 73 68 20 73 69 6d 75 6c 61 74 69 6f 6e 2c 20  ash simulation, 
1d80: 73 65 74 20 70 46 69 6e 61 6c 20 74 6f 20 70 6f  set pFinal to po
1d90: 69 6e 74 20 74 6f 20 74 68 65 20 0a 20 20 2a 2a  int to the .  **
1da0: 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66   last element of
1db0: 20 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 20   the write-list 
1dc0: 74 68 61 74 20 69 73 20 61 73 73 6f 63 69 61 74  that is associat
1dd0: 65 64 20 77 69 74 68 20 66 69 6c 65 20 68 61 6e  ed with file han
1de0: 64 6c 65 0a 20 20 2a 2a 20 70 46 69 6c 65 2e 0a  dle.  ** pFile..
1df0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
1e00: 73 20 69 73 20 61 20 63 72 61 73 68 20 73 69 6d  s is a crash sim
1e10: 75 6c 61 74 69 6f 6e 2c 20 73 65 74 20 70 46 69  ulation, set pFi
1e20: 6e 61 6c 20 74 6f 20 61 6e 20 61 72 62 69 74 72  nal to an arbitr
1e30: 61 72 69 6c 79 20 73 65 6c 65 63 74 65 64 0a 20  arily selected. 
1e40: 20 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74   ** element of t
1e50: 68 65 20 77 72 69 74 65 2d 6c 69 73 74 2e 0a 20  he write-list.. 
1e60: 20 2a 2f 0a 20 20 57 72 69 74 65 42 75 66 66 65   */.  WriteBuffe
1e70: 72 20 2a 70 46 69 6e 61 6c 20 3d 20 30 3b 0a 20  r *pFinal = 0;. 
1e80: 20 69 66 28 20 21 69 73 43 72 61 73 68 20 29 7b   if( !isCrash ){
1e90: 0a 20 20 20 20 66 6f 72 28 70 57 72 69 74 65 3d  .    for(pWrite=
1ea0: 67 2e 70 57 72 69 74 65 4c 69 73 74 3b 20 70 57  g.pWriteList; pW
1eb0: 72 69 74 65 3b 20 70 57 72 69 74 65 3d 70 57 72  rite; pWrite=pWr
1ec0: 69 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ite->pNext){.   
1ed0: 20 20 20 69 66 28 20 70 57 72 69 74 65 2d 3e 70     if( pWrite->p
1ee0: 46 69 6c 65 3d 3d 70 46 69 6c 65 20 29 7b 0a 20  File==pFile ){. 
1ef0: 20 20 20 20 20 20 20 70 46 69 6e 61 6c 20 3d 20         pFinal = 
1f00: 70 57 72 69 74 65 3b 0a 20 20 20 20 20 20 7d 0a  pWrite;.      }.
1f10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1f20: 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
1f30: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 7c 53  CAP_SEQUENTIAL|S
1f40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f50: 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1f60: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
1f70: 20 20 20 20 69 6e 74 20 69 46 69 6e 61 6c 3b 0a      int iFinal;.
1f80: 20 20 20 20 66 6f 72 28 70 57 72 69 74 65 3d 67      for(pWrite=g
1f90: 2e 70 57 72 69 74 65 4c 69 73 74 3b 20 70 57 72  .pWriteList; pWr
1fa0: 69 74 65 3b 20 70 57 72 69 74 65 3d 70 57 72 69  ite; pWrite=pWri
1fb0: 74 65 2d 3e 70 4e 65 78 74 29 20 6e 57 72 69 74  te->pNext) nWrit
1fc0: 65 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e++;.    sqlite3
1fd0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
1fe0: 6f 66 28 69 6e 74 29 2c 20 26 69 46 69 6e 61 6c  of(int), &iFinal
1ff0: 29 3b 0a 20 20 20 20 69 46 69 6e 61 6c 20 3d 20  );.    iFinal = 
2000: 28 28 69 46 69 6e 61 6c 3c 30 29 3f 2d 31 2a 69  ((iFinal<0)?-1*i
2010: 46 69 6e 61 6c 3a 69 46 69 6e 61 6c 29 25 6e 57  Final:iFinal)%nW
2020: 72 69 74 65 3b 0a 20 20 20 20 66 6f 72 28 70 57  rite;.    for(pW
2030: 72 69 74 65 3d 67 2e 70 57 72 69 74 65 4c 69 73  rite=g.pWriteLis
2040: 74 3b 20 69 46 69 6e 61 6c 3e 30 3b 20 70 57 72  t; iFinal>0; pWr
2050: 69 74 65 3d 70 57 72 69 74 65 2d 3e 70 4e 65 78  ite=pWrite->pNex
2060: 74 29 20 69 46 69 6e 61 6c 2d 2d 3b 0a 20 20 20  t) iFinal--;.   
2070: 20 70 46 69 6e 61 6c 20 3d 20 70 57 72 69 74 65   pFinal = pWrite
2080: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 54 52  ;.  }..#ifdef TR
2090: 41 43 45 5f 43 52 41 53 48 54 45 53 54 0a 20 20  ACE_CRASHTEST.  
20a0: 69 66 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20  if( pFile ){.   
20b0: 20 70 72 69 6e 74 66 28 22 53 79 6e 63 20 25 73   printf("Sync %s
20c0: 20 28 69 73 20 25 73 20 63 72 61 73 68 29 5c 6e   (is %s crash)\n
20d0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 4e 61 6d 65 2c  ", pFile->zName,
20e0: 20 28 69 73 43 72 61 73 68 3f 22 61 22 3a 22 6e   (isCrash?"a":"n
20f0: 6f 74 20 61 22 29 29 3b 0a 20 20 7d 0a 23 65 6e  ot a"));.  }.#en
2100: 64 69 66 0a 0a 20 20 70 70 50 74 72 20 3d 20 26  dif..  ppPtr = &
2110: 67 2e 70 57 72 69 74 65 4c 69 73 74 3b 0a 20 20  g.pWriteList;.  
2120: 66 6f 72 28 70 57 72 69 74 65 3d 2a 70 70 50 74  for(pWrite=*ppPt
2130: 72 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  r; rc==SQLITE_OK
2140: 20 26 26 20 70 57 72 69 74 65 3b 20 70 57 72 69   && pWrite; pWri
2150: 74 65 3d 2a 70 70 50 74 72 29 7b 0a 20 20 20 20  te=*ppPtr){.    
2160: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52  sqlite3_file *pR
2170: 65 61 6c 46 69 6c 65 20 3d 20 70 57 72 69 74 65  ealFile = pWrite
2180: 2d 3e 70 46 69 6c 65 2d 3e 70 52 65 61 6c 46 69  ->pFile->pRealFi
2190: 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 28 65 41 63  le;..    /* (eAc
21a0: 74 69 6f 6e 3d 3d 31 29 20 20 20 20 20 20 2d 3e  tion==1)      ->
21b0: 20 77 72 69 74 65 20 62 6c 6f 63 6b 20 6f 75 74   write block out
21c0: 20 6e 6f 72 6d 61 6c 6c 79 2c 0a 20 20 20 20 2a   normally,.    *
21d0: 2a 20 28 65 41 63 74 69 6f 6e 3d 3d 32 29 20 20  * (eAction==2)  
21e0: 20 20 20 20 2d 3e 20 64 6f 20 6e 6f 74 68 69 6e      -> do nothin
21f0: 67 2c 0a 20 20 20 20 2a 2a 20 28 65 41 63 74 69  g,.    ** (eActi
2200: 6f 6e 3d 3d 33 29 20 20 20 20 20 20 2d 3e 20 74  on==3)      -> t
2210: 72 61 73 68 20 73 65 63 74 6f 72 73 2e 0a 20 20  rash sectors..  
2220: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 41 63    */.    int eAc
2230: 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66  tion = 0;.    if
2240: 28 20 21 69 73 43 72 61 73 68 20 29 7b 0a 20 20  ( !isCrash ){.  
2250: 20 20 20 20 65 41 63 74 69 6f 6e 20 3d 20 32 3b      eAction = 2;
2260: 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 72 69  .      if( (pWri
2270: 74 65 2d 3e 70 46 69 6c 65 3d 3d 70 46 69 6c 65  te->pFile==pFile
2280: 20 7c 7c 20 69 44 63 26 53 51 4c 49 54 45 5f 49   || iDc&SQLITE_I
2290: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
22a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 41 63 74   ){.        eAct
22b0: 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ion = 1;.      }
22c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22d0: 20 20 63 68 61 72 20 72 61 6e 64 6f 6d 3b 0a 20    char random;. 
22e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
22f0: 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 61 6e 64  domness(1, &rand
2300: 6f 6d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  om);..      /* D
2310: 6f 20 6e 6f 74 20 73 65 6c 65 63 74 20 6f 70 74  o not select opt
2320: 69 6f 6e 20 33 20 28 73 65 63 74 6f 72 20 74 72  ion 3 (sector tr
2330: 61 73 68 69 6e 67 29 20 69 66 20 74 68 65 20 49  ashing) if the I
2340: 4f 43 41 50 5f 41 54 4f 4d 49 43 20 66 6c 61 67  OCAP_ATOMIC flag
2350: 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65   .      ** is se
2360: 74 20 6f 72 20 74 68 69 73 20 69 73 20 61 6e 20  t or this is an 
2370: 4f 73 54 72 75 6e 63 61 74 65 28 29 2c 20 6e 6f  OsTruncate(), no
2380: 74 20 61 6e 20 4f 73 77 72 69 74 65 28 29 2e 0a  t an Oswrite()..
2390: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
23a0: 66 28 20 28 69 44 63 26 53 51 4c 49 54 45 5f 49  f( (iDc&SQLITE_I
23b0: 4f 43 41 50 5f 41 54 4f 4d 49 43 29 20 7c 7c 20  OCAP_ATOMIC) || 
23c0: 28 70 57 72 69 74 65 2d 3e 7a 42 75 66 3d 3d 30  (pWrite->zBuf==0
23d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 6e  ) ){.        ran
23e0: 64 6f 6d 20 26 3d 20 30 78 30 31 3b 0a 20 20 20  dom &= 0x01;.   
23f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2400: 66 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  f IOCAP_SEQUENTI
2410: 41 4c 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  AL is set and th
2420: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69  is is not the fi
2430: 6e 61 6c 20 65 6e 74 72 79 0a 20 20 20 20 20 20  nal entry.      
2440: 2a 2a 20 69 6e 20 74 68 65 20 74 72 75 6e 63 61  ** in the trunca
2450: 74 65 64 20 77 72 69 74 65 2d 6c 69 73 74 2c 20  ted write-list, 
2460: 61 6c 77 61 79 73 20 73 65 6c 65 63 74 20 6f 70  always select op
2470: 74 69 6f 6e 20 31 20 28 77 72 69 74 65 0a 20 20  tion 1 (write.  
2480: 20 20 20 20 2a 2a 20 6f 75 74 20 63 6f 72 72 65      ** out corre
2490: 63 74 6c 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  ctly)..      */.
24a0: 20 20 20 20 20 20 69 66 28 20 28 69 44 63 26 53        if( (iDc&S
24b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
24c0: 45 4e 54 49 41 4c 20 26 26 20 70 57 72 69 74 65  ENTIAL && pWrite
24d0: 21 3d 70 46 69 6e 61 6c 29 20 29 7b 0a 20 20 20  !=pFinal) ){.   
24e0: 20 20 20 20 20 72 61 6e 64 6f 6d 20 3d 20 30 3b       random = 0;
24f0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2500: 2f 2a 20 49 66 20 49 4f 43 41 50 5f 53 41 46 45  /* If IOCAP_SAFE
2510: 5f 41 50 50 45 4e 44 20 69 73 20 73 65 74 20 61  _APPEND is set a
2520: 6e 64 20 74 68 69 73 20 4f 73 57 72 69 74 65 28  nd this OsWrite(
2530: 29 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 0a 20  ) operation is. 
2540: 20 20 20 20 20 2a 2a 20 61 6e 20 61 70 70 65 6e       ** an appen
2550: 64 20 28 66 69 72 73 74 20 62 79 74 65 20 6f 66  d (first byte of
2560: 20 74 68 65 20 77 72 69 74 74 65 6e 20 72 65 67   the written reg
2570: 69 6f 6e 20 69 73 20 31 20 62 79 74 65 20 70 61  ion is 1 byte pa
2580: 73 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  st the.      ** 
2590: 63 75 72 72 65 6e 74 20 45 4f 46 29 2c 20 61 6c  current EOF), al
25a0: 77 61 79 73 20 73 65 6c 65 63 74 20 6f 70 74 69  ways select opti
25b0: 6f 6e 20 31 20 28 77 72 69 74 65 20 6f 75 74 20  on 1 (write out 
25c0: 63 6f 72 72 65 63 74 6c 79 29 2e 0a 20 20 20 20  correctly)..    
25d0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
25e0: 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
25f0: 53 41 46 45 5f 41 50 50 45 4e 44 20 26 26 20 70  SAFE_APPEND && p
2600: 57 72 69 74 65 2d 3e 7a 42 75 66 20 29 7b 0a 20  Write->zBuf ){. 
2610: 20 20 20 20 20 20 20 69 36 34 20 69 53 69 7a 65         i64 iSize
2620: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2630: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 52 65 61  3OsFileSize(pRea
2640: 6c 46 69 6c 65 2c 20 26 69 53 69 7a 65 29 3b 0a  lFile, &iSize);.
2650: 20 20 20 20 20 20 20 20 69 66 28 20 69 53 69 7a          if( iSiz
2660: 65 3d 3d 70 57 72 69 74 65 2d 3e 69 4f 66 66 73  e==pWrite->iOffs
2670: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
2680: 72 61 6e 64 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  random = 0;.    
2690: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
26a0: 20 20 20 20 20 69 66 28 20 28 72 61 6e 64 6f 6d       if( (random
26b0: 26 30 78 30 36 29 3d 3d 30 78 30 36 20 29 7b 0a  &0x06)==0x06 ){.
26c0: 20 20 20 20 20 20 20 20 65 41 63 74 69 6f 6e 20          eAction 
26d0: 3d 20 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 3;.      }else
26e0: 7b 0a 20 20 20 20 20 20 20 20 65 41 63 74 69 6f  {.        eActio
26f0: 6e 20 3d 20 28 28 72 61 6e 64 6f 6d 26 30 78 30  n = ((random&0x0
2700: 31 29 3f 32 3a 31 29 3b 0a 20 20 20 20 20 20 7d  1)?2:1);.      }
2710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
2720: 63 68 28 20 65 41 63 74 69 6f 6e 20 29 7b 0a 20  ch( eAction ){. 
2730: 20 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 20       case 1: {  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 57 72 69 74 65 20 6f 75 74 20 63 6f 72 72 65 63  Write out correc
2760: 74 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tly */.        i
2770: 66 28 20 70 57 72 69 74 65 2d 3e 7a 42 75 66 20  f( pWrite->zBuf 
2780: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2790: 3d 20 77 72 69 74 65 44 62 46 69 6c 65 28 0a 20  = writeDbFile(. 
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 72               pWr
27b0: 69 74 65 2d 3e 70 46 69 6c 65 2c 20 70 57 72 69  ite->pFile, pWri
27c0: 74 65 2d 3e 7a 42 75 66 2c 20 70 57 72 69 74 65  te->zBuf, pWrite
27d0: 2d 3e 6e 42 75 66 2c 20 70 57 72 69 74 65 2d 3e  ->nBuf, pWrite->
27e0: 69 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  iOffset.        
27f0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
2800: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2810: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
2820: 63 61 74 65 28 70 52 65 61 6c 46 69 6c 65 2c 20  cate(pRealFile, 
2830: 70 57 72 69 74 65 2d 3e 69 4f 66 66 73 65 74 29  pWrite->iOffset)
2840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2850: 20 20 20 20 2a 70 70 50 74 72 20 3d 20 70 57 72      *ppPtr = pWr
2860: 69 74 65 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 64  ite->pNext;.#ifd
2870: 65 66 20 54 52 41 43 45 5f 43 52 41 53 48 54 45  ef TRACE_CRASHTE
2880: 53 54 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ST.        if( i
2890: 73 43 72 61 73 68 20 29 7b 0a 20 20 20 20 20 20  sCrash ){.      
28a0: 20 20 20 20 70 72 69 6e 74 66 28 22 57 72 69 74      printf("Writ
28b0: 69 6e 67 20 25 64 20 62 79 74 65 73 20 40 20 25  ing %d bytes @ %
28c0: 64 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20  d (%s)\n", .    
28d0: 20 20 20 20 20 20 20 20 70 57 72 69 74 65 2d 3e          pWrite->
28e0: 6e 42 75 66 2c 20 28 69 6e 74 29 70 57 72 69 74  nBuf, (int)pWrit
28f0: 65 2d 3e 69 4f 66 66 73 65 74 2c 20 70 57 72 69  e->iOffset, pWri
2900: 74 65 2d 3e 70 46 69 6c 65 2d 3e 7a 4e 61 6d 65  te->pFile->zName
2910: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
2920: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2930: 20 20 20 20 20 20 20 63 72 61 73 68 5f 66 72 65         crash_fre
2940: 65 28 70 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(pWrite);.     
2950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2960: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20  }.      case 2: 
2970: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
2980: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
2990: 0a 20 20 20 20 20 20 20 20 70 70 50 74 72 20 3d  .        ppPtr =
29a0: 20 26 70 57 72 69 74 65 2d 3e 70 4e 65 78 74 3b   &pWrite->pNext;
29b0: 0a 23 69 66 64 65 66 20 54 52 41 43 45 5f 43 52  .#ifdef TRACE_CR
29c0: 41 53 48 54 45 53 54 0a 20 20 20 20 20 20 20 20  ASHTEST.        
29d0: 69 66 28 20 69 73 43 72 61 73 68 20 29 7b 0a 20  if( isCrash ){. 
29e0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
29f0: 22 4f 6d 69 74 69 6e 67 20 25 64 20 62 79 74 65  "Omiting %d byte
2a00: 73 20 40 20 25 64 20 28 25 73 29 5c 6e 22 2c 20  s @ %d (%s)\n", 
2a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57 72  .            pWr
2a20: 69 74 65 2d 3e 6e 42 75 66 2c 20 28 69 6e 74 29  ite->nBuf, (int)
2a30: 70 57 72 69 74 65 2d 3e 69 4f 66 66 73 65 74 2c  pWrite->iOffset,
2a40: 20 70 57 72 69 74 65 2d 3e 70 46 69 6c 65 2d 3e   pWrite->pFile->
2a50: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20  zName.          
2a60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
2a70: 64 69 66 0a 20 20 20 20 20 20 20 20 62 72 65 61  dif.        brea
2a80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2a90: 20 63 61 73 65 20 33 3a 20 7b 20 20 20 20 20 20   case 3: {      
2aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 73           /* Tras
2ab0: 68 20 73 65 63 74 6f 72 73 20 2a 2f 0a 20 20 20  h sectors */.   
2ac0: 20 20 20 20 20 75 38 20 2a 7a 47 61 72 62 61 67       u8 *zGarbag
2ad0: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e;.        int i
2ae0: 46 69 72 73 74 20 3d 20 28 69 6e 74 29 28 70 57  First = (int)(pW
2af0: 72 69 74 65 2d 3e 69 4f 66 66 73 65 74 2f 67 2e  rite->iOffset/g.
2b00: 69 53 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  iSectorSize);.  
2b10: 20 20 20 20 20 20 69 6e 74 20 69 4c 61 73 74 20        int iLast 
2b20: 3d 20 28 69 6e 74 29 28 28 70 57 72 69 74 65 2d  = (int)((pWrite-
2b30: 3e 69 4f 66 66 73 65 74 2b 70 57 72 69 74 65 2d  >iOffset+pWrite-
2b40: 3e 6e 42 75 66 2d 31 29 2f 67 2e 69 53 65 63 74  >nBuf-1)/g.iSect
2b50: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 20 20 20 20  orSize);..      
2b60: 20 20 61 73 73 65 72 74 28 70 57 72 69 74 65 2d    assert(pWrite-
2b70: 3e 7a 42 75 66 29 3b 0a 0a 23 69 66 64 65 66 20  >zBuf);..#ifdef 
2b80: 54 52 41 43 45 5f 43 52 41 53 48 54 45 53 54 0a  TRACE_CRASHTEST.
2b90: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
2ba0: 54 72 61 73 68 69 6e 67 20 25 64 20 73 65 63 74  Trashing %d sect
2bb0: 6f 72 73 20 28 25 64 20 62 79 74 65 73 29 20 40  ors (%d bytes) @
2bc0: 20 25 6c 6c 64 20 28 73 65 63 74 6f 72 20 25 64   %lld (sector %d
2bd0: 29 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20  ) (%s)\n", .    
2be0: 20 20 20 20 20 20 20 20 31 2b 69 4c 61 73 74 2d          1+iLast-
2bf0: 69 46 69 72 73 74 2c 20 28 31 2b 69 4c 61 73 74  iFirst, (1+iLast
2c00: 2d 69 46 69 72 73 74 29 2a 67 2e 69 53 65 63 74  -iFirst)*g.iSect
2c10: 6f 72 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  orSize,.        
2c20: 20 20 20 20 70 57 72 69 74 65 2d 3e 69 4f 66 66      pWrite->iOff
2c30: 73 65 74 2c 20 69 46 69 72 73 74 2c 20 70 57 72  set, iFirst, pWr
2c40: 69 74 65 2d 3e 70 46 69 6c 65 2d 3e 7a 4e 61 6d  ite->pFile->zNam
2c50: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  e.        );.#en
2c60: 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7a 47 61  dif..        zGa
2c70: 72 62 61 67 65 20 3d 20 63 72 61 73 68 5f 6d 61  rbage = crash_ma
2c80: 6c 6c 6f 63 28 67 2e 69 53 65 63 74 6f 72 53 69  lloc(g.iSectorSi
2c90: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ze);.        if(
2ca0: 20 7a 47 61 72 62 61 67 65 20 29 7b 0a 20 20 20   zGarbage ){.   
2cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
2cc0: 6e 74 36 34 20 69 3b 0a 20 20 20 20 20 20 20 20  nt64 i;.        
2cd0: 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
2ce0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cf0: 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
2d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d10: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2d20: 67 2e 69 53 65 63 74 6f 72 53 69 7a 65 2c 20 7a  g.iSectorSize, z
2d30: 47 61 72 62 61 67 65 29 3b 20 0a 20 20 20 20 20  Garbage); .     
2d40: 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
2d50: 65 44 62 46 69 6c 65 28 0a 20 20 20 20 20 20 20  eDbFile(.       
2d60: 20 20 20 20 20 20 20 70 57 72 69 74 65 2d 3e 70         pWrite->p
2d70: 46 69 6c 65 2c 20 7a 47 61 72 62 61 67 65 2c 20  File, zGarbage, 
2d80: 67 2e 69 53 65 63 74 6f 72 53 69 7a 65 2c 20 69  g.iSectorSize, i
2d90: 2a 67 2e 69 53 65 63 74 6f 72 53 69 7a 65 0a 20  *g.iSectorSize. 
2da0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
2db0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc0: 20 20 20 20 63 72 61 73 68 5f 66 72 65 65 28 7a      crash_free(z
2dd0: 47 61 72 62 61 67 65 29 3b 0a 20 20 20 20 20 20  Garbage);.      
2de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2df0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2e00: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
2e10: 0a 20 20 20 20 20 20 20 20 70 70 50 74 72 20 3d  .        ppPtr =
2e20: 20 26 70 57 72 69 74 65 2d 3e 70 4e 65 78 74 3b   &pWrite->pNext;
2e30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2e40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
2e50: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
2e60: 61 73 73 65 72 74 28 21 22 43 61 6e 6e 6f 74 20  assert(!"Cannot 
2e70: 68 61 70 70 65 6e 22 29 3b 0a 20 20 20 20 7d 0a  happen");.    }.
2e80: 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 3d  .    if( pWrite=
2e90: 3d 70 46 69 6e 61 6c 20 29 20 62 72 65 61 6b 3b  =pFinal ) break;
2ea0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2eb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 43  SQLITE_OK && isC
2ec0: 72 61 73 68 20 29 7b 0a 20 20 20 20 65 78 69 74  rash ){.    exit
2ed0: 28 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  (-1);.  }..  for
2ee0: 28 70 57 72 69 74 65 3d 67 2e 70 57 72 69 74 65  (pWrite=g.pWrite
2ef0: 4c 69 73 74 3b 20 70 57 72 69 74 65 20 26 26 20  List; pWrite && 
2f00: 70 57 72 69 74 65 2d 3e 70 4e 65 78 74 3b 20 70  pWrite->pNext; p
2f10: 57 72 69 74 65 3d 70 57 72 69 74 65 2d 3e 70 4e  Write=pWrite->pN
2f20: 65 78 74 29 3b 0a 20 20 67 2e 70 57 72 69 74 65  ext);.  g.pWrite
2f30: 4c 69 73 74 45 6e 64 20 3d 20 70 57 72 69 74 65  ListEnd = pWrite
2f40: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
2f60: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 65 6e 64  entry to the end
2f70: 20 6f 66 20 74 68 65 20 77 72 69 74 65 2d 6c 69   of the write-li
2f80: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
2f90: 74 20 77 72 69 74 65 4c 69 73 74 41 70 70 65 6e  t writeListAppen
2fa0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
2fb0: 65 20 2a 70 46 69 6c 65 2c 0a 20 20 73 71 6c 69  e *pFile,.  sqli
2fc0: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65  te3_int64 iOffse
2fd0: 74 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  t,.  const u8 *z
2fe0: 42 75 66 2c 0a 20 20 69 6e 74 20 6e 42 75 66 0a  Buf,.  int nBuf.
2ff0: 29 7b 0a 20 20 57 72 69 74 65 42 75 66 66 65 72  ){.  WriteBuffer
3000: 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72   *pNew;..  asser
3010: 74 28 28 7a 42 75 66 20 26 26 20 6e 42 75 66 29  t((zBuf && nBuf)
3020: 20 7c 7c 20 28 21 6e 42 75 66 20 26 26 20 21 7a   || (!nBuf && !z
3030: 42 75 66 29 29 3b 0a 0a 20 20 70 4e 65 77 20 3d  Buf));..  pNew =
3040: 20 28 57 72 69 74 65 42 75 66 66 65 72 20 2a 29   (WriteBuffer *)
3050: 63 72 61 73 68 5f 6d 61 6c 6c 6f 63 28 73 69 7a  crash_malloc(siz
3060: 65 6f 66 28 57 72 69 74 65 42 75 66 66 65 72 29  eof(WriteBuffer)
3070: 20 2b 20 6e 42 75 66 29 3b 0a 20 20 69 66 28 20   + nBuf);.  if( 
3080: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 66  pNew==0 ){.    f
3090: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30a0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 69 6e  out of memory in
30b0: 20 74 68 65 20 63 72 61 73 68 20 73 69 6d 75 6c   the crash simul
30c0: 61 74 6f 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  ator\n");.  }.  
30d0: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
30e0: 73 69 7a 65 6f 66 28 57 72 69 74 65 42 75 66 66  sizeof(WriteBuff
30f0: 65 72 29 2b 6e 42 75 66 29 3b 0a 20 20 70 4e 65  er)+nBuf);.  pNe
3100: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  w->iOffset = iOf
3110: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 42  fset;.  pNew->nB
3120: 75 66 20 3d 20 6e 42 75 66 3b 0a 20 20 70 4e 65  uf = nBuf;.  pNe
3130: 77 2d 3e 70 46 69 6c 65 20 3d 20 28 43 72 61 73  w->pFile = (Cras
3140: 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  hFile *)pFile;. 
3150: 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20   if( zBuf ){.   
3160: 20 70 4e 65 77 2d 3e 7a 42 75 66 20 3d 20 28 75   pNew->zBuf = (u
3170: 38 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  8 *)&pNew[1];.  
3180: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
3190: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  Buf, zBuf, nBuf)
31a0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 2e 70  ;.  }..  if( g.p
31b0: 57 72 69 74 65 4c 69 73 74 20 29 7b 0a 20 20 20  WriteList ){.   
31c0: 20 61 73 73 65 72 74 28 67 2e 70 57 72 69 74 65   assert(g.pWrite
31d0: 4c 69 73 74 45 6e 64 29 3b 0a 20 20 20 20 67 2e  ListEnd);.    g.
31e0: 70 57 72 69 74 65 4c 69 73 74 45 6e 64 2d 3e 70  pWriteListEnd->p
31f0: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
3200: 65 6c 73 65 7b 0a 20 20 20 20 67 2e 70 57 72 69  else{.    g.pWri
3210: 74 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  teList = pNew;. 
3220: 20 7d 0a 20 20 67 2e 70 57 72 69 74 65 4c 69 73   }.  g.pWriteLis
3230: 74 45 6e 64 20 3d 20 70 4e 65 77 3b 0a 20 20 0a  tEnd = pNew;.  .
3240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3250: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
3260: 73 65 20 61 20 63 72 61 73 68 2d 66 69 6c 65 2e  se a crash-file.
3270: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
3280: 66 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  fClose(sqlite3_f
3290: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 43  ile *pFile){.  C
32a0: 72 61 73 68 46 69 6c 65 20 2a 70 43 72 61 73 68  rashFile *pCrash
32b0: 20 3d 20 28 43 72 61 73 68 46 69 6c 65 20 2a 29   = (CrashFile *)
32c0: 70 46 69 6c 65 3b 0a 20 20 77 72 69 74 65 4c 69  pFile;.  writeLi
32d0: 73 74 53 79 6e 63 28 70 43 72 61 73 68 2c 20 30  stSync(pCrash, 0
32e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
32f0: 6f 73 65 28 70 43 72 61 73 68 2d 3e 70 52 65 61  ose(pCrash->pRea
3300: 6c 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  lFile);.  return
3310: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3320: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
3330: 72 6f 6d 20 61 20 63 72 61 73 68 2d 66 69 6c 65  rom a crash-file
3340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3350: 63 66 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  cfRead(.  sqlite
3360: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
3370: 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
3380: 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
3390: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
33a0: 0a 29 7b 0a 20 20 43 72 61 73 68 46 69 6c 65 20  .){.  CrashFile 
33b0: 2a 70 43 72 61 73 68 20 3d 20 28 43 72 61 73 68  *pCrash = (Crash
33c0: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
33d0: 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
33e0: 29 4d 49 4e 28 28 69 36 34 29 69 41 6d 74 2c 20  )MIN((i64)iAmt, 
33f0: 28 70 43 72 61 73 68 2d 3e 69 53 69 7a 65 20 2d  (pCrash->iSize -
3400: 20 69 4f 66 73 74 29 29 3b 0a 0a 20 20 69 66 28   iOfst));..  if(
3410: 20 6e 43 6f 70 79 3e 30 20 29 7b 0a 20 20 20 20   nCopy>0 ){.    
3420: 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 70 43  memcpy(zBuf, &pC
3430: 72 61 73 68 2d 3e 7a 44 61 74 61 5b 69 4f 66 73  rash->zData[iOfs
3440: 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 7d 0a  t], nCopy);.  }.
3450: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
3460: 66 69 6c 65 2d 73 69 7a 65 20 74 6f 20 73 65 65  file-size to see
3470: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
3480: 6f 72 74 2d 72 65 61 64 20 2a 2f 0a 20 20 69 66  ort-read */.  if
3490: 28 20 6e 43 6f 70 79 3c 69 41 6d 74 20 29 7b 0a  ( nCopy<iAmt ){.
34a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34b0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
34c0: 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  AD;.  }..  retur
34d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
34e0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
34f0: 20 74 6f 20 61 20 63 72 61 73 68 2d 66 69 6c 65   to a crash-file
3500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3510: 63 66 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  cfWrite(.  sqlit
3520: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
3530: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
3540: 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
3550: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
3560: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 43 72 61  4 iOfst.){.  Cra
3570: 73 68 46 69 6c 65 20 2a 70 43 72 61 73 68 20 3d  shFile *pCrash =
3580: 20 28 43 72 61 73 68 46 69 6c 65 20 2a 29 70 46   (CrashFile *)pF
3590: 69 6c 65 3b 0a 20 20 69 66 28 20 69 41 6d 74 2b  ile;.  if( iAmt+
35a0: 69 4f 66 73 74 3e 70 43 72 61 73 68 2d 3e 69 53  iOfst>pCrash->iS
35b0: 69 7a 65 20 29 7b 0a 20 20 20 20 70 43 72 61 73  ize ){.    pCras
35c0: 68 2d 3e 69 53 69 7a 65 20 3d 20 28 69 6e 74 29  h->iSize = (int)
35d0: 28 69 41 6d 74 2b 69 4f 66 73 74 29 3b 0a 20 20  (iAmt+iOfst);.  
35e0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 43 72 61 73  }.  while( pCras
35f0: 68 2d 3e 69 53 69 7a 65 3e 70 43 72 61 73 68 2d  h->iSize>pCrash-
3600: 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 75 38  >nData ){.    u8
3610: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *zNew;.    int 
3620: 6e 4e 65 77 20 3d 20 28 70 43 72 61 73 68 2d 3e  nNew = (pCrash->
3630: 6e 44 61 74 61 2a 32 29 20 2b 20 34 30 39 36 3b  nData*2) + 4096;
3640: 0a 20 20 20 20 7a 4e 65 77 20 3d 20 63 72 61 73  .    zNew = cras
3650: 68 5f 72 65 61 6c 6c 6f 63 28 70 43 72 61 73 68  h_realloc(pCrash
3660: 2d 3e 7a 44 61 74 61 2c 20 6e 4e 65 77 29 3b 0a  ->zData, nNew);.
3670: 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b      if( !zNew ){
3680: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3690: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
36a0: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 4e  }.    memset(&zN
36b0: 65 77 5b 70 43 72 61 73 68 2d 3e 6e 44 61 74 61  ew[pCrash->nData
36c0: 5d 2c 20 30 2c 20 6e 4e 65 77 2d 70 43 72 61 73  ], 0, nNew-pCras
36d0: 68 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20 70  h->nData);.    p
36e0: 43 72 61 73 68 2d 3e 6e 44 61 74 61 20 3d 20 6e  Crash->nData = n
36f0: 4e 65 77 3b 0a 20 20 20 20 70 43 72 61 73 68 2d  New;.    pCrash-
3700: 3e 7a 44 61 74 61 20 3d 20 7a 4e 65 77 3b 0a 20  >zData = zNew;. 
3710: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 43 72   }.  memcpy(&pCr
3720: 61 73 68 2d 3e 7a 44 61 74 61 5b 69 4f 66 73 74  ash->zData[iOfst
3730: 5d 2c 20 7a 42 75 66 2c 20 69 41 6d 74 29 3b 0a  ], zBuf, iAmt);.
3740: 20 20 72 65 74 75 72 6e 20 77 72 69 74 65 4c 69    return writeLi
3750: 73 74 41 70 70 65 6e 64 28 70 46 69 6c 65 2c 20  stAppend(pFile, 
3760: 69 4f 66 73 74 2c 20 7a 42 75 66 2c 20 69 41 6d  iOfst, zBuf, iAm
3770: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  t);.}../*.** Tru
3780: 6e 63 61 74 65 20 61 20 63 72 61 73 68 2d 66 69  ncate a crash-fi
3790: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
37a0: 74 20 63 66 54 72 75 6e 63 61 74 65 28 73 71 6c  t cfTruncate(sql
37b0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
37c0: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  , sqlite_int64 s
37d0: 69 7a 65 29 7b 0a 20 20 43 72 61 73 68 46 69 6c  ize){.  CrashFil
37e0: 65 20 2a 70 43 72 61 73 68 20 3d 20 28 43 72 61  e *pCrash = (Cra
37f0: 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  shFile *)pFile;.
3800: 20 20 61 73 73 65 72 74 28 73 69 7a 65 3e 3d 30    assert(size>=0
3810: 29 3b 0a 20 20 69 66 28 20 70 43 72 61 73 68 2d  );.  if( pCrash-
3820: 3e 69 53 69 7a 65 3e 73 69 7a 65 20 29 7b 0a 20  >iSize>size ){. 
3830: 20 20 20 70 43 72 61 73 68 2d 3e 69 53 69 7a 65     pCrash->iSize
3840: 20 3d 20 28 69 6e 74 29 73 69 7a 65 3b 0a 20 20   = (int)size;.  
3850: 7d 0a 20 20 72 65 74 75 72 6e 20 77 72 69 74 65  }.  return write
3860: 4c 69 73 74 41 70 70 65 6e 64 28 70 46 69 6c 65  ListAppend(pFile
3870: 2c 20 73 69 7a 65 2c 20 30 2c 20 30 29 3b 0a 7d  , size, 0, 0);.}
3880: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 20 63  ../*.** Sync a c
3890: 72 61 73 68 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rash-file..*/.st
38a0: 61 74 69 63 20 69 6e 74 20 63 66 53 79 6e 63 28  atic int cfSync(
38b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
38c0: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ile, int flags){
38d0: 0a 20 20 43 72 61 73 68 46 69 6c 65 20 2a 70 43  .  CrashFile *pC
38e0: 72 61 73 68 20 3d 20 28 43 72 61 73 68 46 69 6c  rash = (CrashFil
38f0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
3900: 20 69 73 43 72 61 73 68 20 3d 20 30 3b 0a 0a 20   isCrash = 0;.. 
3910: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3920: 6d 65 20 3d 20 70 43 72 61 73 68 2d 3e 7a 4e 61  me = pCrash->zNa
3930: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
3940: 20 2a 7a 43 72 61 73 68 46 69 6c 65 20 3d 20 67   *zCrashFile = g
3950: 2e 7a 43 72 61 73 68 46 69 6c 65 3b 0a 20 20 69  .zCrashFile;.  i
3960: 6e 74 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29  nt nName = (int)
3970: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
3980: 20 69 6e 74 20 6e 43 72 61 73 68 46 69 6c 65 20   int nCrashFile 
3990: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43  = (int)strlen(zC
39a0: 72 61 73 68 46 69 6c 65 29 3b 0a 0a 20 20 69 66  rashFile);..  if
39b0: 28 20 6e 43 72 61 73 68 46 69 6c 65 3e 30 20 26  ( nCrashFile>0 &
39c0: 26 20 7a 43 72 61 73 68 46 69 6c 65 5b 6e 43 72  & zCrashFile[nCr
39d0: 61 73 68 46 69 6c 65 2d 31 5d 3d 3d 27 2a 27 20  ashFile-1]=='*' 
39e0: 29 7b 0a 20 20 20 20 6e 43 72 61 73 68 46 69 6c  ){.    nCrashFil
39f0: 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 4e 61  e--;.    if( nNa
3a00: 6d 65 3e 6e 43 72 61 73 68 46 69 6c 65 20 29 20  me>nCrashFile ) 
3a10: 6e 4e 61 6d 65 20 3d 20 6e 43 72 61 73 68 46 69  nName = nCrashFi
3a20: 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  le;.  }..#ifdef 
3a30: 54 52 41 43 45 5f 43 52 41 53 48 54 45 53 54 0a  TRACE_CRASHTEST.
3a40: 20 20 70 72 69 6e 74 66 28 22 63 66 53 79 6e 63    printf("cfSync
3a50: 28 29 3a 20 6e 4e 61 6d 65 20 3d 20 25 64 2c 20  (): nName = %d, 
3a60: 6e 43 72 61 73 68 46 69 6c 65 20 3d 20 25 64 2c  nCrashFile = %d,
3a70: 20 7a 4e 61 6d 65 20 3d 20 25 73 2c 20 7a 43 72   zName = %s, zCr
3a80: 61 73 68 46 69 6c 65 20 3d 20 25 73 5c 6e 22 2c  ashFile = %s\n",
3a90: 0a 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 2c  .         nName,
3aa0: 20 6e 43 72 61 73 68 46 69 6c 65 2c 20 7a 4e 61   nCrashFile, zNa
3ab0: 6d 65 2c 20 7a 43 72 61 73 68 46 69 6c 65 29 3b  me, zCrashFile);
3ac0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e  .#endif..  if( n
3ad0: 4e 61 6d 65 3d 3d 6e 43 72 61 73 68 46 69 6c 65  Name==nCrashFile
3ae0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4e   && 0==memcmp(zN
3af0: 61 6d 65 2c 20 7a 43 72 61 73 68 46 69 6c 65 2c  ame, zCrashFile,
3b00: 20 6e 4e 61 6d 65 29 20 29 7b 0a 23 69 66 64 65   nName) ){.#ifde
3b10: 66 20 54 52 41 43 45 5f 43 52 41 53 48 54 45 53  f TRACE_CRASHTES
3b20: 54 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63 66  T.    printf("cf
3b30: 53 79 6e 63 28 29 3a 20 6e 61 6d 65 20 6d 61 74  Sync(): name mat
3b40: 63 68 65 64 2c 20 67 2e 69 43 72 61 73 68 20 3d  ched, g.iCrash =
3b50: 20 25 64 5c 6e 22 2c 20 67 2e 69 43 72 61 73 68   %d\n", g.iCrash
3b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
3b70: 28 20 28 2d 2d 67 2e 69 43 72 61 73 68 29 3d 3d  ( (--g.iCrash)==
3b80: 30 20 29 20 69 73 43 72 61 73 68 20 3d 20 31 3b  0 ) isCrash = 1;
3b90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 77  .  }..  return w
3ba0: 72 69 74 65 4c 69 73 74 53 79 6e 63 28 70 43 72  riteListSync(pCr
3bb0: 61 73 68 2c 20 69 73 43 72 61 73 68 29 3b 0a 7d  ash, isCrash);.}
3bc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3bd0: 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d  he current file-
3be0: 73 69 7a 65 20 6f 66 20 74 68 65 20 63 72 61 73  size of the cras
3bf0: 68 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  h-file..*/.stati
3c00: 63 20 69 6e 74 20 63 66 46 69 6c 65 53 69 7a 65  c int cfFileSize
3c10: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
3c20: 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
3c30: 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 43 72  64 *pSize){.  Cr
3c40: 61 73 68 46 69 6c 65 20 2a 70 43 72 61 73 68 20  ashFile *pCrash 
3c50: 3d 20 28 43 72 61 73 68 46 69 6c 65 20 2a 29 70  = (CrashFile *)p
3c60: 46 69 6c 65 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  File;.  *pSize =
3c70: 20 28 69 36 34 29 70 43 72 61 73 68 2d 3e 69 53   (i64)pCrash->iS
3c80: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
3c90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3ca0: 2a 20 43 61 6c 6c 73 20 72 65 6c 61 74 65 64 20  * Calls related 
3cb0: 74 6f 20 66 69 6c 65 2d 6c 6f 63 6b 73 20 61 72  to file-locks ar
3cc0: 65 20 70 61 73 73 65 64 20 6f 6e 20 74 6f 20 74  e passed on to t
3cd0: 68 65 20 72 65 61 6c 20 66 69 6c 65 20 68 61 6e  he real file han
3ce0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
3cf0: 6e 74 20 63 66 4c 6f 63 6b 28 73 71 6c 69 74 65  nt cfLock(sqlite
3d00: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
3d10: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  nt eLock){.  ret
3d20: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  urn sqlite3OsLoc
3d30: 6b 28 28 28 43 72 61 73 68 46 69 6c 65 20 2a 29  k(((CrashFile *)
3d40: 70 46 69 6c 65 29 2d 3e 70 52 65 61 6c 46 69 6c  pFile)->pRealFil
3d50: 65 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61  e, eLock);.}.sta
3d60: 74 69 63 20 69 6e 74 20 63 66 55 6e 6c 6f 63 6b  tic int cfUnlock
3d70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
3d80: 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  File, int eLock)
3d90: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3da0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 28 28 43 72 61  e3OsUnlock(((Cra
3db0: 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 29 2d  shFile *)pFile)-
3dc0: 3e 70 52 65 61 6c 46 69 6c 65 2c 20 65 4c 6f 63  >pRealFile, eLoc
3dd0: 6b 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  k);.}.static int
3de0: 20 63 66 43 68 65 63 6b 52 65 73 65 72 76 65 64   cfCheckReserved
3df0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
3e00: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70  e *pFile, int *p
3e10: 52 65 73 4f 75 74 29 7b 0a 20 20 72 65 74 75 72  ResOut){.  retur
3e20: 6e 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  n sqlite3OsCheck
3e30: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 28 28 43  ReservedLock(((C
3e40: 72 61 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65  rashFile *)pFile
3e50: 29 2d 3e 70 52 65 61 6c 46 69 6c 65 2c 20 70 52  )->pRealFile, pR
3e60: 65 73 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  esOut);.}.static
3e70: 20 69 6e 74 20 63 66 46 69 6c 65 43 6f 6e 74 72   int cfFileContr
3e80: 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
3e90: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20  *pFile, int op, 
3ea0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
3eb0: 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
3ec0: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 29 7b  NTL_SIZE_HINT ){
3ed0: 0a 20 20 20 20 43 72 61 73 68 46 69 6c 65 20 2a  .    CrashFile *
3ee0: 70 43 72 61 73 68 20 3d 20 28 43 72 61 73 68 46  pCrash = (CrashF
3ef0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 20  ile *)pFile;.   
3f00: 20 69 36 34 20 6e 42 79 74 65 20 3d 20 2a 28 69   i64 nByte = *(i
3f10: 36 34 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 69  64 *)pArg;.    i
3f20: 66 28 20 6e 42 79 74 65 3e 70 43 72 61 73 68 2d  f( nByte>pCrash-
3f30: 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  >iSize ){.      
3f40: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 77  if( SQLITE_OK==w
3f50: 72 69 74 65 4c 69 73 74 41 70 70 65 6e 64 28 70  riteListAppend(p
3f60: 46 69 6c 65 2c 20 6e 42 79 74 65 2c 20 30 2c 20  File, nByte, 0, 
3f70: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  0) ){.        pC
3f80: 72 61 73 68 2d 3e 69 53 69 7a 65 20 3d 20 28 69  rash->iSize = (i
3f90: 6e 74 29 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt)nByte;.      
3fa0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
3fb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3fd0: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
3fe0: 28 28 43 72 61 73 68 46 69 6c 65 20 2a 29 70 46  ((CrashFile *)pF
3ff0: 69 6c 65 29 2d 3e 70 52 65 61 6c 46 69 6c 65 2c  ile)->pRealFile,
4000: 20 6f 70 2c 20 70 41 72 67 29 3b 0a 7d 0a 0a 2f   op, pArg);.}../
4010: 2a 0a 2a 2a 20 54 68 65 20 78 53 65 63 74 6f 72  *.** The xSector
4020: 53 69 7a 65 28 29 20 61 6e 64 20 78 44 65 76 69  Size() and xDevi
4030: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
4040: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  s() functions re
4050: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 67 6c 6f 62  turn.** the glob
4060: 61 6c 20 76 61 6c 75 65 73 20 63 6f 6e 66 69 67  al values config
4070: 75 72 65 64 20 62 79 20 74 68 65 20 5b 73 71 6c  ured by the [sql
4080: 69 74 65 5f 63 72 61 73 68 70 61 72 61 6d 73 5d  ite_crashparams]
4090: 20 74 63 6c 0a 2a 20 20 69 6e 74 65 72 66 61 63   tcl.*  interfac
40a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
40b0: 20 63 66 53 65 63 74 6f 72 53 69 7a 65 28 73 71   cfSectorSize(sq
40c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
40d0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 69  e){.  return g.i
40e0: 53 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 73 74  SectorSize;.}.st
40f0: 61 74 69 63 20 69 6e 74 20 63 66 44 65 76 69 63  atic int cfDevic
4100: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
4110: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
4120: 46 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  File){.  return 
4130: 67 2e 69 44 65 76 69 63 65 43 68 61 72 61 63 74  g.iDeviceCharact
4140: 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 2f 2a 0a  eristics;.}../*.
4150: 2a 2a 20 50 61 73 73 2d 74 68 72 6f 75 67 68 73  ** Pass-throughs
4160: 20 66 6f 72 20 57 41 4c 20 73 75 70 70 6f 72 74   for WAL support
4170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4180: 63 66 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  cfShmLock(sqlite
4190: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
41a0: 6e 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 2c 20  nt ofst, int n, 
41b0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65  int flags){.  re
41c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 68  turn sqlite3OsSh
41d0: 6d 4c 6f 63 6b 28 28 28 43 72 61 73 68 46 69 6c  mLock(((CrashFil
41e0: 65 2a 29 70 46 69 6c 65 29 2d 3e 70 52 65 61 6c  e*)pFile)->pReal
41f0: 46 69 6c 65 2c 20 6f 66 73 74 2c 20 6e 2c 20 66  File, ofst, n, f
4200: 6c 61 67 73 29 3b 0a 7d 0a 73 74 61 74 69 63 20  lags);.}.static 
4210: 76 6f 69 64 20 63 66 53 68 6d 42 61 72 72 69 65  void cfShmBarrie
4220: 72 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  r(sqlite3_file *
4230: 70 46 69 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  pFile){.  sqlite
4240: 33 4f 73 53 68 6d 42 61 72 72 69 65 72 28 28 28  3OsShmBarrier(((
4250: 43 72 61 73 68 46 69 6c 65 2a 29 70 46 69 6c 65  CrashFile*)pFile
4260: 29 2d 3e 70 52 65 61 6c 46 69 6c 65 29 3b 0a 7d  )->pRealFile);.}
4270: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66 53 68  .static int cfSh
4280: 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66  mUnmap(sqlite3_f
4290: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
42a0: 64 65 6c 46 6c 61 67 29 7b 0a 20 20 72 65 74 75  delFlag){.  retu
42b0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 68 6d 55  rn sqlite3OsShmU
42c0: 6e 6d 61 70 28 28 28 43 72 61 73 68 46 69 6c 65  nmap(((CrashFile
42d0: 2a 29 70 46 69 6c 65 29 2d 3e 70 52 65 61 6c 46  *)pFile)->pRealF
42e0: 69 6c 65 2c 20 64 65 6c 46 6c 61 67 29 3b 0a 7d  ile, delFlag);.}
42f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66 53 68  .static int cfSh
4300: 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
4310: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
4320: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
4330: 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
4340: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
4350: 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4370: 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
4380: 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ve */.  int sz, 
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
43b0: 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
43c0: 69 6e 74 20 77 2c 20 20 20 20 20 20 20 20 20 20  int w,          
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
43f0: 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
4400: 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
4410: 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
4420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
4430: 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
4440: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
4450: 6c 69 74 65 33 4f 73 53 68 6d 4d 61 70 28 28 28  lite3OsShmMap(((
4460: 43 72 61 73 68 46 69 6c 65 2a 29 70 46 69 6c 65  CrashFile*)pFile
4470: 29 2d 3e 70 52 65 61 6c 46 69 6c 65 2c 20 69 52  )->pRealFile, iR
4480: 65 67 69 6f 6e 2c 20 73 7a 2c 20 77 2c 20 70 70  egion, sz, w, pp
4490: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
44a0: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
44b0: 74 68 6f 64 73 20 43 72 61 73 68 46 69 6c 65 56  thods CrashFileV
44c0: 74 61 62 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  tab = {.  2,    
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
44f0: 69 6f 6e 20 2a 2f 0a 20 20 63 66 43 6c 6f 73 65  ion */.  cfClose
4500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4510: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
4520: 20 2a 2f 0a 20 20 63 66 52 65 61 64 2c 20 20 20   */.  cfRead,   
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
4550: 20 20 63 66 57 72 69 74 65 2c 20 20 20 20 20 20    cfWrite,      
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 63  /* xWrite */.  c
4580: 66 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  fTruncate,      
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45a0: 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 63  xTruncate */.  c
45b0: 66 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  fSync,          
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45d0: 78 53 79 6e 63 20 2a 2f 0a 20 20 63 66 46 69 6c  xSync */.  cfFil
45e0: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
4600: 65 53 69 7a 65 20 2a 2f 0a 20 20 63 66 4c 6f 63  eSize */.  cfLoc
4610: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
4620: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
4630: 6b 20 2a 2f 0a 20 20 63 66 55 6e 6c 6f 63 6b 2c  k */.  cfUnlock,
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
4660: 2a 2f 0a 20 20 63 66 43 68 65 63 6b 52 65 73 65  */.  cfCheckRese
4670: 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
4680: 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
4690: 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 63 66  rvedLock */.  cf
46a0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
46c0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
46d0: 20 63 66 53 65 63 74 6f 72 53 69 7a 65 2c 20 20   cfSectorSize,  
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46f0: 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
4700: 0a 20 20 63 66 44 65 76 69 63 65 43 68 61 72 61  .  cfDeviceChara
4710: 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
4720: 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
4730: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
4740: 63 66 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  cfShmMap,       
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 63 66   xShmMap */.  cf
4770: 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
4780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
4790: 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 63 66 53  ShmLock */.  cfS
47a0: 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
47b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
47c0: 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 63  hmBarrier */.  c
47d0: 66 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20 20  fShmUnmap       
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47f0: 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a  xShmUnmap */.};.
4800: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 69 63 61 74 69  ./*.** Applicati
4810: 6f 6e 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  on data for the 
4820: 63 72 61 73 68 20 56 46 53 0a 2a 2f 0a 73 74 72  crash VFS.*/.str
4830: 75 63 74 20 63 72 61 73 68 41 70 70 44 61 74 61  uct crashAppData
4840: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
4850: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 20 20 20   *pOrig;        
4860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
4870: 61 70 70 65 64 20 76 66 73 20 73 74 72 75 63 74  apped vfs struct
4880: 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ure */.};../*.**
4890: 20 4f 70 65 6e 20 61 20 63 72 61 73 68 2d 66 69   Open a crash-fi
48a0: 6c 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  le file handle..
48b0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
48c0: 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 6c 6f 63   will have alloc
48d0: 61 74 65 64 20 70 56 66 73 2d 3e 73 7a 4f 73 46  ated pVfs->szOsF
48e0: 69 6c 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ile bytes of spa
48f0: 63 65 0a 2a 2a 20 61 74 20 70 46 69 6c 65 2e 20  ce.** at pFile. 
4900: 54 68 69 73 20 66 69 6c 65 20 75 73 65 73 20 74  This file uses t
4910: 68 69 73 20 73 70 61 63 65 20 66 6f 72 20 74 68  his space for th
4920: 65 20 43 72 61 73 68 46 69 6c 65 20 73 74 72 75  e CrashFile stru
4930: 63 74 75 72 65 0a 2a 2a 20 61 6e 64 20 61 6c 6c  cture.** and all
4940: 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
4950: 20 74 68 65 20 22 72 65 61 6c 22 20 66 69 6c 65   the "real" file
4960: 20 73 74 72 75 63 74 75 72 65 20 75 73 69 6e 67   structure using
4970: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c   .** sqlite3_mal
4980: 6c 6f 63 28 29 2e 20 54 68 65 20 61 73 73 75 6d  loc(). The assum
4990: 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 28 70  ption here is (p
49a0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 69  Vfs->szOsFile) i
49b0: 73 0a 2a 2a 20 65 71 75 61 6c 20 6f 72 20 67 72  s.** equal or gr
49c0: 65 61 74 65 72 20 74 68 61 6e 20 73 69 7a 65 6f  eater than sizeo
49d0: 66 28 43 72 61 73 68 46 69 6c 65 29 2e 0a 2a 2f  f(CrashFile)..*/
49e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66 4f 70  .static int cfOp
49f0: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
4a00: 73 20 2a 70 43 66 56 66 73 2c 0a 20 20 63 6f 6e  s *pCfVfs,.  con
4a10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
4a20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4a30: 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61  pFile,.  int fla
4a40: 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46  gs,.  int *pOutF
4a50: 6c 61 67 73 0a 29 7b 0a 20 20 73 71 6c 69 74 65  lags.){.  sqlite
4a60: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 28 73  3_vfs *pVfs = (s
4a70: 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 43 66  qlite3_vfs *)pCf
4a80: 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20  Vfs->pAppData;. 
4a90: 20 69 6e 74 20 72 63 3b 0a 20 20 43 72 61 73 68   int rc;.  Crash
4aa0: 46 69 6c 65 20 2a 70 57 72 61 70 70 65 72 20 3d  File *pWrapper =
4ab0: 20 28 43 72 61 73 68 46 69 6c 65 20 2a 29 70 46   (CrashFile *)pF
4ac0: 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ile;.  sqlite3_f
4ad0: 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 28 73 71  ile *pReal = (sq
4ae0: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 57 72  lite3_file*)&pWr
4af0: 61 70 70 65 72 5b 31 5d 3b 0a 0a 20 20 6d 65 6d  apper[1];..  mem
4b00: 73 65 74 28 70 57 72 61 70 70 65 72 2c 20 30 2c  set(pWrapper, 0,
4b10: 20 73 69 7a 65 6f 66 28 43 72 61 73 68 46 69 6c   sizeof(CrashFil
4b20: 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
4b30: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
4b40: 7a 4e 61 6d 65 2c 20 70 52 65 61 6c 2c 20 66 6c  zName, pReal, fl
4b50: 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  ags, pOutFlags);
4b60: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
4b70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 36 34  TE_OK ){.    i64
4b80: 20 69 53 69 7a 65 3b 0a 20 20 20 20 70 57 72 61   iSize;.    pWra
4b90: 70 70 65 72 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pper->pMethod = 
4ba0: 26 43 72 61 73 68 46 69 6c 65 56 74 61 62 3b 0a  &CrashFileVtab;.
4bb0: 20 20 20 20 70 57 72 61 70 70 65 72 2d 3e 7a 4e      pWrapper->zN
4bc0: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 7a 4e  ame = (char *)zN
4bd0: 61 6d 65 3b 0a 20 20 20 20 70 57 72 61 70 70 65  ame;.    pWrappe
4be0: 72 2d 3e 70 52 65 61 6c 46 69 6c 65 20 3d 20 70  r->pRealFile = p
4bf0: 52 65 61 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73  Real;.    rc = s
4c00: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
4c10: 28 70 52 65 61 6c 2c 20 26 69 53 69 7a 65 29 3b  (pReal, &iSize);
4c20: 0a 20 20 20 20 70 57 72 61 70 70 65 72 2d 3e 69  .    pWrapper->i
4c30: 53 69 7a 65 20 3d 20 28 69 6e 74 29 69 53 69 7a  Size = (int)iSiz
4c40: 65 3b 0a 20 20 20 20 70 57 72 61 70 70 65 72 2d  e;.    pWrapper-
4c50: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
4c60: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
4c70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
4c80: 57 72 61 70 70 65 72 2d 3e 6e 44 61 74 61 20 3d  Wrapper->nData =
4c90: 20 28 69 6e 74 29 28 34 30 39 36 20 2b 20 70 57   (int)(4096 + pW
4ca0: 72 61 70 70 65 72 2d 3e 69 53 69 7a 65 29 3b 0a  rapper->iSize);.
4cb0: 20 20 20 20 70 57 72 61 70 70 65 72 2d 3e 7a 44      pWrapper->zD
4cc0: 61 74 61 20 3d 20 63 72 61 73 68 5f 6d 61 6c 6c  ata = crash_mall
4cd0: 6f 63 28 70 57 72 61 70 70 65 72 2d 3e 6e 44 61  oc(pWrapper->nDa
4ce0: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 57 72  ta);.    if( pWr
4cf0: 61 70 70 65 72 2d 3e 7a 44 61 74 61 20 29 7b 0a  apper->zData ){.
4d00: 20 20 20 20 20 20 2f 2a 20 6f 73 5f 75 6e 69 78        /* os_unix
4d10: 2e 63 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61  .c contains an a
4d20: 73 73 65 72 74 28 29 20 74 68 61 74 20 66 61 69  ssert() that fai
4d30: 6c 73 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  ls if the caller
4d40: 20 61 74 74 65 6d 70 74 73 0a 20 20 20 20 20 20   attempts.      
4d50: 2a 2a 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  ** to read data 
4d60: 66 72 6f 6d 20 74 68 65 20 35 31 32 2d 62 79 74  from the 512-byt
4d70: 65 20 6c 6f 63 6b 69 6e 67 20 72 65 67 69 6f 6e  e locking region
4d80: 20 6f 66 20 61 20 66 69 6c 65 20 6f 70 65 6e 65   of a file opene
4d90: 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
4da0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
4db0: 4d 41 49 4e 5f 44 42 20 66 6c 61 67 2e 20 54 68  MAIN_DB flag. Th
4dc0: 69 73 20 72 65 67 69 6f 6e 20 6f 66 20 61 20 64  is region of a d
4dd0: 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
4de0: 20 20 20 2a 2a 20 6e 65 76 65 72 20 63 6f 6e 74     ** never cont
4df0: 61 69 6e 73 20 76 61 6c 69 64 20 64 61 74 61 20  ains valid data 
4e00: 61 6e 79 68 6f 77 2e 20 53 6f 20 61 76 6f 69 64  anyhow. So avoid
4e10: 20 64 6f 69 6e 67 20 73 75 63 68 20 61 20 72 65   doing such a re
4e20: 61 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  ad here..      *
4e30: 2a 0a 20 20 20 20 20 20 2a 2a 20 55 50 44 41 54  *.      ** UPDAT
4e40: 45 3a 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  E: It also conta
4e50: 69 6e 73 20 61 6e 20 61 73 73 65 72 74 28 29 20  ins an assert() 
4e60: 76 65 72 69 66 79 69 6e 67 20 74 68 61 74 20 65  verifying that e
4e70: 61 63 68 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a  ach call.      *
4e80: 2a 20 74 6f 20 74 68 65 20 78 52 65 61 64 28 29  * to the xRead()
4e90: 20 6d 65 74 68 6f 64 20 72 65 61 64 73 20 6c 65   method reads le
4ea0: 73 73 20 74 68 61 6e 20 31 32 38 4b 42 20 6f 66  ss than 128KB of
4eb0: 20 64 61 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a   data..      */.
4ec0: 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 3b 0a        i64 iOff;.
4ed0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 57  .      memset(pW
4ee0: 72 61 70 70 65 72 2d 3e 7a 44 61 74 61 2c 20 30  rapper->zData, 0
4ef0: 2c 20 70 57 72 61 70 70 65 72 2d 3e 6e 44 61 74  , pWrapper->nDat
4f00: 61 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4f  a);.      for(iO
4f10: 66 66 3d 30 3b 20 69 4f 66 66 3c 70 57 72 61 70  ff=0; iOff<pWrap
4f20: 70 65 72 2d 3e 69 53 69 7a 65 3b 20 69 4f 66 66  per->iSize; iOff
4f30: 20 2b 3d 20 35 31 32 29 7b 0a 20 20 20 20 20 20   += 512){.      
4f40: 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 28 69    int nRead = (i
4f50: 6e 74 29 28 70 57 72 61 70 70 65 72 2d 3e 69 53  nt)(pWrapper->iS
4f60: 69 7a 65 20 2d 20 69 4f 66 66 29 3b 0a 20 20 20  ize - iOff);.   
4f70: 20 20 20 20 20 69 66 28 20 6e 52 65 61 64 3e 35       if( nRead>5
4f80: 31 32 20 29 20 6e 52 65 61 64 20 3d 20 35 31 32  12 ) nRead = 512
4f90: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
4fa0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65  qlite3OsRead(pRe
4fb0: 61 6c 2c 20 26 70 57 72 61 70 70 65 72 2d 3e 7a  al, &pWrapper->z
4fc0: 44 61 74 61 5b 69 4f 66 66 5d 2c 20 6e 52 65 61  Data[iOff], nRea
4fd0: 64 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  d, iOff);.      
4fe0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4ff0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5000: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
5010: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5020: 5f 4f 4b 20 26 26 20 70 57 72 61 70 70 65 72 2d  _OK && pWrapper-
5030: 3e 70 4d 65 74 68 6f 64 20 29 7b 0a 20 20 20 20  >pMethod ){.    
5040: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
5050: 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  File);.  }.  ret
5060: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
5070: 63 20 69 6e 74 20 63 66 44 65 6c 65 74 65 28 73  c int cfDelete(s
5080: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 43 66 56  qlite3_vfs *pCfV
5090: 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
50a0: 7a 50 61 74 68 2c 20 69 6e 74 20 64 69 72 53 79  zPath, int dirSy
50b0: 6e 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  nc){.  sqlite3_v
50c0: 66 73 20 2a 70 56 66 73 20 3d 20 28 73 71 6c 69  fs *pVfs = (sqli
50d0: 74 65 33 5f 76 66 73 20 2a 29 70 43 66 56 66 73  te3_vfs *)pCfVfs
50e0: 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20 72 65  ->pAppData;.  re
50f0: 74 75 72 6e 20 70 56 66 73 2d 3e 78 44 65 6c 65  turn pVfs->xDele
5100: 74 65 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20  te(pVfs, zPath, 
5110: 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 73 74 61 74  dirSync);.}.stat
5120: 69 63 20 69 6e 74 20 63 66 41 63 63 65 73 73 28  ic int cfAccess(
5130: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
5140: 70 43 66 56 66 73 2c 20 0a 20 20 63 6f 6e 73 74  pCfVfs, .  const
5150: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 0a 20   char *zPath, . 
5160: 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20 20 69   int flags, .  i
5170: 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20  nt *pResOut.){. 
5180: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
5190: 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 66  fs = (sqlite3_vf
51a0: 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41 70 70  s *)pCfVfs->pApp
51b0: 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 70  Data;.  return p
51c0: 56 66 73 2d 3e 78 41 63 63 65 73 73 28 70 56 66  Vfs->xAccess(pVf
51d0: 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73 2c  s, zPath, flags,
51e0: 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 73 74 61   pResOut);.}.sta
51f0: 74 69 63 20 69 6e 74 20 63 66 46 75 6c 6c 50 61  tic int cfFullPa
5200: 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
5210: 33 5f 76 66 73 20 2a 70 43 66 56 66 73 2c 20 0a  3_vfs *pCfVfs, .
5220: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
5230: 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 50 61 74  ath, .  int nPat
5240: 68 4f 75 74 2c 0a 20 20 63 68 61 72 20 2a 7a 50  hOut,.  char *zP
5250: 61 74 68 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69  athOut.){.  sqli
5260: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
5270: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70  (sqlite3_vfs *)p
5280: 43 66 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b  CfVfs->pAppData;
5290: 0a 20 20 72 65 74 75 72 6e 20 70 56 66 73 2d 3e  .  return pVfs->
52a0: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  xFullPathname(pV
52b0: 66 73 2c 20 7a 50 61 74 68 2c 20 6e 50 61 74 68  fs, zPath, nPath
52c0: 4f 75 74 2c 20 7a 50 61 74 68 4f 75 74 29 3b 0a  Out, zPathOut);.
52d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  }.static void *c
52e0: 66 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  fDlOpen(sqlite3_
52f0: 76 66 73 20 2a 70 43 66 56 66 73 2c 20 63 6f 6e  vfs *pCfVfs, con
5300: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b  st char *zPath){
5310: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
5320: 70 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f  pVfs = (sqlite3_
5330: 76 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41  vfs *)pCfVfs->pA
5340: 70 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  ppData;.  return
5350: 20 70 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 70   pVfs->xDlOpen(p
5360: 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 73  Vfs, zPath);.}.s
5370: 74 61 74 69 63 20 76 6f 69 64 20 63 66 44 6c 45  tatic void cfDlE
5380: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
5390: 20 2a 70 43 66 56 66 73 2c 20 69 6e 74 20 6e 42   *pCfVfs, int nB
53a0: 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d  yte, char *zErrM
53b0: 73 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  sg){.  sqlite3_v
53c0: 66 73 20 2a 70 56 66 73 20 3d 20 28 73 71 6c 69  fs *pVfs = (sqli
53d0: 74 65 33 5f 76 66 73 20 2a 29 70 43 66 56 66 73  te3_vfs *)pCfVfs
53e0: 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20 70 56  ->pAppData;.  pV
53f0: 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 70 56 66  fs->xDlError(pVf
5400: 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73  s, nByte, zErrMs
5410: 67 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  g);.}.static voi
5420: 64 20 28 2a 63 66 44 6c 53 79 6d 28 73 71 6c 69  d (*cfDlSym(sqli
5430: 74 65 33 5f 76 66 73 20 2a 70 43 66 56 66 73 2c  te3_vfs *pCfVfs,
5440: 20 76 6f 69 64 20 2a 70 48 2c 20 63 6f 6e 73 74   void *pH, const
5450: 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f   char *zSym))(vo
5460: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  id){.  sqlite3_v
5470: 66 73 20 2a 70 56 66 73 20 3d 20 28 73 71 6c 69  fs *pVfs = (sqli
5480: 74 65 33 5f 76 66 73 20 2a 29 70 43 66 56 66 73  te3_vfs *)pCfVfs
5490: 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20 72 65  ->pAppData;.  re
54a0: 74 75 72 6e 20 70 56 66 73 2d 3e 78 44 6c 53 79  turn pVfs->xDlSy
54b0: 6d 28 70 56 66 73 2c 20 70 48 2c 20 7a 53 79 6d  m(pVfs, pH, zSym
54c0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
54d0: 20 63 66 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74   cfDlClose(sqlit
54e0: 65 33 5f 76 66 73 20 2a 70 43 66 56 66 73 2c 20  e3_vfs *pCfVfs, 
54f0: 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
5500: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5510: 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Vfs = (sqlite3_v
5520: 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41 70  fs *)pCfVfs->pAp
5530: 70 44 61 74 61 3b 0a 20 20 70 56 66 73 2d 3e 78  pData;.  pVfs->x
5540: 44 6c 43 6c 6f 73 65 28 70 56 66 73 2c 20 70 48  DlClose(pVfs, pH
5550: 61 6e 64 6c 65 29 3b 0a 7d 0a 73 74 61 74 69 63  andle);.}.static
5560: 20 69 6e 74 20 63 66 52 61 6e 64 6f 6d 6e 65 73   int cfRandomnes
5570: 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
5580: 43 66 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  CfVfs, int nByte
5590: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
55a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
55b0: 2a 70 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33  *pVfs = (sqlite3
55c0: 5f 76 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70  _vfs *)pCfVfs->p
55d0: 41 70 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72  AppData;.  retur
55e0: 6e 20 70 56 66 73 2d 3e 78 52 61 6e 64 6f 6d 6e  n pVfs->xRandomn
55f0: 65 73 73 28 70 56 66 73 2c 20 6e 42 79 74 65 2c  ess(pVfs, nByte,
5600: 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
5610: 74 69 63 20 69 6e 74 20 63 66 53 6c 65 65 70 28  tic int cfSleep(
5620: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 43 66  sqlite3_vfs *pCf
5630: 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29  Vfs, int nMicro)
5640: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
5650: 2a 70 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33  *pVfs = (sqlite3
5660: 5f 76 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70  _vfs *)pCfVfs->p
5670: 41 70 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72  AppData;.  retur
5680: 6e 20 70 56 66 73 2d 3e 78 53 6c 65 65 70 28 70  n pVfs->xSleep(p
5690: 56 66 73 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a  Vfs, nMicro);.}.
56a0: 73 74 61 74 69 63 20 69 6e 74 20 63 66 43 75 72  static int cfCur
56b0: 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
56c0: 5f 76 66 73 20 2a 70 43 66 56 66 73 2c 20 64 6f  _vfs *pCfVfs, do
56d0: 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b  uble *pTimeOut){
56e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
56f0: 70 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f  pVfs = (sqlite3_
5700: 76 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41  vfs *)pCfVfs->pA
5710: 70 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  ppData;.  return
5720: 20 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54   pVfs->xCurrentT
5730: 69 6d 65 28 70 56 66 73 2c 20 70 54 69 6d 65 4f  ime(pVfs, pTimeO
5740: 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  ut);.}.static in
5750: 74 20 63 66 47 65 74 4c 61 73 74 45 72 72 6f 72  t cfGetLastError
5760: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 43  (sqlite3_vfs *pC
5770: 66 56 66 73 2c 20 69 6e 74 20 6e 2c 20 63 68 61  fVfs, int n, cha
5780: 72 20 2a 7a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r *z){.  sqlite3
5790: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 28 73 71  _vfs *pVfs = (sq
57a0: 6c 69 74 65 33 5f 76 66 73 20 2a 29 70 43 66 56  lite3_vfs *)pCfV
57b0: 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20  fs->pAppData;.  
57c0: 72 65 74 75 72 6e 20 70 56 66 73 2d 3e 78 47 65  return pVfs->xGe
57d0: 74 4c 61 73 74 45 72 72 6f 72 28 70 56 66 73 2c  tLastError(pVfs,
57e0: 20 6e 2c 20 7a 29 3b 0a 7d 0a 0a 73 74 61 74 69   n, z);.}..stati
57f0: 63 20 69 6e 74 20 70 72 6f 63 65 73 73 44 65 76  c int processDev
5800: 53 79 6d 41 72 67 73 28 0a 20 20 54 63 6c 5f 49  SymArgs(.  Tcl_I
5810: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
5820: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
5830: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
5840: 5b 5d 2c 0a 20 20 69 6e 74 20 2a 70 69 44 65 76  [],.  int *piDev
5850: 69 63 65 43 68 61 72 2c 0a 20 20 69 6e 74 20 2a  iceChar,.  int *
5860: 70 69 53 65 63 74 6f 72 53 69 7a 65 0a 29 7b 0a  piSectorSize.){.
5870: 20 20 73 74 72 75 63 74 20 44 65 76 69 63 65 46    struct DeviceF
5880: 6c 61 67 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  lag {.    char *
5890: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69  zName;.    int i
58a0: 56 61 6c 75 65 3b 0a 20 20 7d 20 61 46 6c 61 67  Value;.  } aFlag
58b0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 74  [] = {.    { "at
58c0: 6f 6d 69 63 22 2c 20 20 20 20 20 20 20 20 20 20  omic",          
58d0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
58e0: 5f 41 54 4f 4d 49 43 20 20 20 20 20 20 20 20 20  _ATOMIC         
58f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
5900: 22 61 74 6f 6d 69 63 35 31 32 22 2c 20 20 20 20  "atomic512",    
5910: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
5920: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 20 20  CAP_ATOMIC512   
5930: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5940: 20 7b 20 22 61 74 6f 6d 69 63 31 6b 22 2c 20 20   { "atomic1k",  
5950: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
5960: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 31 4b 20  _IOCAP_ATOMIC1K 
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5980: 20 20 20 20 7b 20 22 61 74 6f 6d 69 63 32 6b 22      { "atomic2k"
5990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
59a0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
59b0: 32 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2K              
59c0: 7d 2c 0a 20 20 20 20 7b 20 22 61 74 6f 6d 69 63  },.    { "atomic
59d0: 34 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  4k",            
59e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
59f0: 4d 49 43 34 4b 20 20 20 20 20 20 20 20 20 20 20  MIC4K           
5a00: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 74 6f     },.    { "ato
5a10: 6d 69 63 38 6b 22 2c 20 20 20 20 20 20 20 20 20  mic8k",         
5a20: 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
5a30: 41 54 4f 4d 49 43 38 4b 20 20 20 20 20 20 20 20  ATOMIC8K        
5a40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5a50: 61 74 6f 6d 69 63 31 36 6b 22 2c 20 20 20 20 20  atomic16k",     
5a60: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
5a70: 41 50 5f 41 54 4f 4d 49 43 31 36 4b 20 20 20 20  AP_ATOMIC16K    
5a80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
5a90: 7b 20 22 61 74 6f 6d 69 63 33 32 6b 22 2c 20 20  { "atomic32k",  
5aa0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5ab0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 33 32 4b 20  IOCAP_ATOMIC32K 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
5ad0: 20 20 20 7b 20 22 61 74 6f 6d 69 63 36 34 6b 22     { "atomic64k"
5ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ,           SQLI
5af0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
5b00: 34 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  4K             }
5b10: 2c 0a 20 20 20 20 7b 20 22 73 65 71 75 65 6e 74  ,.    { "sequent
5b20: 69 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 53  ial",          S
5b30: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
5b40: 45 4e 54 49 41 4c 20 20 20 20 20 20 20 20 20 20  ENTIAL          
5b50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 61 66 65    },.    { "safe
5b60: 5f 61 70 70 65 6e 64 22 2c 20 20 20 20 20 20 20  _append",       
5b70: 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
5b80: 41 46 45 5f 41 50 50 45 4e 44 20 20 20 20 20 20  AFE_APPEND      
5b90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
5ba0: 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
5bb0: 74 65 22 2c 20 53 51 4c 49 54 45 5f 49 4f 43 41  te", SQLITE_IOCA
5bc0: 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
5bd0: 57 52 49 54 45 20 20 20 7d 2c 0a 20 20 20 20 7b  WRITE   },.    {
5be0: 20 22 62 61 74 63 68 2d 61 74 6f 6d 69 63 22 2c   "batch-atomic",
5bf0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
5c00: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
5c10: 43 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  C          },.  
5c20: 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a    { 0, 0 }.  };.
5c30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5c40: 69 44 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  iDc = 0;.  int i
5c50: 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 30 3b 0a  SectorSize = 0;.
5c60: 20 20 69 6e 74 20 73 65 74 53 65 63 74 6f 72 73    int setSectors
5c70: 69 7a 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ize = 0;.  int s
5c80: 65 74 44 65 76 69 63 65 43 68 61 72 20 3d 20 30  etDeviceChar = 0
5c90: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
5ca0: 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
5cb0: 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 20 20 63   int nOpt;.    c
5cc0: 68 61 72 20 2a 7a 4f 70 74 20 3d 20 54 63 6c 5f  har *zOpt = Tcl_
5cd0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
5ce0: 28 6f 62 6a 76 5b 69 5d 2c 20 26 6e 4f 70 74 29  (objv[i], &nOpt)
5cf0: 3b 0a 0a 20 20 20 20 69 66 28 20 28 6e 4f 70 74  ;..    if( (nOpt
5d00: 3e 31 31 20 7c 7c 20 6e 4f 70 74 3c 32 20 7c 7c  >11 || nOpt<2 ||
5d10: 20 73 74 72 6e 63 6d 70 28 22 2d 73 65 63 74 6f   strncmp("-secto
5d20: 72 73 69 7a 65 22 2c 20 7a 4f 70 74 2c 20 6e 4f  rsize", zOpt, nO
5d30: 70 74 29 29 20 0a 20 20 20 20 20 26 26 20 28 6e  pt)) .     && (n
5d40: 4f 70 74 3e 31 36 20 7c 7c 20 6e 4f 70 74 3c 32  Opt>16 || nOpt<2
5d50: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 22 2d 63 68   || strncmp("-ch
5d60: 61 72 61 63 74 65 72 69 73 74 69 63 73 22 2c 20  aracteristics", 
5d70: 7a 4f 70 74 2c 20 6e 4f 70 74 29 29 0a 20 20 20  zOpt, nOpt)).   
5d80: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
5d90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
5da0: 70 2c 20 0a 20 20 20 20 20 20 20 20 22 42 61 64  p, .        "Bad
5db0: 20 6f 70 74 69 6f 6e 3a 20 5c 22 22 2c 20 7a 4f   option: \"", zO
5dc0: 70 74 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22  pt, .        "\"
5dd0: 20 2d 20 6d 75 73 74 20 62 65 20 5c 22 2d 63 68   - must be \"-ch
5de0: 61 72 61 63 74 65 72 69 73 74 69 63 73 5c 22 20  aracteristics\" 
5df0: 6f 72 20 5c 22 2d 73 65 63 74 6f 72 73 69 7a 65  or \"-sectorsize
5e00: 5c 22 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  \"", 0.      );.
5e10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
5e20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
5e30: 20 20 69 66 28 20 69 3d 3d 6f 62 6a 63 2d 31 20    if( i==objc-1 
5e40: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
5e50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5e60: 2c 20 22 4f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "Option requir
5e70: 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
5e80: 5c 22 22 2c 20 7a 4f 70 74 2c 20 22 5c 22 22 2c  \"", zOpt, "\"",
5e90: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
5ea0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5eb0: 7d 0a 0a 20 20 20 20 69 66 28 20 7a 4f 70 74 5b  }..    if( zOpt[
5ec0: 31 5d 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20  1]=='s' ){.     
5ed0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
5ee0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
5ef0: 62 6a 76 5b 69 2b 31 5d 2c 20 26 69 53 65 63 74  bjv[i+1], &iSect
5f00: 6f 72 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  orSize) ){.     
5f10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5f20: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
5f30: 20 20 20 73 65 74 53 65 63 74 6f 72 73 69 7a 65     setSectorsize
5f40: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
5f50: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
5f60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70      Tcl_Obj **ap
5f70: 4f 62 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Obj;.      int n
5f80: 4f 62 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 54  Obj;.      if( T
5f90: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
5fa0: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62  ments(interp, ob
5fb0: 6a 76 5b 69 2b 31 5d 2c 20 26 6e 4f 62 6a 2c 20  jv[i+1], &nObj, 
5fc0: 26 61 70 4f 62 6a 29 20 29 7b 0a 20 20 20 20 20  &apObj) ){.     
5fd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
5fe0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
5ff0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 4f     for(j=0; j<nO
6000: 62 6a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  bj; j++){.      
6010: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
6020: 20 20 69 6e 74 20 69 43 68 6f 69 63 65 3b 0a 20    int iChoice;. 
6030: 20 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a         Tcl_Obj *
6040: 70 46 6c 61 67 20 3d 20 54 63 6c 5f 44 75 70 6c  pFlag = Tcl_Dupl
6050: 69 63 61 74 65 4f 62 6a 28 61 70 4f 62 6a 5b 6a  icateObj(apObj[j
6060: 5d 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ]);.        Tcl_
6070: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 46 6c  IncrRefCount(pFl
6080: 61 67 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ag);.        Tcl
6090: 5f 55 74 66 54 6f 4c 6f 77 65 72 28 54 63 6c 5f  _UtfToLower(Tcl_
60a0: 47 65 74 53 74 72 69 6e 67 28 70 46 6c 61 67 29  GetString(pFlag)
60b0: 29 3b 0a 20 0a 20 20 20 20 20 20 20 20 72 63 20  );. .        rc 
60c0: 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  = Tcl_GetIndexFr
60d0: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20  omObjStruct(.   
60e0: 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c           interp,
60f0: 20 70 46 6c 61 67 2c 20 61 46 6c 61 67 2c 20 73   pFlag, aFlag, s
6100: 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c  izeof(aFlag[0]),
6110: 20 22 6e 6f 20 73 75 63 68 20 66 6c 61 67 22 2c   "no such flag",
6120: 20 30 2c 20 26 69 43 68 6f 69 63 65 0a 20 20 20   0, &iChoice.   
6130: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
6140: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6150: 28 70 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20  (pFlag);.       
6160: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
6170: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
6180: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
6190: 0a 0a 20 20 20 20 20 20 20 20 69 44 63 20 7c 3d  ..        iDc |=
61a0: 20 61 46 6c 61 67 5b 69 43 68 6f 69 63 65 5d 2e   aFlag[iChoice].
61b0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a  iValue;.      }.
61c0: 20 20 20 20 20 20 73 65 74 44 65 76 69 63 65 43        setDeviceC
61d0: 68 61 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  har = 1;.    }. 
61e0: 20 7d 0a 0a 20 20 69 66 28 20 73 65 74 44 65 76   }..  if( setDev
61f0: 69 63 65 43 68 61 72 20 29 7b 0a 20 20 20 20 2a  iceChar ){.    *
6200: 70 69 44 65 76 69 63 65 43 68 61 72 20 3d 20 69  piDeviceChar = i
6210: 44 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 65  Dc;.  }.  if( se
6220: 74 53 65 63 74 6f 72 73 69 7a 65 20 29 7b 0a 20  tSectorsize ){. 
6230: 20 20 20 2a 70 69 53 65 63 74 6f 72 53 69 7a 65     *piSectorSize
6240: 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
6250: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
6260: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
6270: 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
6280: 5f 63 72 61 73 68 5f 6e 6f 77 0a 2a 2a 0a 2a 2a  _crash_now.**.**
6290: 20 53 69 6d 75 6c 61 74 65 20 61 20 63 72 61 73   Simulate a cras
62a0: 68 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 54  h immediately. T
62b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
62c0: 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 0a 2a 2a  s not return .**
62d0: 20 28 77 72 69 74 65 4c 69 73 74 53 79 6e 63 28   (writeListSync(
62e0: 29 20 63 61 6c 6c 73 20 65 78 69 74 28 2d 31 29  ) calls exit(-1)
62f0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
6300: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 63   SQLITE_TCLAPI c
6310: 72 61 73 68 4e 6f 77 43 6d 64 28 0a 20 20 76 6f  rashNowCmd(.  vo
6320: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
6330: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
6340: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
6350: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
6360: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
6370: 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
6380: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6390: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
63a0: 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
63b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
63c0: 20 20 7d 0a 20 20 77 72 69 74 65 4c 69 73 74 53    }.  writeListS
63d0: 79 6e 63 28 30 2c 20 31 29 3b 0a 20 20 61 73 73  ync(0, 1);.  ass
63e0: 65 72 74 28 20 30 20 29 3b 0a 20 20 72 65 74 75  ert( 0 );.  retu
63f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
6400: 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
6410: 6c 69 74 65 5f 63 72 61 73 68 5f 65 6e 61 62 6c  lite_crash_enabl
6420: 65 20 45 4e 41 42 4c 45 20 3f 44 45 46 41 55 4c  e ENABLE ?DEFAUL
6430: 54 3f 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  T?.**.** Paramet
6440: 65 72 20 45 4e 41 42 4c 45 20 6d 75 73 74 20 62  er ENABLE must b
6450: 65 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  e a boolean valu
6460: 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e  e. If true, then
6470: 20 74 68 65 20 22 63 72 61 73 68 22 0a 2a 2a 20   the "crash".** 
6480: 76 66 73 20 69 73 20 61 64 64 65 64 20 74 6f 20  vfs is added to 
6490: 74 68 65 20 73 79 73 74 65 6d 2e 20 49 66 20 66  the system. If f
64a0: 61 6c 73 65 2c 20 69 74 20 69 73 20 72 65 6d 6f  alse, it is remo
64b0: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
64c0: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
64d0: 20 63 72 61 73 68 45 6e 61 62 6c 65 43 6d 64 28   crashEnableCmd(
64e0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
64f0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
6500: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
6510: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
6520: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
6530: 29 7b 0a 20 20 69 6e 74 20 69 73 45 6e 61 62 6c  ){.  int isEnabl
6540: 65 3b 0a 20 20 69 6e 74 20 69 73 44 65 66 61 75  e;.  int isDefau
6550: 6c 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  lt = 0;.  static
6560: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 63 72 61   sqlite3_vfs cra
6570: 73 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 32 2c  shVfs = {.    2,
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
65a0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
65b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73           /* szOs
65c0: 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  File */.    0,  
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
65f0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
6600: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
6610: 74 20 2a 2f 0a 20 20 20 20 22 63 72 61 73 68 22  t */.    "crash"
6620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
6630: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
6660: 20 20 0a 20 20 20 20 63 66 4f 70 65 6e 2c 20 20    .    cfOpen,  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6680: 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 63 66 44  xOpen */.    cfD
6690: 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
66a0: 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
66b0: 0a 20 20 20 20 63 66 41 63 63 65 73 73 2c 20 20  .    cfAccess,  
66c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
66d0: 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 63 66 46  ccess */.    cfF
66e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
66f0: 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
6700: 61 6d 65 20 2a 2f 0a 20 20 20 20 63 66 44 6c 4f  ame */.    cfDlO
6710: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
6720: 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
6730: 20 20 20 63 66 44 6c 45 72 72 6f 72 2c 20 20 20     cfDlError,   
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
6750: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 66 44 6c  rror */.    cfDl
6760: 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
6770: 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
6780: 20 20 20 63 66 44 6c 43 6c 6f 73 65 2c 20 20 20     cfDlClose,   
6790: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
67a0: 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 63 66 52 61  lose */.    cfRa
67b0: 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
67c0: 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
67d0: 20 2a 2f 0a 20 20 20 20 63 66 53 6c 65 65 70 2c   */.    cfSleep,
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
67f0: 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 63   xSleep */.    c
6800: 66 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  fCurrentTime,   
6810: 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
6820: 54 69 6d 65 20 2a 2f 0a 20 20 20 20 63 66 47 65  Time */.    cfGe
6830: 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
6840: 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
6850: 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  or */.    0,    
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
6880: 6e 74 36 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20  nt64 */.  };..  
6890: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
68a0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
68b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
68c0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
68d0: 22 45 4e 41 42 4c 45 20 3f 44 45 46 41 55 4c 54  "ENABLE ?DEFAULT
68e0: 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
68f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
6900: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
6910: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
6920: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69 73  rp, objv[1], &is
6930: 45 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  Enable) ){.    r
6940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6950: 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
6960: 3d 33 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  =3 && Tcl_GetBoo
6970: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
6980: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 73  rp, objv[2], &is
6990: 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
69a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
69b0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 69 73  ;.  }..  if( (is
69c0: 45 6e 61 62 6c 65 20 26 26 20 63 72 61 73 68 56  Enable && crashV
69d0: 66 73 2e 70 41 70 70 44 61 74 61 29 20 7c 7c 20  fs.pAppData) || 
69e0: 28 21 69 73 45 6e 61 62 6c 65 20 26 26 20 21 63  (!isEnable && !c
69f0: 72 61 73 68 56 66 73 2e 70 41 70 70 44 61 74 61  rashVfs.pAppData
6a00: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6a10: 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  TCL_OK;.  }..  i
6a20: 66 28 20 63 72 61 73 68 56 66 73 2e 70 41 70 70  f( crashVfs.pApp
6a30: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Data==0 ){.    s
6a40: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4f 72 69  qlite3_vfs *pOri
6a50: 67 69 6e 61 6c 56 66 73 20 3d 20 73 71 6c 69 74  ginalVfs = sqlit
6a60: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
6a70: 20 20 20 20 63 72 61 73 68 56 66 73 2e 6d 78 50      crashVfs.mxP
6a80: 61 74 68 6e 61 6d 65 20 3d 20 70 4f 72 69 67 69  athname = pOrigi
6a90: 6e 61 6c 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  nalVfs->mxPathna
6aa0: 6d 65 3b 0a 20 20 20 20 63 72 61 73 68 56 66 73  me;.    crashVfs
6ab0: 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69  .pAppData = (voi
6ac0: 64 20 2a 29 70 4f 72 69 67 69 6e 61 6c 56 66 73  d *)pOriginalVfs
6ad0: 3b 0a 20 20 20 20 63 72 61 73 68 56 66 73 2e 73  ;.    crashVfs.s
6ae0: 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66  zOsFile = sizeof
6af0: 28 43 72 61 73 68 46 69 6c 65 29 20 2b 20 70 4f  (CrashFile) + pO
6b00: 72 69 67 69 6e 61 6c 56 66 73 2d 3e 73 7a 4f 73  riginalVfs->szOs
6b10: 46 69 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  File;.    sqlite
6b20: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
6b30: 63 72 61 73 68 56 66 73 2c 20 69 73 44 65 66 61  crashVfs, isDefa
6b40: 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ult);.  }else{. 
6b50: 20 20 20 63 72 61 73 68 56 66 73 2e 70 41 70 70     crashVfs.pApp
6b60: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 73 71  Data = 0;.    sq
6b70: 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
6b80: 73 74 65 72 28 26 63 72 61 73 68 56 66 73 29 3b  ster(&crashVfs);
6b90: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
6ba0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
6bb0: 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
6bc0: 5f 63 72 61 73 68 70 61 72 61 6d 73 20 3f 4f 50  _crashparams ?OP
6bd0: 54 49 4f 4e 53 3f 20 44 45 4c 41 59 20 43 52 41  TIONS? DELAY CRA
6be0: 53 48 46 49 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69  SHFILE.**.** Thi
6bf0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c  s procedure impl
6c00: 65 6d 65 6e 74 73 20 61 20 54 43 4c 20 63 6f 6d  ements a TCL com
6c10: 6d 61 6e 64 20 74 68 61 74 20 65 6e 61 62 6c 65  mand that enable
6c20: 73 20 63 72 61 73 68 20 74 65 73 74 69 6e 67 0a  s crash testing.
6c30: 2a 2a 20 69 6e 20 74 65 73 74 66 69 78 74 75 72  ** in testfixtur
6c40: 65 2e 20 20 4f 6e 63 65 20 65 6e 61 62 6c 65 64  e.  Once enabled
6c50: 2c 20 63 72 61 73 68 20 74 65 73 74 69 6e 67 20  , crash testing 
6c60: 63 61 6e 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  cannot be disabl
6c70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61  ed..**.** Availa
6c80: 62 6c 65 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ble options are 
6c90: 22 2d 63 68 61 72 61 63 74 65 72 69 73 74 69 63  "-characteristic
6ca0: 73 22 20 61 6e 64 20 22 2d 73 65 63 74 6f 72 73  s" and "-sectors
6cb0: 69 7a 65 22 2e 20 42 6f 74 68 20 72 65 71 75 69  ize". Both requi
6cc0: 72 65 0a 2a 2a 20 61 6e 20 61 72 67 75 6d 65 6e  re.** an argumen
6cd0: 74 2e 20 46 6f 72 20 2d 73 65 63 74 6f 72 73 69  t. For -sectorsi
6ce0: 7a 65 2c 20 74 68 69 73 20 69 73 20 74 68 65 20  ze, this is the 
6cf0: 73 69 6d 75 6c 61 74 65 64 20 73 65 63 74 6f 72  simulated sector
6d00: 20 73 69 7a 65 20 69 6e 0a 2a 2a 20 62 79 74 65   size in.** byte
6d10: 73 2e 20 46 6f 72 20 2d 63 68 61 72 61 63 74 65  s. For -characte
6d20: 72 69 73 74 69 63 73 2c 20 74 68 65 20 61 72 67  ristics, the arg
6d30: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 20  ument must be a 
6d40: 6c 69 73 74 20 6f 66 20 69 6f 2d 63 61 70 61 62  list of io-capab
6d50: 69 6c 69 74 79 0a 2a 2a 20 66 6c 61 67 73 20 74  ility.** flags t
6d60: 6f 20 73 69 6d 75 6c 61 74 65 2e 20 56 61 6c 69  o simulate. Vali
6d70: 64 20 66 6c 61 67 73 20 61 72 65 20 22 61 74 6f  d flags are "ato
6d80: 6d 69 63 22 2c 20 22 61 74 6f 6d 69 63 35 31 32  mic", "atomic512
6d90: 22 2c 20 22 61 74 6f 6d 69 63 31 4b 22 2c 0a 2a  ", "atomic1K",.*
6da0: 2a 20 22 61 74 6f 6d 69 63 32 4b 22 2c 20 22 61  * "atomic2K", "a
6db0: 74 6f 6d 69 63 34 4b 22 2c 20 22 61 74 6f 6d 69  tomic4K", "atomi
6dc0: 63 38 4b 22 2c 20 22 61 74 6f 6d 69 63 31 36 4b  c8K", "atomic16K
6dd0: 22 2c 20 22 61 74 6f 6d 69 63 33 32 4b 22 2c 20  ", "atomic32K", 
6de0: 0a 2a 2a 20 22 61 74 6f 6d 69 63 36 34 4b 22 2c  .** "atomic64K",
6df0: 20 22 73 65 71 75 65 6e 74 69 61 6c 22 20 61 6e   "sequential" an
6e00: 64 20 22 73 61 66 65 5f 61 70 70 65 6e 64 22 2e  d "safe_append".
6e10: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  .**.** Example:.
6e20: 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 65 5f 63  **.**   sqlite_c
6e30: 72 61 73 68 70 61 72 61 6d 73 20 2d 73 65 63 74  rashparams -sect
6e40: 20 31 30 32 34 20 2d 63 68 61 72 20 7b 61 74 6f   1024 -char {ato
6e50: 6d 69 63 20 73 65 71 75 65 6e 74 69 61 6c 7d 20  mic sequential} 
6e60: 2e 2f 74 65 73 74 2e 64 62 20 31 0a 2a 2a 0a 2a  ./test.db 1.**.*
6e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
6e80: 49 54 45 5f 54 43 4c 41 50 49 20 63 72 61 73 68  ITE_TCLAPI crash
6e90: 50 61 72 61 6d 73 4f 62 6a 43 6d 64 28 0a 20 20  ParamsObjCmd(.  
6ea0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
6eb0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
6ec0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
6ed0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
6ee0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
6ef0: 20 20 69 6e 74 20 69 44 65 6c 61 79 3b 0a 20 20    int iDelay;.  
6f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 61  const char *zCra
6f10: 73 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e 43  shFile;.  int nC
6f20: 72 61 73 68 46 69 6c 65 2c 20 69 44 63 2c 20 69  rashFile, iDc, i
6f30: 53 65 63 74 6f 72 53 69 7a 65 3b 0a 0a 20 20 69  SectorSize;..  i
6f40: 44 63 20 3d 20 2d 31 3b 0a 20 20 69 53 65 63 74  Dc = -1;.  iSect
6f50: 6f 72 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  orSize = -1;..  
6f60: 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20  if( objc<3 ){.  
6f70: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
6f80: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
6f90: 6a 76 2c 20 22 3f 4f 50 54 49 4f 4e 53 3f 20 44  jv, "?OPTIONS? D
6fa0: 45 4c 41 59 20 43 52 41 53 48 46 49 4c 45 22 29  ELAY CRASHFILE")
6fb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
6fc0: 3b 0a 20 20 7d 0a 0a 20 20 7a 43 72 61 73 68 46  ;.  }..  zCrashF
6fd0: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
6fe0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
6ff0: 6f 62 6a 63 2d 31 5d 2c 20 26 6e 43 72 61 73 68  objc-1], &nCrash
7000: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 43 72  File);.  if( nCr
7010: 61 73 68 46 69 6c 65 3e 3d 73 69 7a 65 6f 66 28  ashFile>=sizeof(
7020: 67 2e 7a 43 72 61 73 68 46 69 6c 65 29 20 29 7b  g.zCrashFile) ){
7030: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7040: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46  esult(interp, "F
7050: 69 6c 65 6e 61 6d 65 20 69 73 20 74 6f 6f 20 6c  ilename is too l
7060: 6f 6e 67 3a 20 5c 22 22 2c 20 7a 43 72 61 73 68  ong: \"", zCrash
7070: 46 69 6c 65 2c 20 22 5c 22 22 2c 20 30 29 3b 0a  File, "\"", 0);.
7080: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
7090: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
70a0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
70b0: 72 70 2c 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d  rp, objv[objc-2]
70c0: 2c 20 26 69 44 65 6c 61 79 29 20 29 7b 0a 20 20  , &iDelay) ){.  
70d0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20    goto error;.  
70e0: 7d 0a 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73  }..  if( process
70f0: 44 65 76 53 79 6d 41 72 67 73 28 69 6e 74 65 72  DevSymArgs(inter
7100: 70 2c 20 6f 62 6a 63 2d 33 2c 20 26 6f 62 6a 76  p, objc-3, &objv
7110: 5b 31 5d 2c 20 26 69 44 63 2c 20 26 69 53 65 63  [1], &iDc, &iSec
7120: 74 6f 72 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  torSize) ){.    
7130: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7140: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 44 63  ;.  }..  if( iDc
7150: 3e 3d 30 20 29 7b 0a 20 20 20 20 67 2e 69 44 65  >=0 ){.    g.iDe
7160: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7170: 69 63 73 20 3d 20 69 44 63 3b 0a 20 20 7d 0a 20  ics = iDc;.  }. 
7180: 20 69 66 28 20 69 53 65 63 74 6f 72 53 69 7a 65   if( iSectorSize
7190: 3e 3d 30 20 29 7b 0a 20 20 20 20 67 2e 69 53 65  >=0 ){.    g.iSe
71a0: 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74  ctorSize = iSect
71b0: 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 67  orSize;.  }..  g
71c0: 2e 69 43 72 61 73 68 20 3d 20 69 44 65 6c 61 79  .iCrash = iDelay
71d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 67 2e 7a 43 72  ;.  memcpy(g.zCr
71e0: 61 73 68 46 69 6c 65 2c 20 7a 43 72 61 73 68 46  ashFile, zCrashF
71f0: 69 6c 65 2c 20 6e 43 72 61 73 68 46 69 6c 65 2b  ile, nCrashFile+
7200: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 61  1);.  sqlite3Cra
7210: 73 68 54 65 73 74 45 6e 61 62 6c 65 20 3d 20 31  shTestEnable = 1
7220: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
7230: 4b 3b 0a 0a 65 72 72 6f 72 3a 0a 20 20 72 65 74  K;..error:.  ret
7240: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
7250: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
7260: 49 54 45 5f 54 43 4c 41 50 49 20 64 65 76 53 79  ITE_TCLAPI devSy
7270: 6d 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69 64 20  mObjCmd(.  void 
7280: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
7290: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
72a0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
72b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
72c0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69   objv[].){.  voi
72d0: 64 20 64 65 76 73 79 6d 5f 72 65 67 69 73 74 65  d devsym_registe
72e0: 72 28 69 6e 74 20 69 44 65 76 69 63 65 43 68 61  r(int iDeviceCha
72f0: 72 2c 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69  r, int iSectorSi
7300: 7a 65 29 3b 0a 0a 20 20 69 6e 74 20 69 44 63 20  ze);..  int iDc 
7310: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 53 65 63  = -1;.  int iSec
7320: 74 6f 72 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  torSize = -1;.. 
7330: 20 69 66 28 20 70 72 6f 63 65 73 73 44 65 76 53   if( processDevS
7340: 79 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 6f  ymArgs(interp, o
7350: 62 6a 63 2d 31 2c 20 26 6f 62 6a 76 5b 31 5d 2c  bjc-1, &objv[1],
7360: 20 26 69 44 63 2c 20 26 69 53 65 63 74 6f 72 53   &iDc, &iSectorS
7370: 69 7a 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ize) ){.    retu
7380: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7390: 7d 0a 20 20 64 65 76 73 79 6d 5f 72 65 67 69 73  }.  devsym_regis
73a0: 74 65 72 28 69 44 63 2c 20 69 53 65 63 74 6f 72  ter(iDc, iSector
73b0: 53 69 7a 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Size);..  return
73c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
73d0: 2a 20 74 63 6c 63 6d 64 3a 20 73 71 6c 69 74 65  * tclcmd: sqlite
73e0: 33 5f 63 72 61 73 68 5f 6f 6e 5f 77 72 69 74 65  3_crash_on_write
73f0: 20 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74   N.*/.static int
7400: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
7410: 72 69 74 65 43 72 61 73 68 4f 62 6a 43 6d 64 28  riteCrashObjCmd(
7420: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
7430: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
7440: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
7450: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
7460: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
7470: 29 7b 0a 20 20 76 6f 69 64 20 64 65 76 73 79 6d  ){.  void devsym
7480: 5f 63 72 61 73 68 5f 6f 6e 5f 77 72 69 74 65 28  _crash_on_write(
7490: 69 6e 74 29 3b 0a 20 20 69 6e 74 20 6e 57 72 69  int);.  int nWri
74a0: 74 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  te = 0;..  if( o
74b0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
74c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
74d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
74e0: 22 4e 57 52 49 54 45 22 29 3b 0a 20 20 20 20 72  "NWRITE");.    r
74f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7500: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
7510: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
7520: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6e  erp, objv[1], &n
7530: 57 72 69 74 65 29 20 29 7b 0a 20 20 20 20 72 65  Write) ){.    re
7540: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7550: 20 20 7d 0a 0a 20 20 64 65 76 73 79 6d 5f 63 72    }..  devsym_cr
7560: 61 73 68 5f 6f 6e 5f 77 72 69 74 65 28 6e 57 72  ash_on_write(nWr
7570: 69 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ite);.  return T
7580: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
7590: 74 63 6c 63 6d 64 3a 20 75 6e 72 65 67 69 73 74  tclcmd: unregist
75a0: 65 72 5f 64 65 76 73 69 6d 0a 2a 2f 0a 73 74 61  er_devsim.*/.sta
75b0: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
75c0: 43 4c 41 50 49 20 64 73 55 6e 72 65 67 69 73 74  CLAPI dsUnregist
75d0: 65 72 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69 64  erObjCmd(.  void
75e0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
75f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7600: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
7610: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
7620: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f  T objv[].){.  vo
7630: 69 64 20 64 65 76 73 79 6d 5f 75 6e 72 65 67 69  id devsym_unregi
7640: 73 74 65 72 28 76 6f 69 64 29 3b 0a 0a 20 20 69  ster(void);..  i
7650: 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
7660: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
7670: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7680: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
7690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
76a0: 20 7d 0a 0a 20 20 64 65 76 73 79 6d 5f 75 6e 72   }..  devsym_unr
76b0: 65 67 69 73 74 65 72 28 29 3b 0a 20 20 72 65 74  egister();.  ret
76c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
76d0: 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 72 65 67  *.** tclcmd: reg
76e0: 69 73 74 65 72 5f 6a 74 5f 76 66 73 20 3f 2d 64  ister_jt_vfs ?-d
76f0: 65 66 61 75 6c 74 3f 20 50 41 52 45 4e 54 2d 56  efault? PARENT-V
7700: 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  FS.*/.static int
7710: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 6a   SQLITE_TCLAPI j
7720: 74 4f 62 6a 43 6d 64 28 0a 20 20 76 6f 69 64 20  tObjCmd(.  void 
7730: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
7740: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7750: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
7760: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
7770: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
7780: 20 6a 74 5f 72 65 67 69 73 74 65 72 28 63 68 61   jt_register(cha
7790: 72 20 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 68 61  r *, int);.  cha
77a0: 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 30 3b 0a  r *zParent = 0;.
77b0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26  .  if( objc!=2 &
77c0: 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
77d0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
77e0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
77f0: 76 2c 20 22 3f 2d 64 65 66 61 75 6c 74 3f 20 50  v, "?-default? P
7800: 41 52 45 4e 54 2d 56 46 53 22 29 3b 0a 20 20 20  ARENT-VFS");.   
7810: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7820: 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 72 65 6e 74  R;.  }.  zParent
7830: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7840: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (objv[1]);.  if(
7850: 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
7860: 69 66 28 20 73 74 72 63 6d 70 28 7a 50 61 72 65  if( strcmp(zPare
7870: 6e 74 2c 20 22 2d 64 65 66 61 75 6c 74 22 29 20  nt, "-default") 
7880: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
7890: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
78a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 62 61  , .          "ba
78b0: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 7a 50  d option \"", zP
78c0: 61 72 65 6e 74 2c 20 22 5c 22 3a 20 6d 75 73 74  arent, "\": must
78d0: 20 62 65 20 2d 64 65 66 61 75 6c 74 22 2c 20 30   be -default", 0
78e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
78f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 72  ;.    }.    zPar
7910: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ent = Tcl_GetStr
7920: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
7930: 7d 0a 0a 20 20 69 66 28 20 21 28 2a 7a 50 61 72  }..  if( !(*zPar
7940: 65 6e 74 29 20 29 7b 0a 20 20 20 20 7a 50 61 72  ent) ){.    zPar
7950: 65 6e 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ent = 0;.  }.  i
7960: 66 28 20 6a 74 5f 72 65 67 69 73 74 65 72 28 7a  f( jt_register(z
7970: 50 61 72 65 6e 74 2c 20 6f 62 6a 63 3d 3d 33 29  Parent, objc==3)
7980: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
7990: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
79a0: 20 22 45 72 72 6f 72 20 69 6e 20 6a 74 5f 72 65   "Error in jt_re
79b0: 67 69 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20  gister", 0);.   
79c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
79d0: 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
79e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
79f0: 2a 20 74 63 6c 63 6d 64 3a 20 75 6e 72 65 67 69  * tclcmd: unregi
7a00: 73 74 65 72 5f 6a 74 5f 76 66 73 0a 2a 2f 0a 73  ster_jt_vfs.*/.s
7a10: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7a20: 5f 54 43 4c 41 50 49 20 6a 74 55 6e 72 65 67 69  _TCLAPI jtUnregi
7a30: 73 74 65 72 4f 62 6a 43 6d 64 28 0a 20 20 76 6f  sterObjCmd(.  vo
7a40: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
7a50: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7a60: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
7a70: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
7a80: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
7a90: 76 6f 69 64 20 6a 74 5f 75 6e 72 65 67 69 73 74  void jt_unregist
7aa0: 65 72 28 76 6f 69 64 29 3b 0a 0a 20 20 69 66 28  er(void);..  if(
7ab0: 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
7ac0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
7ad0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
7ae0: 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
7af0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7b00: 0a 0a 20 20 6a 74 5f 75 6e 72 65 67 69 73 74 65  ..  jt_unregiste
7b10: 72 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  r();.  return TC
7b20: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  L_OK;.}..#endif 
7b30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
7b40: 49 53 4b 49 4f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ISKIO */../*.** 
7b50: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72  This procedure r
7b60: 65 67 69 73 74 65 72 73 20 74 68 65 20 54 43 4c  egisters the TCL
7b70: 20 70 72 6f 63 65 64 75 72 65 73 20 64 65 66 69   procedures defi
7b80: 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
7b90: 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74  ..*/.int Sqlitet
7ba0: 65 73 74 36 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est6_Init(Tcl_In
7bb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 23  terp *interp){.#
7bc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7bd0: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f  IT_DISKIO.  Tcl_
7be0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
7bf0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
7c00: 33 5f 63 72 61 73 68 5f 65 6e 61 62 6c 65 22 2c  3_crash_enable",
7c10: 20 63 72 61 73 68 45 6e 61 62 6c 65 43 6d 64 2c   crashEnableCmd,
7c20: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72   0, 0);.  Tcl_Cr
7c30: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
7c40: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
7c50: 63 72 61 73 68 70 61 72 61 6d 73 22 2c 20 63 72  crashparams", cr
7c60: 61 73 68 50 61 72 61 6d 73 4f 62 6a 43 6d 64 2c  ashParamsObjCmd,
7c70: 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72   0, 0);.  Tcl_Cr
7c80: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
7c90: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
7ca0: 63 72 61 73 68 5f 6e 6f 77 22 2c 20 63 72 61 73  crash_now", cras
7cb0: 68 4e 6f 77 43 6d 64 2c 20 30 2c 20 30 29 3b 0a  hNowCmd, 0, 0);.
7cc0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
7cd0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
7ce0: 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65  sqlite3_simulate
7cf0: 5f 64 65 76 69 63 65 22 2c 20 64 65 76 53 79 6d  _device", devSym
7d00: 4f 62 6a 43 6d 64 2c 20 30 2c 20 30 29 3b 0a 20  ObjCmd, 0, 0);. 
7d10: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
7d20: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73  mmand(interp, "s
7d30: 71 6c 69 74 65 33 5f 63 72 61 73 68 5f 6f 6e 5f  qlite3_crash_on_
7d40: 77 72 69 74 65 22 2c 20 77 72 69 74 65 43 72 61  write", writeCra
7d50: 73 68 4f 62 6a 43 6d 64 2c 30 2c 30 29 3b 0a 20  shObjCmd,0,0);. 
7d60: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
7d70: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 75  mmand(interp, "u
7d80: 6e 72 65 67 69 73 74 65 72 5f 64 65 76 73 69 6d  nregister_devsim
7d90: 22 2c 20 64 73 55 6e 72 65 67 69 73 74 65 72 4f  ", dsUnregisterO
7da0: 62 6a 43 6d 64 2c 20 30 2c 20 30 29 3b 0a 20 20  bjCmd, 0, 0);.  
7db0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
7dc0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 72 65  mand(interp, "re
7dd0: 67 69 73 74 65 72 5f 6a 74 5f 76 66 73 22 2c 20  gister_jt_vfs", 
7de0: 6a 74 4f 62 6a 43 6d 64 2c 20 30 2c 20 30 29 3b  jtObjCmd, 0, 0);
7df0: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
7e00: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
7e10: 22 75 6e 72 65 67 69 73 74 65 72 5f 6a 74 5f 76  "unregister_jt_v
7e20: 66 73 22 2c 20 6a 74 55 6e 72 65 67 69 73 74 65  fs", jtUnregiste
7e30: 72 4f 62 6a 43 6d 64 2c 20 30 2c 20 30 29 3b 0a  rObjCmd, 0, 0);.
7e40: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7e50: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  TCL_OK;.}..#endi
7e60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
7e70: 20 2a 2f 0a                                       */.