/ Hex Artifact Content
Login

Artifact 41cacf3b0dd180823919bf9e1fbab287c9266723:


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 6e 63 6c 75 64 65 20 22 74  t.h".#include "t
02c0: 63 6c 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53  cl.h"..#ifndef S
02d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
02e0: 4f 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20  O  /* This file 
02f0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 69  is a no-op if di
0300: 73 6b 20 49 2f 4f 20 69 73 20 64 69 73 61 62 6c  sk I/O is disabl
0310: 65 64 20 2a 2f 0a 0a 2f 2a 20 23 64 65 66 69 6e  ed */../* #defin
0320: 65 20 54 52 41 43 45 5f 43 52 41 53 48 54 45 53  e TRACE_CRASHTES
0330: 54 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74  T */..typedef st
0340: 72 75 63 74 20 43 72 61 73 68 46 69 6c 65 20 43  ruct CrashFile C
0350: 72 61 73 68 46 69 6c 65 3b 0a 74 79 70 65 64 65  rashFile;.typede
0360: 66 20 73 74 72 75 63 74 20 43 72 61 73 68 47 6c  f struct CrashGl
0370: 6f 62 61 6c 20 43 72 61 73 68 47 6c 6f 62 61 6c  obal CrashGlobal
0380: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0390: 20 57 72 69 74 65 42 75 66 66 65 72 20 57 72 69   WriteBuffer Wri
03a0: 74 65 42 75 66 66 65 72 3b 0a 0a 2f 2a 0a 2a 2a  teBuffer;../*.**
03b0: 20 4d 65 74 68 6f 64 3a 0a 2a 2a 0a 2a 2a 20 20   Method:.**.**  
03c0: 20 54 68 69 73 20 6c 61 79 65 72 20 69 73 20 69   This layer is i
03d0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
03e0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
03f0: 68 65 20 22 72 65 61 6c 22 20 0a 2a 2a 20 20 20  he "real" .**   
0400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
0410: 65 63 74 20 66 6f 72 20 74 68 65 20 68 6f 73 74  ect for the host
0420: 20 73 79 73 74 65 6d 2e 20 45 61 63 68 20 74 69   system. Each ti
0430: 6d 65 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 20  me data is .**  
0440: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
0450: 66 69 6c 65 20 6f 62 6a 65 63 74 2c 20 69 6e 73  file object, ins
0460: 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 77 72  tead of being wr
0470: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0480: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c    underlying fil
0490: 65 2c 20 74 68 65 20 77 72 69 74 65 20 6f 70 65  e, the write ope
04a0: 72 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64  ration is stored
04b0: 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   in an in-memory
04c0: 20 0a 2a 2a 20 20 20 73 74 72 75 63 74 75 72 65   .**   structure
04d0: 20 28 74 79 70 65 20 57 72 69 74 65 42 75 66 66   (type WriteBuff
04e0: 65 72 29 2e 20 54 68 69 73 20 73 74 72 75 63 74  er). This struct
04f0: 75 72 65 20 69 73 20 70 6c 61 63 65 64 20 61 74  ure is placed at
0500: 20 74 68 65 0a 2a 2a 20 20 20 65 6e 64 20 6f 66   the.**   end of
0510: 20 61 20 67 6c 6f 62 61 6c 20 6f 72 64 65 72 65   a global ordere
0520: 64 20 6c 69 73 74 20 28 74 68 65 20 77 72 69 74  d list (the writ
0530: 65 2d 6c 69 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 20  e-list)..**.**  
0540: 20 57 68 65 6e 20 64 61 74 61 20 69 73 20 72 65   When data is re
0550: 61 64 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 6f  ad from a file o
0560: 62 6a 65 63 74 2c 20 74 68 65 20 72 65 71 75 65  bject, the reque
0570: 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 2a  sted region is.*
0580: 2a 20 20 20 66 69 72 73 74 20 72 65 74 72 69 65  *   first retrie
0590: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 61  ved from the rea
05a0: 6c 20 66 69 6c 65 2e 20 54 68 65 20 77 72 69 74  l file. The writ
05b0: 65 2d 6c 69 73 74 20 69 73 20 74 68 65 6e 20 0a  e-list is then .
05c0: 2a 2a 20 20 20 74 72 61 76 65 72 73 65 64 20 61  **   traversed a
05d0: 6e 64 20 64 61 74 61 20 63 6f 70 69 65 64 20 66  nd data copied f
05e0: 72 6f 6d 20 61 6e 79 20 6f 76 65 72 6c 61 70 70  rom any overlapp
05f0: 69 6e 67 20 57 72 69 74 65 42 75 66 66 65 72 20  ing WriteBuffer 
0600: 0a 2a 2a 20 20 20 73 74 72 75 63 74 75 72 65 73  .**   structures
0610: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
0620: 75 66 66 65 72 2e 20 69 2e 65 2e 20 61 20 72 65  uffer. i.e. a re
0630: 61 64 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 66  ad() operation f
0640: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 20 20 6f 6e  ollowing.**   on
0650: 65 20 6f 72 20 6d 6f 72 65 20 77 72 69 74 65 28  e or more write(
0660: 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 6f 72  ) operations wor
0670: 6b 73 20 61 73 20 65 78 70 65 63 74 65 64 2c 20  ks as expected, 
0680: 65 76 65 6e 20 69 66 20 6e 6f 0a 2a 2a 20 20 20  even if no.**   
0690: 64 61 74 61 20 68 61 73 20 61 63 74 75 61 6c 6c  data has actuall
06a0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f  y been written o
06b0: 75 74 20 74 6f 20 74 68 65 20 72 65 61 6c 20 66  ut to the real f
06c0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ile..**.**   Whe
06d0: 6e 20 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72  n a fsync() oper
06e0: 61 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ation is perform
06f0: 65 64 2c 20 61 6e 20 6f 70 65 72 61 74 69 6e 67  ed, an operating
0700: 20 73 79 73 74 65 6d 20 63 72 61 73 68 20 0a 2a   system crash .*
0710: 2a 20 20 20 6d 61 79 20 62 65 20 73 69 6d 75 6c  *   may be simul
0720: 61 74 65 64 2c 20 69 6e 20 77 68 69 63 68 20 63  ated, in which c
0730: 61 73 65 20 65 78 69 74 28 2d 31 29 20 69 73 20  ase exit(-1) is 
0740: 63 61 6c 6c 65 64 20 28 74 68 65 20 63 61 6c 6c  called (the call
0750: 20 74 6f 20 0a 2a 2a 20 20 20 78 53 79 6e 63 28   to .**   xSync(
0760: 29 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 29  ) never returns)
0770: 2e 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  . Whether or not
0780: 20 61 20 63 72 61 73 68 20 69 73 20 73 69 6d 75   a crash is simu
0790: 6c 61 74 65 64 2c 0a 2a 2a 20 20 20 74 68 65 20  lated,.**   the 
07a0: 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
07b0: 77 69 74 68 20 61 20 73 75 62 73 65 74 20 6f 66  with a subset of
07c0: 20 74 68 65 20 57 72 69 74 65 42 75 66 66 65 72   the WriteBuffer
07d0: 20 73 74 72 75 63 74 75 72 65 73 20 0a 2a 2a 20   structures .** 
07e0: 20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20    stored in the 
07f0: 77 72 69 74 65 2d 6c 69 73 74 20 69 73 20 77 72  write-list is wr
0800: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72 65 61  itten to the rea
0810: 6c 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  l underlying fil
0820: 65 73 20 0a 2a 2a 20 20 20 61 6e 64 20 74 68 65  es .**   and the
0830: 20 65 6e 74 72 69 65 73 20 72 65 6d 6f 76 65 64   entries removed
0840: 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
0850: 6c 69 73 74 2e 20 49 66 20 61 20 63 72 61 73 68  list. If a crash
0860: 20 69 73 20 73 69 6d 75 6c 61 74 65 64 2c 0a 2a   is simulated,.*
0870: 2a 20 20 20 61 20 73 75 62 73 65 74 20 6f 66 20  *   a subset of 
0880: 74 68 65 20 62 75 66 66 65 72 73 20 6d 61 79 20  the buffers may 
0890: 62 65 20 63 6f 72 72 75 70 74 65 64 20 62 65 66  be corrupted bef
08a0: 6f 72 65 20 74 68 65 20 64 61 74 61 20 69 73 20  ore the data is 
08b0: 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  written..**.**  
08c0: 20 54 68 65 20 65 78 61 63 74 20 73 75 62 73 65   The exact subse
08d0: 74 20 6f 66 20 74 68 65 20 77 72 69 74 65 2d 6c  t of the write-l
08e0: 69 73 74 20 77 72 69 74 74 65 6e 20 61 6e 64 2f  ist written and/
08f0: 6f 72 20 63 6f 72 72 75 70 74 65 64 20 69 73 0a  or corrupted is.
0900: 2a 2a 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  **   determined 
0910: 62 79 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  by the simulated
0920: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
0930: 72 69 73 74 69 63 73 20 61 6e 64 20 73 65 63 74  ristics and sect
0940: 6f 72 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 22  or-size..**.** "
0950: 4e 6f 72 6d 61 6c 22 20 6d 6f 64 65 3a 0a 2a 2a  Normal" mode:.**
0960: 0a 2a 2a 20 20 20 4e 6f 72 6d 61 6c 20 6d 6f 64  .**   Normal mod
0970: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
0980: 68 65 20 73 69 6d 75 6c 61 74 65 64 20 64 65 76  he simulated dev
0990: 69 63 65 20 68 61 73 20 6e 6f 6e 65 20 6f 66 20  ice has none of 
09a0: 74 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  the.**   SQLITE_
09b0: 49 4f 43 41 50 5f 58 58 58 20 66 6c 61 67 73 20  IOCAP_XXX flags 
09c0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  set..**.**   In 
09d0: 6e 6f 72 6d 61 6c 20 6d 6f 64 65 2c 20 69 66 20  normal mode, if 
09e0: 74 68 65 20 66 73 79 6e 63 28 29 20 69 73 20 6e  the fsync() is n
09f0: 6f 74 20 61 20 73 69 6d 75 6c 61 74 65 64 20 63  ot a simulated c
0a00: 72 61 73 68 2c 20 74 68 65 20 0a 2a 2a 20 20 20  rash, the .**   
0a10: 77 72 69 74 65 2d 6c 69 73 74 20 69 73 20 74 72  write-list is tr
0a20: 61 76 65 72 73 65 64 20 66 72 6f 6d 20 62 65 67  aversed from beg
0a30: 69 6e 6e 69 6e 67 20 74 6f 20 65 6e 64 2e 20 45  inning to end. E
0a40: 61 63 68 20 57 72 69 74 65 42 75 66 66 65 72 0a  ach WriteBuffer.
0a50: 2a 2a 20 20 20 73 74 72 75 63 74 75 72 65 20 61  **   structure a
0a60: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
0a70: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 75  he file handle u
0a80: 73 65 64 20 74 6f 20 63 61 6c 6c 20 78 53 79 6e  sed to call xSyn
0a90: 63 28 29 0a 2a 2a 20 20 20 69 73 20 77 72 69 74  c().**   is writ
0aa0: 74 65 6e 20 74 6f 20 74 68 65 20 72 65 61 6c 20  ten to the real 
0ab0: 66 69 6c 65 20 61 6e 64 20 72 65 6d 6f 76 65 64  file and removed
0ac0: 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
0ad0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66  list..**.**   If
0ae0: 20 61 20 63 72 61 73 68 20 69 73 20 73 69 6d 75   a crash is simu
0af0: 6c 61 74 65 64 2c 20 6f 6e 65 20 6f 66 20 74 68  lated, one of th
0b00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 6b 65  e following take
0b10: 73 20 70 6c 61 63 65 20 66 6f 72 20 0a 2a 2a 20  s place for .** 
0b20: 20 20 65 61 63 68 20 57 72 69 74 65 42 75 66 66    each WriteBuff
0b30: 65 72 20 69 6e 20 74 68 65 20 77 72 69 74 65 2d  er in the write-
0b40: 6c 69 73 74 2c 20 72 65 67 61 72 64 6c 65 73 73  list, regardless
0b50: 20 6f 66 20 77 68 69 63 68 20 0a 2a 2a 20 20 20   of which .**   
0b60: 66 69 6c 65 2d 68 61 6e 64 6c 65 20 69 74 20 69  file-handle it i
0b70: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
0b80: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 31 2e 20  h:.**.**     1. 
0b90: 54 68 65 20 62 75 66 66 65 72 20 69 73 20 63 6f  The buffer is co
0ba0: 72 72 65 63 74 6c 79 20 77 72 69 74 74 65 6e 20  rrectly written 
0bb0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 6a 75 73  to the file, jus
0bc0: 74 20 61 73 20 69 66 0a 2a 2a 20 20 20 20 20 20  t as if.**      
0bd0: 20 20 61 20 63 72 61 73 68 20 77 65 72 65 20 6e    a crash were n
0be0: 6f 74 20 62 65 69 6e 67 20 73 69 6d 75 6c 61 74  ot being simulat
0bf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 32 2e  ed..**.**     2.
0c00: 20 4e 6f 74 68 69 6e 67 20 69 73 20 64 6f 6e 65   Nothing is done
0c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 33 2e 20 47  ..**.**     3. G
0c20: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 77  arbage data is w
0c30: 72 69 74 74 65 6e 20 74 6f 20 61 6c 6c 20 73 65  ritten to all se
0c40: 63 74 6f 72 73 20 6f 66 20 74 68 65 20 66 69 6c  ctors of the fil
0c50: 65 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  e that .**      
0c60: 20 20 6f 76 65 72 6c 61 70 20 74 68 65 20 72 65    overlap the re
0c70: 67 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 62  gion specified b
0c80: 79 20 74 68 65 20 57 72 69 74 65 42 75 66 66 65  y the WriteBuffe
0c90: 72 2e 20 4f 72 20 67 61 72 62 61 67 65 0a 2a 2a  r. Or garbage.**
0ca0: 20 20 20 20 20 20 20 20 64 61 74 61 20 69 73 20          data is 
0cb0: 77 72 69 74 74 65 6e 20 74 6f 20 73 6f 6d 65 20  written to some 
0cc0: 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 63 74 69  contiguous secti
0cd0: 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 0a 2a  on within the .*
0ce0: 2a 20 20 20 20 20 20 20 20 6f 76 65 72 6c 61 70  *        overlap
0cf0: 70 65 64 20 73 65 63 74 6f 72 73 2e 0a 2a 2a 0a  ped sectors..**.
0d00: 2a 2a 20 44 65 76 69 63 65 20 43 68 61 72 61 63  ** Device Charac
0d10: 74 65 72 69 73 74 69 63 20 66 6c 61 67 20 68 61  teristic flag ha
0d20: 6e 64 6c 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndling:.**.**   
0d30: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 41 54 4f  If the IOCAP_ATO
0d40: 4d 49 43 20 66 6c 61 67 20 69 73 20 73 65 74 2c  MIC flag is set,
0d50: 20 74 68 65 6e 20 6f 70 74 69 6f 6e 20 28 33 29   then option (3)
0d60: 20 61 62 6f 76 65 20 69 73 20 0a 2a 2a 20 20 20   above is .**   
0d70: 6e 65 76 65 72 20 73 65 6c 65 63 74 65 64 2e 0a  never selected..
0d80: 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 49  **.**   If the I
0d90: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 66  OCAP_ATOMIC512 f
0da0: 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
0db0: 74 68 65 20 57 72 69 74 65 42 75 66 66 65 72 20  the WriteBuffer 
0dc0: 72 65 70 72 65 73 65 6e 74 73 0a 2a 2a 20 20 20  represents.**   
0dd0: 61 6e 20 61 6c 69 67 6e 65 64 20 77 72 69 74 65  an aligned write
0de0: 28 29 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  () of an integer
0df0: 20 6e 75 6d 62 65 72 20 6f 66 20 35 31 32 20 62   number of 512 b
0e00: 79 74 65 20 72 65 67 69 6f 6e 73 2c 20 74 68 65  yte regions, the
0e10: 6e 0a 2a 2a 20 20 20 6f 70 74 69 6f 6e 20 28 33  n.**   option (3
0e20: 29 20 61 62 6f 76 65 20 69 73 20 6e 65 76 65 72  ) above is never
0e30: 20 73 65 6c 65 63 74 65 64 2e 20 49 6e 73 74 65   selected. Inste
0e40: 61 64 2c 20 65 61 63 68 20 35 31 32 20 62 79 74  ad, each 512 byt
0e50: 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 20 20 69 73  e region.**   is
0e60: 20 65 69 74 68 65 72 20 63 6f 72 72 65 63 74 6c   either correctl
0e70: 79 20 77 72 69 74 74 65 6e 20 6f 72 20 6c 65 66  y written or lef
0e80: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 74  t completely unt
0e90: 6f 75 63 68 65 64 2e 20 53 69 6d 69 6c 61 72 0a  ouched. Similar.
0ea0: 2a 2a 20 20 20 6c 6f 67 69 63 20 67 6f 76 65 72  **   logic gover
0eb0: 6e 73 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ns the behavior 
0ec0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  if any of the ot
0ed0: 68 65 72 20 41 54 4f 4d 49 43 58 58 58 20 66 6c  her ATOMICXXX fl
0ee0: 61 67 73 0a 2a 2a 20 20 20 69 73 20 73 65 74 2e  ags.**   is set.
0ef0: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 65 69 74 68  .**.**   If eith
0f00: 65 72 20 74 68 65 20 49 4f 43 41 50 5f 53 41 46  er the IOCAP_SAF
0f10: 45 41 50 50 45 4e 44 20 6f 72 20 49 4f 43 41 50  EAPPEND or IOCAP
0f20: 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
0f30: 73 20 61 72 65 20 73 65 74 0a 2a 2a 20 20 20 61  s are set.**   a
0f40: 6e 64 20 61 20 63 72 61 73 68 20 69 73 20 62 65  nd a crash is be
0f50: 69 6e 67 20 73 69 6d 75 6c 61 74 65 64 2c 20 74  ing simulated, t
0f60: 68 65 6e 20 61 6e 20 65 6e 74 72 79 20 6f 66 20  hen an entry of 
0f70: 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 20 69  the write-list i
0f80: 73 0a 2a 2a 20 20 20 73 65 6c 65 63 74 65 64 20  s.**   selected 
0f90: 61 74 20 72 61 6e 64 6f 6d 2e 20 45 76 65 72 79  at random. Every
0fa0: 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6c 69 73  thing in the lis
0fb0: 74 20 61 66 74 65 72 20 74 68 65 20 73 65 6c 65  t after the sele
0fc0: 63 74 65 64 20 65 6e 74 72 79 20 0a 2a 2a 20 20  cted entry .**  
0fd0: 20 69 73 20 64 69 73 63 61 72 64 65 64 20 62 65   is discarded be
0fe0: 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20  fore processing 
0ff0: 62 65 67 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  begins..**.**   
1000: 49 66 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  If IOCAP_SEQUENT
1010: 49 41 4c 20 69 73 20 73 65 74 20 61 6e 64 20 61  IAL is set and a
1020: 20 63 72 61 73 68 20 69 73 20 62 65 69 6e 67 20   crash is being 
1030: 73 69 6d 75 6c 61 74 65 64 2c 20 6f 70 74 69 6f  simulated, optio
1040: 6e 20 0a 2a 2a 20 20 20 28 31 29 20 69 73 20 73  n .**   (1) is s
1050: 65 6c 65 63 74 65 64 20 66 6f 72 20 61 6c 6c 20  elected for all 
1060: 77 72 69 74 65 2d 6c 69 73 74 20 65 6e 74 72 69  write-list entri
1070: 65 73 20 65 78 63 65 70 74 20 74 68 65 20 6c 61  es except the la
1080: 73 74 2e 20 49 66 20 61 20 0a 2a 2a 20 20 20 63  st. If a .**   c
1090: 72 61 73 68 20 69 73 20 6e 6f 74 20 62 65 69 6e  rash is not bein
10a0: 67 20 73 69 6d 75 6c 61 74 65 64 2c 20 74 68 65  g simulated, the
10b0: 6e 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  n all entries in
10c0: 20 74 68 65 20 77 72 69 74 65 2d 6c 69 73 74 0a   the write-list.
10d0: 2a 2a 20 20 20 74 68 61 74 20 6f 63 63 75 72 20  **   that occur 
10e0: 62 65 66 6f 72 65 20 61 74 20 6c 65 61 73 74 20  before at least 
10f0: 6f 6e 65 20 77 72 69 74 65 28 29 20 6f 6e 20 74  one write() on t
1100: 68 65 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 73  he file-handle s
1110: 70 65 63 69 66 69 65 64 0a 2a 2a 20 20 20 61 73  pecified.**   as
1120: 20 70 61 72 74 20 6f 66 20 74 68 65 20 78 53 79   part of the xSy
1130: 6e 63 28 29 20 61 72 65 20 77 72 69 74 74 65 6e  nc() are written
1140: 20 74 6f 20 74 68 65 69 72 20 61 73 73 6f 63 69   to their associ
1150: 61 74 65 64 20 72 65 61 6c 20 66 69 6c 65 73 2e  ated real files.
1160: 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 49 4f 43 41  .**.**   If IOCA
1170: 50 5f 53 41 46 45 41 50 50 45 4e 44 20 69 73 20  P_SAFEAPPEND is 
1180: 73 65 74 20 61 6e 64 20 74 68 65 20 66 69 72 73  set and the firs
1190: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
11a0: 79 20 74 68 65 20 77 72 69 74 65 28 29 0a 2a 2a  y the write().**
11b0: 20 20 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20     operation is 
11c0: 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74 68  one byte past th
11d0: 65 20 63 75 72 72 65 6e 74 20 65 6e 64 20 6f 66  e current end of
11e0: 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 6e 20   the file, then 
11f0: 6f 70 74 69 6f 6e 0a 2a 2a 20 20 20 28 31 29 20  option.**   (1) 
1200: 69 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74  is always select
1210: 65 64 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 61  ed..*/../*.** Ea
1220: 63 68 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ch write operati
1230: 6f 6e 20 69 6e 20 74 68 65 20 77 72 69 74 65 2d  on in the write-
1240: 6c 69 73 74 20 69 73 20 72 65 70 72 65 73 65 6e  list is represen
1250: 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61 6e  ted by an instan
1260: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
1270: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1280: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 42 75 66 20  ..**.** If zBuf 
1290: 69 73 20 30 2c 20 74 68 65 6e 20 74 68 69 73 20  is 0, then this 
12a0: 73 74 72 75 63 74 75 72 65 20 72 65 70 72 65 73  structure repres
12b0: 65 6e 74 73 20 61 20 63 61 6c 6c 20 74 6f 20 78  ents a call to x
12c0: 54 72 75 6e 63 61 74 65 28 29 2c 20 0a 2a 2a 20  Truncate(), .** 
12d0: 6e 6f 74 20 78 57 72 69 74 65 28 29 2e 20 49 6e  not xWrite(). In
12e0: 20 74 68 61 74 20 63 61 73 65 2c 20 69 4f 66 66   that case, iOff
12f0: 73 65 74 20 69 73 20 74 68 65 20 73 69 7a 65 20  set is the size 
1300: 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 69 73  that the file is
1310: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f  .** truncated to
1320: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 72 69 74  ..*/.struct Writ
1330: 65 42 75 66 66 65 72 20 7b 0a 20 20 69 36 34 20  eBuffer {.  i64 
1340: 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  iOffset;        
1350: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1360: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1370: 74 61 72 74 20 6f 66 20 74 68 69 73 20 77 72 69  tart of this wri
1380: 74 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  te() */.  int nB
1390: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
13a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13b0: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
13c0: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 42 75 66 3b  n */.  u8 *zBuf;
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13f0: 6f 20 63 6f 70 79 20 6f 66 20 77 72 69 74 74 65  o copy of writte
1400: 6e 20 64 61 74 61 20 2a 2f 0a 20 20 43 72 61 73  n data */.  Cras
1410: 68 46 69 6c 65 20 2a 70 46 69 6c 65 3b 20 20 20  hFile *pFile;   
1420: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1430: 20 74 68 69 73 20 77 72 69 74 65 28 29 20 61 70   this write() ap
1440: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 0a 20 20 57  plies to */..  W
1450: 72 69 74 65 42 75 66 66 65 72 20 2a 70 4e 65 78  riteBuffer *pNex
1460: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  t;          /* N
1470: 65 78 74 20 69 6e 20 43 72 61 73 68 47 6c 6f 62  ext in CrashGlob
1480: 61 6c 2e 70 57 72 69 74 65 4c 69 73 74 20 2a 2f  al.pWriteList */
1490: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 43 72 61 73  .};..struct Cras
14a0: 68 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  hFile {.  const 
14b0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
14c0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 20 20 2f  ds *pMethod;   /
14d0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
14e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
14f0: 65 20 2a 70 52 65 61 6c 46 69 6c 65 3b 20 20 20  e *pRealFile;   
1500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 64            /* Und
1510: 65 72 6c 79 69 6e 67 20 22 72 65 61 6c 22 20 66  erlying "real" f
1520: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
1530: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
1540: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 65      /* Flags the
1570: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
1580: 20 77 69 74 68 20 2a 2f 0a 0a 20 20 2f 2a 20 43   with */..  /* C
1590: 61 63 68 65 20 6f 66 20 74 68 65 20 65 6e 74 69  ache of the enti
15a0: 72 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  re file. This is
15b0: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
15c0: 70 20 4f 73 52 65 61 64 28 29 20 61 6e 64 20 0a  p OsRead() and .
15d0: 20 20 2a 2a 20 4f 73 46 69 6c 65 53 69 7a 65 28    ** OsFileSize(
15e0: 29 20 63 61 6c 6c 73 2e 20 41 6c 74 68 6f 75 67  ) calls. Althoug
15f0: 68 20 62 6f 74 68 20 63 6f 75 6c 64 20 62 65 20  h both could be 
1600: 64 6f 6e 65 20 62 79 20 74 72 61 76 65 72 73 69  done by traversi
1610: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 77 72 69 74  ng the.  ** writ
1620: 65 2d 6c 69 73 74 2c 20 69 6e 20 70 72 61 63 74  e-list, in pract
1630: 69 63 65 20 74 68 69 73 20 69 73 20 69 6d 70 72  ice this is impr
1640: 61 63 74 69 63 61 6c 6c 79 20 73 6c 6f 77 2e 0a  actically slow..
1650: 20 20 2a 2f 0a 20 20 75 38 20 2a 7a 44 61 74 61    */.  u8 *zData
1660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1680: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1690: 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 2a   file contents *
16a0: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20  /.  int nData;  
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 20 20 2f 2a 20 53 69 7a 65           /* Size
16d0: 20 6f 66 20 62 75 66 66 65 72 20 61 6c 6c 6f 63   of buffer alloc
16e0: 61 74 65 64 20 61 74 20 7a 44 61 74 61 20 2a 2f  ated at zData */
16f0: 0a 20 20 69 36 34 20 69 53 69 7a 65 3b 20 20 20  .  i64 iSize;   
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1720: 6f 66 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  of file in bytes
1730: 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 43   */.};..struct C
1740: 72 61 73 68 47 6c 6f 62 61 6c 20 7b 0a 20 20 57  rashGlobal {.  W
1750: 72 69 74 65 42 75 66 66 65 72 20 2a 70 57 72 69  riteBuffer *pWri
1760: 74 65 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 48  teList;     /* H
1770: 65 61 64 20 6f 66 20 77 72 69 74 65 2d 6c 69 73  ead of write-lis
1780: 74 20 2a 2f 0a 20 20 57 72 69 74 65 42 75 66 66  t */.  WriteBuff
1790: 65 72 20 2a 70 57 72 69 74 65 4c 69 73 74 45 6e  er *pWriteListEn
17a0: 64 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 77 72  d;  /* End of wr
17b0: 69 74 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 69  ite-list */..  i
17c0: 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  nt iSectorSize; 
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
17e0: 61 6c 75 65 20 6f 66 20 73 69 6d 75 6c 61 74 65  alue of simulate
17f0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  d sector size */
1800: 0a 20 20 69 6e 74 20 69 44 65 76 69 63 65 43 68  .  int iDeviceCh
1810: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20 20  aracteristics;  
1820: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 73 69 6d 75  /* Value of simu
1830: 6c 61 74 65 64 20 64 65 76 69 63 65 20 63 68 61  lated device cha
1840: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
1850: 0a 20 20 69 6e 74 20 69 43 72 61 73 68 3b 20 20  .  int iCrash;  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 2f 2a 20 43 72 61 73 68 20 6f 6e 20 74 68 65 20  /* Crash on the 
1880: 69 43 72 61 73 68 27 74 68 20 63 61 6c 6c 20 74  iCrash'th call t
1890: 6f 20 78 53 79 6e 63 28 29 20 2a 2f 0a 20 20 63  o xSync() */.  c
18a0: 68 61 72 20 7a 43 72 61 73 68 46 69 6c 65 5b 35  har zCrashFile[5
18b0: 30 30 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  00];        /* C
18c0: 72 61 73 68 20 64 75 72 69 6e 67 20 61 6e 20 78  rash during an x
18d0: 53 79 6e 63 28 29 20 6f 6e 20 74 68 69 73 20 66  Sync() on this f
18e0: 69 6c 65 20 2a 2f 20 0a 7d 3b 0a 0a 73 74 61 74  ile */ .};..stat
18f0: 69 63 20 43 72 61 73 68 47 6c 6f 62 61 6c 20 67  ic CrashGlobal g
1900: 20 3d 20 7b 30 2c 20 30 2c 20 53 51 4c 49 54 45   = {0, 0, SQLITE
1910: 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1920: 53 49 5a 45 2c 20 30 2c 20 30 7d 3b 0a 0a 2f 2a  SIZE, 0, 0};../*
1930: 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c 6f  .** Set this glo
1940: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f 20  bal variable to 
1950: 31 20 74 6f 20 65 6e 61 62 6c 65 20 63 72 61 73  1 to enable cras
1960: 68 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 73 74  h testing..*/.st
1970: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1980: 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c 65 20  CrashTestEnable 
1990: 3d 20 30 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69  = 0;..static voi
19a0: 64 20 2a 63 72 61 73 68 5f 6d 61 6c 6c 6f 63 28  d *crash_malloc(
19b0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 72 65  int nByte){.  re
19c0: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 54 63 6c  turn (void *)Tcl
19d0: 5f 41 6c 6c 6f 63 28 28 73 69 7a 65 5f 74 29 6e  _Alloc((size_t)n
19e0: 42 79 74 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Byte);.}.static 
19f0: 76 6f 69 64 20 63 72 61 73 68 5f 66 72 65 65 28  void crash_free(
1a00: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 54 63 6c 5f  void *p){.  Tcl_
1a10: 46 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69  Free(p);.}.stati
1a20: 63 20 76 6f 69 64 20 2a 63 72 61 73 68 5f 72 65  c void *crash_re
1a30: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 2c 20 69  alloc(void *p, i
1a40: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
1a50: 28 76 6f 69 64 20 2a 29 54 63 6c 5f 52 65 61 6c  (void *)Tcl_Real
1a60: 6c 6f 63 28 70 2c 20 28 73 69 7a 65 5f 74 29 6e  loc(p, (size_t)n
1a70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 61 70  );.}../*.** Wrap
1a80: 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73  per around the s
1a90: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
1aa0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 76  function that av
1ab0: 6f 69 64 73 20 77 72 69 74 69 6e 67 20 74 6f 20  oids writing to 
1ac0: 74 68 65 0a 2a 2a 20 35 31 32 20 62 79 74 65 20  the.** 512 byte 
1ad0: 62 6c 6f 63 6b 20 62 65 67 69 6e 69 6e 67 20 61  block begining a
1ae0: 74 20 6f 66 66 73 65 74 20 50 45 4e 44 49 4e 47  t offset PENDING
1af0: 5f 42 59 54 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _BYTE..*/.static
1b00: 20 69 6e 74 20 77 72 69 74 65 44 62 46 69 6c 65   int writeDbFile
1b10: 28 43 72 61 73 68 46 69 6c 65 20 2a 70 2c 20 75  (CrashFile *p, u
1b20: 38 20 2a 7a 2c 20 69 36 34 20 69 41 6d 74 2c 20  8 *z, i64 iAmt, 
1b30: 69 36 34 20 69 4f 66 66 29 7b 0a 20 20 69 6e 74  i64 iOff){.  int
1b40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b50: 0a 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30  .  int iSkip = 0
1b60: 3b 0a 20 20 69 66 28 20 28 69 41 6d 74 2d 69 53  ;.  if( (iAmt-iS
1b70: 6b 69 70 29 3e 30 20 29 7b 0a 20 20 20 20 72 63  kip)>0 ){.    rc
1b80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1b90: 65 28 70 2d 3e 70 52 65 61 6c 46 69 6c 65 2c 20  e(p->pRealFile, 
1ba0: 26 7a 5b 69 53 6b 69 70 5d 2c 20 28 69 6e 74 29  &z[iSkip], (int)
1bb0: 28 69 41 6d 74 2d 69 53 6b 69 70 29 2c 20 69 4f  (iAmt-iSkip), iO
1bc0: 66 66 2b 69 53 6b 69 70 29 3b 0a 20 20 7d 0a 20  ff+iSkip);.  }. 
1bd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1be0: 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 77  *.** Flush the w
1bf0: 72 69 74 65 2d 6c 69 73 74 20 61 73 20 69 66 20  rite-list as if 
1c00: 78 53 79 6e 63 28 29 20 68 61 64 20 62 65 65 6e  xSync() had been
1c10: 20 63 61 6c 6c 65 64 20 6f 6e 20 66 69 6c 65 20   called on file 
1c20: 68 61 6e 64 6c 65 0a 2a 2a 20 70 46 69 6c 65 2e  handle.** pFile.
1c30: 20 49 66 20 69 73 43 72 61 73 68 20 69 73 20 74   If isCrash is t
1c40: 72 75 65 2c 20 73 69 6d 75 6c 61 74 65 20 61 20  rue, simulate a 
1c50: 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  crash..*/.static
1c60: 20 69 6e 74 20 77 72 69 74 65 4c 69 73 74 53 79   int writeListSy
1c70: 6e 63 28 43 72 61 73 68 46 69 6c 65 20 2a 70 46  nc(CrashFile *pF
1c80: 69 6c 65 2c 20 69 6e 74 20 69 73 43 72 61 73 68  ile, int isCrash
1c90: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1ca0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
1cb0: 44 63 20 3d 20 67 2e 69 44 65 76 69 63 65 43 68  Dc = g.iDeviceCh
1cc0: 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 0a  aracteristics;..
1cd0: 20 20 57 72 69 74 65 42 75 66 66 65 72 20 2a 70    WriteBuffer *p
1ce0: 57 72 69 74 65 3b 0a 20 20 57 72 69 74 65 42 75  Write;.  WriteBu
1cf0: 66 66 65 72 20 2a 2a 70 70 50 74 72 3b 0a 0a 20  ffer **ppPtr;.. 
1d00: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
1d10: 6f 74 20 61 20 63 72 61 73 68 20 73 69 6d 75 6c  ot a crash simul
1d20: 61 74 69 6f 6e 2c 20 73 65 74 20 70 46 69 6e 61  ation, set pFina
1d30: 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  l to point to th
1d40: 65 20 0a 20 20 2a 2a 20 6c 61 73 74 20 65 6c 65  e .  ** last ele
1d50: 6d 65 6e 74 20 6f 66 20 74 68 65 20 77 72 69 74  ment of the writ
1d60: 65 2d 6c 69 73 74 20 74 68 61 74 20 69 73 20 61  e-list that is a
1d70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 66  ssociated with f
1d80: 69 6c 65 20 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile handle.  ** 
1d90: 70 46 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pFile..  **.  **
1da0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 63 72   If this is a cr
1db0: 61 73 68 20 73 69 6d 75 6c 61 74 69 6f 6e 2c 20  ash simulation, 
1dc0: 73 65 74 20 70 46 69 6e 61 6c 20 74 6f 20 61 6e  set pFinal to an
1dd0: 20 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c   arbitrarily sel
1de0: 65 63 74 65 64 0a 20 20 2a 2a 20 65 6c 65 6d 65  ected.  ** eleme
1df0: 6e 74 20 6f 66 20 74 68 65 20 77 72 69 74 65 2d  nt of the write-
1e00: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 57 72 69  list..  */.  Wri
1e10: 74 65 42 75 66 66 65 72 20 2a 70 46 69 6e 61 6c  teBuffer *pFinal
1e20: 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 69 73 43   = 0;.  if( !isC
1e30: 72 61 73 68 20 29 7b 0a 20 20 20 20 66 6f 72 28  rash ){.    for(
1e40: 70 57 72 69 74 65 3d 67 2e 70 57 72 69 74 65 4c  pWrite=g.pWriteL
1e50: 69 73 74 3b 20 70 57 72 69 74 65 3b 20 70 57 72  ist; pWrite; pWr
1e60: 69 74 65 3d 70 57 72 69 74 65 2d 3e 70 4e 65 78  ite=pWrite->pNex
1e70: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 57  t){.      if( pW
1e80: 72 69 74 65 2d 3e 70 46 69 6c 65 3d 3d 70 46 69  rite->pFile==pFi
1e90: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  le ){.        pF
1ea0: 69 6e 61 6c 20 3d 20 70 57 72 69 74 65 3b 0a 20  inal = pWrite;. 
1eb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ec0: 65 6c 73 65 20 69 66 28 20 69 44 63 26 28 53 51  else if( iDc&(SQ
1ed0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1ee0: 4e 54 49 41 4c 7c 53 51 4c 49 54 45 5f 49 4f 43  NTIAL|SQLITE_IOC
1ef0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
1f00: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 57 72 69 74  ){.    int nWrit
1f10: 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  e = 0;.    int i
1f20: 46 69 6e 61 6c 3b 0a 20 20 20 20 66 6f 72 28 70  Final;.    for(p
1f30: 57 72 69 74 65 3d 67 2e 70 57 72 69 74 65 4c 69  Write=g.pWriteLi
1f40: 73 74 3b 20 70 57 72 69 74 65 3b 20 70 57 72 69  st; pWrite; pWri
1f50: 74 65 3d 70 57 72 69 74 65 2d 3e 70 4e 65 78 74  te=pWrite->pNext
1f60: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
1f70: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1f80: 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c 20  ss(sizeof(int), 
1f90: 26 69 46 69 6e 61 6c 29 3b 0a 20 20 20 20 69 46  &iFinal);.    iF
1fa0: 69 6e 61 6c 20 3d 20 28 28 69 46 69 6e 61 6c 3c  inal = ((iFinal<
1fb0: 30 29 3f 2d 31 2a 69 46 69 6e 61 6c 3a 69 46 69  0)?-1*iFinal:iFi
1fc0: 6e 61 6c 29 25 6e 57 72 69 74 65 3b 0a 20 20 20  nal)%nWrite;.   
1fd0: 20 66 6f 72 28 70 57 72 69 74 65 3d 67 2e 70 57   for(pWrite=g.pW
1fe0: 72 69 74 65 4c 69 73 74 3b 20 69 46 69 6e 61 6c  riteList; iFinal
1ff0: 3e 30 3b 20 70 57 72 69 74 65 3d 70 57 72 69 74  >0; pWrite=pWrit
2000: 65 2d 3e 70 4e 65 78 74 29 20 69 46 69 6e 61 6c  e->pNext) iFinal
2010: 2d 2d 3b 0a 20 20 20 20 70 46 69 6e 61 6c 20 3d  --;.    pFinal =
2020: 20 70 57 72 69 74 65 3b 0a 20 20 7d 0a 0a 23 69   pWrite;.  }..#i
2030: 66 64 65 66 20 54 52 41 43 45 5f 43 52 41 53 48  fdef TRACE_CRASH
2040: 54 45 53 54 0a 20 20 70 72 69 6e 74 66 28 22 53  TEST.  printf("S
2050: 79 6e 63 20 25 73 20 28 69 73 20 25 73 20 63 72  ync %s (is %s cr
2060: 61 73 68 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ash)\n", pFile->
2070: 7a 4e 61 6d 65 2c 20 28 69 73 43 72 61 73 68 3f  zName, (isCrash?
2080: 22 61 22 3a 22 6e 6f 74 20 61 22 29 29 3b 0a 23  "a":"not a"));.#
2090: 65 6e 64 69 66 0a 0a 20 20 70 70 50 74 72 20 3d  endif..  ppPtr =
20a0: 20 26 67 2e 70 57 72 69 74 65 4c 69 73 74 3b 0a   &g.pWriteList;.
20b0: 20 20 66 6f 72 28 70 57 72 69 74 65 3d 2a 70 70    for(pWrite=*pp
20c0: 50 74 72 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Ptr; rc==SQLITE_
20d0: 4f 4b 20 26 26 20 70 57 72 69 74 65 3b 20 70 57  OK && pWrite; pW
20e0: 72 69 74 65 3d 2a 70 70 50 74 72 29 7b 0a 20 20  rite=*ppPtr){.  
20f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2100: 70 52 65 61 6c 46 69 6c 65 20 3d 20 70 57 72 69  pRealFile = pWri
2110: 74 65 2d 3e 70 46 69 6c 65 2d 3e 70 52 65 61 6c  te->pFile->pReal
2120: 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 28 65  File;..    /* (e
2130: 41 63 74 69 6f 6e 3d 3d 31 29 20 20 20 20 20 20  Action==1)      
2140: 2d 3e 20 77 72 69 74 65 20 62 6c 6f 63 6b 20 6f  -> write block o
2150: 75 74 20 6e 6f 72 6d 61 6c 6c 79 2c 0a 20 20 20  ut normally,.   
2160: 20 2a 2a 20 28 65 41 63 74 69 6f 6e 3d 3d 32 29   ** (eAction==2)
2170: 20 20 20 20 20 20 2d 3e 20 64 6f 20 6e 6f 74 68        -> do noth
2180: 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 28 65 41 63  ing,.    ** (eAc
2190: 74 69 6f 6e 3d 3d 33 29 20 20 20 20 20 20 2d 3e  tion==3)      ->
21a0: 20 74 72 61 73 68 20 73 65 63 74 6f 72 73 2e 0a   trash sectors..
21b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65      */.    int e
21c0: 41 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Action = 0;.    
21d0: 69 66 28 20 21 69 73 43 72 61 73 68 20 29 7b 0a  if( !isCrash ){.
21e0: 20 20 20 20 20 20 65 41 63 74 69 6f 6e 20 3d 20        eAction = 
21f0: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57  2;.      if( (pW
2200: 72 69 74 65 2d 3e 70 46 69 6c 65 3d 3d 70 46 69  rite->pFile==pFi
2210: 6c 65 20 7c 7c 20 69 44 63 26 53 51 4c 49 54 45  le || iDc&SQLITE
2220: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
2230: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 41  L) ){.        eA
2240: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ction = 1;.     
2250: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2260: 20 20 20 20 63 68 61 72 20 72 61 6e 64 6f 6d 3b      char random;
2270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2280: 61 6e 64 6f 6d 6e 65 73 73 28 31 2c 20 26 72 61  andomness(1, &ra
2290: 6e 64 6f 6d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ndom);..      /*
22a0: 20 44 6f 20 6e 6f 74 20 73 65 6c 65 63 74 20 6f   Do not select o
22b0: 70 74 69 6f 6e 20 33 20 28 73 65 63 74 6f 72 20  ption 3 (sector 
22c0: 74 72 61 73 68 69 6e 67 29 20 69 66 20 74 68 65  trashing) if the
22d0: 20 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 66 6c   IOCAP_ATOMIC fl
22e0: 61 67 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ag .      ** is 
22f0: 73 65 74 20 6f 72 20 74 68 69 73 20 69 73 20 61  set or this is a
2300: 6e 20 4f 73 54 72 75 6e 63 61 74 65 28 29 2c 20  n OsTruncate(), 
2310: 6e 6f 74 20 61 6e 20 4f 73 77 72 69 74 65 28 29  not an Oswrite()
2320: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2330: 20 69 66 28 20 28 69 44 63 26 53 51 4c 49 54 45   if( (iDc&SQLITE
2340: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 29 20 7c  _IOCAP_ATOMIC) |
2350: 7c 20 28 70 57 72 69 74 65 2d 3e 7a 42 75 66 3d  | (pWrite->zBuf=
2360: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =0) ){.        r
2370: 61 6e 64 6f 6d 20 26 3d 20 30 78 30 31 3b 0a 20  andom &= 0x01;. 
2380: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2390: 20 49 66 20 49 4f 43 41 50 5f 53 45 51 55 45 4e   If IOCAP_SEQUEN
23a0: 54 49 41 4c 20 69 73 20 73 65 74 20 61 6e 64 20  TIAL is set and 
23b0: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
23c0: 66 69 6e 61 6c 20 65 6e 74 72 79 0a 20 20 20 20  final entry.    
23d0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 72 75 6e    ** in the trun
23e0: 63 61 74 65 64 20 77 72 69 74 65 2d 6c 69 73 74  cated write-list
23f0: 2c 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 20  , always select 
2400: 6f 70 74 69 6f 6e 20 31 20 28 77 72 69 74 65 0a  option 1 (write.
2410: 20 20 20 20 20 20 2a 2a 20 6f 75 74 20 63 6f 72        ** out cor
2420: 72 65 63 74 6c 79 29 2e 0a 20 20 20 20 20 20 2a  rectly)..      *
2430: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63  /.      if( (iDc
2440: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
2450: 51 55 45 4e 54 49 41 4c 20 26 26 20 70 57 72 69  QUENTIAL && pWri
2460: 74 65 21 3d 70 46 69 6e 61 6c 29 20 29 7b 0a 20  te!=pFinal) ){. 
2470: 20 20 20 20 20 20 20 72 61 6e 64 6f 6d 20 3d 20         random = 
2480: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
2490: 20 20 2f 2a 20 49 66 20 49 4f 43 41 50 5f 53 41    /* If IOCAP_SA
24a0: 46 45 5f 41 50 50 45 4e 44 20 69 73 20 73 65 74  FE_APPEND is set
24b0: 20 61 6e 64 20 74 68 69 73 20 4f 73 57 72 69 74   and this OsWrit
24c0: 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  e() operation is
24d0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 70 70  .      ** an app
24e0: 65 6e 64 20 28 66 69 72 73 74 20 62 79 74 65 20  end (first byte 
24f0: 6f 66 20 74 68 65 20 77 72 69 74 74 65 6e 20 72  of the written r
2500: 65 67 69 6f 6e 20 69 73 20 31 20 62 79 74 65 20  egion is 1 byte 
2510: 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 2a  past the.      *
2520: 2a 20 63 75 72 72 65 6e 74 20 45 4f 46 29 2c 20  * current EOF), 
2530: 61 6c 77 61 79 73 20 73 65 6c 65 63 74 20 6f 70  always select op
2540: 74 69 6f 6e 20 31 20 28 77 72 69 74 65 20 6f 75  tion 1 (write ou
2550: 74 20 63 6f 72 72 65 63 74 6c 79 29 2e 0a 20 20  t correctly)..  
2560: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2570: 20 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41   iDc&SQLITE_IOCA
2580: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 26 26  P_SAFE_APPEND &&
2590: 20 70 57 72 69 74 65 2d 3e 7a 42 75 66 20 29 7b   pWrite->zBuf ){
25a0: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 53 69  .        i64 iSi
25b0: 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ze;.        sqli
25c0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 52  te3OsFileSize(pR
25d0: 65 61 6c 46 69 6c 65 2c 20 26 69 53 69 7a 65 29  ealFile, &iSize)
25e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53  ;.        if( iS
25f0: 69 7a 65 3d 3d 70 57 72 69 74 65 2d 3e 69 4f 66  ize==pWrite->iOf
2600: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
2610: 20 20 72 61 6e 64 6f 6d 20 3d 20 30 3b 0a 20 20    random = 0;.  
2620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2630: 0a 20 20 20 20 20 20 69 66 28 20 28 72 61 6e 64  .      if( (rand
2640: 6f 6d 26 30 78 30 36 29 3d 3d 30 78 30 36 20 29  om&0x06)==0x06 )
2650: 7b 0a 20 20 20 20 20 20 20 20 65 41 63 74 69 6f  {.        eActio
2660: 6e 20 3d 20 33 3b 0a 20 20 20 20 20 20 7d 65 6c  n = 3;.      }el
2670: 73 65 7b 0a 20 20 20 20 20 20 20 20 65 41 63 74  se{.        eAct
2680: 69 6f 6e 20 3d 20 28 28 72 61 6e 64 6f 6d 26 30  ion = ((random&0
2690: 78 30 31 29 3f 32 3a 31 29 3b 0a 20 20 20 20 20  x01)?2:1);.     
26a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77   }.    }..    sw
26b0: 69 74 63 68 28 20 65 41 63 74 69 6f 6e 20 29 7b  itch( eAction ){
26c0: 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 7b  .      case 1: {
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e0: 2a 20 57 72 69 74 65 20 6f 75 74 20 63 6f 72 72  * Write out corr
26f0: 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20  ectly */.       
2700: 20 69 66 28 20 70 57 72 69 74 65 2d 3e 7a 42 75   if( pWrite->zBu
2710: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  f ){.          r
2720: 63 20 3d 20 77 72 69 74 65 44 62 46 69 6c 65 28  c = writeDbFile(
2730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2740: 57 72 69 74 65 2d 3e 70 46 69 6c 65 2c 20 70 57  Write->pFile, pW
2750: 72 69 74 65 2d 3e 7a 42 75 66 2c 20 70 57 72 69  rite->zBuf, pWri
2760: 74 65 2d 3e 6e 42 75 66 2c 20 70 57 72 69 74 65  te->nBuf, pWrite
2770: 2d 3e 69 4f 66 66 73 65 74 0a 20 20 20 20 20 20  ->iOffset.      
2780: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
2790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
27b0: 75 6e 63 61 74 65 28 70 52 65 61 6c 46 69 6c 65  uncate(pRealFile
27c0: 2c 20 70 57 72 69 74 65 2d 3e 69 4f 66 66 73 65  , pWrite->iOffse
27d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
27e0: 20 20 20 20 20 20 2a 70 70 50 74 72 20 3d 20 70        *ppPtr = p
27f0: 57 72 69 74 65 2d 3e 70 4e 65 78 74 3b 0a 23 69  Write->pNext;.#i
2800: 66 64 65 66 20 54 52 41 43 45 5f 43 52 41 53 48  fdef TRACE_CRASH
2810: 54 45 53 54 0a 20 20 20 20 20 20 20 20 69 66 28  TEST.        if(
2820: 20 69 73 43 72 61 73 68 20 29 7b 0a 20 20 20 20   isCrash ){.    
2830: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 57 72        printf("Wr
2840: 69 74 69 6e 67 20 25 64 20 62 79 74 65 73 20 40  iting %d bytes @
2850: 20 25 64 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20   %d (%s)\n", .  
2860: 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
2870: 2d 3e 6e 42 75 66 2c 20 28 69 6e 74 29 70 57 72  ->nBuf, (int)pWr
2880: 69 74 65 2d 3e 69 4f 66 66 73 65 74 2c 20 70 57  ite->iOffset, pW
2890: 72 69 74 65 2d 3e 70 46 69 6c 65 2d 3e 7a 4e 61  rite->pFile->zNa
28a0: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  me.          );.
28b0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
28c0: 0a 20 20 20 20 20 20 20 20 63 72 61 73 68 5f 66  .        crash_f
28d0: 72 65 65 28 70 57 72 69 74 65 29 3b 0a 20 20 20  ree(pWrite);.   
28e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28f0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 32    }.      case 2
2900: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
2910: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
2920: 2a 2f 0a 20 20 20 20 20 20 20 20 70 70 50 74 72  */.        ppPtr
2930: 20 3d 20 26 70 57 72 69 74 65 2d 3e 70 4e 65 78   = &pWrite->pNex
2940: 74 3b 0a 23 69 66 64 65 66 20 54 52 41 43 45 5f  t;.#ifdef TRACE_
2950: 43 52 41 53 48 54 45 53 54 0a 20 20 20 20 20 20  CRASHTEST.      
2960: 20 20 69 66 28 20 69 73 43 72 61 73 68 20 29 7b    if( isCrash ){
2970: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
2980: 66 28 22 4f 6d 69 74 69 6e 67 20 25 64 20 62 79  f("Omiting %d by
2990: 74 65 73 20 40 20 25 64 20 28 25 73 29 5c 6e 22  tes @ %d (%s)\n"
29a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
29b0: 57 72 69 74 65 2d 3e 6e 42 75 66 2c 20 28 69 6e  Write->nBuf, (in
29c0: 74 29 70 57 72 69 74 65 2d 3e 69 4f 66 66 73 65  t)pWrite->iOffse
29d0: 74 2c 20 70 57 72 69 74 65 2d 3e 70 46 69 6c 65  t, pWrite->pFile
29e0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
29f0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23    );.        }.#
2a00: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 62 72  endif.        br
2a10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a20: 20 20 20 63 61 73 65 20 33 3a 20 7b 20 20 20 20     case 3: {    
2a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a40: 61 73 68 20 73 65 63 74 6f 72 73 20 2a 2f 0a 20  ash sectors */. 
2a50: 20 20 20 20 20 20 20 75 38 20 2a 7a 47 61 72 62         u8 *zGarb
2a60: 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
2a70: 20 69 46 69 72 73 74 20 3d 20 28 69 6e 74 29 28   iFirst = (int)(
2a80: 70 57 72 69 74 65 2d 3e 69 4f 66 66 73 65 74 2f  pWrite->iOffset/
2a90: 67 2e 69 53 65 63 74 6f 72 53 69 7a 65 29 3b 0a  g.iSectorSize);.
2aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 61 73          int iLas
2ab0: 74 20 3d 20 28 69 6e 74 29 28 28 70 57 72 69 74  t = (int)((pWrit
2ac0: 65 2d 3e 69 4f 66 66 73 65 74 2b 70 57 72 69 74  e->iOffset+pWrit
2ad0: 65 2d 3e 6e 42 75 66 2d 31 29 2f 67 2e 69 53 65  e->nBuf-1)/g.iSe
2ae0: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 20 20  ctorSize);..    
2af0: 20 20 20 20 61 73 73 65 72 74 28 70 57 72 69 74      assert(pWrit
2b00: 65 2d 3e 7a 42 75 66 29 3b 0a 0a 23 69 66 64 65  e->zBuf);..#ifde
2b10: 66 20 54 52 41 43 45 5f 43 52 41 53 48 54 45 53  f TRACE_CRASHTES
2b20: 54 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  T.        printf
2b30: 28 22 54 72 61 73 68 69 6e 67 20 25 64 20 73 65  ("Trashing %d se
2b40: 63 74 6f 72 73 20 40 20 25 6c 6c 64 20 28 73 65  ctors @ %lld (se
2b50: 63 74 6f 72 20 25 64 29 20 28 25 73 29 5c 6e 22  ctor %d) (%s)\n"
2b60: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 31  , .            1
2b70: 2b 69 4c 61 73 74 2d 69 46 69 72 73 74 2c 20 70  +iLast-iFirst, p
2b80: 57 72 69 74 65 2d 3e 69 4f 66 66 73 65 74 2c 20  Write->iOffset, 
2b90: 69 46 69 72 73 74 2c 20 70 57 72 69 74 65 2d 3e  iFirst, pWrite->
2ba0: 70 46 69 6c 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20  pFile->zName.   
2bb0: 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a       );.#endif..
2bc0: 20 20 20 20 20 20 20 20 7a 47 61 72 62 61 67 65          zGarbage
2bd0: 20 3d 20 63 72 61 73 68 5f 6d 61 6c 6c 6f 63 28   = crash_malloc(
2be0: 67 2e 69 53 65 63 74 6f 72 53 69 7a 65 29 3b 0a  g.iSectorSize);.
2bf0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 47 61 72          if( zGar
2c00: 62 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bage ){.        
2c10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2c20: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  i;.          for
2c30: 28 69 3d 69 46 69 72 73 74 3b 20 72 63 3d 3d 53  (i=iFirst; rc==S
2c40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69  QLITE_OK && i<=i
2c50: 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Last; i++){.    
2c60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c70: 72 61 6e 64 6f 6d 6e 65 73 73 28 67 2e 69 53 65  randomness(g.iSe
2c80: 63 74 6f 72 53 69 7a 65 2c 20 7a 47 61 72 62 61  ctorSize, zGarba
2c90: 67 65 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20  ge); .          
2ca0: 20 20 72 63 20 3d 20 77 72 69 74 65 44 62 46 69    rc = writeDbFi
2cb0: 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  le(.            
2cc0: 20 20 70 57 72 69 74 65 2d 3e 70 46 69 6c 65 2c    pWrite->pFile,
2cd0: 20 7a 47 61 72 62 61 67 65 2c 20 67 2e 69 53 65   zGarbage, g.iSe
2ce0: 63 74 6f 72 53 69 7a 65 2c 20 69 2a 67 2e 69 53  ctorSize, i*g.iS
2cf0: 65 63 74 6f 72 53 69 7a 65 0a 20 20 20 20 20 20  ectorSize.      
2d00: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2d10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2d20: 72 61 73 68 5f 66 72 65 65 28 7a 47 61 72 62 61  rash_free(zGarba
2d30: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ge);.        }el
2d40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2d50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2d60: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2d70: 20 20 20 20 70 70 50 74 72 20 3d 20 26 70 57 72      ppPtr = &pWr
2d80: 69 74 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ite->pNext;.    
2d90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2da0: 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
2db0: 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
2dc0: 74 28 21 22 43 61 6e 6e 6f 74 20 68 61 70 70 65  t(!"Cannot happe
2dd0: 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n");.    }..    
2de0: 69 66 28 20 70 57 72 69 74 65 3d 3d 70 46 69 6e  if( pWrite==pFin
2df0: 61 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  al ) break;.  }.
2e00: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e10: 45 5f 4f 4b 20 26 26 20 69 73 43 72 61 73 68 20  E_OK && isCrash 
2e20: 29 7b 0a 20 20 20 20 65 78 69 74 28 2d 31 29 3b  ){.    exit(-1);
2e30: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 72 69  .  }..  for(pWri
2e40: 74 65 3d 67 2e 70 57 72 69 74 65 4c 69 73 74 3b  te=g.pWriteList;
2e50: 20 70 57 72 69 74 65 20 26 26 20 70 57 72 69 74   pWrite && pWrit
2e60: 65 2d 3e 70 4e 65 78 74 3b 20 70 57 72 69 74 65  e->pNext; pWrite
2e70: 3d 70 57 72 69 74 65 2d 3e 70 4e 65 78 74 29 3b  =pWrite->pNext);
2e80: 0a 20 20 67 2e 70 57 72 69 74 65 4c 69 73 74 45  .  g.pWriteListE
2e90: 6e 64 20 3d 20 70 57 72 69 74 65 3b 0a 0a 20 20  nd = pWrite;..  
2ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2eb0: 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79  .** Add an entry
2ec0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
2ed0: 68 65 20 77 72 69 74 65 2d 6c 69 73 74 2e 0a 2a  he write-list..*
2ee0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
2ef0: 74 65 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  teListAppend(.  
2f00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2f10: 69 6c 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  ile,.  sqlite3_i
2f20: 6e 74 36 34 20 69 4f 66 66 73 65 74 2c 0a 20 20  nt64 iOffset,.  
2f30: 63 6f 6e 73 74 20 75 38 20 2a 7a 42 75 66 2c 0a  const u8 *zBuf,.
2f40: 20 20 69 6e 74 20 6e 42 75 66 0a 29 7b 0a 20 20    int nBuf.){.  
2f50: 57 72 69 74 65 42 75 66 66 65 72 20 2a 70 4e 65  WriteBuffer *pNe
2f60: 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 28 7a 42  w;..  assert((zB
2f70: 75 66 20 26 26 20 6e 42 75 66 29 20 7c 7c 20 28  uf && nBuf) || (
2f80: 21 6e 42 75 66 20 26 26 20 21 7a 42 75 66 29 29  !nBuf && !zBuf))
2f90: 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 28 57 72 69  ;..  pNew = (Wri
2fa0: 74 65 42 75 66 66 65 72 20 2a 29 63 72 61 73 68  teBuffer *)crash
2fb0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 57  _malloc(sizeof(W
2fc0: 72 69 74 65 42 75 66 66 65 72 29 20 2b 20 6e 42  riteBuffer) + nB
2fd0: 75 66 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  uf);.  if( pNew=
2fe0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
2ff0: 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20 6f  f(stderr, "out o
3000: 66 20 6d 65 6d 6f 72 79 20 69 6e 20 74 68 65 20  f memory in the 
3010: 63 72 61 73 68 20 73 69 6d 75 6c 61 74 6f 72 5c  crash simulator\
3020: 6e 22 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  n");.  }.  memse
3030: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
3040: 66 28 57 72 69 74 65 42 75 66 66 65 72 29 2b 6e  f(WriteBuffer)+n
3050: 42 75 66 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f  Buf);.  pNew->iO
3060: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 3b  ffset = iOffset;
3070: 0a 20 20 70 4e 65 77 2d 3e 6e 42 75 66 20 3d 20  .  pNew->nBuf = 
3080: 6e 42 75 66 3b 0a 20 20 70 4e 65 77 2d 3e 70 46  nBuf;.  pNew->pF
3090: 69 6c 65 20 3d 20 28 43 72 61 73 68 46 69 6c 65  ile = (CrashFile
30a0: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20   *)pFile;.  if( 
30b0: 7a 42 75 66 20 29 7b 0a 20 20 20 20 70 4e 65 77  zBuf ){.    pNew
30c0: 2d 3e 7a 42 75 66 20 3d 20 28 75 38 20 2a 29 26  ->zBuf = (u8 *)&
30d0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pNew[1];.    mem
30e0: 63 70 79 28 70 4e 65 77 2d 3e 7a 42 75 66 2c 20  cpy(pNew->zBuf, 
30f0: 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d  zBuf, nBuf);.  }
3100: 0a 0a 20 20 69 66 28 20 67 2e 70 57 72 69 74 65  ..  if( g.pWrite
3110: 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65  List ){.    asse
3120: 72 74 28 67 2e 70 57 72 69 74 65 4c 69 73 74 45  rt(g.pWriteListE
3130: 6e 64 29 3b 0a 20 20 20 20 67 2e 70 57 72 69 74  nd);.    g.pWrit
3140: 65 4c 69 73 74 45 6e 64 2d 3e 70 4e 65 78 74 20  eListEnd->pNext 
3150: 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65 7b  = pNew;.  }else{
3160: 0a 20 20 20 20 67 2e 70 57 72 69 74 65 4c 69 73  .    g.pWriteLis
3170: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
3180: 67 2e 70 57 72 69 74 65 4c 69 73 74 45 6e 64 20  g.pWriteListEnd 
3190: 3d 20 70 4e 65 77 3b 0a 20 20 0a 20 20 72 65 74  = pNew;.  .  ret
31a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
31c0: 63 72 61 73 68 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  crash-file..*/.s
31d0: 74 61 74 69 63 20 69 6e 74 20 63 66 43 6c 6f 73  tatic int cfClos
31e0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
31f0: 70 46 69 6c 65 29 7b 0a 20 20 43 72 61 73 68 46  pFile){.  CrashF
3200: 69 6c 65 20 2a 70 43 72 61 73 68 20 3d 20 28 43  ile *pCrash = (C
3210: 72 61 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65  rashFile *)pFile
3220: 3b 0a 20 20 77 72 69 74 65 4c 69 73 74 53 79 6e  ;.  writeListSyn
3230: 63 28 70 43 72 61 73 68 2c 20 30 29 3b 0a 20 20  c(pCrash, 0);.  
3240: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
3250: 43 72 61 73 68 2d 3e 70 52 65 61 6c 46 69 6c 65  Crash->pRealFile
3260: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
3270: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3280: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
3290: 20 63 72 61 73 68 2d 66 69 6c 65 2e 0a 2a 2f 0a   crash-file..*/.
32a0: 73 74 61 74 69 63 20 69 6e 74 20 63 66 52 65 61  static int cfRea
32b0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
32c0: 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69  e *pFile, .  voi
32d0: 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *zBuf, .  int 
32e0: 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f  iAmt, .  sqlite_
32f0: 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20  int64 iOfst.){. 
3300: 20 43 72 61 73 68 46 69 6c 65 20 2a 70 43 72 61   CrashFile *pCra
3310: 73 68 20 3d 20 28 43 72 61 73 68 46 69 6c 65 20  sh = (CrashFile 
3320: 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e  *)pFile;.  int n
3330: 43 6f 70 79 20 3d 20 28 69 6e 74 29 4d 49 4e 28  Copy = (int)MIN(
3340: 28 69 36 34 29 69 41 6d 74 2c 20 28 70 43 72 61  (i64)iAmt, (pCra
3350: 73 68 2d 3e 69 53 69 7a 65 20 2d 20 69 4f 66 73  sh->iSize - iOfs
3360: 74 29 29 3b 0a 0a 20 20 69 66 28 20 6e 43 6f 70  t));..  if( nCop
3370: 79 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  y>0 ){.    memcp
3380: 79 28 7a 42 75 66 2c 20 26 70 43 72 61 73 68 2d  y(zBuf, &pCrash-
3390: 3e 7a 44 61 74 61 5b 69 4f 66 73 74 5d 2c 20 6e  >zData[iOfst], n
33a0: 43 6f 70 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Copy);.  }..  /*
33b0: 20 43 68 65 63 6b 20 74 68 65 20 66 69 6c 65 2d   Check the file-
33c0: 73 69 7a 65 20 74 6f 20 73 65 65 20 69 66 20 74  size to see if t
33d0: 68 69 73 20 69 73 20 61 20 73 68 6f 72 74 2d 72  his is a short-r
33e0: 65 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ead */.  if( nCo
33f0: 70 79 3c 69 41 6d 74 20 29 7b 0a 20 20 20 20 72  py<iAmt ){.    r
3400: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
3410: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
3420: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3430: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3440: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
3450: 20 63 72 61 73 68 2d 66 69 6c 65 2e 0a 2a 2f 0a   crash-file..*/.
3460: 73 74 61 74 69 63 20 69 6e 74 20 63 66 57 72 69  static int cfWri
3470: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
3480: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f  le *pFile, .  co
3490: 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20  nst void *zBuf, 
34a0: 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20  .  int iAmt, .  
34b0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
34c0: 73 74 0a 29 7b 0a 20 20 43 72 61 73 68 46 69 6c  st.){.  CrashFil
34d0: 65 20 2a 70 43 72 61 73 68 20 3d 20 28 43 72 61  e *pCrash = (Cra
34e0: 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  shFile *)pFile;.
34f0: 20 20 69 66 28 20 69 41 6d 74 2b 69 4f 66 73 74    if( iAmt+iOfst
3500: 3e 70 43 72 61 73 68 2d 3e 69 53 69 7a 65 20 29  >pCrash->iSize )
3510: 7b 0a 20 20 20 20 70 43 72 61 73 68 2d 3e 69 53  {.    pCrash->iS
3520: 69 7a 65 20 3d 20 28 69 6e 74 29 28 69 41 6d 74  ize = (int)(iAmt
3530: 2b 69 4f 66 73 74 29 3b 0a 20 20 7d 0a 20 20 77  +iOfst);.  }.  w
3540: 68 69 6c 65 28 20 70 43 72 61 73 68 2d 3e 69 53  hile( pCrash->iS
3550: 69 7a 65 3e 70 43 72 61 73 68 2d 3e 6e 44 61 74  ize>pCrash->nDat
3560: 61 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 4e 65  a ){.    u8 *zNe
3570: 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  w;.    int nNew 
3580: 3d 20 28 70 43 72 61 73 68 2d 3e 6e 44 61 74 61  = (pCrash->nData
3590: 2a 32 29 20 2b 20 34 30 39 36 3b 0a 20 20 20 20  *2) + 4096;.    
35a0: 7a 4e 65 77 20 3d 20 63 72 61 73 68 5f 72 65 61  zNew = crash_rea
35b0: 6c 6c 6f 63 28 70 43 72 61 73 68 2d 3e 7a 44 61  lloc(pCrash->zDa
35c0: 74 61 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69  ta, nNew);.    i
35d0: 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20  f( !zNew ){.    
35e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
3600: 20 6d 65 6d 73 65 74 28 26 7a 4e 65 77 5b 70 43   memset(&zNew[pC
3610: 72 61 73 68 2d 3e 6e 44 61 74 61 5d 2c 20 30 2c  rash->nData], 0,
3620: 20 6e 4e 65 77 2d 70 43 72 61 73 68 2d 3e 6e 44   nNew-pCrash->nD
3630: 61 74 61 29 3b 0a 20 20 20 20 70 43 72 61 73 68  ata);.    pCrash
3640: 2d 3e 6e 44 61 74 61 20 3d 20 6e 4e 65 77 3b 0a  ->nData = nNew;.
3650: 20 20 20 20 70 43 72 61 73 68 2d 3e 7a 44 61 74      pCrash->zDat
3660: 61 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20  a = zNew;.  }.  
3670: 6d 65 6d 63 70 79 28 26 70 43 72 61 73 68 2d 3e  memcpy(&pCrash->
3680: 7a 44 61 74 61 5b 69 4f 66 73 74 5d 2c 20 7a 42  zData[iOfst], zB
3690: 75 66 2c 20 69 41 6d 74 29 3b 0a 20 20 72 65 74  uf, iAmt);.  ret
36a0: 75 72 6e 20 77 72 69 74 65 4c 69 73 74 41 70 70  urn writeListApp
36b0: 65 6e 64 28 70 46 69 6c 65 2c 20 69 4f 66 73 74  end(pFile, iOfst
36c0: 2c 20 7a 42 75 66 2c 20 69 41 6d 74 29 3b 0a 7d  , zBuf, iAmt);.}
36d0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
36e0: 20 61 20 63 72 61 73 68 2d 66 69 6c 65 2e 0a 2a   a crash-file..*
36f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66 54  /.static int cfT
3700: 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
3710: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
3720: 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b  ite_int64 size){
3730: 0a 20 20 43 72 61 73 68 46 69 6c 65 20 2a 70 43  .  CrashFile *pC
3740: 72 61 73 68 20 3d 20 28 43 72 61 73 68 46 69 6c  rash = (CrashFil
3750: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 61 73 73  e *)pFile;.  ass
3760: 65 72 74 28 73 69 7a 65 3e 3d 30 29 3b 0a 20 20  ert(size>=0);.  
3770: 69 66 28 20 70 43 72 61 73 68 2d 3e 69 53 69 7a  if( pCrash->iSiz
3780: 65 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 70 43  e>size ){.    pC
3790: 72 61 73 68 2d 3e 69 53 69 7a 65 20 3d 20 28 69  rash->iSize = (i
37a0: 6e 74 29 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  nt)size;.  }.  r
37b0: 65 74 75 72 6e 20 77 72 69 74 65 4c 69 73 74 41  eturn writeListA
37c0: 70 70 65 6e 64 28 70 46 69 6c 65 2c 20 73 69 7a  ppend(pFile, siz
37d0: 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  e, 0, 0);.}../*.
37e0: 2a 2a 20 53 79 6e 63 20 61 20 63 72 61 73 68 2d  ** Sync a crash-
37f0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
3800: 69 6e 74 20 63 66 53 79 6e 63 28 73 71 6c 69 74  int cfSync(sqlit
3810: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
3820: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 43 72  int flags){.  Cr
3830: 61 73 68 46 69 6c 65 20 2a 70 43 72 61 73 68 20  ashFile *pCrash 
3840: 3d 20 28 43 72 61 73 68 46 69 6c 65 20 2a 29 70  = (CrashFile *)p
3850: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 69 73 43 72  File;.  int isCr
3860: 61 73 68 20 3d 20 30 3b 0a 0a 20 20 63 6f 6e 73  ash = 0;..  cons
3870: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
3880: 70 43 72 61 73 68 2d 3e 7a 4e 61 6d 65 3b 0a 20  pCrash->zName;. 
3890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72   const char *zCr
38a0: 61 73 68 46 69 6c 65 20 3d 20 67 2e 7a 43 72 61  ashFile = g.zCra
38b0: 73 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 6e 4e  shFile;.  int nN
38c0: 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
38d0: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20  n(zName);.  int 
38e0: 6e 43 72 61 73 68 46 69 6c 65 20 3d 20 28 69 6e  nCrashFile = (in
38f0: 74 29 73 74 72 6c 65 6e 28 7a 43 72 61 73 68 46  t)strlen(zCrashF
3900: 69 6c 65 29 3b 0a 0a 20 20 69 66 28 20 6e 43 72  ile);..  if( nCr
3910: 61 73 68 46 69 6c 65 3e 30 20 26 26 20 7a 43 72  ashFile>0 && zCr
3920: 61 73 68 46 69 6c 65 5b 6e 43 72 61 73 68 46 69  ashFile[nCrashFi
3930: 6c 65 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  le-1]=='*' ){.  
3940: 20 20 6e 43 72 61 73 68 46 69 6c 65 2d 2d 3b 0a    nCrashFile--;.
3950: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 6e 43      if( nName>nC
3960: 72 61 73 68 46 69 6c 65 20 29 20 6e 4e 61 6d 65  rashFile ) nName
3970: 20 3d 20 6e 43 72 61 73 68 46 69 6c 65 3b 0a 20   = nCrashFile;. 
3980: 20 7d 0a 0a 23 69 66 64 65 66 20 54 52 41 43 45   }..#ifdef TRACE
3990: 5f 43 52 41 53 48 54 45 53 54 0a 20 20 70 72 69  _CRASHTEST.  pri
39a0: 6e 74 66 28 22 63 66 53 79 6e 63 28 29 3a 20 6e  ntf("cfSync(): n
39b0: 4e 61 6d 65 20 3d 20 25 64 2c 20 6e 43 72 61 73  Name = %d, nCras
39c0: 68 46 69 6c 65 20 3d 20 25 64 2c 20 7a 4e 61 6d  hFile = %d, zNam
39d0: 65 20 3d 20 25 73 2c 20 7a 43 72 61 73 68 46 69  e = %s, zCrashFi
39e0: 6c 65 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20  le = %s\n",.    
39f0: 20 20 20 20 20 6e 4e 61 6d 65 2c 20 6e 43 72 61       nName, nCra
3a00: 73 68 46 69 6c 65 2c 20 7a 4e 61 6d 65 2c 20 7a  shFile, zName, z
3a10: 43 72 61 73 68 46 69 6c 65 29 3b 0a 23 65 6e 64  CrashFile);.#end
3a20: 69 66 0a 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3d  if..  if( nName=
3a30: 3d 6e 43 72 61 73 68 46 69 6c 65 20 26 26 20 30  =nCrashFile && 0
3a40: 3d 3d 6d 65 6d 63 6d 70 28 7a 4e 61 6d 65 2c 20  ==memcmp(zName, 
3a50: 7a 43 72 61 73 68 46 69 6c 65 2c 20 6e 4e 61 6d  zCrashFile, nNam
3a60: 65 29 20 29 7b 0a 23 69 66 64 65 66 20 54 52 41  e) ){.#ifdef TRA
3a70: 43 45 5f 43 52 41 53 48 54 45 53 54 0a 20 20 20  CE_CRASHTEST.   
3a80: 20 70 72 69 6e 74 66 28 22 63 66 53 79 6e 63 28   printf("cfSync(
3a90: 29 3a 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2c  ): name matched,
3aa0: 20 67 2e 69 43 72 61 73 68 20 3d 20 25 64 5c 6e   g.iCrash = %d\n
3ab0: 22 2c 20 67 2e 69 43 72 61 73 68 29 3b 0a 23 65  ", g.iCrash);.#e
3ac0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 2d 2d  ndif.    if( (--
3ad0: 67 2e 69 43 72 61 73 68 29 3d 3d 30 20 29 20 69  g.iCrash)==0 ) i
3ae0: 73 43 72 61 73 68 20 3d 20 31 3b 0a 20 20 7d 0a  sCrash = 1;.  }.
3af0: 0a 20 20 72 65 74 75 72 6e 20 77 72 69 74 65 4c  .  return writeL
3b00: 69 73 74 53 79 6e 63 28 70 43 72 61 73 68 2c 20  istSync(pCrash, 
3b10: 69 73 43 72 61 73 68 29 3b 0a 7d 0a 0a 2f 2a 0a  isCrash);.}../*.
3b20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
3b30: 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20  rrent file-size 
3b40: 6f 66 20 74 68 65 20 63 72 61 73 68 2d 66 69 6c  of the crash-fil
3b50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3b60: 20 63 66 46 69 6c 65 53 69 7a 65 28 73 71 6c 69   cfFileSize(sqli
3b70: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
3b80: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
3b90: 53 69 7a 65 29 7b 0a 20 20 43 72 61 73 68 46 69  Size){.  CrashFi
3ba0: 6c 65 20 2a 70 43 72 61 73 68 20 3d 20 28 43 72  le *pCrash = (Cr
3bb0: 61 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  ashFile *)pFile;
3bc0: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 69 36 34  .  *pSize = (i64
3bd0: 29 70 43 72 61 73 68 2d 3e 69 53 69 7a 65 3b 0a  )pCrash->iSize;.
3be0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3bf0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  OK;.}../*.** Cal
3c00: 6c 73 20 72 65 6c 61 74 65 64 20 74 6f 20 66 69  ls related to fi
3c10: 6c 65 2d 6c 6f 63 6b 73 20 61 72 65 20 70 61 73  le-locks are pas
3c20: 73 65 64 20 6f 6e 20 74 6f 20 74 68 65 20 72 65  sed on to the re
3c30: 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  al file handle..
3c40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66  */.static int cf
3c50: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
3c60: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c  e *pFile, int eL
3c70: 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ock){.  return s
3c80: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 28 28 43  qlite3OsLock(((C
3c90: 72 61 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65  rashFile *)pFile
3ca0: 29 2d 3e 70 52 65 61 6c 46 69 6c 65 2c 20 65 4c  )->pRealFile, eL
3cb0: 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  ock);.}.static i
3cc0: 6e 74 20 63 66 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt cfUnlock(sqli
3cd0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
3ce0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 72   int eLock){.  r
3cf0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
3d00: 6e 6c 6f 63 6b 28 28 28 43 72 61 73 68 46 69 6c  nlock(((CrashFil
3d10: 65 20 2a 29 70 46 69 6c 65 29 2d 3e 70 52 65 61  e *)pFile)->pRea
3d20: 6c 46 69 6c 65 2c 20 65 4c 6f 63 6b 29 3b 0a 7d  lFile, eLock);.}
3d30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66 43 68  .static int cfCh
3d40: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
3d50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
3d60: 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  ile, int *pResOu
3d70: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t){.  return sql
3d80: 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
3d90: 76 65 64 4c 6f 63 6b 28 28 28 43 72 61 73 68 46  vedLock(((CrashF
3da0: 69 6c 65 20 2a 29 70 46 69 6c 65 29 2d 3e 70 52  ile *)pFile)->pR
3db0: 65 61 6c 46 69 6c 65 2c 20 70 52 65 73 4f 75 74  ealFile, pResOut
3dc0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
3dd0: 63 66 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  cfFileControl(sq
3de0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
3df0: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
3e00: 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 6f 70  *pArg){.  if( op
3e10: 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  ==SQLITE_FCNTL_S
3e20: 49 5a 45 5f 48 49 4e 54 20 29 7b 0a 20 20 20 20  IZE_HINT ){.    
3e30: 43 72 61 73 68 46 69 6c 65 20 2a 70 43 72 61 73  CrashFile *pCras
3e40: 68 20 3d 20 28 43 72 61 73 68 46 69 6c 65 20 2a  h = (CrashFile *
3e50: 29 70 46 69 6c 65 3b 0a 20 20 20 20 69 36 34 20  )pFile;.    i64 
3e60: 6e 42 79 74 65 20 3d 20 2a 28 69 36 34 20 2a 29  nByte = *(i64 *)
3e70: 70 41 72 67 3b 0a 20 20 20 20 69 66 28 20 6e 42  pArg;.    if( nB
3e80: 79 74 65 3e 70 43 72 61 73 68 2d 3e 69 53 69 7a  yte>pCrash->iSiz
3e90: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53  e ){.      if( S
3ea0: 51 4c 49 54 45 5f 4f 4b 3d 3d 77 72 69 74 65 4c  QLITE_OK==writeL
3eb0: 69 73 74 41 70 70 65 6e 64 28 70 46 69 6c 65 2c  istAppend(pFile,
3ec0: 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 20 29 7b   nByte, 0, 0) ){
3ed0: 0a 20 20 20 20 20 20 20 20 70 43 72 61 73 68 2d  .        pCrash-
3ee0: 3e 69 53 69 7a 65 20 3d 20 28 69 6e 74 29 6e 42  >iSize = (int)nB
3ef0: 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  yte;.      }.   
3f00: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
3f10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
3f20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 46  eturn sqlite3OsF
3f30: 69 6c 65 43 6f 6e 74 72 6f 6c 28 28 28 43 72 61  ileControl(((Cra
3f40: 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 29 2d  shFile *)pFile)-
3f50: 3e 70 52 65 61 6c 46 69 6c 65 2c 20 6f 70 2c 20  >pRealFile, op, 
3f60: 70 41 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pArg);.}../*.** 
3f70: 54 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  The xSectorSize(
3f80: 29 20 61 6e 64 20 78 44 65 76 69 63 65 43 68 61  ) and xDeviceCha
3f90: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 66  racteristics() f
3fa0: 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 0a  unctions return.
3fb0: 2a 2a 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61  ** the global va
3fc0: 6c 75 65 73 20 63 6f 6e 66 69 67 75 72 65 64 20  lues configured 
3fd0: 62 79 20 74 68 65 20 5b 73 71 6c 69 74 65 5f 63  by the [sqlite_c
3fe0: 72 61 73 68 70 61 72 61 6d 73 5d 20 74 63 6c 0a  rashparams] tcl.
3ff0: 2a 20 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  *  interface..*/
4000: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 66 53 65  .static int cfSe
4010: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
4020: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
4030: 20 72 65 74 75 72 6e 20 67 2e 69 53 65 63 74 6f   return g.iSecto
4040: 72 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20  rSize;.}.static 
4050: 69 6e 74 20 63 66 44 65 76 69 63 65 43 68 61 72  int cfDeviceChar
4060: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
4070: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
4080: 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 69 44 65  {.  return g.iDe
4090: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
40a0: 69 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ics;.}../*.** Pa
40b0: 73 73 2d 74 68 72 6f 75 67 68 73 20 66 6f 72 20  ss-throughs for 
40c0: 57 41 4c 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a  WAL support..*/.
40d0: 73 74 61 74 69 63 20 69 6e 74 20 63 66 53 68 6d  static int cfShm
40e0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
40f0: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 66  e *pFile, int of
4100: 73 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66  st, int n, int f
4110: 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20  lags){.  return 
4120: 73 71 6c 69 74 65 33 4f 73 53 68 6d 4c 6f 63 6b  sqlite3OsShmLock
4130: 28 28 28 43 72 61 73 68 46 69 6c 65 2a 29 70 46  (((CrashFile*)pF
4140: 69 6c 65 29 2d 3e 70 52 65 61 6c 46 69 6c 65 2c  ile)->pRealFile,
4150: 20 6f 66 73 74 2c 20 6e 2c 20 66 6c 61 67 73 29   ofst, n, flags)
4160: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4170: 63 66 53 68 6d 42 61 72 72 69 65 72 28 73 71 6c  cfShmBarrier(sql
4180: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
4190: 29 7b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 68  ){.  sqlite3OsSh
41a0: 6d 42 61 72 72 69 65 72 28 28 28 43 72 61 73 68  mBarrier(((Crash
41b0: 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 70 52  File*)pFile)->pR
41c0: 65 61 6c 46 69 6c 65 29 3b 0a 7d 0a 73 74 61 74  ealFile);.}.stat
41d0: 69 63 20 69 6e 74 20 63 66 53 68 6d 55 6e 6d 61  ic int cfShmUnma
41e0: 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
41f0: 70 46 69 6c 65 2c 20 69 6e 74 20 64 65 6c 46 6c  pFile, int delFl
4200: 61 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ag){.  return sq
4210: 6c 69 74 65 33 4f 73 53 68 6d 55 6e 6d 61 70 28  lite3OsShmUnmap(
4220: 28 28 43 72 61 73 68 46 69 6c 65 2a 29 70 46 69  ((CrashFile*)pFi
4230: 6c 65 29 2d 3e 70 52 65 61 6c 46 69 6c 65 2c 20  le)->pRealFile, 
4240: 64 65 6c 46 6c 61 67 29 3b 0a 7d 0a 73 74 61 74  delFlag);.}.stat
4250: 69 63 20 69 6e 74 20 63 66 53 68 6d 4d 61 70 28  ic int cfShmMap(
4260: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4270: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
4280: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
4290: 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
42a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
42b0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
42c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
42d0: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
42e0: 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
4310: 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 77  gions */.  int w
4320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4340: 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
4350: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
4360: 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
4370: 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
4380: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
4390: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
43a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
43b0: 4f 73 53 68 6d 4d 61 70 28 28 28 43 72 61 73 68  OsShmMap(((Crash
43c0: 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 70 52  File*)pFile)->pR
43d0: 65 61 6c 46 69 6c 65 2c 20 69 52 65 67 69 6f 6e  ealFile, iRegion
43e0: 2c 20 73 7a 2c 20 77 2c 20 70 70 29 3b 0a 7d 0a  , sz, w, pp);.}.
43f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
4400: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
4410: 20 43 72 61 73 68 46 69 6c 65 56 74 61 62 20 3d   CrashFileVtab =
4420: 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20   {.  2,         
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
4450: 2f 0a 20 20 63 66 43 6c 6f 73 65 2c 20 20 20 20  /.  cfClose,    
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
4480: 20 63 66 52 65 61 64 2c 20 20 20 20 20 20 20 20   cfRead,        
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
44a0: 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 63 66 57  * xRead */.  cfW
44b0: 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
44c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
44d0: 72 69 74 65 20 2a 2f 0a 20 20 63 66 54 72 75 6e  rite */.  cfTrun
44e0: 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
44f0: 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
4500: 63 61 74 65 20 2a 2f 0a 20 20 63 66 53 79 6e 63  cate */.  cfSync
4510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4520: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
4530: 20 2a 2f 0a 20 20 63 66 46 69 6c 65 53 69 7a 65   */.  cfFileSize
4540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4550: 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
4560: 20 2a 2f 0a 20 20 63 66 4c 6f 63 6b 2c 20 20 20   */.  cfLock,   
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
4590: 20 20 63 66 55 6e 6c 6f 63 6b 2c 20 20 20 20 20    cfUnlock,     
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
45c0: 63 66 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  cfCheckReservedL
45d0: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ock,          /*
45e0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
45f0: 6f 63 6b 20 2a 2f 0a 20 20 63 66 46 69 6c 65 43  ock */.  cfFileC
4600: 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
4610: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
4620: 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 63 66 53 65  ontrol */.  cfSe
4630: 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
4640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
4650: 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 63 66  ctorSize */.  cf
4660: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
4670: 73 74 69 63 73 2c 20 20 20 20 20 20 2f 2a 20 78  stics,      /* x
4680: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
4690: 73 74 69 63 73 20 2a 2f 0a 20 20 63 66 53 68 6d  stics */.  cfShm
46a0: 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
46b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
46c0: 4d 61 70 20 2a 2f 0a 20 20 63 66 53 68 6d 4c 6f  Map */.  cfShmLo
46d0: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
46e0: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
46f0: 63 6b 20 2a 2f 0a 20 20 63 66 53 68 6d 42 61 72  ck */.  cfShmBar
4700: 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
4710: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
4720: 72 69 65 72 20 2a 2f 0a 20 20 63 66 53 68 6d 55  rier */.  cfShmU
4730: 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20  nmap            
4740: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
4750: 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nmap */.};../*.*
4760: 2a 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 64 61  * Application da
4770: 74 61 20 66 6f 72 20 74 68 65 20 63 72 61 73 68  ta for the crash
4780: 20 56 46 53 0a 2a 2f 0a 73 74 72 75 63 74 20 63   VFS.*/.struct c
4790: 72 61 73 68 41 70 70 44 61 74 61 20 7b 0a 20 20  rashAppData {.  
47a0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4f 72  sqlite3_vfs *pOr
47b0: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ig;             
47c0: 20 20 20 20 20 20 2f 2a 20 57 72 61 70 70 65 64        /* Wrapped
47d0: 20 76 66 73 20 73 74 72 75 63 74 75 72 65 20 2a   vfs structure *
47e0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  /.};../*.** Open
47f0: 20 61 20 63 72 61 73 68 2d 66 69 6c 65 20 66 69   a crash-file fi
4800: 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a  le handle..**.**
4810: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
4820: 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64 20   have allocated 
4830: 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
4840: 79 74 65 73 20 6f 66 20 73 70 61 63 65 0a 2a 2a  ytes of space.**
4850: 20 61 74 20 70 46 69 6c 65 2e 20 54 68 69 73 20   at pFile. This 
4860: 66 69 6c 65 20 75 73 65 73 20 74 68 69 73 20 73  file uses this s
4870: 70 61 63 65 20 66 6f 72 20 74 68 65 20 43 72 61  pace for the Cra
4880: 73 68 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  shFile structure
4890: 0a 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  .** and allocate
48a0: 73 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  s space for the 
48b0: 22 72 65 61 6c 22 20 66 69 6c 65 20 73 74 72 75  "real" file stru
48c0: 63 74 75 72 65 20 75 73 69 6e 67 20 0a 2a 2a 20  cture using .** 
48d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
48e0: 2e 20 54 68 65 20 61 73 73 75 6d 70 74 69 6f 6e  . The assumption
48f0: 20 68 65 72 65 20 69 73 20 28 70 56 66 73 2d 3e   here is (pVfs->
4900: 73 7a 4f 73 46 69 6c 65 29 20 69 73 0a 2a 2a 20  szOsFile) is.** 
4910: 65 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72  equal or greater
4920: 20 74 68 61 6e 20 73 69 7a 65 6f 66 28 43 72 61   than sizeof(Cra
4930: 73 68 46 69 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  shFile)..*/.stat
4940: 69 63 20 69 6e 74 20 63 66 4f 70 65 6e 28 0a 20  ic int cfOpen(. 
4950: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 43   sqlite3_vfs *pC
4960: 66 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  fVfs,.  const ch
4970: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c  ar *zName,.  sql
4980: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
4990: 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
49a0: 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
49b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
49c0: 20 2a 70 56 66 73 20 3d 20 28 73 71 6c 69 74 65   *pVfs = (sqlite
49d0: 33 5f 76 66 73 20 2a 29 70 43 66 56 66 73 2d 3e  3_vfs *)pCfVfs->
49e0: 70 41 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20  pAppData;.  int 
49f0: 72 63 3b 0a 20 20 43 72 61 73 68 46 69 6c 65 20  rc;.  CrashFile 
4a00: 2a 70 57 72 61 70 70 65 72 20 3d 20 28 43 72 61  *pWrapper = (Cra
4a10: 73 68 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  shFile *)pFile;.
4a20: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4a30: 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  pReal = (sqlite3
4a40: 5f 66 69 6c 65 2a 29 26 70 57 72 61 70 70 65 72  _file*)&pWrapper
4a50: 5b 31 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  [1];..  memset(p
4a60: 57 72 61 70 70 65 72 2c 20 30 2c 20 73 69 7a 65  Wrapper, 0, size
4a70: 6f 66 28 43 72 61 73 68 46 69 6c 65 29 29 3b 0a  of(CrashFile));.
4a80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4a90: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65  Open(pVfs, zName
4aa0: 2c 20 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20  , pReal, flags, 
4ab0: 70 4f 75 74 46 6c 61 67 73 29 3b 0a 0a 20 20 69  pOutFlags);..  i
4ac0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ad0: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 53 69 7a   ){.    i64 iSiz
4ae0: 65 3b 0a 20 20 20 20 70 57 72 61 70 70 65 72 2d  e;.    pWrapper-
4af0: 3e 70 4d 65 74 68 6f 64 20 3d 20 26 43 72 61 73  >pMethod = &Cras
4b00: 68 46 69 6c 65 56 74 61 62 3b 0a 20 20 20 20 70  hFileVtab;.    p
4b10: 57 72 61 70 70 65 72 2d 3e 7a 4e 61 6d 65 20 3d  Wrapper->zName =
4b20: 20 28 63 68 61 72 20 2a 29 7a 4e 61 6d 65 3b 0a   (char *)zName;.
4b30: 20 20 20 20 70 57 72 61 70 70 65 72 2d 3e 70 52      pWrapper->pR
4b40: 65 61 6c 46 69 6c 65 20 3d 20 70 52 65 61 6c 3b  ealFile = pReal;
4b50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4b60: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 52 65 61  3OsFileSize(pRea
4b70: 6c 2c 20 26 69 53 69 7a 65 29 3b 0a 20 20 20 20  l, &iSize);.    
4b80: 70 57 72 61 70 70 65 72 2d 3e 69 53 69 7a 65 20  pWrapper->iSize 
4b90: 3d 20 28 69 6e 74 29 69 53 69 7a 65 3b 0a 20 20  = (int)iSize;.  
4ba0: 20 20 70 57 72 61 70 70 65 72 2d 3e 66 6c 61 67    pWrapper->flag
4bb0: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 20  s = flags;.  }. 
4bc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4bd0: 4f 4b 20 29 7b 0a 20 20 20 20 70 57 72 61 70 70  OK ){.    pWrapp
4be0: 65 72 2d 3e 6e 44 61 74 61 20 3d 20 28 69 6e 74  er->nData = (int
4bf0: 29 28 34 30 39 36 20 2b 20 70 57 72 61 70 70 65  )(4096 + pWrappe
4c00: 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20 20 70  r->iSize);.    p
4c10: 57 72 61 70 70 65 72 2d 3e 7a 44 61 74 61 20 3d  Wrapper->zData =
4c20: 20 63 72 61 73 68 5f 6d 61 6c 6c 6f 63 28 70 57   crash_malloc(pW
4c30: 72 61 70 70 65 72 2d 3e 6e 44 61 74 61 29 3b 0a  rapper->nData);.
4c40: 20 20 20 20 69 66 28 20 70 57 72 61 70 70 65 72      if( pWrapper
4c50: 2d 3e 7a 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->zData ){.     
4c60: 20 2f 2a 20 6f 73 5f 75 6e 69 78 2e 63 20 63 6f   /* os_unix.c co
4c70: 6e 74 61 69 6e 73 20 61 6e 20 61 73 73 65 72 74  ntains an assert
4c80: 28 29 20 74 68 61 74 20 66 61 69 6c 73 20 69 66  () that fails if
4c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 61 74 74 65   the caller atte
4ca0: 6d 70 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  mpts.      ** to
4cb0: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
4cc0: 74 68 65 20 35 31 32 2d 62 79 74 65 20 6c 6f 63  the 512-byte loc
4cd0: 6b 69 6e 67 20 72 65 67 69 6f 6e 20 6f 66 20 61  king region of a
4ce0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
4cf0: 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 53     ** with the S
4d00: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
4d10: 44 42 20 66 6c 61 67 2e 20 54 68 69 73 20 72 65  DB flag. This re
4d20: 67 69 6f 6e 20 6f 66 20 61 20 64 61 74 61 62 61  gion of a databa
4d30: 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
4d40: 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 73 20   never contains 
4d50: 76 61 6c 69 64 20 64 61 74 61 20 61 6e 79 68 6f  valid data anyho
4d60: 77 2e 20 53 6f 20 61 76 6f 69 64 20 64 6f 69 6e  w. So avoid doin
4d70: 67 20 73 75 63 68 20 61 20 72 65 61 64 20 68 65  g such a read he
4d80: 72 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  re..      **.   
4d90: 20 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 49 74     ** UPDATE: It
4da0: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 61   also contains a
4db0: 6e 20 61 73 73 65 72 74 28 29 20 76 65 72 69 66  n assert() verif
4dc0: 79 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 63  ying that each c
4dd0: 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  all.      ** to 
4de0: 74 68 65 20 78 52 65 61 64 28 29 20 6d 65 74 68  the xRead() meth
4df0: 6f 64 20 72 65 61 64 73 20 6c 65 73 73 20 74 68  od reads less th
4e00: 61 6e 20 31 32 38 4b 42 20 6f 66 20 64 61 74 61  an 128KB of data
4e10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
4e20: 20 69 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20   i64 iOff;..    
4e30: 20 20 6d 65 6d 73 65 74 28 70 57 72 61 70 70 65    memset(pWrappe
4e40: 72 2d 3e 7a 44 61 74 61 2c 20 30 2c 20 70 57 72  r->zData, 0, pWr
4e50: 61 70 70 65 72 2d 3e 6e 44 61 74 61 29 3b 0a 20  apper->nData);. 
4e60: 20 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 30 3b       for(iOff=0;
4e70: 20 69 4f 66 66 3c 70 57 72 61 70 70 65 72 2d 3e   iOff<pWrapper->
4e80: 69 53 69 7a 65 3b 20 69 4f 66 66 20 2b 3d 20 35  iSize; iOff += 5
4e90: 31 32 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  12){.        int
4ea0: 20 6e 52 65 61 64 20 3d 20 28 69 6e 74 29 28 70   nRead = (int)(p
4eb0: 57 72 61 70 70 65 72 2d 3e 69 53 69 7a 65 20 2d  Wrapper->iSize -
4ec0: 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
4ed0: 69 66 28 20 6e 52 65 61 64 3e 35 31 32 20 29 20  if( nRead>512 ) 
4ee0: 6e 52 65 61 64 20 3d 20 35 31 32 3b 0a 20 20 20  nRead = 512;.   
4ef0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4f00: 33 4f 73 52 65 61 64 28 70 52 65 61 6c 2c 20 26  3OsRead(pReal, &
4f10: 70 57 72 61 70 70 65 72 2d 3e 7a 44 61 74 61 5b  pWrapper->zData[
4f20: 69 4f 66 66 5d 2c 20 6e 52 65 61 64 2c 20 69 4f  iOff], nRead, iO
4f30: 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
4f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
4f50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4f70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
4f80: 26 20 70 57 72 61 70 70 65 72 2d 3e 70 4d 65 74  & pWrapper->pMet
4f90: 68 6f 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  hod ){.    sqlit
4fa0: 65 33 4f 73 43 6c 6f 73 65 28 70 46 69 6c 65 29  e3OsClose(pFile)
4fb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4fc0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
4fd0: 20 63 66 44 65 6c 65 74 65 28 73 71 6c 69 74 65   cfDelete(sqlite
4fe0: 33 5f 76 66 73 20 2a 70 43 66 56 66 73 2c 20 63  3_vfs *pCfVfs, c
4ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
5000: 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a  , int dirSync){.
5010: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5020: 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Vfs = (sqlite3_v
5030: 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41 70  fs *)pCfVfs->pAp
5040: 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  pData;.  return 
5050: 70 56 66 73 2d 3e 78 44 65 6c 65 74 65 28 70 56  pVfs->xDelete(pV
5060: 66 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79  fs, zPath, dirSy
5070: 6e 63 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  nc);.}.static in
5080: 74 20 63 66 41 63 63 65 73 73 28 0a 20 20 73 71  t cfAccess(.  sq
5090: 6c 69 74 65 33 5f 76 66 73 20 2a 70 43 66 56 66  lite3_vfs *pCfVf
50a0: 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
50b0: 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20   *zPath, .  int 
50c0: 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70  flags, .  int *p
50d0: 52 65 73 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69  ResOut.){.  sqli
50e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
50f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29 70  (sqlite3_vfs *)p
5100: 43 66 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b  CfVfs->pAppData;
5110: 0a 20 20 72 65 74 75 72 6e 20 70 56 66 73 2d 3e  .  return pVfs->
5120: 78 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 50  xAccess(pVfs, zP
5130: 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73  ath, flags, pRes
5140: 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Out);.}.static i
5150: 6e 74 20 63 66 46 75 6c 6c 50 61 74 68 6e 61 6d  nt cfFullPathnam
5160: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
5170: 20 2a 70 43 66 56 66 73 2c 20 0a 20 20 63 6f 6e   *pCfVfs, .  con
5180: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
5190: 0a 20 20 69 6e 74 20 6e 50 61 74 68 4f 75 74 2c  .  int nPathOut,
51a0: 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 4f 75  .  char *zPathOu
51b0: 74 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  t.){.  sqlite3_v
51c0: 66 73 20 2a 70 56 66 73 20 3d 20 28 73 71 6c 69  fs *pVfs = (sqli
51d0: 74 65 33 5f 76 66 73 20 2a 29 70 43 66 56 66 73  te3_vfs *)pCfVfs
51e0: 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20 72 65  ->pAppData;.  re
51f0: 74 75 72 6e 20 70 56 66 73 2d 3e 78 46 75 6c 6c  turn pVfs->xFull
5200: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
5210: 50 61 74 68 2c 20 6e 50 61 74 68 4f 75 74 2c 20  Path, nPathOut, 
5220: 7a 50 61 74 68 4f 75 74 29 3b 0a 7d 0a 73 74 61  zPathOut);.}.sta
5230: 74 69 63 20 76 6f 69 64 20 2a 63 66 44 6c 4f 70  tic void *cfDlOp
5240: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
5250: 70 43 66 56 66 73 2c 20 63 6f 6e 73 74 20 63 68  pCfVfs, const ch
5260: 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 73 71  ar *zPath){.  sq
5270: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
5280: 3d 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  = (sqlite3_vfs *
5290: 29 70 43 66 56 66 73 2d 3e 70 41 70 70 44 61 74  )pCfVfs->pAppDat
52a0: 61 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 66 73  a;.  return pVfs
52b0: 2d 3e 78 44 6c 4f 70 65 6e 28 70 56 66 73 2c 20  ->xDlOpen(pVfs, 
52c0: 7a 50 61 74 68 29 3b 0a 7d 0a 73 74 61 74 69 63  zPath);.}.static
52d0: 20 76 6f 69 64 20 63 66 44 6c 45 72 72 6f 72 28   void cfDlError(
52e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 43 66  sqlite3_vfs *pCf
52f0: 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
5300: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a  char *zErrMsg){.
5310: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
5320: 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Vfs = (sqlite3_v
5330: 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41 70  fs *)pCfVfs->pAp
5340: 70 44 61 74 61 3b 0a 20 20 70 56 66 73 2d 3e 78  pData;.  pVfs->x
5350: 44 6c 45 72 72 6f 72 28 70 56 66 73 2c 20 6e 42  DlError(pVfs, nB
5360: 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d  yte, zErrMsg);.}
5370: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 63  .static void (*c
5380: 66 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  fDlSym(sqlite3_v
5390: 66 73 20 2a 70 43 66 56 66 73 2c 20 76 6f 69 64  fs *pCfVfs, void
53a0: 20 2a 70 48 2c 20 63 6f 6e 73 74 20 63 68 61 72   *pH, const char
53b0: 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a   *zSym))(void){.
53c0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
53d0: 56 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Vfs = (sqlite3_v
53e0: 66 73 20 2a 29 70 43 66 56 66 73 2d 3e 70 41 70  fs *)pCfVfs->pAp
53f0: 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  pData;.  return 
5400: 70 56 66 73 2d 3e 78 44 6c 53 79 6d 28 70 56 66  pVfs->xDlSym(pVf
5410: 73 2c 20 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  s, pH, zSym);.}.
5420: 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 44 6c  static void cfDl
5430: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
5440: 73 20 2a 70 43 66 56 66 73 2c 20 76 6f 69 64 20  s *pCfVfs, void 
5450: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 73 71 6c  *pHandle){.  sql
5460: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
5470: 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 29   (sqlite3_vfs *)
5480: 70 43 66 56 66 73 2d 3e 70 41 70 70 44 61 74 61  pCfVfs->pAppData
5490: 3b 0a 20 20 70 56 66 73 2d 3e 78 44 6c 43 6c 6f  ;.  pVfs->xDlClo
54a0: 73 65 28 70 56 66 73 2c 20 70 48 61 6e 64 6c 65  se(pVfs, pHandle
54b0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
54c0: 63 66 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  cfRandomness(sql
54d0: 69 74 65 33 5f 76 66 73 20 2a 70 43 66 56 66 73  ite3_vfs *pCfVfs
54e0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
54f0: 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 73  r *zBufOut){.  s
5500: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
5510: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20   = (sqlite3_vfs 
5520: 2a 29 70 43 66 56 66 73 2d 3e 70 41 70 70 44 61  *)pCfVfs->pAppDa
5530: 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 66  ta;.  return pVf
5540: 73 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 70  s->xRandomness(p
5550: 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66  Vfs, nByte, zBuf
5560: 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Out);.}.static i
5570: 6e 74 20 63 66 53 6c 65 65 70 28 73 71 6c 69 74  nt cfSleep(sqlit
5580: 65 33 5f 76 66 73 20 2a 70 43 66 56 66 73 2c 20  e3_vfs *pCfVfs, 
5590: 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 73  int nMicro){.  s
55a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
55b0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20   = (sqlite3_vfs 
55c0: 2a 29 70 43 66 56 66 73 2d 3e 70 41 70 70 44 61  *)pCfVfs->pAppDa
55d0: 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 66  ta;.  return pVf
55e0: 73 2d 3e 78 53 6c 65 65 70 28 70 56 66 73 2c 20  s->xSleep(pVfs, 
55f0: 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 73 74 61 74 69  nMicro);.}.stati
5600: 63 20 69 6e 74 20 63 66 43 75 72 72 65 6e 74 54  c int cfCurrentT
5610: 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
5620: 2a 70 43 66 56 66 73 2c 20 64 6f 75 62 6c 65 20  *pCfVfs, double 
5630: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 73 71  *pTimeOut){.  sq
5640: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
5650: 3d 20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  = (sqlite3_vfs *
5660: 29 70 43 66 56 66 73 2d 3e 70 41 70 70 44 61 74  )pCfVfs->pAppDat
5670: 61 3b 0a 20 20 72 65 74 75 72 6e 20 70 56 66 73  a;.  return pVfs
5680: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 70  ->xCurrentTime(p
5690: 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a  Vfs, pTimeOut);.
56a0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  }..static int pr
56b0: 6f 63 65 73 73 44 65 76 53 79 6d 41 72 67 73 28  ocessDevSymArgs(
56c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
56d0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
56e0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
56f0: 4e 53 54 20 6f 62 6a 76 5b 5d 2c 0a 20 20 69 6e  NST objv[],.  in
5700: 74 20 2a 70 69 44 65 76 69 63 65 43 68 61 72 2c  t *piDeviceChar,
5710: 0a 20 20 69 6e 74 20 2a 70 69 53 65 63 74 6f 72  .  int *piSector
5720: 53 69 7a 65 0a 29 7b 0a 20 20 73 74 72 75 63 74  Size.){.  struct
5730: 20 44 65 76 69 63 65 46 6c 61 67 20 7b 0a 20 20   DeviceFlag {.  
5740: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
5750: 20 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20     int iValue;. 
5760: 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20   } aFlag[] = {. 
5770: 20 20 20 7b 20 22 61 74 6f 6d 69 63 22 2c 20 20     { "atomic",  
5780: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
5790: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20  TE_IOCAP_ATOMIC 
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
57b0: 2c 0a 20 20 20 20 7b 20 22 61 74 6f 6d 69 63 35  ,.    { "atomic5
57c0: 31 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 53  12",           S
57d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
57e0: 49 43 35 31 32 20 20 20 20 20 20 20 20 20 20 20  IC512           
57f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 74 6f 6d    },.    { "atom
5800: 69 63 31 6b 22 2c 20 20 20 20 20 20 20 20 20 20  ic1k",          
5810: 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
5820: 54 4f 4d 49 43 31 4b 20 20 20 20 20 20 20 20 20  TOMIC1K         
5830: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
5840: 74 6f 6d 69 63 32 6b 22 2c 20 20 20 20 20 20 20  tomic2k",       
5850: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
5860: 50 5f 41 54 4f 4d 49 43 32 4b 20 20 20 20 20 20  P_ATOMIC2K      
5870: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5880: 20 22 61 74 6f 6d 69 63 34 6b 22 2c 20 20 20 20   "atomic4k",    
5890: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
58a0: 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 20 20  OCAP_ATOMIC4K   
58b0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
58c0: 20 20 7b 20 22 61 74 6f 6d 69 63 38 6b 22 2c 20    { "atomic8k", 
58d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
58e0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 38 4b  E_IOCAP_ATOMIC8K
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
5900: 0a 20 20 20 20 7b 20 22 61 74 6f 6d 69 63 31 36  .    { "atomic16
5910: 6b 22 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  k",           SQ
5920: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5930: 43 31 36 4b 20 20 20 20 20 20 20 20 20 20 20 20  C16K            
5940: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 74 6f 6d 69   },.    { "atomi
5950: 63 33 32 6b 22 2c 20 20 20 20 20 20 20 20 20 20  c32k",          
5960: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
5970: 4f 4d 49 43 33 32 4b 20 20 20 20 20 20 20 20 20  OMIC32K         
5980: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 74      },.    { "at
5990: 6f 6d 69 63 36 34 6b 22 2c 20 20 20 20 20 20 20  omic64k",       
59a0: 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
59b0: 5f 41 54 4f 4d 49 43 36 34 4b 20 20 20 20 20 20  _ATOMIC64K      
59c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
59d0: 22 73 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20  "sequential",   
59e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
59f0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 20  CAP_SEQUENTIAL  
5a00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
5a10: 20 7b 20 22 73 61 66 65 5f 61 70 70 65 6e 64 22   { "safe_append"
5a20: 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
5a30: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
5a40: 4e 44 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ND           },.
5a50: 20 20 20 20 7b 20 22 70 6f 77 65 72 73 61 66 65      { "powersafe
5a60: 5f 6f 76 65 72 77 72 69 74 65 22 2c 20 53 51 4c  _overwrite", SQL
5a70: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
5a80: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 20 20  AFE_OVERWRITE   
5a90: 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
5aa0: 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 69 3b 0a 20    };..  int i;. 
5ab0: 20 69 6e 74 20 69 44 63 20 3d 20 30 3b 0a 20 20   int iDc = 0;.  
5ac0: 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
5ad0: 3d 20 30 3b 0a 20 20 69 6e 74 20 73 65 74 53 65  = 0;.  int setSe
5ae0: 63 74 6f 72 73 69 7a 65 20 3d 20 30 3b 0a 20 20  ctorsize = 0;.  
5af0: 69 6e 74 20 73 65 74 44 65 76 69 63 65 43 68 61  int setDeviceCha
5b00: 72 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  r = 0;..  for(i=
5b10: 30 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29  0; i<objc; i+=2)
5b20: 7b 0a 20 20 20 20 69 6e 74 20 6e 4f 70 74 3b 0a  {.    int nOpt;.
5b30: 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 20 3d      char *zOpt =
5b40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5b50: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 5d 2c 20 26  omObj(objv[i], &
5b60: 6e 4f 70 74 29 3b 0a 0a 20 20 20 20 69 66 28 20  nOpt);..    if( 
5b70: 28 6e 4f 70 74 3e 31 31 20 7c 7c 20 6e 4f 70 74  (nOpt>11 || nOpt
5b80: 3c 32 20 7c 7c 20 73 74 72 6e 63 6d 70 28 22 2d  <2 || strncmp("-
5b90: 73 65 63 74 6f 72 73 69 7a 65 22 2c 20 7a 4f 70  sectorsize", zOp
5ba0: 74 2c 20 6e 4f 70 74 29 29 20 0a 20 20 20 20 20  t, nOpt)) .     
5bb0: 26 26 20 28 6e 4f 70 74 3e 31 36 20 7c 7c 20 6e  && (nOpt>16 || n
5bc0: 4f 70 74 3c 32 20 7c 7c 20 73 74 72 6e 63 6d 70  Opt<2 || strncmp
5bd0: 28 22 2d 63 68 61 72 61 63 74 65 72 69 73 74 69  ("-characteristi
5be0: 63 73 22 2c 20 7a 4f 70 74 2c 20 6e 4f 70 74 29  cs", zOpt, nOpt)
5bf0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 54  ).    ){.      T
5c00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5c10: 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20  interp, .       
5c20: 20 22 42 61 64 20 6f 70 74 69 6f 6e 3a 20 5c 22   "Bad option: \"
5c30: 22 2c 20 7a 4f 70 74 2c 20 0a 20 20 20 20 20 20  ", zOpt, .      
5c40: 20 20 22 5c 22 20 2d 20 6d 75 73 74 20 62 65 20    "\" - must be 
5c50: 5c 22 2d 63 68 61 72 61 63 74 65 72 69 73 74 69  \"-characteristi
5c60: 63 73 5c 22 20 6f 72 20 5c 22 2d 73 65 63 74 6f  cs\" or \"-secto
5c70: 72 73 69 7a 65 5c 22 22 2c 20 30 0a 20 20 20 20  rsize\"", 0.    
5c80: 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
5c90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5ca0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6f 62   }.    if( i==ob
5cb0: 6a 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 54 63  jc-1 ){.      Tc
5cc0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
5cd0: 6e 74 65 72 70 2c 20 22 4f 70 74 69 6f 6e 20 72  nterp, "Option r
5ce0: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
5cf0: 65 6e 74 3a 20 5c 22 22 2c 20 7a 4f 70 74 2c 20  ent: \"", zOpt, 
5d00: 22 5c 22 22 2c 30 29 3b 0a 20 20 20 20 20 20 72  "\"",0);.      r
5d10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5d20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
5d30: 7a 4f 70 74 5b 31 5d 3d 3d 27 73 27 20 29 7b 0a  zOpt[1]=='s' ){.
5d40: 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
5d50: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
5d60: 72 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26  rp, objv[i+1], &
5d70: 69 53 65 63 74 6f 72 53 69 7a 65 29 20 29 7b 0a  iSectorSize) ){.
5d80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
5d90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
5da0: 7d 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  }.      setSecto
5db0: 72 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rsize = 1;.    }
5dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
5dd0: 6a 3b 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a  j;.      Tcl_Obj
5de0: 20 2a 2a 61 70 4f 62 6a 3b 0a 20 20 20 20 20 20   **apObj;.      
5df0: 69 6e 74 20 6e 4f 62 6a 3b 0a 20 20 20 20 20 20  int nObj;.      
5e00: 69 66 28 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if( Tcl_ListObjG
5e10: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
5e20: 70 2c 20 6f 62 6a 76 5b 69 2b 31 5d 2c 20 26 6e  p, objv[i+1], &n
5e30: 4f 62 6a 2c 20 26 61 70 4f 62 6a 29 20 29 7b 0a  Obj, &apObj) ){.
5e40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
5e50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
5e60: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
5e70: 20 6a 3c 6e 4f 62 6a 3b 20 6a 2b 2b 29 7b 0a 20   j<nObj; j++){. 
5e80: 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20         int rc;. 
5e90: 20 20 20 20 20 20 20 69 6e 74 20 69 43 68 6f 69         int iChoi
5ea0: 63 65 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ce;.        Tcl_
5eb0: 4f 62 6a 20 2a 70 46 6c 61 67 20 3d 20 54 63 6c  Obj *pFlag = Tcl
5ec0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 61 70  _DuplicateObj(ap
5ed0: 4f 62 6a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  Obj[j]);.       
5ee0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5ef0: 74 28 70 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  t(pFlag);.      
5f00: 20 20 54 63 6c 5f 55 74 66 54 6f 4c 6f 77 65 72    Tcl_UtfToLower
5f10: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70  (Tcl_GetString(p
5f20: 46 6c 61 67 29 29 3b 0a 20 0a 20 20 20 20 20 20  Flag));. .      
5f30: 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e    rc = Tcl_GetIn
5f40: 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
5f50: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  (.            in
5f60: 74 65 72 70 2c 20 70 46 6c 61 67 2c 20 61 46 6c  terp, pFlag, aFl
5f70: 61 67 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61 67  ag, sizeof(aFlag
5f80: 5b 30 5d 29 2c 20 22 6e 6f 20 73 75 63 68 20 66  [0]), "no such f
5f90: 6c 61 67 22 2c 20 30 2c 20 26 69 43 68 6f 69 63  lag", 0, &iChoic
5fa0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
5fb0: 20 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66       Tcl_DecrRef
5fc0: 43 6f 75 6e 74 28 70 46 6c 61 67 29 3b 0a 20 20  Count(pFlag);.  
5fd0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
5fe0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5ff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
6000: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
6010: 44 63 20 7c 3d 20 61 46 6c 61 67 5b 69 43 68 6f  Dc |= aFlag[iCho
6020: 69 63 65 5d 2e 69 56 61 6c 75 65 3b 0a 20 20 20  ice].iValue;.   
6030: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 44 65     }.      setDe
6040: 76 69 63 65 43 68 61 72 20 3d 20 31 3b 0a 20 20  viceChar = 1;.  
6050: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73    }.  }..  if( s
6060: 65 74 44 65 76 69 63 65 43 68 61 72 20 29 7b 0a  etDeviceChar ){.
6070: 20 20 20 20 2a 70 69 44 65 76 69 63 65 43 68 61      *piDeviceCha
6080: 72 20 3d 20 69 44 63 3b 0a 20 20 7d 0a 20 20 69  r = iDc;.  }.  i
6090: 66 28 20 73 65 74 53 65 63 74 6f 72 73 69 7a 65  f( setSectorsize
60a0: 20 29 7b 0a 20 20 20 20 2a 70 69 53 65 63 74 6f   ){.    *piSecto
60b0: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
60c0: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ize;.  }..  retu
60d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
60e0: 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
60f0: 6c 69 74 65 5f 63 72 61 73 68 5f 65 6e 61 62 6c  lite_crash_enabl
6100: 65 20 45 4e 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 50  e ENABLE.**.** P
6110: 61 72 61 6d 65 74 65 72 20 45 4e 41 42 4c 45 20  arameter ENABLE 
6120: 6d 75 73 74 20 62 65 20 61 20 62 6f 6f 6c 65 61  must be a boolea
6130: 6e 20 76 61 6c 75 65 2e 20 49 66 20 74 72 75 65  n value. If true
6140: 2c 20 74 68 65 6e 20 74 68 65 20 22 63 72 61 73  , then the "cras
6150: 68 22 0a 2a 2a 20 76 66 73 20 69 73 20 61 64 64  h".** vfs is add
6160: 65 64 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  ed to the system
6170: 2e 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 69  . If false, it i
6180: 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74  s removed..*/.st
6190: 61 74 69 63 20 69 6e 74 20 63 72 61 73 68 45 6e  atic int crashEn
61a0: 61 62 6c 65 43 6d 64 28 0a 20 20 76 6f 69 64 20  ableCmd(.  void 
61b0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
61c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
61d0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
61e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
61f0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
6200: 20 69 73 45 6e 61 62 6c 65 3b 0a 20 20 73 74 61   isEnable;.  sta
6210: 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
6220: 63 72 61 73 68 56 66 73 20 3d 20 7b 0a 20 20 20  crashVfs = {.   
6230: 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
6240: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
6250: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
6260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
6270: 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 30  zOsFile */.    0
6280: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6290: 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65     /* mxPathname
62a0: 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
62c0: 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 63 72 61  Next */.    "cra
62d0: 73 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sh",            
62e0: 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
62f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6300: 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
6310: 2a 2f 0a 20 20 0a 20 20 20 20 63 66 4f 70 65 6e  */.  .    cfOpen
6320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6330: 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
6340: 63 66 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  cfDelete,       
6350: 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
6360: 20 2a 2f 0a 20 20 20 20 63 66 41 63 63 65 73 73   */.    cfAccess
6370: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6380: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
6390: 63 66 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  cfFullPathname, 
63a0: 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61        /* xFullPa
63b0: 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 66  thname */.    cf
63c0: 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
63d0: 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
63e0: 2f 0a 20 20 20 20 63 66 44 6c 45 72 72 6f 72 2c  /.    cfDlError,
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6400: 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63  DlError */.    c
6410: 66 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  fDlSym,         
6420: 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
6430: 2f 0a 20 20 20 20 63 66 44 6c 43 6c 6f 73 65 2c  /.    cfDlClose,
6440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
6450: 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 63  DlClose */.    c
6460: 66 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  fRandomness,    
6470: 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
6480: 65 73 73 20 2a 2f 0a 20 20 20 20 63 66 53 6c 65  ess */.    cfSle
6490: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
64a0: 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
64b0: 20 20 63 66 43 75 72 72 65 6e 74 54 69 6d 65 2c    cfCurrentTime,
64c0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
64d0: 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 30  entTime */.    0
64e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
64f0: 20 20 20 20 20 2f 2a 20 78 47 65 74 6c 61 73 74       /* xGetlast
6500: 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20  Error */.    0, 
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6520: 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
6530: 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 7d 3b 0a  meInt64 */.  };.
6540: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
6550: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
6560: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
6570: 2c 20 6f 62 6a 76 2c 20 22 45 4e 41 42 4c 45 22  , objv, "ENABLE"
6580: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6590: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
65a0: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
65b0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
65c0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69 73 45 6e  , objv[1], &isEn
65d0: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
65e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
65f0: 20 7d 0a 0a 20 20 69 66 28 20 28 69 73 45 6e 61   }..  if( (isEna
6600: 62 6c 65 20 26 26 20 63 72 61 73 68 56 66 73 2e  ble && crashVfs.
6610: 70 41 70 70 44 61 74 61 29 20 7c 7c 20 28 21 69  pAppData) || (!i
6620: 73 45 6e 61 62 6c 65 20 26 26 20 21 63 72 61 73  sEnable && !cras
6630: 68 56 66 73 2e 70 41 70 70 44 61 74 61 29 20 29  hVfs.pAppData) )
6640: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
6650: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
6660: 63 72 61 73 68 56 66 73 2e 70 41 70 70 44 61 74  crashVfs.pAppDat
6670: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  a==0 ){.    sqli
6680: 74 65 33 5f 76 66 73 20 2a 70 4f 72 69 67 69 6e  te3_vfs *pOrigin
6690: 61 6c 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  alVfs = sqlite3_
66a0: 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
66b0: 20 63 72 61 73 68 56 66 73 2e 6d 78 50 61 74 68   crashVfs.mxPath
66c0: 6e 61 6d 65 20 3d 20 70 4f 72 69 67 69 6e 61 6c  name = pOriginal
66d0: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b  Vfs->mxPathname;
66e0: 0a 20 20 20 20 63 72 61 73 68 56 66 73 2e 70 41  .    crashVfs.pA
66f0: 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 20 2a  ppData = (void *
6700: 29 70 4f 72 69 67 69 6e 61 6c 56 66 73 3b 0a 20  )pOriginalVfs;. 
6710: 20 20 20 63 72 61 73 68 56 66 73 2e 73 7a 4f 73     crashVfs.szOs
6720: 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 43 72  File = sizeof(Cr
6730: 61 73 68 46 69 6c 65 29 20 2b 20 70 4f 72 69 67  ashFile) + pOrig
6740: 69 6e 61 6c 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  inalVfs->szOsFil
6750: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e;.    sqlite3_v
6760: 66 73 5f 72 65 67 69 73 74 65 72 28 26 63 72 61  fs_register(&cra
6770: 73 68 56 66 73 2c 20 30 29 3b 0a 20 20 7d 65 6c  shVfs, 0);.  }el
6780: 73 65 7b 0a 20 20 20 20 63 72 61 73 68 56 66 73  se{.    crashVfs
6790: 2e 70 41 70 70 44 61 74 61 20 3d 20 30 3b 0a 20  .pAppData = 0;. 
67a0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
67b0: 6e 72 65 67 69 73 74 65 72 28 26 63 72 61 73 68  nregister(&crash
67c0: 56 66 73 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Vfs);.  }..  ret
67d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
67e0: 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
67f0: 71 6c 69 74 65 5f 63 72 61 73 68 70 61 72 61 6d  qlite_crashparam
6800: 73 20 3f 4f 50 54 49 4f 4e 53 3f 20 44 45 4c 41  s ?OPTIONS? DELA
6810: 59 20 43 52 41 53 48 46 49 4c 45 0a 2a 2a 0a 2a  Y CRASHFILE.**.*
6820: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
6830: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 54 43   implements a TC
6840: 4c 20 63 6f 6d 6d 61 6e 64 20 74 68 61 74 20 65  L command that e
6850: 6e 61 62 6c 65 73 20 63 72 61 73 68 20 74 65 73  nables crash tes
6860: 74 69 6e 67 0a 2a 2a 20 69 6e 20 74 65 73 74 66  ting.** in testf
6870: 69 78 74 75 72 65 2e 20 20 4f 6e 63 65 20 65 6e  ixture.  Once en
6880: 61 62 6c 65 64 2c 20 63 72 61 73 68 20 74 65 73  abled, crash tes
6890: 74 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 64  ting cannot be d
68a0: 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  isabled..**.** A
68b0: 76 61 69 6c 61 62 6c 65 20 6f 70 74 69 6f 6e 73  vailable options
68c0: 20 61 72 65 20 22 2d 63 68 61 72 61 63 74 65 72   are "-character
68d0: 69 73 74 69 63 73 22 20 61 6e 64 20 22 2d 73 65  istics" and "-se
68e0: 63 74 6f 72 73 69 7a 65 22 2e 20 42 6f 74 68 20  ctorsize". Both 
68f0: 72 65 71 75 69 72 65 0a 2a 2a 20 61 6e 20 61 72  require.** an ar
6900: 67 75 6d 65 6e 74 2e 20 46 6f 72 20 2d 73 65 63  gument. For -sec
6910: 74 6f 72 73 69 7a 65 2c 20 74 68 69 73 20 69 73  torsize, this is
6920: 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 20 73   the simulated s
6930: 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 0a 2a 2a  ector size in.**
6940: 20 62 79 74 65 73 2e 20 46 6f 72 20 2d 63 68 61   bytes. For -cha
6950: 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 74 68  racteristics, th
6960: 65 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  e argument must 
6970: 62 65 20 61 20 6c 69 73 74 20 6f 66 20 69 6f 2d  be a list of io-
6980: 63 61 70 61 62 69 6c 69 74 79 0a 2a 2a 20 66 6c  capability.** fl
6990: 61 67 73 20 74 6f 20 73 69 6d 75 6c 61 74 65 2e  ags to simulate.
69a0: 20 56 61 6c 69 64 20 66 6c 61 67 73 20 61 72 65   Valid flags are
69b0: 20 22 61 74 6f 6d 69 63 22 2c 20 22 61 74 6f 6d   "atomic", "atom
69c0: 69 63 35 31 32 22 2c 20 22 61 74 6f 6d 69 63 31  ic512", "atomic1
69d0: 4b 22 2c 0a 2a 2a 20 22 61 74 6f 6d 69 63 32 4b  K",.** "atomic2K
69e0: 22 2c 20 22 61 74 6f 6d 69 63 34 4b 22 2c 20 22  ", "atomic4K", "
69f0: 61 74 6f 6d 69 63 38 4b 22 2c 20 22 61 74 6f 6d  atomic8K", "atom
6a00: 69 63 31 36 4b 22 2c 20 22 61 74 6f 6d 69 63 33  ic16K", "atomic3
6a10: 32 4b 22 2c 20 0a 2a 2a 20 22 61 74 6f 6d 69 63  2K", .** "atomic
6a20: 36 34 4b 22 2c 20 22 73 65 71 75 65 6e 74 69 61  64K", "sequentia
6a30: 6c 22 20 61 6e 64 20 22 73 61 66 65 5f 61 70 70  l" and "safe_app
6a40: 65 6e 64 22 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  end"..**.** Exam
6a50: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c  ple:.**.**   sql
6a60: 69 74 65 5f 63 72 61 73 68 70 61 72 61 6d 73 20  ite_crashparams 
6a70: 2d 73 65 63 74 20 31 30 32 34 20 2d 63 68 61 72  -sect 1024 -char
6a80: 20 7b 61 74 6f 6d 69 63 20 73 65 71 75 65 6e 74   {atomic sequent
6a90: 69 61 6c 7d 20 2e 2f 74 65 73 74 2e 64 62 20 31  ial} ./test.db 1
6aa0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
6ab0: 74 20 63 72 61 73 68 50 61 72 61 6d 73 4f 62 6a  t crashParamsObj
6ac0: 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  Cmd(.  void * cl
6ad0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
6ae0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
6af0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
6b00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
6b10: 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 44 65  v[].){.  int iDe
6b20: 6c 61 79 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  lay;.  const cha
6b30: 72 20 2a 7a 43 72 61 73 68 46 69 6c 65 3b 0a 20  r *zCrashFile;. 
6b40: 20 69 6e 74 20 6e 43 72 61 73 68 46 69 6c 65 2c   int nCrashFile,
6b50: 20 69 44 63 2c 20 69 53 65 63 74 6f 72 53 69 7a   iDc, iSectorSiz
6b60: 65 3b 0a 0a 20 20 69 44 63 20 3d 20 2d 31 3b 0a  e;..  iDc = -1;.
6b70: 20 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20    iSectorSize = 
6b80: 2d 31 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c  -1;..  if( objc<
6b90: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
6ba0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6bb0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4f 50 54  , 1, objv, "?OPT
6bc0: 49 4f 4e 53 3f 20 44 45 4c 41 59 20 43 52 41 53  IONS? DELAY CRAS
6bd0: 48 46 49 4c 45 22 29 3b 0a 20 20 20 20 67 6f 74  HFILE");.    got
6be0: 6f 20 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o error;.  }..  
6bf0: 7a 43 72 61 73 68 46 69 6c 65 20 3d 20 54 63 6c  zCrashFile = Tcl
6c00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
6c10: 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 2c 20  j(objv[objc-1], 
6c20: 26 6e 43 72 61 73 68 46 69 6c 65 29 3b 0a 20 20  &nCrashFile);.  
6c30: 69 66 28 20 6e 43 72 61 73 68 46 69 6c 65 3e 3d  if( nCrashFile>=
6c40: 73 69 7a 65 6f 66 28 67 2e 7a 43 72 61 73 68 46  sizeof(g.zCrashF
6c50: 69 6c 65 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ile) ){.    Tcl_
6c60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6c70: 65 72 70 2c 20 22 46 69 6c 65 6e 61 6d 65 20 69  erp, "Filename i
6c80: 73 20 74 6f 6f 20 6c 6f 6e 67 3a 20 5c 22 22 2c  s too long: \"",
6c90: 20 7a 43 72 61 73 68 46 69 6c 65 2c 20 22 5c 22   zCrashFile, "\"
6ca0: 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
6cb0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
6cc0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
6cd0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
6ce0: 6f 62 6a 63 2d 32 5d 2c 20 26 69 44 65 6c 61 79  objc-2], &iDelay
6cf0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  ) ){.    goto er
6d00: 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ror;.  }..  if( 
6d10: 70 72 6f 63 65 73 73 44 65 76 53 79 6d 41 72 67  processDevSymArg
6d20: 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 33  s(interp, objc-3
6d30: 2c 20 26 6f 62 6a 76 5b 31 5d 2c 20 26 69 44 63  , &objv[1], &iDc
6d40: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 20  , &iSectorSize) 
6d50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
6d60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
6d70: 69 66 28 20 69 44 63 3e 3d 30 20 29 7b 0a 20 20  if( iDc>=0 ){.  
6d80: 20 20 67 2e 69 44 65 76 69 63 65 43 68 61 72 61    g.iDeviceChara
6d90: 63 74 65 72 69 73 74 69 63 73 20 3d 20 69 44 63  cteristics = iDc
6da0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 63  ;.  }.  if( iSec
6db0: 74 6f 72 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  torSize>=0 ){.  
6dc0: 20 20 67 2e 69 53 65 63 74 6f 72 53 69 7a 65 20    g.iSectorSize 
6dd0: 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
6de0: 20 7d 0a 0a 20 20 67 2e 69 43 72 61 73 68 20 3d   }..  g.iCrash =
6df0: 20 69 44 65 6c 61 79 3b 0a 20 20 6d 65 6d 63 70   iDelay;.  memcp
6e00: 79 28 67 2e 7a 43 72 61 73 68 46 69 6c 65 2c 20  y(g.zCrashFile, 
6e10: 7a 43 72 61 73 68 46 69 6c 65 2c 20 6e 43 72 61  zCrashFile, nCra
6e20: 73 68 46 69 6c 65 2b 31 29 3b 0a 20 20 73 71 6c  shFile+1);.  sql
6e30: 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e 61  ite3CrashTestEna
6e40: 62 6c 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  ble = 1;.  retur
6e50: 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 65 72 72 6f 72  n TCL_OK;..error
6e60: 3a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  :.  return TCL_E
6e70: 52 52 4f 52 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RROR;.}..static 
6e80: 69 6e 74 20 64 65 76 53 79 6d 4f 62 6a 43 6d 64  int devSymObjCmd
6e90: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
6ea0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
6eb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
6ec0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
6ed0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
6ee0: 0a 29 7b 0a 20 20 76 6f 69 64 20 64 65 76 73 79  .){.  void devsy
6ef0: 6d 5f 72 65 67 69 73 74 65 72 28 69 6e 74 20 69  m_register(int i
6f00: 44 65 76 69 63 65 43 68 61 72 2c 20 69 6e 74 20  DeviceChar, int 
6f10: 69 53 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  iSectorSize);.. 
6f20: 20 69 6e 74 20 69 44 63 20 3d 20 2d 31 3b 0a 20   int iDc = -1;. 
6f30: 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65   int iSectorSize
6f40: 20 3d 20 2d 31 3b 0a 0a 20 20 69 66 28 20 70 72   = -1;..  if( pr
6f50: 6f 63 65 73 73 44 65 76 53 79 6d 41 72 67 73 28  ocessDevSymArgs(
6f60: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20  interp, objc-1, 
6f70: 26 6f 62 6a 76 5b 31 5d 2c 20 26 69 44 63 2c 20  &objv[1], &iDc, 
6f80: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 20 29 7b  &iSectorSize) ){
6f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6fa0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 65 76  ERROR;.  }.  dev
6fb0: 73 79 6d 5f 72 65 67 69 73 74 65 72 28 69 44 63  sym_register(iDc
6fc0: 2c 20 69 53 65 63 74 6f 72 53 69 7a 65 29 3b 0a  , iSectorSize);.
6fd0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
6fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
6ff0: 64 3a 20 72 65 67 69 73 74 65 72 5f 6a 74 5f 76  d: register_jt_v
7000: 66 73 20 3f 2d 64 65 66 61 75 6c 74 3f 20 50 41  fs ?-default? PA
7010: 52 45 4e 54 2d 56 46 53 0a 2a 2f 0a 73 74 61 74  RENT-VFS.*/.stat
7020: 69 63 20 69 6e 74 20 6a 74 4f 62 6a 43 6d 64 28  ic int jtObjCmd(
7030: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
7040: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
7050: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
7060: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
7070: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
7080: 29 7b 0a 20 20 69 6e 74 20 6a 74 5f 72 65 67 69  ){.  int jt_regi
7090: 73 74 65 72 28 63 68 61 72 20 2a 2c 20 69 6e 74  ster(char *, int
70a0: 29 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65  );.  char *zPare
70b0: 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  nt = 0;..  if( o
70c0: 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
70d0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
70e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
70f0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 64 65  , 1, objv, "?-de
7100: 66 61 75 6c 74 3f 20 50 41 52 45 4e 54 2d 56 46  fault? PARENT-VF
7110: 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  S");.    return 
7120: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
7130: 20 7a 50 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47   zParent = Tcl_G
7140: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
7150: 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  );.  if( objc==3
7160: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
7170: 6d 70 28 7a 50 61 72 65 6e 74 2c 20 22 2d 64 65  mp(zParent, "-de
7180: 66 61 75 6c 74 22 29 20 29 7b 0a 20 20 20 20 20  fault") ){.     
7190: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
71a0: 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
71b0: 20 20 20 20 20 22 62 61 64 20 6f 70 74 69 6f 6e       "bad option
71c0: 20 5c 22 22 2c 20 7a 50 61 72 65 6e 74 2c 20 22   \"", zParent, "
71d0: 5c 22 3a 20 6d 75 73 74 20 62 65 20 2d 64 65 66  \": must be -def
71e0: 61 75 6c 74 22 2c 20 30 0a 20 20 20 20 20 20 29  ault", 0.      )
71f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
7200: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7210: 20 20 20 20 7a 50 61 72 65 6e 74 20 3d 20 54 63      zParent = Tc
7220: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
7230: 5b 32 5d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  [2]);.  }..  if(
7240: 20 21 28 2a 7a 50 61 72 65 6e 74 29 20 29 7b 0a   !(*zParent) ){.
7250: 20 20 20 20 7a 50 61 72 65 6e 74 20 3d 20 30 3b      zParent = 0;
7260: 0a 20 20 7d 0a 20 20 69 66 28 20 6a 74 5f 72 65  .  }.  if( jt_re
7270: 67 69 73 74 65 72 28 7a 50 61 72 65 6e 74 2c 20  gister(zParent, 
7280: 6f 62 6a 63 3d 3d 33 29 20 29 7b 0a 20 20 20 20  objc==3) ){.    
7290: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
72a0: 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 20  (interp, "Error 
72b0: 69 6e 20 6a 74 5f 72 65 67 69 73 74 65 72 22 2c  in jt_register",
72c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
72e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
72f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
7300: 3a 20 75 6e 72 65 67 69 73 74 65 72 5f 6a 74 5f  : unregister_jt_
7310: 76 66 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  vfs.*/.static in
7320: 74 20 6a 74 55 6e 72 65 67 69 73 74 65 72 4f 62  t jtUnregisterOb
7330: 6a 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  jCmd(.  void * c
7340: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
7350: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7360: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
7370: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
7380: 6a 76 5b 5d 0a 29 7b 0a 20 20 76 6f 69 64 20 6a  jv[].){.  void j
7390: 74 5f 75 6e 72 65 67 69 73 74 65 72 28 76 6f 69  t_unregister(voi
73a0: 64 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  d);..  if( objc!
73b0: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
73c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
73d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
73e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
73f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 6a 74  ERROR;.  }..  jt
7400: 5f 75 6e 72 65 67 69 73 74 65 72 28 29 3b 0a 20  _unregister();. 
7410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7420: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
7430: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
7440: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70  */../*.** This p
7450: 72 6f 63 65 64 75 72 65 20 72 65 67 69 73 74 65  rocedure registe
7460: 72 73 20 74 68 65 20 54 43 4c 20 70 72 6f 63 65  rs the TCL proce
7470: 64 75 72 65 73 20 64 65 66 69 6e 65 64 20 69 6e  dures defined in
7480: 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a 69   this file..*/.i
7490: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 36 5f 49  nt Sqlitetest6_I
74a0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
74b0: 69 6e 74 65 72 70 29 7b 0a 23 69 66 6e 64 65 66  interp){.#ifndef
74c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
74d0: 4b 49 4f 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  KIO.  Tcl_Create
74e0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
74f0: 70 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 61 73  p, "sqlite3_cras
7500: 68 5f 65 6e 61 62 6c 65 22 2c 20 63 72 61 73 68  h_enable", crash
7510: 45 6e 61 62 6c 65 43 6d 64 2c 20 30 2c 20 30 29  EnableCmd, 0, 0)
7520: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
7530: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
7540: 20 22 73 71 6c 69 74 65 33 5f 63 72 61 73 68 70   "sqlite3_crashp
7550: 61 72 61 6d 73 22 2c 20 63 72 61 73 68 50 61 72  arams", crashPar
7560: 61 6d 73 4f 62 6a 43 6d 64 2c 20 30 2c 20 30 29  amsObjCmd, 0, 0)
7570: 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62  ;.  Tcl_CreateOb
7580: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
7590: 20 22 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61   "sqlite3_simula
75a0: 74 65 5f 64 65 76 69 63 65 22 2c 20 64 65 76 53  te_device", devS
75b0: 79 6d 4f 62 6a 43 6d 64 2c 20 30 2c 20 30 29 3b  ymObjCmd, 0, 0);
75c0: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  .  Tcl_CreateObj
75d0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
75e0: 22 72 65 67 69 73 74 65 72 5f 6a 74 5f 76 66 73  "register_jt_vfs
75f0: 22 2c 20 6a 74 4f 62 6a 43 6d 64 2c 20 30 2c 20  ", jtObjCmd, 0, 
7600: 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
7610: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
7620: 70 2c 20 22 75 6e 72 65 67 69 73 74 65 72 5f 6a  p, "unregister_j
7630: 74 5f 76 66 73 22 2c 20 6a 74 55 6e 72 65 67 69  t_vfs", jtUnregi
7640: 73 74 65 72 4f 62 6a 43 6d 64 2c 20 30 2c 20 30  sterObjCmd, 0, 0
7650: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
7660: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65  rn TCL_OK;.}..#e
7670: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7680: 45 53 54 20 2a 2f 0a                             EST */.