/ Hex Artifact Content
Login

Artifact a721d5d9002c4811c48c197cf3d38ba6a0d8f7c6:


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 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ce0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0cf0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0d00: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0d10: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0d20: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0d40: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0d50: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0d60: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d70: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0d80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0d90: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0da0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0db0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69  >.# include <uui
0dc0: 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 6e 63 6c  d/uuid.h>.# incl
0dd0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0de0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0df0: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0e00: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0e10: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0e20: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
0e30: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
0e40: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
0e50: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0e60: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45         (__IPHONE
0e90: 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  _OS_VERSION_MIN_
0ea0: 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29  REQUIRED > 2000)
0eb0: 29 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65  ).#  if (!define
0ec0: 64 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45  d(TARGET_OS_EMBE
0ed0: 44 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54  DDED) || (TARGET
0ee0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29  _OS_EMBEDDED==0)
0ef0: 29 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21  ) \.       && (!
0f00: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49  defined(TARGET_I
0f10: 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29  PHONE_SIMULATOR)
0f20: 20 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f   || (TARGET_IPHO
0f30: 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29  NE_SIMULATOR==0)
0f40: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41  ).#    define HA
0f50: 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31  VE_GETHOSTUUID 1
0f60: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61  .#  else.#    wa
0f70: 72 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75  rning "gethostuu
0f80: 69 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  id() is disabled
0f90: 2e 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .".#  endif.#end
0fa0: 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  if...#if OS_VXWO
0fb0: 52 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  RKS.# include <s
0fc0: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e  ys/ioctl.h>.# in
0fd0: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
0fe0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c  .h>.# include <l
0ff0: 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20  imits.h>.#endif 
1000: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1010: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1020: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
1030: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1040: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
1050: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
1060: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
1070: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
1080: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
1090: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
10a0: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
10b0: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
10c0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
10d0: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
10e0: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
10f0: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
1100: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
1110: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
1120: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
1130: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
1140: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1150: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
1160: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
1170: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
1180: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
1190: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
11a0: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
11b0: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
11c0: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
11d0: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
11e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11f0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1200: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
1210: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
1220: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
1230: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
1240: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1250: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1260: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1270: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
1280: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
1290: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
12a0: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
12b0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
12c0: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
12d0: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
12e0: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
12f0: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
1300: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
1310: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
1320: 32 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  2../*.** Maximum
1330: 20 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f   supported symbo
1340: 6c 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65  lic links.*/.#de
1350: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f  fine SQLITE_MAX_
1360: 53 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a  SYMLINKS 100../*
1370: 20 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65   Always cast the
1380: 20 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e   getpid() return
1390: 20 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74   type for compat
13a0: 69 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20  ibility with.** 
13b0: 6b 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69  kernel modules i
13c0: 6e 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64  n VxWorks. */.#d
13d0: 65 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58  efine osGetpid(X
13e0: 29 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28  ) (pid_t)getpid(
13f0: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65  )../*.** Only se
1400: 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  t the lastErrno 
1410: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
1420: 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f  e is a real erro
1430: 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20  r and not .** a 
1440: 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20  normal expected 
1450: 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53  return code of S
1460: 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51  QLITE_BUSY or SQ
1470: 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69  LITE_OK.*/.#defi
1480: 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  ne IS_LOCK_ERROR
1490: 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49  (x)  ((x != SQLI
14a0: 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20  TE_OK) && (x != 
14b0: 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f  SQLITE_BUSY))../
14c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
14d0: 6e 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  nces */.typedef 
14e0: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
14f0: 6e 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20  nixShm;         
1500: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1510: 69 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ion shared memor
1520: 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  y */.typedef str
1530: 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
1540: 75 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20  unixShmNode;    
1550: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1560: 6f 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a  ory instance */.
1570: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
1580: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69  nixInodeInfo uni
1590: 78 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a  xInodeInfo;   /*
15a0: 20 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79   An i-node */.ty
15b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69  pedef struct Uni
15c0: 78 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e  xUnusedFd UnixUn
15d0: 75 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41  usedFd;     /* A
15e0: 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
15f0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a  scriptor */../*.
1600: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66  ** Sometimes, af
1610: 74 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c  ter a file handl
1620: 65 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53  e is closed by S
1630: 51 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20  QLite, the file 
1640: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61  descriptor.** ca
1650: 6e 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69  nnot be closed i
1660: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74  mmediately. In t
1670: 68 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74  hese cases, inst
1680: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c  ances of the fol
1690: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
16a0: 75 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20  ure are used to 
16b0: 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64  store the file d
16c0: 65 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20  escriptor while 
16d0: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a  waiting for an.*
16e0: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
16f0: 20 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72   either close or
1700: 20 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74   reuse it..*/.st
1710: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
1720: 64 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  d {.  int fd;   
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1750: 6f 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20  or to close */. 
1760: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
1770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
1780: 61 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65  ags this file de
1790: 73 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65  scriptor was ope
17a0: 6e 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e  ned with */.  Un
17b0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78  ixUnusedFd *pNex
17c0: 74 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  t;      /* Next 
17d0: 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
17e0: 72 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66  riptor on same f
17f0: 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ile */.};../*.**
1800: 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   The unixFile st
1810: 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c  ructure is subcl
1820: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1830: 69 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20  ile specific to 
1840: 74 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20  the unix.** VFS 
1850: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e  implementations.
1860: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1870: 63 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78  ct unixFile unix
1880: 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69  File;.struct uni
1890: 78 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65  xFile {.  sqlite
18a0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e  3_io_methods con
18b0: 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a  st *pMethod;  /*
18c0: 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   Always the firs
18d0: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  t entry */.  sql
18e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74   /* The VFS that
1910: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e   created this un
1920: 69 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  ixFile */.  unix
1930: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
1940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1950: 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f  /* Info about lo
1960: 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  cks on this inod
1970: 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19b0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
19c0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19e0: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68  e type of lock h
19f0: 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a  eld on this fd *
1a00: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f  /.  unsigned sho
1a10: 72 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  rt int ctrlFlags
1a20: 3b 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76  ;       /* Behav
1a30: 69 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49  ioral bits.  UNI
1a40: 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
1a50: 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f  .  int lastErrno
1a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
1a80: 69 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61  ix errno from la
1a90: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1aa0: 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43    void *lockingC
1ab0: 6f 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20  ontext;         
1ac0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1ad0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1ae0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1af0: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b10: 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20  * Pre-allocated 
1b20: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a  UnixUnusedFd */.
1b30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1b40: 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
1b50: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b60: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
1b70: 6e 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20  nixShm *pShm;   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
1ba0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f  ory segment info
1bb0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rmation */.  int
1bc0: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62   /* Configured b
1bf0: 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  y FCNTL_CHUNK_SI
1c00: 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ZE */.#if SQLITE
1c10: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1c20: 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74  .  int nFetchOut
1c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c50: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1c60: 78 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20  xFetch refs */. 
1c70: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1c80: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mapSize;        
1c90: 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73       /* Usable s
1ca0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1cb0: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1cc0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1cd0: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
1ce0: 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20        /* Actual 
1cf0: 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  size of mapping 
1d00: 61 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f  at pMapRegion */
1d10: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d20: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
1d30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
1d40: 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f  ured FCNTL_MMAP_
1d50: 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20  SIZE value */.  
1d60: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
1d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d80: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
1d90: 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23  pped region */.#
1da0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 51  endif.#ifdef __Q
1db0: 4e 58 4e 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65  NXNTO__.  int se
1dc0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1de0: 20 44 65 76 69 63 65 20 73 65 63 74 6f 72 20 73   Device sector s
1df0: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76  ize */.  int dev
1e00: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1e10: 63 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  cs;          /* 
1e20: 50 72 65 63 6f 6d 70 75 74 65 64 20 64 65 76 69  Precomputed devi
1e30: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1e40: 63 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  cs */.#endif.#if
1e50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1e60: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1e70: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1e80: 5f 29 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  _).  int openFla
1e90: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb0: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1ec0: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ed0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ee0: 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1ef0: 43 54 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74  CTION.  int prot
1f00: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1f20: 61 74 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66  ata protection f
1f30: 6c 61 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70  lags from unixOp
1f40: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  en */.#endif.#if
1f50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1f60: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20  OCKING_STYLE || 
1f70: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1f80: 5f 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73  _).  unsigned fs
1f90: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68           /* cach
1fb0: 65 64 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20  ed details from 
1fc0: 73 74 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64  statfs() */.#end
1fd0: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
1fe0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
1ff0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
2000: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75          /* Uniqu
2010: 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e  e file ID */.#en
2020: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2030: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
2040: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76   next group of v
2050: 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65  ariables are use
2060: 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68  d to track wheth
2070: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20  er or not the.  
2080: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
2090: 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20  ounter in bytes 
20a0: 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73  24-27 of databas
20b0: 65 20 66 69 6c 65 73 20 61 72 65 20 75 70 64 61  e files are upda
20c0: 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65  ted.  ** wheneve
20d0: 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  r any part of th
20e0: 65 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  e database chang
20f0: 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f  es.  An assertio
2100: 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a  n fault will.  *
2110: 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c  * occur if a fil
2120: 65 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  e is updated wit
2130: 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69  hout also updati
2140: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
2150: 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e  on.  ** counter.
2160: 20 20 54 68 69 73 20 74 65 73 74 20 69 73 20 6d    This test is m
2170: 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77  ade to avoid new
2180: 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61   problems simila
2190: 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e  r to the.  ** on
21a0: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
21b0: 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20  icket #3584. .  
21c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
21d0: 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  ar transCntrChng
21e0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ;   /* True if t
21f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
2200: 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a  ounter changed *
2210: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2220: 72 20 64 62 55 70 64 61 74 65 3b 20 20 20 20 20  r dbUpdate;     
2230: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2240: 79 20 70 61 72 74 20 6f 66 20 64 61 74 61 62 61  y part of databa
2250: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20  se file changed 
2260: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2270: 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  ar inNormalWrite
2280: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69  ;   /* True if i
2290: 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  n a normal write
22a0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23   operation */..#
22b0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
22c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49  LITE_TEST.  /* I
22d0: 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63  n test mode, inc
22e0: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
22f0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2300: 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a   a bit so that .
2310: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
2320: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63  r than the struc
2330: 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69  t CrashFile defi
2340: 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a  ned in test6.c..
2350: 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64    */.  char aPad
2360: 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66  ding[32];.#endif
2370: 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72  .};../* This var
2380: 69 61 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20  iable holds the 
2390: 70 72 6f 63 65 73 73 20 69 64 20 28 70 69 64 29  process id (pid)
23a0: 20 66 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78   from when the x
23b0: 52 61 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20  Randomness().** 
23c0: 6d 65 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65  method was calle
23d0: 64 2e 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69  d.  If xOpen() i
23e0: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20  s called from a 
23f0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2400: 73 20 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  s id,.** indicat
2410: 69 6e 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28  ing that a fork(
2420: 29 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  ) has occurred, 
2430: 74 68 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65  the PRNG will be
2440: 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
2450: 63 20 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65  c pid_t randomne
2460: 73 73 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ssPid = 0;../*.*
2470: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
2480: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c   for the unixFil
2490: 65 2e 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d  e.ctrlFlags bitm
24a0: 61 73 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask:.*/.#define 
24b0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20  UNIXFILE_EXCL   
24c0: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a       0x01     /*
24d0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   Connections fro
24e0: 6d 20 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e  m one process on
24f0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ly */.#define UN
2500: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  IXFILE_RDONLY   
2510: 20 20 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43     0x02     /* C
2520: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61  onnection is rea
2530: 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e  d only */.#defin
2540: 65 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  e UNIXFILE_PERSI
2550: 53 54 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20  ST_WAL 0x04     
2560: 2f 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41  /* Persistent WA
2570: 4c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  L mode */.#ifnde
2580: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2590: 5f 44 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e  _DIRSYNC.# defin
25a0: 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  e UNIXFILE_DIRSY
25b0: 4e 43 20 20 20 20 30 78 30 38 20 20 20 20 20 2f  NC    0x08     /
25c0: 2a 20 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63  * Directory sync
25d0: 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65   needed */.#else
25e0: 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49  .# define UNIXFI
25f0: 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78  LE_DIRSYNC    0x
2600: 30 30 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  00.#endif.#defin
2610: 65 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  e UNIXFILE_PSOW 
2620: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 20 20         0x10     
2630: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
2640: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2650: 49 54 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ITE */.#define U
2660: 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20  NIXFILE_DELETE  
2670: 20 20 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20      0x20     /* 
2680: 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  Delete on close 
2690: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
26a0: 49 4c 45 5f 55 52 49 20 20 20 20 20 20 20 20 20  ILE_URI         
26b0: 30 78 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65  0x40     /* File
26c0: 6e 61 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20  name might have 
26d0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
26e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
26f0: 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20  FILE_NOLOCK     
2700: 20 30 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20   0x80     /* Do 
2710: 6e 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  no file locking 
2720: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  */../*.** Includ
2730: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
2740: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
2750: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
2760: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
2770: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e  .h"../*.** Defin
2780: 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73  e various macros
2790: 20 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e   that are missin
27a0: 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74  g from some syst
27b0: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
27c0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
27d0: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
27e0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   0.#endif.#ifdef
27f0: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2800: 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41  LFS.# undef O_LA
2810: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
2820: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
2830: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2840: 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e  NOFOLLOW.# defin
2850: 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23  e O_NOFOLLOW 0.#
2860: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f  endif.#ifndef O_
2870: 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20  BINARY.# define 
2880: 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69  O_BINARY 0.#endi
2890: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
28a0: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
28b0: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
28c0: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
28d0: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
28e0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
28f0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53  g only..*/.#if S
2900: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2910: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
2920: 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  d pthread_self()
2930: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74  .#else.#define t
2940: 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66  hreadid 0.#endif
2950: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
2960: 5f 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  __.#define SQLIT
2970: 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f  E_ENABLE_SUPERLO
2980: 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66  CK 1.#endif..#if
2990: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
29a0: 55 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64  UPERLOCK.#includ
29b0: 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69  e "sqlite3.h".#i
29c0: 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68  nclude <string.h
29d0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  >.#include <asse
29e0: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  rt.h>../*.** A s
29f0: 74 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c  tructure to coll
2a00: 65 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c  ect a busy-handl
2a10: 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  er callback and 
2a20: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63  argument and a c
2a30: 6f 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  ount.** of the n
2a40: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69  umber of times i
2a50: 74 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b  t has been invok
2a60: 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75  ed..*/.struct Su
2a70: 70 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20  perlockBusy {.  
2a80: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
2a90: 64 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20  d*,int);        
2aa0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2ab0: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2ac0: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
2ad0: 42 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20  BusyArg;        
2ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2af0: 74 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f  t arg to pass to
2b00: 20 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20   xBusy */.  int 
2b10: 6e 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20  nBusy;          
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b30: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78  umber of times x
2b40: 42 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e  Busy has been in
2b50: 76 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  voked */.};.type
2b60: 64 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72  def struct Super
2b70: 6c 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f  lockBusy Superlo
2b80: 63 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ckBusy;../*.** A
2b90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2ba0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2bb0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2bc0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
2bd0: 76 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e  ve.** superlock.
2be0: 20 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64   The opaque hand
2bf0: 6c 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  le returned by s
2c00: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
2c10: 6c 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74  lock() is.** act
2c20: 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
2c30: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
2c40: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2c50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65  ..*/.struct Supe
2c60: 72 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65  rlock {.  sqlite
2c70: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
2c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2c90: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65  abase handle use
2ca0: 64 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a  d to lock db */.
2cb0: 20 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20    int bWal;     
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20    /* True if db 
2ce0: 69 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  is a WAL databas
2cf0: 65 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  e */.};.typedef 
2d00: 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b  struct Superlock
2d10: 20 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a   Superlock;../*.
2d20: 2a 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e  ** The pCtx poin
2d30: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  ter passed to th
2d40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2d50: 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
2d60: 72 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c  r to a.** Superl
2d70: 6f 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72  ockBusy structur
2d80: 65 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  e. Invoke the bu
2d90: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
2da0: 69 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64  ion encapsulated
2db0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63  .** by the struc
2dc0: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
2dd0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73  the result..*/.s
2de0: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
2df0: 6f 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76  ockBusyHandler(v
2e00: 6f 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55  oid *pCtx, int U
2e10: 4e 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c  NUSED){.  Superl
2e20: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d  ockBusy *pBusy =
2e30: 20 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20   (SuperlockBusy 
2e40: 2a 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42  *)pCtx;.  if( pB
2e50: 75 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20  usy->xBusy==0 ) 
2e60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
2e70: 72 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28  rn pBusy->xBusy(
2e80: 70 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c  pBusy->pBusyArg,
2e90: 20 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29   pBusy->nBusy++)
2ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2eb0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2ec0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2ed0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2ee0: 73 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  se file for .** 
2ef0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73  connection db is
2f00: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
2f10: 65 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20  e or not. If no 
2f20: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
2f30: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2f40: 20 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20   file is in WAL 
2f50: 6d 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c  mode, set *pbWal
2f60: 20 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74   to true and ret
2f70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
2f80: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69  * If it is not i
2f90: 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20  n WAL mode, set 
2fa0: 2a 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e  *pbWal to false.
2fb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2fc0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
2fd0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
2fe0: 72 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75  r code. The valu
2ff0: 65 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69  e of *pbWal.** i
3000: 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
3010: 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
3020: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
3030: 6b 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b  kIsWal(Superlock
3040: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
3050: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
3060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3070: 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
3080: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3090: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
30a0: 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47  /* Compiled PRAG
30b0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
30c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
30d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
30e0: 70 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  pare(pLock->db, 
30f0: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75  "PRAGMA main.jou
3100: 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20  rnal_mode", -1, 
3110: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
3120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
3140: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b  pLock->bWal = 0;
3150: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
3160: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
3170: 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f  pStmt) ){.    co
3180: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20  nst char *zMode 
3190: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
31a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31b0: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
31c0: 20 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20     if( zMode && 
31d0: 73 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33  strlen(zMode)==3
31e0: 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
31f0: 69 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64  icmp("wal", zMod
3200: 65 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  e, 3)==0 ){.    
3210: 20 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20    pLock->bWal = 
3220: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
3230: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66  return sqlite3_f
3240: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
3250: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
3260: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d  an exclusive shm
3270: 2d 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62  -lock on nByte b
3280: 79 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ytes starting at
3290: 20 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f   offset idx.** o
32a0: 66 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49  f the file fd. I
32b0: 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
32c0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
32d0: 6d 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b  mediately, invok
32e0: 65 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61  e.** the busy-ha
32f0: 6e 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68  ndler until eith
3300: 65 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  er it is obtaine
3310: 64 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61  d or the busy-ha
3320: 6e 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63  ndler.** callbac
3330: 6b 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a  k returns 0..*/.
3340: 73 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72  static int super
3350: 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73  lockShmLock(.  s
3360: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3380: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
3390: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
33a0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
33c0: 66 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63  ffset of shm-loc
33d0: 6b 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20  k to obtain */. 
33e0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3410: 6e 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74  nsective bytes t
3420: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65  o lock */.  Supe
3430: 72 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79  rlockBusy *pBusy
3440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3450: 75 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70  usy-handler wrap
3460: 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  per object */.){
3470: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3480: 20 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c   (*xShmLock)(sql
3490: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c  ite3_file*, int,
34a0: 20 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d   int, int) = fd-
34b0: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
34c0: 6f 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ock;.  do {.    
34d0: 72 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64  rc = xShmLock(fd
34e0: 2c 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51  , idx, nByte, SQ
34f0: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51  LITE_SHM_LOCK|SQ
3500: 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
3510: 56 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  VE);.  }while( r
3520: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
3530: 26 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48  & superlockBusyH
3540: 61 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70  andler((void *)p
3550: 42 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65  Busy, 0) );.  re
3560: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3570: 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74  * Obtain the ext
3580: 72 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ra locks on the 
3590: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65  database file re
35a0: 71 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64  quired for WAL d
35b0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76  atabases..** Inv
35c0: 6f 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  oke the supplied
35d0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73   busy-handler as
35e0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
35f0: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
3600: 63 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c  ckWalLock(.  sql
3610: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3630: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
3640: 6f 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61  open on WAL data
3650: 62 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c  base */.  Superl
3660: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20  ockBusy *pBusy  
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73            /* Bus
3680: 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y handler wrappe
3690: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
36a0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
36d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
36e0: 65 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20  e *fd = 0;      
36f0: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74       /* Main dat
3700: 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
3710: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  e */.  void vola
3720: 74 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  tile *p = 0;    
3730: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3740: 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
3750: 6f 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  of shared memory
3760: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
3770: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3780: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f  e sqlite3_file o
3790: 62 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68  bject open on th
37a0: 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20  e main db file. 
37b0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
37c0: 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
37d0: 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  b, "main", SQLIT
37e0: 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
37f0: 4e 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66  NTER, (void *)&f
3800: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
3810: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
3820: 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69   rc;..  /* Obtai
3830: 6e 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22  n the "recovery"
3840: 20 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c   lock. Normally,
3850: 20 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e   this lock is on
3860: 6c 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20  ly obtained by. 
3870: 20 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e   ** clients runn
3880: 69 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63  ing database rec
3890: 6f 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20  overy.  .  */.  
38a0: 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68  rc = superlockSh
38b0: 6d 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20  mLock(fd, 2, 1, 
38c0: 70 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63  pBusy);.  if( rc
38d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
38e0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a  turn rc;..  /* Z
38f0: 65 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66  ero the start of
3900: 20 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65   the first share
3910: 64 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54  d-memory page. T
3920: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
3930: 6e 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20  ny.  ** clients 
3940: 74 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f  that open read o
3950: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
3960: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70  ions from this p
3970: 6f 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a  oint on will.  *
3980: 2a 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65  * have to run re
3990: 63 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72  covery before pr
39a0: 6f 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20  oceeding. Since 
39b0: 74 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72  they need the "r
39c0: 65 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f  ecovery".  ** lo
39d0: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  ck that this pro
39e0: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
39f0: 74 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e  to do that, no n
3a00: 65 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ew read or write
3a10: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
3a20: 6e 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70  ns may now be op
3a30: 65 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20  ened. Nor can a 
3a40: 63 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75  checkpoint be ru
3a50: 6e 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  n, for the.  ** 
3a60: 73 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a  same reason..  *
3a70: 2f 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65  /.  rc = fd->pMe
3a80: 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66  thods->xShmMap(f
3a90: 64 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31  d, 0, 32*1024, 1
3aa0: 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21  , &p);.  if( rc!
3ab0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3ac0: 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
3ad0: 28 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33  ((void *)p, 0, 3
3ae0: 32 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  2);..  /* Obtain
3af0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
3b00: 20 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61   on all the "rea
3b10: 64 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f  d-lock" slots. O
3b20: 6e 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a  nce these locks.
3b30: 20 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69    ** are held, i
3b40: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
3b50: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
3b60: 6f 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c  o active reader,
3b70: 20 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a   writer or .  **
3b80: 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c   checkpointer cl
3b90: 69 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  ients..  */.  rc
3ba0: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c   = superlockShmL
3bb0: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3bc0: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70  E_SHM_NLOCK-3, p
3bd0: 42 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  Busy);.  return 
3be0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
3bf0: 65 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b  ease a superlock
3c00: 20 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62   held on a datab
3c10: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
3c20: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
3c30: 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69   .** this functi
3c40: 6f 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  on must have bee
3c50: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
3c60: 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
3c70: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64  l to.** sqlite3d
3c80: 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e  emo_superlock().
3c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3ca0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
3cb0: 72 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c  runlock(void *pL
3cc0: 6f 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63  ock){.  Superloc
3cd0: 6b 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63  k *p = (Superloc
3ce0: 6b 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28  k *)pLock;.  if(
3cf0: 20 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20   p->bWal ){.    
3d00: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3d30: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  /.    int flags 
3d40: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  = SQLITE_SHM_UNL
3d50: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
3d60: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
3d70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3d80: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
3d90: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
3da0: 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e  rol(p->db, "main
3db0: 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ", SQLITE_FCNTL_
3dc0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20  FILE_POINTER,.  
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
3df0: 20 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28   *)&fd);.    if(
3e00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3e10: 7b 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74  {.      fd->pMet
3e20: 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66  hods->xShmLock(f
3e30: 64 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b  d, 2, 1, flags);
3e40: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3e50: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3e60: 2c 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  , 3, SQLITE_SHM_
3e70: 4e 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b  NLOCK-3, flags);
3e80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3e90: 69 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62  ite3_close(p->db
3ea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3eb0: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  e(p);.}../*.** O
3ec0: 62 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63  btain a superloc
3ed0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
3ee0: 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65  e file identifie
3ef0: 64 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e  d by zPath, usin
3f00: 67 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  g the.** locking
3f10: 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
3f20: 69 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73  ided by VFS zVfs
3f30: 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
3f40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
3f50: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75   returned and ou
3f60: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
3f70: 70 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74  pLock is populat
3f80: 65 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75  ed with an opaqu
3f90: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74  e handle.** that
3fa0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
3fb0: 68 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  h sqlite3demo_su
3fc0: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72  perunlock() to r
3fd0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e  elease the lock.
3fe0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
3ff0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f  or occurs, *ppLo
4000: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ck is set to 0 a
4010: 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  nd an SQLite err
4020: 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67  or code .** (e.g
4030: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69  . SQLITE_BUSY) i
4040: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
4050: 2a 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20  * If a required 
4060: 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
4070: 62 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74  btained immediat
4080: 65 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73  ely and the xBus
4090: 79 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74  y parameter.** t
40a0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
40b0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
40c0: 6e 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b  n xBusy is invok
40d0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
40e0: 61 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d  ay.** as a busy-
40f0: 68 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72  handler register
4100: 65 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28  ed with SQLite (
4110: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75  using sqlite3_bu
4120: 73 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a  sy_handler()).**
4130: 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68   until either th
4140: 65 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62  e lock can be ob
4150: 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75  tained or the bu
4160: 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
4170: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30  ion returns.** 0
4180: 20 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69   (indicating "gi
4190: 76 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74  ve up")..*/.stat
41a0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65  ic int sqlite3de
41b0: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20  mo_superlock(.  
41c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
41d0: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
41e0: 2f 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62  /* Path to datab
41f0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b  ase file to lock
4200: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4210: 20 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20   *zVfs,         
4220: 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
4230: 75 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  use to access da
4240: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4250: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4270: 20 41 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67   Additional flag
4280: 73 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c  s to pass to sql
4290: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a  ite3_open_v2 */.
42a0: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
42b0: 6f 69 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20  oid*,int),      
42c0: 20 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65    /* Busy handle
42d0: 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  r callback */.  
42e0: 76 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20  void *pBusyArg, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66  /* Context arg f
4310: 6f 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  or busy handler 
4320: 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f  */.  void **ppLo
4330: 63 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ck              
4340: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e       /* OUT: Con
4350: 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
4360: 73 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f  superunlock() */
4370: 0a 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42  .){.  SuperlockB
4380: 75 73 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30  usy busy = {0, 0
4390: 2c 20 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61  , 0}; /* Busy ha
43a0: 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62  ndler wrapper ob
43b0: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
43c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
43e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75  urn code */.  Su
43f0: 70 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a  perlock *pLock;.
4400: 0a 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  .  pLock = sqlit
4410: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
4420: 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20  (Superlock));.  
4430: 69 66 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74  if( !pLock ) ret
4440: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4450: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b  ;.  memset(pLock
4460: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65  , 0, sizeof(Supe
4470: 72 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f  rlock));..  /* O
4480: 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 68  pen a database h
4490: 61 6e 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c  andle on the fil
44a0: 65 20 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e to superlock. 
44b0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
44c0: 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20  3_open_v2(.     
44d0: 20 7a 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e   zPath, &pLock->
44e0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  db, SQLITE_OPEN_
44f0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
4500: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61  _OPEN_CREATE|fla
4510: 67 73 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20  gs, zVfs.  );.. 
4520: 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75   /* Install a bu
4530: 73 79 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65  sy-handler and e
4540: 78 65 63 75 74 65 20 61 20 42 45 47 49 4e 20 45  xecute a BEGIN E
4550: 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69  XCLUSIVE. If thi
4560: 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20  s is not.  ** a 
4570: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
4580: 69 73 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65  is is all we nee
4590: 64 20 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a  d to do.  .  **.
45a0: 20 20 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66    ** A wrapper f
45b0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
45c0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  to invoke the bu
45d0: 73 79 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65  sy-handler inste
45e0: 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73  ad of.  ** regis
45f0: 74 65 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d  tering the busy-
4600: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
4610: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
4620: 20 75 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20   user directly. 
4630: 20 2a 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e   ** with SQLite.
4640: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
4650: 20 74 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68   the same busy-h
4660: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
4670: 6d 61 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f  may be.  ** invo
4680: 6b 65 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74  ked directly lat
4690: 65 72 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d  er on when attem
46a0: 70 74 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20  pting to obtain 
46b0: 74 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a  the extra locks.
46c0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e    ** required in
46d0: 20 57 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73   WAL mode. By us
46e0: 69 6e 67 20 74 68 65 20 77 72 61 70 70 65 72 2c  ing the wrapper,
46f0: 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
4700: 67 75 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74  guarantee.  ** t
4710: 68 61 74 20 74 68 65 20 22 6e 42 75 73 79 22 20  hat the "nBusy" 
4720: 69 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74 65  integer paramete
4730: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  r passed to the 
4740: 75 73 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c  users busy-handl
4750: 65 72 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  er.  ** represen
4760: 74 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ts the total num
4770: 62 65 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64  ber of busy-hand
4780: 6c 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  ler invocations 
4790: 6d 61 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a  made within.  **
47a0: 20 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71   this call to sq
47b0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
47c0: 6f 63 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67  ock(), including
47d0: 20 61 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67   any made during
47e0: 20 74 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e   the.  ** "BEGIN
47f0: 20 45 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a   EXCLUSIVE"..  *
4800: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
4810: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73  TE_OK ){.    bus
4820: 79 2e 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b  y.xBusy = xBusy;
4830: 0a 20 20 20 20 62 75 73 79 2e 70 42 75 73 79 41  .    busy.pBusyA
4840: 72 67 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20  rg = pBusyArg;. 
4850: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
4860: 68 61 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64  handler(pLock->d
4870: 62 2c 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79  b, superlockBusy
4880: 48 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a  Handler, (void *
4890: 29 26 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20  )&busy);.    rc 
48a0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
48b0: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e  Lock->db, "BEGIN
48c0: 20 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20   EXCLUSIVE", 0, 
48d0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
48e0: 20 49 66 20 74 68 65 20 42 45 47 49 4e 20 45 58   If the BEGIN EX
48f0: 43 4c 55 53 49 56 45 20 77 61 73 20 65 78 65 63  CLUSIVE was exec
4900: 75 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  uted successfull
4910: 79 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  y and this is a 
4920: 57 41 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  WAL.  ** databas
4930: 65 2c 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63  e, call superloc
4940: 6b 57 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  kWalLock() to ob
4950: 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c  tain the extra l
4960: 6f 63 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20  ocks required.  
4970: 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  ** to prevent re
4980: 61 64 65 72 73 2c 20 77 72 69 74 65 72 73 20 61  aders, writers a
4990: 6e 64 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  nd/or checkpoint
49a0: 65 72 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ers from accessi
49b0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77  ng the.  ** db w
49c0: 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
49d0: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
49e0: 20 73 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a   superlock..  **
49f0: 0a 20 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74  .  ** Before att
4a00: 65 6d 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20  empting any WAL 
4a10: 6c 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68  locks, commit th
4a20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
4a30: 61 72 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a  arted above.  **
4a40: 20 74 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c   to drop the WAL
4a50: 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
4a60: 6c 6f 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20  locks currently 
4a70: 68 65 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  held. Otherwise,
4a80: 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41   the.  ** new WA
4a90: 4c 20 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66  L locks may conf
4aa0: 6c 69 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c  lict with the ol
4ab0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
4ac0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4ad0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
4ae0: 3d 3d 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63  ==(rc = superloc
4af0: 6b 49 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26  kIsWal(pLock)) &
4b00: 26 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b  & pLock->bWal ){
4b10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
4b20: 74 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e  te3_exec(pLock->
4b30: 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
4b40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
4b50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4b60: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
4b70: 73 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b  superlockWalLock
4b80: 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73  (pLock->db, &bus
4b90: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
4ba0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
4bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4bc0: 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
4bd0: 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
4be0: 3b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20  ;.    *ppLock = 
4bf0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
4c00: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
4c10: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4c20: 63 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75  c;.}../* A corru
4c30: 70 74 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b  pt DB won't work
4c40: 20 77 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61   with the sql-ba
4c50: 73 65 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65  sed locking atte
4c60: 6d 70 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a  mpt, grab an .**
4c70: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
4c80: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
4c90: 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42  E_OK or SQLITE_B
4ca0: 55 53 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  USY if the lock 
4cb0: 66 61 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e  fails .** return
4cc0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  s the current lo
4cd0: 63 6b 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e  ck level held on
4ce0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f   sqlite3_file.*/
4cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4d00: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
4d10: 6b 5f 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c  k_corrupt(.  sql
4d20: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20  ite3_file *id,. 
4d30: 20 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65   int eTargetFile
4d40: 4c 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69  Lock,.  int *pFi
4d50: 6c 65 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78  leLock.){.  unix
4d60: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
4d70: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
4d80: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70  nt eFileLock = p
4d90: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
4da0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4db0: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4dc0: 65 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65  eFileLock<eTarge
4dd0: 74 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  tFileLock ){.   
4de0: 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65   rc = pFile->pMe
4df0: 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20  thod->xLock(id, 
4e00: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52  SQLITE_LOCK_SHAR
4e10: 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ED);.  }.  if( !
4e20: 72 63 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43  rc && SQLITE_LOC
4e30: 4b 5f 53 48 41 52 45 44 3c 65 54 61 72 67 65 74  K_SHARED<eTarget
4e40: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4e50: 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
4e60: 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
4e70: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
4e80: 53 49 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28  SIVE);.  }.  if(
4e90: 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70   rc ){.    if( p
4ea0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
4eb0: 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
4ec0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74       pFile->pMet
4ed0: 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
4ee0: 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
4ef0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
4f00: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c  ;.  }.  if (pFil
4f10: 65 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46  eLock) {.    *pF
4f20: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
4f30: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ock;.  }.  retur
4f40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4f50: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4f60: 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f  e3demo_superunlo
4f70: 63 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74  ck_corrupt(sqlit
4f80: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
4f90: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
4fa0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
4fb0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
4fc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4fd0: 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
4fe0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
4ff0: 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a   > eFileLock ){.
5000: 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e      rc = pFile->
5010: 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b  pMethod->xUnlock
5020: 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
5030: 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20  _SHARED);.  }.  
5040: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
5050: 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b  Lock > eFileLock
5060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f   ){.    int unlo
5070: 63 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d  ckRC = pFile->pM
5080: 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
5090: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e  d, SQLITE_LOCK_N
50a0: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72  ONE);.    if (!r
50b0: 63 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43  c) rc = unlockRC
50c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
50d0: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
50e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
50f0: 50 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a  PERLOCK */.../*.
5100: 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64  ** HAVE_MREMAP d
5110: 65 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20  efaults to true 
5120: 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c  on Linux and fal
5130: 73 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c  se everywhere el
5140: 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  se..*/.#if !defi
5150: 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29  ned(HAVE_MREMAP)
5160: 0a 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  .# if defined(__
5170: 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69  linux__) && defi
5180: 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29  ned(_GNU_SOURCE)
5190: 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f  .#  define HAVE_
51a0: 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a  MREMAP 1.# else.
51b0: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
51c0: 52 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a  REMAP 0.# endif.
51d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
51e0: 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68  plicitly call th
51f0: 65 20 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e  e 64-bit version
5200: 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41   of lseek() on A
5210: 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73  ndroid. Otherwis
5220: 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73  e, lseek().** is
5230: 20 74 68 65 20 33 32 2d 62 69 74 20 76 65 72 73   the 32-bit vers
5240: 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49  ion, even if _FI
5250: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36  LE_OFFSET_BITS=6
5260: 34 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  4 is defined..*/
5270: 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49  .#ifdef __ANDROI
5280: 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65  D__.# define lse
5290: 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69  ek lseek64.#endi
52a0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65  f../*.** Differe
52b0: 6e 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20  nt Unix systems 
52c0: 64 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69  declare open() i
52d0: 6e 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  n different ways
52e0: 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f  .  Same use.** o
52f0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
5300: 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74  int,mode_t).  Ot
5310: 68 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f  hers use open(co
5320: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e  nst char*,int,..
5330: 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .)..** The diffe
5340: 72 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61  rence is importa
5350: 6e 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20  nt when using a 
5360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
5370: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
5380: 68 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f  he safest way to
5390: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70   deal with the p
53a0: 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77  roblem is to alw
53b0: 61 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61  ays use this wra
53c0: 70 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c  pper.** which al
53d0: 77 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d  ways has the sam
53e0: 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69  e well-defined i
53f0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
5400: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65  tic int posixOpe
5410: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
5420: 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20  ile, int flags, 
5430: 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74  int mode){.  ret
5440: 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  urn open(zFile, 
5450: 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a  flags, mode);.}.
5460: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5470: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5480: 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
5490: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  y(const char*, i
54a0: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
54b0: 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
54c0: 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  (void);../*.** M
54d0: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
54e0: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
54f0: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
5500: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
5510: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
5520: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
5530: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
5540: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
5550: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
5560: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
5570: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
5580: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
5590: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
55a0: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
55b0: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
55c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
55d0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
55e0: 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20  unix_syscall {. 
55f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5600: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
5610: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
5620: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
5630: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5640: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
5650: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
5660: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
5670: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
5680: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
5690: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
56a0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
56b0: 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70  ll[] = {.  { "op
56c0: 65 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  en",         (sq
56d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
56e0: 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20  r)posixOpen,  0 
56f0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70   },.#define osOp
5700: 65 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  en      ((int(*)
5710: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
5720: 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30  ,int))aSyscall[0
5730: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5740: 20 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20   "close",       
5750: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5760: 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20  l_ptr)close,    
5770: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5780: 6f 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e  osClose     ((in
5790: 74 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61  t(*)(int))aSysca
57a0: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
57b0: 0a 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20  .  { "access",  
57c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
57d0: 73 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73  scall_ptr)access
57e0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
57f0: 69 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20  ine osAccess    
5800: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
5810: 68 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61  har*,int))aSysca
5820: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
5830: 0a 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20  .  { "getcwd",  
5840: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5850: 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64  scall_ptr)getcwd
5860: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
5870: 69 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20  ine osGetcwd    
5880: 28 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a  ((char*(*)(char*
5890: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
58a0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
58b0: 20 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20    { "stat",     
58c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
58d0: 63 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20  call_ptr)stat,  
58e0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
58f0: 6e 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28  ne osStat      (
5900: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
5910: 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a  ar*,struct stat*
5920: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
5930: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54  urrent)../*.** T
5940: 68 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65  he DJGPP compile
5950: 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f  r environment lo
5960: 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20  oks mostly like 
5970: 55 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20  Unix, but it.** 
5980: 6c 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28  lacks the fcntl(
5990: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  ) system call.  
59a0: 53 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74  So redefine fcnt
59b0: 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  l() to be someth
59c0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61  ing.** that alwa
59d0: 79 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68  ys succeeds.  Th
59e0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f  is means that lo
59f0: 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f  cking does not o
5a00: 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a  ccur under.** DJ
5a10: 47 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20  GPP.  But it is 
5a20: 44 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79  DOS - what did y
5a30: 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69  ou expect?.*/.#i
5a40: 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  fdef __DJGPP__. 
5a50: 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20   { "fstat",     
5a60: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
5a70: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5a80: 69 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c  ine osFstat(a,b,
5a90: 63 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20  c)    0.#else   
5aa0: 20 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20    .  { "fstat", 
5ab0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
5ac0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61  syscall_ptr)fsta
5ad0: 74 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  t,      0  },.#d
5ae0: 65 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20  efine osFstat   
5af0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73    ((int(*)(int,s
5b00: 74 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79  truct stat*))aSy
5b10: 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e  scall[5].pCurren
5b20: 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22  t).#endif..  { "
5b30: 66 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28  ftruncate",    (
5b40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5b50: 70 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20  ptr)ftruncate,  
5b60: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5b70: 46 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28  Ftruncate ((int(
5b80: 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  *)(int,off_t))aS
5b90: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
5ba0: 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22  nt)..  { "fcntl"
5bb0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5bc0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63  3_syscall_ptr)fc
5bd0: 6e 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ntl,      0  },.
5be0: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
5bf0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
5c00: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
5c10: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
5c20: 0a 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20  .  { "read",    
5c30: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5c40: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20  scall_ptr)read, 
5c50: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
5c60: 69 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20  ine osRead      
5c70: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
5c80: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  ,void*,size_t))a
5c90: 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72  Syscall[8].pCurr
5ca0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5cb0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5cc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
5cd0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
5ce0: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
5cf0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5d00: 5f 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20  _ptr)pread,     
5d10: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
5d20: 20 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20   "pread",       
5d30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5d40: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
5d50: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
5d60: 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20  define osPread  
5d70: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
5d80: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
5d90: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
5da0: 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [9].pCurrent)..#
5db0: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
5dc0: 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65  READ64).  { "pre
5dd0: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
5de0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5df0: 29 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20  )pread64,    0  
5e00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72  },.#else.  { "pr
5e10: 65 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71  ead64",      (sq
5e20: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5e30: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5e40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
5e50: 6e 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28  ne osPread64   (
5e60: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5e70: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66  void*,size_t,off
5e80: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d  _t))aSyscall[10]
5e90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5ea0: 22 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20  "write",        
5eb0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5ec0: 5f 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20  _ptr)write,     
5ed0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
5ee0: 73 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69  sWrite     ((ssi
5ef0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
5f00: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29  t void*,size_t))
5f10: 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75  aSyscall[11].pCu
5f20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5f30: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c  ned(USE_PREAD) |
5f40: 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  | SQLITE_ENABLE_
5f50: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
5f60: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
5f70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5f80: 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20  ll_ptr)pwrite,  
5f90: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
5fa0: 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20   { "pwrite",    
5fb0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5fc0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
5fd0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
5fe0: 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74  .#define osPwrit
5ff0: 65 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a  e    ((ssize_t(*
6000: 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  )(int,const void
6010: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
6020: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
6030: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31        aSyscall[1
6040: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
6050: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
6060: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69  EAD64).  { "pwri
6070: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
6080: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6090: 70 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d  pwrite64,   0  }
60a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
60b0: 69 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c  ite64",     (sql
60c0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
60d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
60e0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
60f0: 65 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28  e osPwrite64  ((
6100: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
6110: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
6120: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
6140: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
6150: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d  rent)..  { "fchm
6160: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
6170: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6180: 66 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20  fchmod,         
6190: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
61a0: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
61b0: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
61c0: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
61d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
61e0: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
61f0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
6200: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
6210: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
6220: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
6230: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
6240: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
6250: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
6260: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
6270: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6280: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6290: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
62a0: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
62b0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
62c0: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
62d0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
62e0: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
62f0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
6300: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
6310: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
6320: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
6330: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
6340: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
6350: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
6360: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
6370: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
6380: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6390: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
63a0: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
63b0: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
63c0: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
63d0: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
63e0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
63f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
6400: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
6410: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6420: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
6430: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6440: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
6450: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
6460: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
6470: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
6480: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
6490: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
64a0: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
64b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
64c0: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
64d0: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
64e0: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
64f0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
6500: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
6510: 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66  E_FCHOWN).  { "f
6520: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
6530: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6540: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
6550: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6560: 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20   { "fchown",    
6570: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6580: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
6590: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
65a0: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
65b0: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
65c0: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
65d0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
65e0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
65f0: 67 65 74 65 75 69 64 22 2c 20 20 20 20 20 20 28  geteuid",      (
6600: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6610: 70 74 72 29 67 65 74 65 75 69 64 2c 20 20 20 20  ptr)geteuid,    
6620: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
6630: 65 20 6f 73 47 65 74 65 75 69 64 20 20 20 28 28  e osGeteuid   ((
6640: 75 69 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61  uid_t(*)(void))a
6650: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
6660: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
6670: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6680: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
6690: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
66a0: 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20   { "mmap",      
66b0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
66c0: 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20  all_ptr)mmap,   
66d0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
66e0: 6c 73 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20  lse.  { "mmap", 
66f0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
6700: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6720: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
6730: 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a  e osMmap ((void*
6740: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
6750: 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66  ,int,int,int,off
6760: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  _t))aSyscall[22]
6770: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6780: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6790: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
67a0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
67b0: 45 3e 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22  E>0.  { "munmap"
67c0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
67d0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e  _syscall_ptr)mun
67e0: 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  map,          0 
67f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75  },.#else.  { "mu
6800: 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  nmap",       (sq
6810: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6820: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
6830: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
6840: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
6850: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
6860: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
6870: 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[23].pCurrent).
6880: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
6890: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
68a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
68b0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
68c0: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d  P_SIZE>0).  { "m
68d0: 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73  remap",       (s
68e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
68f0: 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20  tr)mremap,      
6900: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6910: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
6920: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6930: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
6940: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6950: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d  ndif.#define osM
6960: 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  remap ((void*(*)
6970: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69  (void*,size_t,si
6980: 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  ze_t,int,...))aS
6990: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
69a0: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
69b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
69c0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
69d0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
69e0: 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c  { "getpagesize",
69f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6a00: 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61  ll_ptr)unixGetpa
6a10: 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c  gesize, 0 },.#el
6a20: 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73  se.  { "getpages
6a30: 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f  ize",  (sqlite3_
6a40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a60: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6a70: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
6a80: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
6a90: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
6aa0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
6ab0: 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
6ac0: 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c  .  { "readlink",
6ad0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6ae0: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69  scall_ptr)readli
6af0: 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  nk,        0 },.
6b00: 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61 64 6c  #else.  { "readl
6b10: 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74  ink",     (sqlit
6b20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6b40: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
6b50: 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20 28  ine osReadlink (
6b60: 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e 73  (ssize_t(*)(cons
6b70: 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73 69  t char*,char*,si
6b80: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ze_t))aSyscall[2
6b90: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
6ba0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c  f defined(HAVE_L
6bb0: 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74 61 74  STAT).  { "lstat
6bc0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
6bd0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6be0: 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20 20 20  lstat,          
6bf0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6c00: 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  lstat",         
6c10: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6c20: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
6c30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6c40: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74 61 74  .#define osLstat
6c50: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
6c60: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
6c70: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
6c80: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
6c90: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
6ca0: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
6cb0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
6cc0: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  ./*.** On some s
6cd0: 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f  ystems, calls to
6ce0: 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74   fchown() will t
6cf0: 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65  rigger a message
6d00: 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a   in a security.*
6d10: 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f  * log if they co
6d20: 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74  me from non-root
6d30: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20   processes.  So 
6d40: 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63  avoid calling fc
6d50: 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20  hown() if.** we 
6d60: 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
6d70: 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74  as root..*/.stat
6d80: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68  ic int robustFch
6d90: 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f  own(int fd, uid_
6da0: 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64  t uid, gid_t gid
6db0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
6dc0: 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65  AVE_FCHOWN).  re
6dd0: 74 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29  turn osGeteuid()
6de0: 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28   ? 0 : osFchown(
6df0: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c  fd,uid,gid);.#el
6e00: 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
6e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
6e20: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
6e30: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
6e40: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
6e50: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
6e60: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
6e70: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6e80: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
6e90: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
6ea0: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
6eb0: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
6ec0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
6ed0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
6ee0: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
6ef0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
6f00: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
6f10: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
6f20: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
6f30: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
6f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
6f50: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
6f60: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
6f70: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
6f80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
6f90: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
6fa0: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
6fb0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6fc0: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
6fd0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
6fe0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
6ff0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
7000: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
7010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
7020: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
7030: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
7040: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
7050: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
7060: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
7070: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
7080: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
7090: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
70a0: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
70b0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
70c0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
70d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
70e0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
70f0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
7100: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
7110: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
7120: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
7130: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
7140: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7150: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
7160: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7170: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
7180: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
7190: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
71a0: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
71b0: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
71c0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
71d0: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
71e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
71f0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
7200: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
7210: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
7220: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
7230: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7240: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
7250: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7260: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
7270: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
7280: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
7290: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
72a0: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
72b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
72c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
72d0: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
72e0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
72f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
7300: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
7310: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7320: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
7330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7340: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7350: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
7370: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
7380: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
7390: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
73a0: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
73b0: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
73c0: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
73d0: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
73e0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
73f0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
7400: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
7410: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
7420: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
7430: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
7440: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
7450: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
7460: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
7470: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
7480: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7490: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
74a0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
74b0: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
74c0: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
74d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
74e0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
74f0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
7500: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
7510: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
7520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7540: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7550: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
7560: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
7570: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
7580: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
7590: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
75a0: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
75b0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
75c0: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
75d0: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
75e0: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
75f0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
7600: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
7610: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
7620: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7630: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
7640: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
7650: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
7660: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
7670: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
7680: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
7690: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
76a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
76b0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
76c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
76d0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
76e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
76f0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
7700: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
7710: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
7720: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
7730: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
7740: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
7750: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
7760: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
7770: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7780: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
7790: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
77a0: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
77b0: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
77c0: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
77d0: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
77e0: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
77f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
7800: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
7810: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
7820: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
7830: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
7840: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
7850: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
7860: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
7870: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
7880: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
7890: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
78a0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
78b0: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
78c0: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
78d0: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
78e0: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
78f0: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
7900: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
7910: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
7920: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
7930: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
7940: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
7950: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
7960: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
7970: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
7980: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
7990: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
79a0: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
79b0: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
79c0: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
79d0: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
79e0: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
79f0: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
7a00: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
7a10: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
7a20: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
7a30: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
7a40: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
7a50: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
7a60: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
7a70: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
7a80: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
7a90: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
7aa0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
7ab0: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
7ac0: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
7ad0: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
7ae0: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
7af0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
7b00: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
7b10: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
7b20: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
7b30: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
7b40: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
7b50: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
7b60: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
7b70: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
7b80: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
7b90: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
7ba0: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
7bb0: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
7bc0: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
7bd0: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
7be0: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
7bf0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
7c00: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
7c10: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
7c20: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
7c30: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
7c40: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
7c50: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
7c60: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
7c70: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
7c80: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
7c90: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
7ca0: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
7cb0: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
7cc0: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
7cd0: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
7ce0: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
7cf0: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
7d00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
7d10: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
7d20: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
7d30: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
7d40: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
7d50: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
7d60: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
7d80: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
7d90: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
7da0: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
7db0: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
7dc0: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
7dd0: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
7de0: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
7df0: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
7e00: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
7e10: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
7e20: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
7e30: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
7e40: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
7e50: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
7e60: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
7e70: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
7e80: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
7e90: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
7ea0: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
7eb0: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
7ec0: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
7ed0: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
7ee0: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
7ef0: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
7f00: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
7f10: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
7f20: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
7f30: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
7f40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
7f50: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
7f60: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
7f70: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
7f80: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
7f90: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
7fa0: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
7fb0: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
7fc0: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
7fd0: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
7fe0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
7ff0: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
8000: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
8010: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
8020: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
8030: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
8040: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
8050: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
8060: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
8070: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
8080: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
8090: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
80a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
80b0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
80c0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
80d0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
80e0: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
80f0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
8100: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
8110: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
8120: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
8130: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
8140: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
8150: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
8160: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8170: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
8180: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
8190: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
81a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
81b0: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
81c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
81d0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
81e0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
81f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
8200: 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  FS1));.}.#ifdef 
8210: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
8220: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
8230: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
8240: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
8250: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
8260: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
8270: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
8280: 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  VFS1));.}.#endif
8290: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
82a0: 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a 2f  _HAVE_OS_TRACE./
82b0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
82c0: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
82d0: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
82e0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
82f0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
8300: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
8310: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
8320: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
8330: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
8340: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
8350: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8360: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
8370: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
8380: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
8390: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
83a0: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
83b0: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
83c0: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
83d0: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
83e0: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
83f0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
8400: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
8410: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
8420: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
8430: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
8440: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
8450: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
8460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
8470: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
8480: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8490: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
84a0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
84b0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
84c0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
84d0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
84e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
84f0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
8500: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
8510: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
8520: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
8530: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
8540: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
8550: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
8560: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
8570: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
8580: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
8590: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
85a0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
85b0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
85c0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
85d0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
85e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
85f0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
8600: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
8610: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
8620: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
8630: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
8640: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
8650: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
8660: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
8670: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
8680: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
8690: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
86a0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
86b0: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
86c0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
86d0: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
86e0: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
86f0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
8700: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
8710: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
8720: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
8730: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
8740: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
8750: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
8760: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
8770: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
8780: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
8790: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
87a0: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
87b0: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
87c0: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
87d0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
87e0: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
87f0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
8800: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
8810: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
8820: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
8830: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
8840: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
8850: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
8860: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
8870: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
8880: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
8890: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
88a0: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
88b0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
88c0: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
88d0: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
88e0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
88f0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
8900: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
8910: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
8920: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
8930: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
8940: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
8950: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8960: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
8970: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
8980: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
8990: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
89a0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
89b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
89c0: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
89d0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
89e0: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
89f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
8a00: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
8a10: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
8a20: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
8a30: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
8a40: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
8a50: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
8a60: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
8a70: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
8a80: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
8a90: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
8aa0: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
8ab0: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
8ac0: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
8ad0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
8ae0: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
8af0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
8b00: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
8b10: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
8b20: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
8b30: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
8b40: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
8b50: 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61  ough.** this wra
8b60: 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e  pper.  On the An
8b70: 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20  droid platform, 
8b80: 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f  bypassing the lo
8b90: 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75  gic below.** cou
8ba0: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72  ld lead to a cor
8bb0: 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a  rupt database..*
8bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
8bd0: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
8be0: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
8bf0: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
8c00: 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f  ;.#ifdef __ANDRO
8c10: 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64  ID__.  /* On And
8c20: 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28  roid, ftruncate(
8c30: 29 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32  ) always uses 32
8c40: 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76  -bit offsets, ev
8c50: 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c  en if .  ** _FIL
8c60: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34  E_OFFSET_BITS=64
8c70: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
8c80: 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e  s means it is un
8c90: 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20  safe to attempt 
8ca0: 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  to.  ** truncate
8cb0: 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73   a file to any s
8cc0: 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ize larger than 
8cd0: 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69  2GiB. Silently i
8ce0: 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73  gnore any.  ** s
8cf0: 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a  uch attempts.  *
8d00: 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69  /.  if( sz>(sqli
8d10: 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46  te3_int64)0x7FFF
8d20: 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d  FFFF ){.    rc =
8d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
8d40: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b  lse.#endif.  do{
8d50: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
8d60: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
8d70: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
8d80: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
8d90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8da0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
8db0: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
8dc0: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
8dd0: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
8de0: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
8df0: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
8e00: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
8e10: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
8e20: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
8e30: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
8e40: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
8e50: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
8e60: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
8e70: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
8e80: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
8e90: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
8ea0: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
8eb0: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
8ec0: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
8ed0: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
8ee0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
8ef0: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
8f00: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
8f10: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
8f20: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
8f30: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
8f40: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
8f50: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
8f60: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
8f70: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
8f80: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
8f90: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
8fa0: 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74    assert( (sqlit
8fb0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
8fc0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
8fd0: 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  .          (sqli
8fe0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
8ff0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
9000: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73  || .          (s
9010: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
9020: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
9030: 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  K) ||.          
9040: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
9050: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
9060: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
9070: 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73  );.  switch (pos
9080: 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73  ixError) {.  cas
9090: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63 61 73  e EACCES: .  cas
90a0: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
90b0: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
90c0: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
90d0: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
90e0: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
90f0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
9100: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
9110: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
9120: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
9130: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
9140: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
9150: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
9160: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
9170: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
9180: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
9190: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
91a0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
91b0: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
91c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
91d0: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
91e0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
91f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
9240: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
9250: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
9260: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
9270: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
9280: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
9290: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
92a0: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
92b0: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
92c0: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
92d0: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
92e0: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
92f0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
9300: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
9310: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
9320: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
9330: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
9340: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
9350: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
9360: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
9370: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
9380: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9390: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
93a0: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
93b0: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
93c0: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
93d0: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
93e0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
93f0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
9400: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
9410: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
9420: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
9430: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
9440: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
9450: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
9460: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
9470: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
9480: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
9490: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
94a0: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
94b0: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
94c0: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
94d0: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
94e0: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
94f0: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
9500: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
9510: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
9520: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
9530: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
9540: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
9550: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
9560: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9570: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
9580: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
9590: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
95a0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
95d0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
95e0: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
95f0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
9600: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
9610: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
9620: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
9630: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
9640: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
9650: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
9660: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
9670: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
9680: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
9690: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
96a0: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
96b0: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
96c0: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
96d0: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
96e0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
96f0: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
9700: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
9710: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
9720: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
9730: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
9740: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
9750: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
9760: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
9770: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
9780: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
9790: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
97a0: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
97b0: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
97c0: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
97d0: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
97e0: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
97f0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
9800: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
9810: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
9820: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
9830: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
9840: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
9850: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
9860: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
9870: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
9880: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
9890: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
98a0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
98b0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
98c0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
98d0: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
98e0: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
98f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
9900: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
9910: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
9920: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
9930: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
9940: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
9950: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
9960: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
9970: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
9980: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
9990: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
99a0: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
99b0: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
99c0: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
99d0: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
99e0: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
99f0: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
9a00: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
9a10: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
9a20: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
9a30: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
9a40: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
9a50: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
9a60: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
9a70: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
9a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
9a90: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
9aa0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
9ab0: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
9ac0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
9ad0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
9ae0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
9af0: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
9b00: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
9b10: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
9b20: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
9b30: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
9b40: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
9b50: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
9b60: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
9b70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
9b80: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
9b90: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
9ba0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
9bb0: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
9bc0: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
9bd0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
9be0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9bf0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
9c00: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
9c10: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
9c20: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
9c30: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
9c40: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
9c50: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
9c60: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9c70: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
9c80: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
9c90: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
9ca0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9cb0: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
9cc0: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
9cd0: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
9ce0: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
9cf0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9d20: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
9d30: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
9d40: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
9d50: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
9d60: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
9d70: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
9d80: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9d90: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
9da0: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
9db0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
9dc0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9dd0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
9de0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
9df0: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
9e00: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
9e10: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
9e20: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
9e30: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
9e40: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
9e50: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
9e60: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
9e70: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
9e80: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
9e90: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
9ea0: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
9eb0: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
9ec0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
9ed0: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
9ee0: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
9ef0: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
9f00: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
9f10: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
9f20: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
9f30: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
9f40: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
9f50: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
9f60: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
9f70: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
9f80: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
9f90: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
9fa0: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
9fb0: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
9fc0: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
9fd0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
9fe0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
9ff0: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
a000: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
a010: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
a020: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
a030: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
a040: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a050: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
a060: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
a070: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
a080: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
a090: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
a0a0: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
a0b0: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
a0c0: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
a0d0: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
a0e0: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
a0f0: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
a100: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
a110: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
a120: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
a130: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
a140: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
a150: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
a160: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
a170: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
a180: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
a190: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
a1a0: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
a1b0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
a1c0: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
a1d0: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
a1e0: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
a1f0: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
a200: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
a210: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
a220: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
a230: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
a240: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
a250: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
a260: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
a270: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
a280: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
a290: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
a2a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
a2b0: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
a2c0: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
a2d0: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
a2e0: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
a2f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
a300: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
a310: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
a320: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
a330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a340: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
a350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
a390: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
a3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3e0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
a400: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
a410: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
a420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a430: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
a440: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
a450: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
a460: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
a470: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
a480: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
a490: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
a4a0: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
a4b0: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
a4c0: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
a4d0: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
a4e0: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
a4f0: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
a500: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
a510: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
a520: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
a530: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
a540: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
a550: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
a560: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
a570: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
a580: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
a590: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
a5a0: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
a5b0: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
a5c0: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
a5d0: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
a5e0: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
a5f0: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
a600: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
a610: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
a620: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
a630: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
a640: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
a650: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
a660: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
a670: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
a680: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
a690: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
a6a0: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
a6b0: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
a6c0: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
a6d0: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
a6e0: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
a6f0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
a700: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
a710: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
a720: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
a730: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
a740: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
a750: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
a760: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
a770: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
a780: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
a790: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
a7a0: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
a7b0: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
a7c0: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
a7d0: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
a7e0: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
a7f0: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
a800: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
a810: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
a820: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
a830: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
a840: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
a850: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
a860: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
a870: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
a880: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
a890: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
a8a0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
a8b0: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
a8c0: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
a8d0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
a8e0: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
a8f0: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
a900: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
a910: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
a920: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a930: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
a940: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
a950: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
a960: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
a970: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
a980: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
a990: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
a9a0: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
a9b0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
a9c0: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
a9d0: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
a9e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
a9f0: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
aa00: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
aa10: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
aa20: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
aa30: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
aa40: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
aa50: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
aa60: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
aa70: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
aa80: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
aa90: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
aaa0: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
aab0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
aac0: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
aad0: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
aae0: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
aaf0: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
ab00: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
ab10: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
ab20: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
ab30: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
ab40: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
ab50: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
ab60: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
ab70: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
ab80: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
ab90: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
aba0: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
abb0: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
abc0: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
abd0: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
abe0: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
abf0: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
ac00: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
ac10: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
ac20: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
ac30: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
ac40: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
ac50: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
ac60: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
ac70: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
ac80: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
ac90: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
aca0: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
acb0: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
acc0: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
acd0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
ace0: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
acf0: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
ad00: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
ad10: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
ad20: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
ad30: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
ad40: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
ad50: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
ad60: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
ad70: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
ad80: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
ad90: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
ada0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
adb0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
adc0: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
add0: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
ade0: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
adf0: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
ae00: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
ae10: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
ae20: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
ae30: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
ae40: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
ae50: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
ae60: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
ae70: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
ae80: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
ae90: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
aea0: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
aeb0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
aec0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
aed0: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
aee0: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
aef0: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
af00: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
af10: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
af20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
af30: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
af40: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
af50: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
af60: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
af70: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
af80: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
af90: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
afa0: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
afb0: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
afc0: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
afd0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
afe0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
aff0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
b000: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
b010: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
b020: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
b030: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
b040: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
b050: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
b060: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
b070: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
b080: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
b090: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
b0a0: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
b0b0: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
b0c0: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
b0d0: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
b0e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
b0f0: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
b100: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
b110: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
b120: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
b130: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
b140: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
b150: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
b160: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
b170: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
b180: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
b190: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
b1a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
b1b0: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
b1c0: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
b1d0: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
b1e0: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
b1f0: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
b200: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
b210: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
b220: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
b230: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
b240: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
b250: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
b260: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
b270: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
b280: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
b290: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
b2a0: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
b2b0: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
b2c0: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
b2d0: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
b2e0: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
b2f0: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
b300: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
b310: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
b320: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
b330: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
b340: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
b350: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
b360: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
b370: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
b380: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
b390: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
b3a0: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
b3b0: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
b3c0: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
b3d0: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
b3e0: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
b3f0: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
b400: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
b410: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
b420: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
b430: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
b440: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
b450: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
b460: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
b470: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
b480: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
b490: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
b4a0: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
b4b0: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
b4c0: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
b4d0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
b4e0: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
b4f0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
b500: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
b510: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
b520: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
b530: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
b540: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
b550: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
b560: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
b570: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
b580: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
b590: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
b5a0: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
b5b0: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
b5c0: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
b5d0: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
b5e0: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
b5f0: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
b600: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
b610: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
b620: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
b630: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
b640: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
b650: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
b660: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
b670: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
b680: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
b690: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
b6a0: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
b6b0: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
b6c0: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
b6d0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
b6e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b6f0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
b700: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
b710: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
b720: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
b730: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
b740: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
b750: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
b760: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
b770: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
b780: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
b790: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
b7a0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
b7b0: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
b7c0: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
b7d0: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
b7e0: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b800: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
b810: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
b820: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
b830: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
b840: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
b850: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
b860: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
b870: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
b880: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
b890: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
b8a0: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
b8b0: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
b8c0: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
b8d0: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
b8e0: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
b8f0: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
b900: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
b910: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
b920: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
b930: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
b940: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
b950: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
b960: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
b970: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
b980: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
b990: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
b9a0: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
b9b0: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
b9c0: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b9d0: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
b9e0: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
b9f0: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ba20: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
ba30: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
ba40: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
ba50: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
ba60: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
ba70: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
ba80: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
ba90: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
baa0: 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c  ;     /* An excl
bab0: 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f  usive process lo
bac0: 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20  ck is held */.  
bad0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
bb00: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
bb10: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
bb20: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
bb30: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
bb40: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
bb50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
bb60: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
bb70: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb90: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
bba0: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
bbb0: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
bbc0: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
bbd0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
bbe0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bbf0: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
bc00: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
bc10: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
bc20: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
bc30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
bc40: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
bc50: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
bc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
bc70: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
bc80: 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ed */.#if SQLITE
bc90: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
bca0: 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64  STYLE.  unsigned
bcb0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
bcc0: 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41  dByte;  /* for A
bcd0: 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61  FP simulated sha
bce0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64  red lock */.#end
bcf0: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
bd00: 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b  S.  sem_t *pSem;
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53      /* Named POS
bd30: 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  IX semaphore */.
bd40: 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b    char aSemName[
bd50: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
bd60: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
bd70: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
bd80: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
bd90: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
bda0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
bdb0: 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ects..*/.static 
bdc0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69  unixInodeInfo *i
bdd0: 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  nodeList = 0;../
bde0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
bdf0: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
be00: 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73  rrorAtLine(), is
be10: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
be20: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
be30: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
be40: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
be50: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
be60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
be70: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
be80: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
be90: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
bea0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
beb0: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
bec0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
bed0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
bee0: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
bef0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
bf00: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
bf10: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
bf20: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
bf30: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
bf40: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
bf50: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
bf60: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
bf70: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
bf80: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
bf90: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
bfa0: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
bfb0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
bfc0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bfd0: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
bfe0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
bff0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
c000: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
c010: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
c020: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
c030: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
c040: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
c050: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
c060: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
c070: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
c080: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
c090: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
c0a0: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
c0b0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
c0c0: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
c0d0: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
c0e0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
c0f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
c100: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
c110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
c120: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
c130: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
c140: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
c150: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
c160: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
c170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
c180: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
c190: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
c1a0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
c1d0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
c1e0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
c1f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
c220: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
c230: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
c240: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
c250: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
c260: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
c270: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
c280: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
c290: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
c2a0: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
c2b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
c2c0: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
c2d0: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
c2e0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
c2f0: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
c300: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
c310: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
c320: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
c330: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
c340: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
c350: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
c360: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
c370: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
c380: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
c390: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
c3a0: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
c3b0: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
c3c0: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
c3d0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
c3e0: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
c3f0: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
c400: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
c410: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
c420: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
c430: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
c440: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
c450: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
c460: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
c470: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
c480: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
c490: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
c4a0: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
c4b0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
c4c0: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
c4d0: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
c4e0: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
c4f0: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
c500: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
c510: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
c520: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
c530: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
c540: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
c550: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
c560: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
c570: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
c580: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
c590: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
c5a0: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
c5b0: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
c5c0: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
c5d0: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
c5e0: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
c5f0: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
c600: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
c610: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
c620: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
c630: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
c640: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
c650: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
c660: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
c670: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
c680: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
c690: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
c6a0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
c6b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
c6c0: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
c6d0: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
c6e0: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
c6f0: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
c700: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
c710: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
c720: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
c730: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
c740: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
c750: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
c760: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
c770: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
c780: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
c790: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
c7a0: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
c7b0: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
c7c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
c7d0: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
c7e0: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
c7f0: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
c800: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
c810: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
c820: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
c830: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
c840: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
c850: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
c860: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
c870: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
c880: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
c890: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
c8a0: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
c8b0: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
c8c0: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
c8d0: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
c8e0: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
c8f0: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
c900: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
c910: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
c920: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
c930: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
c940: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
c950: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
c960: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
c970: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
c980: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
c990: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
c9a0: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
c9b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
c9c0: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
c9d0: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
c9e0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
c9f0: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
ca00: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
ca10: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
ca20: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
ca30: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
ca40: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
ca50: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
ca60: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
ca70: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
ca80: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
ca90: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
caa0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
cab0: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
cac0: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
caf0: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
cb00: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
cb10: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
cb20: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
cb30: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
cb40: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
cb50: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
cb60: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
cb70: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
cb80: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
cb90: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
cba0: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
cbb0: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
cbc0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
cbd0: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
cbe0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
cbf0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
cc00: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
cc10: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
cc20: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
cc30: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
cc40: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
cc50: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
cc60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
cc70: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
cc80: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
cc90: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
cca0: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
ccb0: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
ccc0: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
ccd0: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
cce0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
ccf0: 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43  #if OSCLOSE_CHEC
cd00: 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20  K_CLOSE_IOERR.  
cd10: 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66    if( close(p->f
cd20: 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  d) ){.      stor
cd30: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
cd40: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
cd50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
cd60: 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70  R_CLOSE;.      p
cd70: 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72  ->pNext = pError
cd80: 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d  ;.      pError =
cd90: 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   p;.    }else{. 
cda0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cdb0: 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  e(p);.    }.#els
cdc0: 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  e.    robust_clo
cdd0: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
cde0: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
cdf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ce00: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 49  .#endif.  }.  pI
ce10: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
ce20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
ce30: 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65 49  ase a unixInodeI
ce40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
ce50: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
ce60: 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65 49  ed by findInodeI
ce70: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
ce80: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
ce90: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
cea0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
ceb0: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
cec0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
ced0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
cee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cef0: 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
cf00: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
cf10: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
cf20: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
cf30: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
cf40: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
cf50: 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 41  eld() );.  if( A
cf60: 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29 7b  LWAYS(pInode) ){
cf70: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
cf80: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  f--;.    if( pIn
cf90: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
cfa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
cfb0: 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d  node->pShmNode==
cfc0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  0 );.      close
cfd0: 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
cfe0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
cff0: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
d000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d010: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
d020: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
d030: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
d040: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
d050: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
d060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d070: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
d080: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
d090: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
d0a0: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
d0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d0c0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
d0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
d0e0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
d0f0: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
d100: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
d110: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
d120: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
d130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d140: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
d150: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
d160: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
d170: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d180: 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69  , locate the uni
d190: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
d1a0: 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  t that.** descri
d1b0: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
d1c0: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
d1d0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
d1e0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
d1f0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d  * return value m
d200: 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61  ight be uninitia
d210: 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f  lized if an erro
d220: 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  r occurs..**.** 
d230: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
d240: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
d250: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
d260: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
d270: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
d280: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d290: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
d2a0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
d2b0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
d2c0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e  tatic int findIn
d2d0: 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  odeInfo(.  unixF
d2e0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
d2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
d300: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
d310: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
d320: 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49  e key */.  unixI
d330: 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f  nodeInfo **ppIno
d340: 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  de        /* Ret
d350: 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  urn the unixInod
d360: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72  eInfo object her
d370: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
d380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d390: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74           /* Syst
d3a0: 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63  em call return c
d3b0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  ode */.  int fd;
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
d3e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
d3f0: 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74  or pFile */.  st
d400: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
d410: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
d420: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
d430: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
d440: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
d450: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
d460: 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
d470: 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
d480: 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  on */.  unixInod
d490: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
d4a0: 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64  0;     /* Candid
d4b0: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
d4c0: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
d4d0: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
d4e0: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
d4f0: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
d500: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
d510: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
d520: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
d530: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
d540: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
d550: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
d560: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
d570: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
d580: 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72  tatbuf);.  if( r
d590: 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72  c!=0 ){.    stor
d5a0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
d5b0: 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65  , errno);.#if de
d5c0: 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29  fined(EOVERFLOW)
d5d0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
d5e0: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a  TE_DISABLE_LFS).
d5f0: 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c      if( pFile->l
d600: 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46  astErrno==EOVERF
d610: 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c  LOW ) return SQL
d620: 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69  ITE_NOLFS;.#endi
d630: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
d640: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a  ITE_IOERR;.  }..
d650: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
d660: 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e  .  /* On OS X on
d670: 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79   an msdos filesy
d680: 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20  stem, the inode 
d690: 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74  number is report
d6a0: 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63  ed.  ** incorrec
d6b0: 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a  tly for zero-siz
d6c0: 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69  e files.  See ti
d6d0: 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20  cket #3260.  To 
d6e0: 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64  work.  ** around
d6f0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77   this problem (w
d700: 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20  e consider it a 
d710: 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74  bug in OS X, not
d720: 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65   SQLite).  ** we
d730: 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65   always increase
d740: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74   the file size t
d750: 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67 20 61  o 1 by writing a
d760: 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a   single byte.  *
d770: 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73  * prior to acces
d780: 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e  sing the inode n
d790: 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20  umber.  The one 
d7a0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a  byte written is.
d7b0: 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53    ** an ASCII 'S
d7c0: 27 20 63 68 61 72 61 63 74 65 72 20 77 68 69 63  ' character whic
d7d0: 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74  h also happens t
d7e0: 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 62  o be the first b
d7f0: 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  yte.  ** in the 
d800: 68 65 61 64 65 72 20 6f 66 20 65 76 65 72 79 20  header of every 
d810: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
d820: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
d830: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  f there.  ** is 
d840: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
d850: 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68   such that anoth
d860: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 61 6c  er thread has al
d870: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a  ready populated.
d880: 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70    ** the first p
d890: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
d8a0: 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69  ase, no damage i
d8b0: 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  s done..  */.  i
d8c0: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69  f( statbuf.st_si
d8d0: 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d  ze==0 && (pFile-
d8e0: 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
d8f0: 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
d900: 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f  OS)!=0 ){.    do
d910: 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66  { rc = osWrite(f
d920: 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69  d, "S", 1); }whi
d930: 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
d940: 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20  o==EINTR );.    
d950: 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20  if( rc!=1 ){.   
d960: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
d970: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
d980: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d990: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
d9a0: 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  }.    rc = osFst
d9b0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
d9c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
d9d0: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
d9e0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
d9f0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
da00: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
da10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
da20: 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69  if..  memset(&fi
da30: 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  leId, 0, sizeof(
da40: 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65  fileId));.  file
da50: 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  Id.dev = statbuf
da60: 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f  .st_dev;.#if OS_
da70: 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64  VXWORKS.  fileId
da80: 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49  .pId = pFile->pI
da90: 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49  d;.#else.  fileI
daa0: 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  d.ino = statbuf.
dab0: 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20  st_ino;.#endif. 
dac0: 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
dad0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  ist;.  while( pI
dae0: 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28 26  node && memcmp(&
daf0: 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d  fileId, &pInode-
db00: 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  >fileId, sizeof(
db10: 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20 20  fileId)) ){.    
db20: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
db30: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
db40: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
db50: 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69     pInode = sqli
db60: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
db70: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b  zeof(*pInode) );
db80: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 3d  .    if( pInode=
db90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
dba0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
dbb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
dbc0: 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30  memset(pInode, 0
dbd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  , sizeof(*pInode
dbe0: 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ));.    memcpy(&
dbf0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
dc00: 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28  &fileId, sizeof(
dc10: 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49  fileId));.    pI
dc20: 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  node->nRef = 1;.
dc30: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
dc40: 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  t = inodeList;. 
dc50: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
dc60: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e   = 0;.    if( in
dc70: 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c  odeList ) inodeL
dc80: 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e  ist->pPrev = pIn
dc90: 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69  ode;.    inodeLi
dca0: 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d  st = pInode;.  }
dcb0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65  else{.    pInode
dcc0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
dcd0: 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64  *ppInode = pInod
dce0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
dcf0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dd00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70  Return TRUE if p
dd10: 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  File has been re
dd20: 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65  named or unlinke
dd30: 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66  d since it was f
dd40: 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  irst opened..*/.
dd50: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48  static int fileH
dd60: 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65  asMoved(unixFile
dd70: 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53   *pFile){.#if OS
dd80: 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
dd90: 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21  n pFile->pInode!
dda0: 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64  =0 && pFile->pId
ddb0: 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  !=pFile->pInode-
ddc0: 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c  >fileId.pId;.#el
ddd0: 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  se.  struct stat
dde0: 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70   buf;.  return p
ddf0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
de00: 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74  &&.      (osStat
de10: 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
de20: 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73  buf)!=0 || buf.s
de30: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
de40: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
de50: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
de60: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
de70: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
de80: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
de90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
dea0: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
deb0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
dec0: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
ded0: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
dee0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
def0: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
df00: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
df10: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
df20: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
df30: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
df40: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
df50: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
df60: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
df70: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
df80: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
df90: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
dfa0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
dfb0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
dfc0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
dfd0: 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  se verifications
dfe0: 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20   occurs for the 
dff0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
e000: 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ly */.  if( pFil
e010: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
e020: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
e030: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d   return;..  rc =
e040: 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
e050: 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20  h, &buf);.  if( 
e060: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc!=0 ){.    sql
e070: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e080: 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74  WARNING, "cannot
e090: 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25   fstat db file %
e0a0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e0b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
e0c0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
e0d0: 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46 69  nlink==0 && (pFi
e0e0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
e0f0: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 29  UNIXFILE_DELETE)
e100: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
e110: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
e120: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c  RNING, "file unl
e130: 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65 6e  inked while open
e140: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
e150: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
e160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
e170: 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20  st_nlink>1 ){.  
e180: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e190: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d  LITE_WARNING, "m
e1a0: 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f  ultiple links to
e1b0: 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c   file: %s", pFil
e1c0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
e1d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
e1e0: 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46   fileHasMoved(pF
e1f0: 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ile) ){.    sqli
e200: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
e210: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65  ARNING, "file re
e220: 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e  named while open
e230: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
e240: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
e250: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
e260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
e270: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
e280: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
e290: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
e2a0: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
e2b0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
e2c0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
e2d0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
e2e0: 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
e2f0: 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
e300: 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
e310: 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
e320: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
e330: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
e340: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
e350: 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
e360: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
e370: 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
e380: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
e390: 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  nt unixCheckRese
e3a0: 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
e3b0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
e3c0: 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
e3d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e3e0: 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
e3f0: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
e400: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
e410: 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
e420: 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
e430: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
e440: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
e450: 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
e460: 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
e470: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
e480: 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
e490: 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   );.  unixEnterM
e4a0: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
e4b0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
e4c0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
e4d0: 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20  s threads */..  
e4e0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
e4f0: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
e500: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
e510: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
e520: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
e530: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
e540: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
e550: 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  rved = 1;.  }.. 
e560: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
e570: 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
e580: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
e590: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f  ..  */.#ifndef _
e5a0: 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21  _DJGPP__.  if( !
e5b0: 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69  reserved && !pFi
e5c0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
e5d0: 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  cessLock ){.    
e5e0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
e5f0: 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  k;.    lock.l_wh
e600: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
e610: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
e620: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
e630: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
e640: 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e  n = 1;.    lock.
e650: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
e660: 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74  ;.    if( osFcnt
e670: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45  l(pFile->h, F_GE
e680: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23  TLK, &lock) ){.#
e690: 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
e6a0: 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
e6b0: 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
e6c0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
e6d0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
e6e0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
e6f0: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
e700: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
e710: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 73 74 6f 72  OCK);.      stor
e720: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
e730: 2c 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6c 73 65  , tErrno);.#else
e740: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e750: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
e760: 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20  SERVEDLOCK;.    
e770: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
e780: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
e790: 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73  #endif.    } els
e7a0: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
e7b0: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
e7c0: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
e7d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
e7e0: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
e7f0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
e800: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
e810: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
e820: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e830: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
e840: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
e850: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
e860: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e870: 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20  ttempt to set a 
e880: 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74  system-lock on t
e890: 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20  he file pFile.  
e8a0: 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  The lock is .** 
e8b0: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f  described by pLo
e8c0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
e8d0: 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65   pFile was opene
e8e0: 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f  d read/write fro
e8f0: 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65  m unix-excl, the
e900: 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a  n the only lock.
e910: 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64  ** ever obtained
e920: 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65   is an exclusive
e930: 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73   lock, and it is
e940: 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c   obtained exactl
e950: 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69  y once.** the fi
e960: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
e970: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
e980: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
e990: 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a  system locking.*
e9a0: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63  * operations bec
e9b0: 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63  ome no-ops.  Loc
e9c0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  king operations 
e9d0: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74  still happen int
e9e0: 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f  ernally,.** in o
e9f0: 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61  rder to coordina
ea00: 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65  te access betwee
ea10: 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  n separate datab
ea20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
ea30: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70  ** within this p
ea40: 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20  rocess, but all 
ea50: 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c  of that is handl
ea60: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
ea70: 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e   the.** operatin
ea80: 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  g system does no
ea90: 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a  t participate..*
eaa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eab0: 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72  on is a pass-thr
eac0: 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f  ough to fcntl(F_
ead0: 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20  SETLK) if pFile 
eae0: 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20  is using.** any 
eaf0: 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22  VFS other than "
eb00: 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66  unix-excl" or if
eb10: 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64   pFile is opened
eb20: 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a   on "unix-excl".
eb30: 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
eb40: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  nly..**.** Zero 
eb50: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
eb60: 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65  he call complete
eb70: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
eb80: 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a  or -1 if a call.
eb90: 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61  ** to fcntl() fa
eba0: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
ebb0: 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20  e, errno is set 
ebc0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62  appropriately (b
ebd0: 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73  y fcntl())..*/.s
ebe0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
ebf0: 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  leLock(unixFile 
ec00: 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66  *pFile, struct f
ec10: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74  lock *pLock, int
ec20: 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 6e 74 20   nRetry){.  int 
ec30: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
ec40: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
ec50: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
ec60: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
ec70: 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65  Held() );.  asse
ec80: 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
ec90: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63  .  if( (pFile->c
eca0: 74 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58  trlFlags & (UNIX
ecb0: 46 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49  FILE_EXCL|UNIXFI
ecc0: 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49  LE_RDONLY))==UNI
ecd0: 58 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20  XFILE_EXCL ){.  
ece0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
ecf0: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
ed00: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
ed10: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
ed20: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ed30: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
ed40: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
ed50: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
ed60: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ed70: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ed80: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ed90: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
eda0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
edb0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
edc0: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
edd0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
ede0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
edf0: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
ee00: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
ee10: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
ee20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
ee30: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
ee40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
ee50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
ee60: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  lse{.    int i =
ee70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ee80: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 66 6f           .    fo
ee90: 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 72 63 20  r(;;){.      rc 
eea0: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
eeb0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
eec0: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
eed0: 63 20 26 26 20 6e 52 65 74 72 79 2d 2d 20 29 7b  c && nRetry-- ){
eee0: 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
eef0: 31 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20  100 * (++i));.  
ef00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ef10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ef20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
ef30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ef40: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
ef50: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
ef60: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
ef70: 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
ef80: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
ef90: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
efa0: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
efb0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
efc0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
efd0: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
efe0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
eff0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
f000: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
f010: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
f020: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
f030: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
f040: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
f050: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
f060: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
f070: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
f080: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
f090: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
f0a0: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
f0b0: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
f0c0: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
f0d0: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
f0e0: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
f0f0: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
f100: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
f110: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
f120: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
f130: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
f140: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
f150: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
f160: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
f170: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
f180: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
f190: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
f1a0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
f1b0: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
f1c0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f1d0: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
f1e0: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
f1f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f200: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
f210: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
f220: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
f230: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
f240: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
f250: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
f260: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
f270: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f280: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
f290: 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ock){.  /* The f
f2a0: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
f2b0: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
f2c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
f2d0: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
f2e0: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
f2f0: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
f300: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
f310: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
f320: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
f330: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
f340: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
f350: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
f360: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
f370: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
f380: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
f390: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
f3a0: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
f3b0: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
f3c0: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
f3d0: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
f3e0: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
f3f0: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
f400: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
f410: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
f420: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
f430: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
f440: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
f450: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
f460: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
f470: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
f480: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
f490: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
f4a0: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
f4b0: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
f4c0: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
f4d0: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
f4e0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
f4f0: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
f500: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
f510: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
f520: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
f530: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
f540: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
f550: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
f560: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
f570: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
f580: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
f590: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
f5a0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
f5b0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
f5c0: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
f5d0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
f5e0: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
f5f0: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
f600: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
f610: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
f620: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
f630: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
f640: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
f650: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
f660: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
f670: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
f680: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
f690: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
f6a0: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
f6b0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
f6c0: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
f6d0: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
f6e0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
f6f0: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
f700: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
f710: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
f720: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
f730: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
f740: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
f750: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
f760: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
f770: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
f780: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
f790: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
f7a0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
f7b0: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
f7c0: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
f7d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
f7e0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
f7f0: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
f800: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
f810: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
f820: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
f830: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
f840: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
f850: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
f860: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
f870: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
f880: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
f890: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
f8a0: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
f8b0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
f8c0: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
f8d0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
f8e0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
f8f0: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
f900: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
f910: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
f920: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
f930: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
f940: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
f950: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
f960: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
f970: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
f980: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
f990: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
f9a0: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
f9b0: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
f9c0: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
f9d0: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
f9e0: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
f9f0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
fa00: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
fa10: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
fa20: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
fa30: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
fa40: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
fa50: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
fa60: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
fa70: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
fa80: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
fa90: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
faa0: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
fab0: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
fac0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
fad0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
fae0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
faf0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fb00: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
fb10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
fb20: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
fb30: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
fb40: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
fb50: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
fb60: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
fb70: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
fb80: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
fb90: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
fba0: 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
fbb0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
fbc0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
fbd0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
fbe0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
fbf0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
fc00: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65  FileLock), pFile
fc10: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
fc20: 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69  d,.      osGetpi
fc30: 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
fc40: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
fc50: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
fc60: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
fc70: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
fc80: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
fc90: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
fca0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
fcb0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
fcc0: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
fcd0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
fce0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
fcf0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
fd00: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
fd10: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
fd20: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
fd30: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
fd40: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
fd50: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
fd60: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
fd70: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
fd80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fd90: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
fda0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
fdb0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
fdc0: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
fdd0: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
fde0: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
fdf0: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
fe00: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
fe10: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
fe20: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
fe30: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
fe40: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
fe50: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
fe60: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
fe70: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
fe80: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
fe90: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
fea0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
feb0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
fec0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
fed0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
fee0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
fef0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
ff00: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
ff10: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
ff20: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
ff30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
ff40: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
ff50: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
ff60: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
ff70: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
ff80: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
ff90: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
ffa0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
ffb0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
ffc0: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
ffd0: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
ffe0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
fff0: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
10000 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
10010 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
10020 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
10030 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10040 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
10050 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
10060 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
10070 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
10080 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
10090 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
100a0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
100b0 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
100c0 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
100d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
100e0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
100f0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
10100 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
10110 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
10120 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
10130 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
10140 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
10150 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
10160 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
10170 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
10180 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
10190 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
101a0 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
101b0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
101c0 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
101d0 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
101e0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
101f0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
10200 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10210 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
10220 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
10230 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10240 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
10250 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
10260 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10270 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
10280 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
10290 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
102a0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
102b0 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
102c0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
102d0 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
102e0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
102f0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
10300 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
10310 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
10320 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
10330 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
10340 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
10350 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
10360 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
10370 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
10380 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
10390 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
103a0 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
103b0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
103c0 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
103d0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
103e0 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
103f0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
10400 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
10410 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
10420 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
10430 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
10440 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
10450 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
10460 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
10470 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
10480 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
10490 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
104a0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20  File, &lock, 0) 
104b0 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
104c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
104d0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
104e0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
104f0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
10500 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
10510 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
10520 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
10530 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10540 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
10550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
10560 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
10570 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
10580 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
10590 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
105a0 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
105b0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
105c0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
105d0 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
105e0 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
105f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
10600 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10610 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
10620 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
10630 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
10640 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
10650 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
10660 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
10670 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10680 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
10690 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
106a0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
106b0 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
106c0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
106d0 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
106e0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
106f0 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10700 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10710 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10720 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10730 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10740 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10750 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a  R_LOCK);.    }..
10760 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
10770 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
10780 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
10790 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
107a0 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
107b0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
107c0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
107d0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
107e0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
107f0 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
10800 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
10810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
10820 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
10830 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
10840 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
10850 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
10860 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
10870 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
10880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
10890 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
108a0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
108b0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
108c0 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63   .#else.      rc
108d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
108e0 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a  UNLOCK; .#endif.
108f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
10900 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 49  c ){.      if( I
10910 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10920 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
10930 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
10940 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
10950 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
10960 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
10970 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
10980 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10990 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
109a0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
109b0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
109c0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
109d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
109e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
109f0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
10a00 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
10a10 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
10a20 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
10a30 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
10a40 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
10a50 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
10a60 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
10a70 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
10a80 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
10a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
10aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10ab0 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
10ac0 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
10ad0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
10ae0 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
10af0 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
10b00 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
10b10 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
10b20 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
10b30 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
10b40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10b50 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
10b60 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
10b70 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
10b80 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
10b90 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
10ba0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
10bb0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
10bc0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
10bd0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
10be0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
10bf0 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10c00 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
10c10 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
10c20 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
10c30 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
10c40 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10c50 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
10c60 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
10c70 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
10c80 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10c90 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30  (pFile, &lock, 0
10ca0 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
10cb0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
10cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10cd0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10ce0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10cf0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
10d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10d10 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
10d20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10d30 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
10d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10d50 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
10d60 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
10d70 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
10d80 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
10d90 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
10da0 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
10db0 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
10dc0 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
10dd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
10de0 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
10df0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
10e00 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
10e10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
10e20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
10e30 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
10e40 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
10e50 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
10e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10e70 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
10e80 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
10e90 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
10ea0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10eb0 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
10ec0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
10ed0 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
10ee0 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
10ef0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
10f00 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
10f10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
10f20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10f30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
10f40 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10f50 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
10f60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
10f70 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
10f80 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
10f90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
10fa0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
10fb0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
10fc0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
10fd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
10fe0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
10ff0 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
11000 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11010 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
11020 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
11030 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
11040 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
11050 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
11060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
11070 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
11080 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11090 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
110a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
110b0 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
110c0 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
110d0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
110e0 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
110f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11100 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
11110 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
11120 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
11130 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
11140 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
11150 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
11160 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
11170 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
11180 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f  >pUnused;.  pIno
11190 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b  de->pUnused = p;
111a0 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31  .  pFile->h = -1
111b0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ;.  pFile->pUnus
111c0 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
111d0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
111e0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
111f0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11200 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11210 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11220 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11230 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11240 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11250 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11260 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
11270 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
11280 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
11290 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
112a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
112b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
112c0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
112d0 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
112e0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
112f0 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
11300 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
11310 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
11320 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
11330 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
11340 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
11350 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
11360 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
11370 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
11380 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
11390 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
113a0 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
113b0 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
113c0 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
113d0 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
113e0 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
113f0 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
11400 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
11410 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
11420 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
11430 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
11440 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
11450 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
11460 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
11470 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e  ileLock, int han
11480 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20  dleNFSUnlock){. 
11490 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
114a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
114b0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
114c0 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
114d0 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
114e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
114f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
11500 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
11510 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
11520 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
11530 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
11540 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
11550 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70  ileLock,.      p
11560 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
11570 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
11580 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
11590 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
115a0 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69  d,.      osGetpi
115b0 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  d(0)));..  asser
115c0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
115d0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
115e0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
115f0 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
11600 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11610 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
11620 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11630 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
11640 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
11650 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
11660 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
11670 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11680 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
11690 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
116a0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
116b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
116c0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
116d0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
116e0 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
116f0 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
11700 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
11710 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
11720 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
11730 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
11740 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
11750 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
11760 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
11770 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
11780 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
11790 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
117a0 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
117b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
117c0 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
117d0 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
117e0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
117f0 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
11800 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
11810 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
11820 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
11830 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
11840 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
11850 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
11860 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
11870 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
11880 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
11890 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
118a0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
118b0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
118c0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
118d0 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
118e0 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
118f0 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
11900 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
11910 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
11920 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
11930 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
11940 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
11950 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
11960 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
11970 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
11980 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
11990 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
119a0 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
119b0 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
119c0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
119d0 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
119e0 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
119f0 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
11a00 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
11a10 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
11a20 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
11a30 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
11a40 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
11a50 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
11a60 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
11a70 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  K ){.#if !define
11a80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
11a90 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  !SQLITE_ENABLE_L
11aa0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
11ab0 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e     (void)handleN
11ac0 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  FSUnlock;.      
11ad0 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46  assert( handleNF
11ae0 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65  SUnlock==0 );.#e
11af0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
11b00 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
11b10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11b20 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
11b30 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e   if( handleNFSUn
11b40 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
11b50 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20  int tErrno;     
11b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11b70 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73  or code from sys
11b80 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20  tem call errors 
11b90 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
11ba0 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
11bb0 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
11bc0 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
11bd0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
11be0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
11bf0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
11c00 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
11c10 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
11c20 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
11c30 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
11c40 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
11c50 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
11c60 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
11c70 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
11c80 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
11c90 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
11ca0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
11cb0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
11cc0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11cd0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11ce0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11cf0 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
11d00 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
11d10 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11d20 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
11d30 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
11d40 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
11d50 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
11d60 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
11d70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11d80 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
11d90 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
11da0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
11db0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
11dc0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
11dd0 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
11de0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11df0 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
11e00 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
11e10 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
11e20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29  &lock, 10)==(-1)
11e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
11e40 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
11e50 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
11e60 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
11e70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11e80 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11e90 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11ea0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
11eb0 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
11ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11ed0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65  IOERR_UNLOCK;.#e
11ee0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69  ndif.          i
11ef0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11f00 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
11f10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
11f20 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
11f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
11f40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
11f50 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
11f60 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
11f70 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
11f80 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
11f90 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
11fa0 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
11fb0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
11fc0 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65  ED_FIRST+divSize
11fd0 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11fe0 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
11ff0 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ZE-divSize;.    
12000 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
12010 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
12020 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a  k, 10)==(-1) ){.
12030 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
12040 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53   = errno;.#if OS
12050 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
12060 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  SY_IOERR.       
12070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12080 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12090 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
120a0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
120b0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
120c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
120d0 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66  R_UNLOCK;.#endif
120e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
120f0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
12100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12110 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12120 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
12130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12140 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12150 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
12160 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
12170 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
12180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12190 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64  else.#endif /* d
121a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
121b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
121c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
121d0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
121e0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
121f0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
12200 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
12210 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
12220 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
12230 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
12240 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
12250 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
12260 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ZE;.        if( 
12270 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
12280 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29  le, &lock, 10) )
12290 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
122a0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
122b0 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
122c0 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
122d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
122e0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
122f0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12300 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
12310 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
12320 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
12330 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
12340 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
12350 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
12360 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
12370 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
12380 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
12390 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
123a0 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
123b0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
123c0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
123d0 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
123e0 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
123f0 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
12400 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
12410 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
12420 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
12430 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
12440 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
12450 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
12460 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
12470 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
12480 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
12490 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
124a0 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
124b0 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
124c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
124d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
124e0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
124f0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
12500 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6e  le, tErrno);.#en
12510 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66  dif.          if
12520 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12530 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
12540 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
12550 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
12560 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
12580 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
12590 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
125a0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
125b0 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
125c0 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
125d0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
125e0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
125f0 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
12600 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20  ock.l_len = 2L; 
12610 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47   assert( PENDING
12620 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45  _BYTE+1==RESERVE
12630 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66  D_BYTE );.    if
12640 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
12650 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29  File, &lock, 10)
12660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
12670 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
12680 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
12690 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c    }else{.#if OSL
126a0 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
126b0 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 74 45  Y_IOERR.      tE
126c0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
126d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
126e0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
126f0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12700 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
12710 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
12720 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
12730 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
12740 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
12750 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rrno);.      }.#
12760 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
12770 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12780 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
12790 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
127a0 20 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a   errno);.#endif.
127b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
127c0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
127d0 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
127e0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
127f0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
12800 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
12810 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
12820 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
12830 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
12840 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
12850 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
12860 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
12870 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
12880 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
12890 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  /.    pInode->nS
128a0 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
128b0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
128c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
128d0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
128e0 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
128f0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
12900 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
12910 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
12920 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
12930 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
12940 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31  (pFile, &lock, 1
12950 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
12960 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
12970 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12980 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f      }else{.#if O
12990 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
129a0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
129b0 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
129c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
129d0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
129e0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
129f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12a00 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
12a10 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
12a20 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
12a30 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12a40 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
12a50 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
12a60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
12a70 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
12a80 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  K;.        store
12a90 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12aa0 20 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a   errno);.#endif.
12ab0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
12ac0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
12ad0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
12ae0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
12af0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
12b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
12b10 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
12b20 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
12b30 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
12b40 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
12b50 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
12b60 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
12b70 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
12b80 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
12b90 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
12ba0 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
12bb0 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
12bc0 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
12bd0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
12be0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
12bf0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
12c00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
12c10 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
12c20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
12c30 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
12c40 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
12c50 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
12c60 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
12c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
12c80 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12c90 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
12ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12cb0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
12cc0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
12cd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
12ce0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
12cf0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
12d00 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
12d10 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
12d20 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
12d30 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
12d40 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
12d50 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
12d60 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
12d70 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
12d80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
12d90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12da0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12db0 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
12dc0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12dd0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12de0 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  k){.#if SQLITE_M
12df0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
12e00 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
12e10 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
12e20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29  || ((unixFile *)
12e30 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  id)->nFetchOut==
12e40 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  0 );.#endif.  re
12e50 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
12e60 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
12e70 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  0);.}..#if SQLIT
12e80 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12e90 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  0.static int uni
12ea0 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
12eb0 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
12ec0 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
12ed0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
12ee0 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65  ixFile *pFd);.#e
12ef0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
12f00 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
12f10 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
12f20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
12f30 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
12f40 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
12f50 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
12f60 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
12f70 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
12f80 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
12f90 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
12fa0 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
12fb0 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
12fc0 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
12fd0 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
12fe0 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
12ff0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
13000 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
13010 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
13020 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
13030 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
13040 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
13050 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
13060 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
13070 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
13080 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13090 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
130a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
130b0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
130c0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
130d0 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  )id;.#if SQLITE_
130e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
130f0 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
13100 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
13110 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
13120 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
13130 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
13140 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
13150 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
13160 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
13170 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
13180 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
13190 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
131a0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
131b0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
131c0 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
131d0 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
131e0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
131f0 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
13200 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
13210 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
13220 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
13230 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
13240 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
13250 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
13260 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
13270 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
13280 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
13290 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
132a0 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72  ite3_free(*(char
132b0 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68  **)&pFile->zPath
132c0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50  );.    pFile->zP
132d0 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ath = 0;.  }.#en
132e0 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
132f0 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
13300 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
13310 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
13320 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13330 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
13340 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
13350 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
13360 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
13370 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13380 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
13390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
133a0 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
133b0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
133c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
133d0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
133e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
133f0 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
13400 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
13410 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
13420 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
13430 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
13440 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
13450 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
13460 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
13470 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
13480 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
13490 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
134a0 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
134b0 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
134c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
134d0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
134e0 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
134f0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
13500 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
13510 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
13520 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
13530 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
13540 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
13550 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
13560 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
13570 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
13580 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
13590 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
135a0 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
135b0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
135c0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
135d0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
135e0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
135f0 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
13600 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
13610 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
13620 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
13630 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
13640 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
13650 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
13660 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
13670 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
13680 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
13690 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
136a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
136b0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
136c0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
136d0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
136e0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
136f0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
13700 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
13710 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
13720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13760 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
137e0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
13810 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
13820 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
13830 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
13840 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
13850 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
13860 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
13870 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
13880 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
13890 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
138a0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
138b0 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
138c0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
138d0 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
138e0 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
138f0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
13900 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
13910 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
13920 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
13930 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
13940 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
13950 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
13960 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
13970 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
13980 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
13990 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
139a0 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
139b0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
139c0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
139d0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
139e0 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
139f0 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
13a00 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
13a10 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
13a20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
13a30 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
13a40 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
13a50 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
13a60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13a70 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
13a80 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
13a90 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
13aa0 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
13ab0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
13ac0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
13ad0 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
13ae0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
13af0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
13b00 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13b10 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
13b20 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
13b30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
13b40 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
13b50 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
13b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
13b70 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
13b80 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13b90 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
13ba0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
13bb0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
13bc0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
13bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13be0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
13bf0 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
13c00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
13c10 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
13c20 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
13c30 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
13c40 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
13c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
13c70 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
13c80 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
13c90 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13ca0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
13cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13cc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
13cd0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
13ce0 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
13cf0 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ex();.  if( pFil
13d00 65 2d 3e 70 49 6e 6f 64 65 20 29 7b 20 20 0a 20  e->pInode ){  . 
13d10 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
13d20 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ->pInode->nLock>
13d30 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  0 || pFile->pIno
13d40 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
13d50 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
13d60 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
13d70 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
13d80 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
13d90 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
13da0 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
13db0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
13dc0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
13dd0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
13de0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
13df0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
13e00 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
13e10 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
13e20 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
13e30 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
13e40 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
13e50 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
13e60 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
13e70 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
13e80 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
13e90 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
13ea0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
13eb0 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
13ec0 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  nfo(pFile);.  }.
13ed0 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
13ee0 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
13ef0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
13f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f  ** End of the no
13f30 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  -op lock impleme
13f40 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
13f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
13fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14010 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64  ******** Begin d
14020 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20  ot-file Locking 
14030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
14050 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65  *.** The dotfile
14060 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
14070 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  ntation uses the
14080 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65   existence of se
14090 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66  parate lock.** f
140a0 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64  iles (really a d
140b0 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e  irectory) to con
140c0 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
140d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
140e0 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a  is works.** on j
140f0 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20  ust about every 
14100 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69  filesystem imagi
14110 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72  nable.  But ther
14120 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f  e are serious do
14130 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  wnsides:.**.**  
14140 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20    (1)  There is 
14150 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79  zero concurrency
14160 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64  .  A single read
14170 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74  er blocks all ot
14180 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  her.**         c
14190 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
141a0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
141b0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
141c0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41  .**.**    (2)  A
141d0 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72  n application cr
141e0 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73  ash or power los
141f0 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c  s can leave stal
14200 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20  e lock files.** 
14210 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20          sitting 
14220 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64  around that need
14230 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d   to be cleared m
14240 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  anually..**.** N
14250 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64  evertheless, a d
14260 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70  otlock is an app
14270 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
14280 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66   mode for use if
14290 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63   no.** other loc
142a0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73  king strategy is
142b0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
142c0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
142d0 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74  g works by creat
142e0 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f  ing a subdirecto
142f0 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ry in the same d
14300 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74  irectory as.** t
14310 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
14320 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
14330 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e  me but with a ".
14340 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20  lock" extension 
14350 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78  added..** The ex
14360 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63  istence of a loc
14370 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c  k directory impl
14380 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ies an EXCLUSIVE
14390 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65   lock.  All othe
143a0 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20  r.** lock types 
143b0 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45  (SHARED, RESERVE
143c0 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20  D, PENDING) are 
143d0 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c  mapped into EXCL
143e0 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  USIVE..*/../*.**
143f0 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78   The file suffix
14400 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61   added to the da
14410 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  ta base filename
14420 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
14430 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20  ate the.** lock 
14440 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64  directory..*/.#d
14450 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55  efine DOTLOCK_SU
14460 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a  FFIX ".lock"../*
14470 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14480 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14490 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
144a0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
144b0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
144c0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
144d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
144e0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
144f0 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
14500 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14510 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
14520 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
14530 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
14540 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14550 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
14560 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
14570 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14580 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14590 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  hecking..**.** I
145a0 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  n dotfile lockin
145b0 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b  g, either a lock
145c0 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f   exists or it do
145d0 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74  es not.  So in t
145e0 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e  his.** variation
145f0 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65   of CheckReserve
14600 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75  dLock(), *pResOu
14610 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
14620 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20   if any lock.** 
14630 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  is held on the f
14640 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66  ile and false if
14650 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
14660 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ocked..*/.static
14670 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63   int dotlockChec
14680 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
14690 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
146a0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
146b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
146c0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
146d0 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
146e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
146f0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
14700 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14720 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14730 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
14740 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14750 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73  .  reserved = os
14760 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63 68  Access((const ch
14770 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
14780 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d 30  ngContext, 0)==0
14790 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
147a0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
147b0 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22   %d (dotlock)\n"
147c0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
147d0 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70  reserved));.  *p
147e0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
147f0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
14800 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
14810 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
14820 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
14830 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
14840 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
14850 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
14860 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
14870 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
14880 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
14890 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
148a0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
148b0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
148c0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
148d0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
148e0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
148f0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
14900 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
14910 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
14920 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
14930 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
14940 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
14950 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
14960 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
14970 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
14980 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
14990 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
149a0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
149b0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
149c0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
149d0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
149e0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
149f0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
14a00 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
14a10 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
14a20 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
14a30 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14a40 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
14a50 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
14a60 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14a70 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14a80 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14a90 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14aa0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
14ab0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
14ac0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14ad0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14ae0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
14af0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
14b00 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
14b10 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14b20 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64  el..**.** With d
14b30 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
14b40 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73  we really only s
14b50 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29  upport state (4)
14b60 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20  : EXCLUSIVE..** 
14b70 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65  But we track the
14b80 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c   other locking l
14b90 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79  evels internally
14ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14bb0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
14bc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14bd0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
14be0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14bf0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14c00 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
14c10 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
14c20 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
14c30 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
14c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
14c50 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
14c60 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
14c70 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
14c80 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
14c90 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
14ca0 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
14cb0 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
14cc0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
14cd0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
14ce0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
14cf0 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
14d00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14d10 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
14d20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
14d30 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
14d40 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
14d50 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f   */.#ifdef HAVE_
14d60 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28  UTIME.    utime(
14d70 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
14d80 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d  ;.#else.    utim
14d90 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
14da0 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
14db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14dc0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
14dd0 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
14de0 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f  lock */.  rc = o
14df0 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sMkdir(zLockFile
14e00 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72  , 0777);.  if( r
14e10 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  c<0 ){.    /* fa
14e20 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
14e30 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72  ate the lock dir
14e40 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e  ectory */.    in
14e50 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
14e60 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
14e70 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
14e80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14e90 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
14ea0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
14eb0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
14ec0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
14ed0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
14ee0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
14ef0 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
14f00 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
14f10 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
14f20 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
14f30 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14f40 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f   rc;.  } .  .  /
14f50 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  * got it, set th
14f60 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
14f70 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  n ok */.  pFile-
14f80 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
14f90 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
14fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14fb0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
14fc0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
14fd0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
14fe0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
14ff0 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
15000 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
15010 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
15020 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
15030 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
15040 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
15050 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
15060 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
15070 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
15080 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
15090 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
150a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  op..**.** When t
150b0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
150c0 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b   reaches NO_LOCK
150d0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
150e0 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  k file..*/.stati
150f0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c  c int dotlockUnl
15100 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15110 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
15120 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
15130 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15140 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
15150 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
15160 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
15170 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15180 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
15190 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
151a0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
151b0 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
151c0 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c  %d (dotlock)\n",
151d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
151e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
151f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15200 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  k, osGetpid(0)))
15210 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
15220 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
15230 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f  CK );.  .  /* no
15240 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20  -op if possible 
15250 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
15260 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65  eFileLock==eFile
15270 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
15280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15290 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67  }..  /* To downg
152a0 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20  rade to shared, 
152b0 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75  simply update ou
152c0 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f  r internal notio
152d0 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
152e0 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65  ck state.  No ne
152f0 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20  ed to mess with 
15300 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
15310 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
15320 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
15330 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
15340 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
15350 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  ARED_LOCK;.    r
15360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15370 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20  .  }.  .  /* To 
15380 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65  fully unlock the
15390 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74   database, delet
153a0 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  e the lock file 
153b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  */.  assert( eFi
153c0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
153d0 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69  );.  rc = osRmdi
153e0 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  r(zLockFile);.  
153f0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
15400 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
15410 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72 72  no;.    if( tErr
15420 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no==ENOENT ){.  
15430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15440 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  OK;.    }else{.#
15450 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
15460 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
15470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15480 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15490 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
154a0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
154b0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
154c0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
154d0 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
154e0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
154f0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
15500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15510 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
15520 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15530 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
15540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15550 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
15560 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
15570 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
15580 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
15590 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
155a0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
155b0 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
155c0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69  ile *id) {.  uni
155d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
155e0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
155f0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
15600 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
15610 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
15620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
15630 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
15640 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  ext);.  return c
15650 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
15660 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
15670 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
15680 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
15690 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
156a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156b0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
156c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15700 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
15710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15750 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
15760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
15770 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
15780 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
15790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157a0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
157b0 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
157c0 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
157d0 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
157e0 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
157f0 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
15800 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
15810 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
15820 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
15830 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
15840 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
15850 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
15860 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
15870 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
15880 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
15890 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
158a0 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
158b0 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
158c0 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
158d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
158e0 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
158f0 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
15900 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
15910 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
15920 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
15930 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
15940 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
15950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
15960 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
15970 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
15980 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
15990 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
159a0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f  is turned off.*/
159b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
159c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
159d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c  ../*.** Retry fl
159e0 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ock() calls that
159f0 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52   fail with EINTR
15a00 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52  .*/.#ifdef EINTR
15a10 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
15a20 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c  st_flock(int fd,
15a30 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20   int op){.  int 
15a40 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66  rc;.  do{ rc = f
15a50 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68  lock(fd,op); }wh
15a60 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
15a70 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72  no==EINTR );.  r
15a80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
15a90 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73  e.# define robus
15aa0 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f  t_flock(a,b) flo
15ab0 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20  ck(a,b).#endif. 
15ac0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
15ad0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
15ae0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
15af0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
15b00 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
15b10 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
15b20 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
15b30 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
15b40 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
15b50 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
15b60 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
15b70 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
15b80 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
15b90 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
15ba0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
15bb0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
15bc0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
15bd0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15be0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
15bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15c00 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
15c10 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
15c20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
15c30 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
15c40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15c50 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15c60 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15c70 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
15c80 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  id;.  .  Simulat
15c90 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
15ca0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
15cb0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
15cc0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
15cd0 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f   pFile );.  .  /
15ce0 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
15cf0 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
15d00 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
15d10 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
15d20 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
15d30 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
15d40 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
15d50 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
15d60 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
15d70 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
15d80 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20   holds it. */.  
15d90 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
15da0 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
15db0 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
15dc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d  */.    int lrc =
15dd0 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
15de0 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
15df0 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20  | LOCK_NB);.    
15e00 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20  if( !lrc ){.    
15e10 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63    /* got the loc
15e20 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a  k, unlock it */.
15e30 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75        lrc = robu
15e40 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
15e50 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20  h, LOCK_UN);.   
15e60 20 20 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a     if ( lrc ) {.
15e70 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
15e80 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
15e90 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61      /* unlock fa
15ea0 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  iled with an err
15eb0 6f 72 20 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b  or */.#if OSLOCK
15ec0 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
15ed0 4f 45 52 52 0a 20 20 20 20 20 20 20 20 6c 72 63  OERR.        lrc
15ee0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
15ef0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
15f00 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
15f10 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65  R_UNLOCK);.#else
15f20 20 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20   .        lrc = 
15f30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15f40 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20  OCK; .#endif.   
15f50 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
15f60 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
15f70 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
15f80 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
15f90 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
15fa0 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20    rc = lrc;.    
15fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74      }.        st
15fc0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
15fd0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
15fe0 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
15ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
16000 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
16010 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
16020 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
16030 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
16040 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
16050 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
16060 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
16070 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
16080 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
16090 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
160a0 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
160b0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
160c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
160d0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
160e0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
160f0 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
16100 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16110 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
16120 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
16130 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
16140 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
16150 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
16160 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
16170 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
16180 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
16190 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
161a0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
161b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
161c0 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
161d0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
161e0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
161f0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
16200 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
16210 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
16220 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16230 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
16240 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
16250 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
16260 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
16270 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
16280 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
16290 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
162a0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
162b0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
162c0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
162d0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
162e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
162f0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
16300 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
16310 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
16320 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
16330 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
16340 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
16350 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
16360 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
16370 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
16380 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
16390 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
163a0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
163b0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
163c0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
163d0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
163e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
163f0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
16400 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
16410 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
16420 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
16430 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
16440 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
16450 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
16460 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
16470 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
16480 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
16490 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
164a0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
164b0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
164c0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
164d0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
164e0 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
164f0 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
16500 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
16510 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
16520 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
16530 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
16540 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
16550 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
16560 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
16570 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
16580 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
16590 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
165a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
165b0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
165c0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
165d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
165e0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
165f0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
16600 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
16610 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
16620 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
16630 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
16640 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
16650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16660 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
16670 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16680 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
16690 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
166a0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
166b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
166c0 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
166d0 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
166e0 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
166f0 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
16700 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
16710 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
16720 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
16730 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
16740 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
16750 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16760 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
16770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16780 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
16790 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
167a0 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
167b0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
167c0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
167d0 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
167e0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
167f0 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
16800 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
16810 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
16820 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
16830 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
16840 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
16850 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
16860 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
16870 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
16880 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
16890 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
168a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
168b0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
168c0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
168d0 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
168e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
168f0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
16900 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
16910 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
16920 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16930 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16940 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
16950 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
16960 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
16970 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
16980 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
16990 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
169a0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
169b0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
169c0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
169d0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
169e0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
169f0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
16a00 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
16a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16a20 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
16a30 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
16a40 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
16a50 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
16a60 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
16a70 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
16a80 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
16a90 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
16aa0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
16ab0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
16ac0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
16ad0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
16ae0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
16af0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
16b00 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
16b10 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
16b20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
16b30 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
16b40 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
16b50 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
16b60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16b70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
16b80 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16b90 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16ba0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16bb0 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
16bc0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
16bd0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
16be0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
16bf0 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
16c00 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
16c10 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
16c20 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
16c30 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
16c40 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
16c50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16c60 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
16c70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16c80 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
16c90 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
16ca0 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
16cb0 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
16cc0 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
16cd0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
16ce0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
16cf0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
16d00 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
16d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16d20 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
16d30 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
16d40 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20  nlock. */.  if( 
16d50 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
16d60 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20  le->h, LOCK_UN) 
16d70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
16d80 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16d90 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65  CK_ERRORS.    re
16da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16db0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16dc0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16dd0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
16de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16df0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d  OERR_UNLOCK;.  }
16e00 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
16e10 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
16e20 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
16e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16e40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
16e50 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
16e60 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28   int flockClose(
16e70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
16e80 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ) {.  assert( id
16e90 21 3d 30 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e  !=0 );.  flockUn
16ea0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
16eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  );.  return clos
16ec0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
16ed0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
16ee0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
16ef0 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
16f00 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  XWORK */../*****
16f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
16f20 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  nd of the flock 
16f30 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
16f40 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
16f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fa0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
16fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
17000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17010 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20  *** Begin Named 
17020 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e  Semaphore Lockin
17030 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
17040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
17050 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
17060 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
17070 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78   supported on Vx
17080 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d  Works..**.** Sem
17090 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
170a0 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20  s like dot-lock 
170b0 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61  and flock in tha
170c0 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  t it really only
170d0 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43  .** supports EXC
170e0 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20  LUSIVE locking. 
170f0 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   Only a single p
17100 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20  rocess can read 
17110 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20  or write.** the 
17120 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
17130 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
17140 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c  educes potential
17150 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75   concurrency, bu
17160 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c  t.** makes the l
17170 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
17180 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a  on much easier..
17190 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
171a0 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
171b0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
171c0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
171d0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
171e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
171f0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
17200 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
17210 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
17220 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
17230 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
17240 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
17250 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
17260 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
17270 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
17280 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
17290 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
172a0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
172b0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
172c0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
172d0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
172e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
172f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17300 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
17310 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
17320 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
17330 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
17340 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17350 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17360 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
17370 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
17380 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
17390 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
173a0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
173b0 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
173c0 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
173d0 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
173e0 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
173f0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
17400 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
17410 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
17420 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
17430 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
17440 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
17450 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
17460 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
17470 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
17480 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
17490 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
174a0 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72  ..    if( sem_tr
174b0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
174c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
174d0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
174e0 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d     if( EAGAIN !=
174f0 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
17500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
17510 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
17520 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
17530 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
17540 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RVEDLOCK);.     
17550 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
17560 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
17570 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
17580 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
17590 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
175a0 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
175b0 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
175c0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
175d0 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
175e0 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
175f0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
17600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
17610 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
17620 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
17630 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
17640 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
17650 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
17660 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
17670 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
17680 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
17690 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
176a0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
176b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
176c0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
176d0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
176e0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
176f0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
17700 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
17710 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
17720 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
17730 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
17740 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
17750 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
17760 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
17770 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
17780 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
17790 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
177a0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
177b0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
177c0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
177d0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
177e0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
177f0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
17800 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
17810 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
17820 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
17830 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
17840 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
17850 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
17860 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
17870 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
17880 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
17890 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
178a0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
178b0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
178c0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
178d0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
178e0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
178f0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
17900 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
17910 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
17920 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
17930 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
17940 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
17950 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
17960 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
17970 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
17980 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
17990 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
179a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
179b0 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
179c0 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
179d0 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
179e0 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
179f0 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
17a00 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
17a10 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
17a20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
17a30 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
17a40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
17a50 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
17a60 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
17a70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
17a80 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
17a90 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
17aa0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
17ab0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
17ac0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
17ad0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
17ae0 20 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71   int semXLock(sq
17af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
17b00 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
17b10 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
17b20 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
17b30 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
17b40 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
17b50 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72  e->pSem;.  int r
17b60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17b70 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
17b80 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
17b90 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
17ba0 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
17bb0 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
17bc0 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
17bd0 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
17be0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
17bf0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
17c00 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17c10 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
17c20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17c30 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
17c40 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
17c50 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65  * lock semaphore
17c60 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75   now but bail ou
17c70 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c  t when already l
17c80 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ocked. */.  if( 
17c90 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
17ca0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  )==-1 ){.    rc 
17cb0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17cc0 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
17cd0 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
17ce0 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
17cf0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
17d00 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
17d10 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17d20 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f  Lock;.. sem_end_
17d30 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
17d40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
17d50 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
17d60 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
17d70 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
17d80 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
17d90 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
17da0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
17db0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
17dc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
17dd0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
17de0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
17df0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
17e00 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
17e10 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
17e20 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
17e30 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17e40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17e50 73 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  semXUnlock(sqlit
17e60 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17e70 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17e80 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17e90 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17ea0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
17eb0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17ec0 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
17ed0 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
17ee0 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
17ef0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
17f00 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
17f10 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
17f20 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17f30 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17f40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17f50 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
17f60 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
17f70 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
17f80 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
17f90 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
17fa0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
17fb0 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
17fc0 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
17fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17fe0 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
17ff0 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
18000 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
18010 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
18020 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
18030 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18040 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
18050 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
18060 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
18070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18080 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
18090 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
180a0 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
180b0 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
180c0 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
180d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
180e0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
180f0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
18100 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
18110 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
18120 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
18130 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
18140 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
18150 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
18160 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
18170 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
18180 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
18190 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
181a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
181b0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
181c0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73   */.static int s
181d0 65 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  emXClose(sqlite3
181e0 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
181f0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
18200 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
18210 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
18220 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c    semXUnlock(id,
18230 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61   NO_LOCK);.    a
18240 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
18250 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
18260 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ex();.    releas
18270 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18280 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
18290 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f  Mutex();.    clo
182a0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
182b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
182c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
182d0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
182e0 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  */./*.** Named s
182f0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
18300 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
18310 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  le on VxWorks..*
18320 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
18330 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d  * End of the nam
18340 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
18350 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18360 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18370 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
18380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183c0 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
183d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18410 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
18430 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e  Begin AFP Lockin
18440 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
18450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18460 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73  ***.**.** AFP is
18470 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e   the Apple Filin
18480 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50  g Protocol.  AFP
18490 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69   is a network fi
184a0 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a  lesystem found.*
184b0 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e  * on Apple Macin
184c0 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d  tosh computers -
184d0 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53   both OS9 and OS
184e0 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70  X..**.** Third-p
184f0 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74  arty implementat
18500 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20  ions of AFP are 
18510 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
18520 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a  this code here.*
18530 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  * only works on 
18540 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  OSX..*/..#if def
18550 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
18560 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
18570 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
18580 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b  *.** The afpLock
18590 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63  ingContext struc
185a0 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  ture contains al
185b0 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69  l afp lock speci
185c0 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70  fic state.*/.typ
185d0 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c  edef struct afpL
185e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66  ockingContext af
185f0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  pLockingContext;
18600 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69  .struct afpLocki
18610 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e  ngContext {.  in
18620 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f  t reserved;.  co
18630 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
18640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18650 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
18660 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74  n file */.};..st
18670 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
18680 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
18690 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
186a0 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
186b0 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
186c0 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
186d0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
186e0 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
186f0 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
18700 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
18710 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18720 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
18730 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
18740 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
18750 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
18760 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
18770 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
18780 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
18790 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
187a0 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
187b0 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
187c0 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
187d0 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
187e0 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
187f0 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18810 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
18820 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
18830 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
18840 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
18850 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
18860 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
18870 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
18880 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a  geLockPB2)../*.*
18890 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
188a0 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ity for setting 
188b0 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69  or clearing a bi
188c0 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20  t-range lock on 
188d0 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79  an.** AFP filesy
188e0 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74  stem..** .** Ret
188f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18900 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
18910 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65  _BUSY on failure
18920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18930 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f  afpSetLock(.  co
18940 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18960 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
18970 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72   to be locked or
18980 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75   unlocked */.  u
18990 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
189b0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
189c0 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f  iptor on path */
189d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
189e0 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20   long offset,   
189f0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
18a00 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
18a10 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
18a20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20  long length,    
18a30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
18a40 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
18a50 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67   int setLockFlag
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c  /* True to set l
18a80 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63  ock.  False to c
18a90 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  lear lock */.){.
18aa0 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
18ab0 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20  geLockPB2 pb;.  
18ac0 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62  int err;.  .  pb
18ad0 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65  .unLockFlag = se
18ae0 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20  tLockFlag ? 0 : 
18af0 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64  1;.  pb.startEnd
18b00 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f  Flag = 0;.  pb.o
18b10 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
18b20 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65    pb.length = le
18b30 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d  ngth; .  pb.fd =
18b40 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20   pFile->h;.  .  
18b50 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
18b60 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64  LOCK [%s] for %d
18b70 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %s in range %llx
18b80 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
18b90 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
18ba0 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e  :"OFF"), pFile->
18bb0 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b  h, (pb.fd==-1?"[
18bc0 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c  testval-1]":""),
18bd0 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e  .    offset, len
18be0 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66  gth));.  err = f
18bf0 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
18c00 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
18c10 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
18c20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
18c30 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
18c40 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
18c50 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
18c60 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  (("AFPSETLOCK fa
18c70 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
18c80 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
18c90 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
18ca0 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
18cb0 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69  or(tErrno)));.#i
18cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
18cd0 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
18ce0 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  RS.    rc = SQLI
18cf0 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20  TE_BUSY;.#else. 
18d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
18d10 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
18d20 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  r(tErrno,.      
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
18d40 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49  tLockFlag ? SQLI
18d50 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20  TE_IOERR_LOCK : 
18d60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
18d70 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  OCK);.#endif /* 
18d80 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
18d90 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  P_LOCK_ERRORS */
18da0 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
18db0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
18dc0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
18dd0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
18de0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
18df0 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
18e00 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
18e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
18e20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18e30 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
18e40 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
18e50 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
18e60 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
18e70 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
18e80 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
18e90 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
18ea0 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
18eb0 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
18ec0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
18ed0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
18ee0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
18ef0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
18f00 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
18f10 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
18f20 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
18f30 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
18f40 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
18f50 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
18f60 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
18f70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18f80 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
18f90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18fa0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
18fb0 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
18fc0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
18fd0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
18fe0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
18ff0 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53  *context;.  .  S
19000 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19020 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
19030 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
19040 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
19050 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70    context = (afp
19060 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
19070 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
19080 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
19090 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
190a0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
190b0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
190c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
190d0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
190e0 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
190f0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
19100 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
19110 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a  reads */.  .  /*
19120 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
19130 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
19140 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
19150 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
19160 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
19170 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
19180 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
19190 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
191a0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
191b0 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
191c0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
191d0 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72  ..   */.  if( !r
191e0 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
191f0 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52  * lock the RESER
19200 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  VED byte */.    
19210 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74  int lrc = afpSet
19220 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19230 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
19240 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
19250 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ;  .    if( SQLI
19260 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20  TE_OK==lrc ){.  
19270 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63      /* if we suc
19280 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67  ceeded in taking
19290 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
192a0 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f  ck, unlock it to
192b0 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a   restore.      *
192c0 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  * the original s
192d0 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72  tate */.      lr
192e0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
192f0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19300 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
19310 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
19320 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
19330 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20  /* if we failed 
19340 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
19350 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  then someone els
19360 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a  e must have it *
19370 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  /.      reserved
19380 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
19390 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
193a0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
193b0 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20  rc=lrc;.    }.  
193c0 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
193d0 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
193e0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
193f0 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29  K %d %d %d (afp)
19400 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
19410 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
19420 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72   .  *pResOut = r
19430 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
19440 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
19450 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
19460 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
19470 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
19480 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
19490 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
194a0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
194b0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
194c0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
194d0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
194e0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
194f0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
19500 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
19510 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
19520 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
19530 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
19540 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
19550 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
19560 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
19570 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
19580 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
19590 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
195a0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
195b0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
195c0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
195d0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
195e0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
195f0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
19600 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
19610 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
19620 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
19630 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
19640 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
19650 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
19660 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
19670 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
19680 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
19690 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
196a0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
196b0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
196c0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
196d0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
196e0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
196f0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
19700 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
19710 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
19720 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
19730 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
19740 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
19750 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
19760 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
19770 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28  tic int afpLock(
19780 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19790 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
197a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
197b0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
197c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
197d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
197e0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
197f0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
19800 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
19810 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
19820 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
19830 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
19840 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
19850 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
19860 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
19870 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
19880 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
19890 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
198a0 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
198b0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
198c0 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
198d0 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
198e0 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  leLock),.       
198f0 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
19900 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
19910 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  ), pInode->nShar
19920 65 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ed , osGetpid(0)
19930 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
19940 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
19950 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
19960 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
19970 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
19980 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
19990 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
199a0 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
199b0 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
199c0 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
199d0 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
199e0 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
199f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
19a00 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
19a10 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
19a20 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
19a30 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
19a40 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22  y held) (afp)\n"
19a50 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
19a60 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
19a70 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
19a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19a90 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
19aa0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
19ab0 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
19ac0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20  s correct.  **  
19ad0 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
19ae0 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
19af0 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
19b00 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
19b10 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
19b20 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
19b30 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
19b40 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
19b50 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
19b60 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
19b70 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
19b80 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
19b90 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
19ba0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
19bb0 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
19bc0 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
19bd0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
19be0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
19bf0 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
19c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
19c10 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
19c20 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
19c30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
19c40 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
19c50 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
19c60 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
19c70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
19c80 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
19c90 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
19ca0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
19cb0 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
19cc0 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
19cd0 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
19ce0 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
19cf0 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
19d00 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
19d10 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
19d20 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
19d30 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
19d40 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
19d50 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
19d60 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
19d70 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
19d80 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65   .       (pInode
19d90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
19da0 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
19db0 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
19dc0 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
19dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
19de0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
19df0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
19e00 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
19e10 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
19e20 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
19e30 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
19e40 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
19e50 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
19e60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
19e70 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
19e80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
19e90 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
19ea0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
19eb0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
19ec0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
19ed0 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65  .     (pInode->e
19ee0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19ef0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
19f00 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
19f10 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
19f20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
19f30 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
19f40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19f50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19f60 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
19f70 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
19f80 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
19f90 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
19fa0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
19fb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
19fc0 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
19fd0 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
19fe0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
19ff0 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
1a000 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
1a010 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
1a020 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
1a030 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
1a040 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
1a050 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1a060 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
1a070 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
1a080 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
1a090 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
1a0a0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
1a0b0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
1a0c0 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
1a0d0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1a0e0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
1a0f0 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
1a100 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
1a110 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
1a120 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
1a130 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1a140 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
1a150 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
1a160 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
1a170 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
1a180 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
1a190 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
1a1a0 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
1a1b0 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
1a1c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
1a1d0 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
1a1e0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
1a1f0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
1a200 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
1a210 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
1a220 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
1a230 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1a240 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
1a250 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
1a260 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e  rno = 0;.    lon
1a270 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20  g lk, mask;.    
1a280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
1a290 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
1a2a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a2b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1a2c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a  ==0 );.        .
1a2d0 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65      mask = (size
1a2e0 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c  of(long)==8) ? L
1a2f0 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30  ARGEST_INT64 : 0
1a300 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f  x7fffffff;.    /
1a310 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
1a320 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c  ad-lock SHARED_L
1a330 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f  OCK */.    /* no
1a340 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c  te that the qual
1a350 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f  ity of the rando
1a360 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61  mness doesn't ma
1a370 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a  tter that much *
1a380 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f  /.    lk = rando
1a390 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65  m(); .    pInode
1a3a0 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
1a3b0 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52  lk & mask)%(SHAR
1a3c0 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
1a3d0 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c    lrc1 = afpSetL
1a3e0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1a3f0 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
1a400 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
1a410 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
1a420 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
1a430 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
1a440 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
1a450 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
1a460 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
1a480 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
1a490 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
1a4a0 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
1a4b0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1a4c0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1a4d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
1a4e0 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
1a4f0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
1a500 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
1a510 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1a520 46 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29  File, lrc1Errno)
1a530 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
1a540 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
1a550 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
1a560 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
1a570 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
1a580 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
1a590 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
1a5a0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
1a5b0 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
1a5c0 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
1a5d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
1a5e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
1a5f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
1a600 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
1a610 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
1a620 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
1a630 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
1a640 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
1a650 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
1a660 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1a670 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
1a680 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
1a690 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
1a6a0 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
1a6b0 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
1a6c0 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
1a6d0 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
1a6e0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
1a6f0 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
1a700 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
1a710 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1a720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1a730 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
1a740 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
1a750 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1a760 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
1a770 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
1a780 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
1a790 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
1a7a0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
1a7b0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
1a7c0 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
1a7d0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
1a7e0 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
1a7f0 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
1a800 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
1a810 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
1a820 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
1a830 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
1a840 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
1a850 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
1a860 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
1a870 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
1a880 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1a890 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
1a8a0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
1a8b0 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
1a8c0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
1a8d0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
1a8e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1a8f0 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
1a900 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
1a910 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
1a920 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
1a930 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
1a940 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
1a950 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
1a960 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
1a970 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
1a980 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
1a990 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
1a9a0 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
1a9b0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
1a9c0 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
1a9d0 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
1a9e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a9f0 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
1aa00 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
1aa10 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
1aa20 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
1aa30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aa40 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
1aa50 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
1aa60 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
1aa70 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
1aa80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1aa90 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
1aaa0 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
1aab0 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
1aac0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
1aad0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
1aae0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1aaf0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
1ab00 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
1ab30 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
1ab40 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
1ab50 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
1ab60 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1ab70 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab90 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
1aba0 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
1abb0 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
1abc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
1abd0 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
1abe0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
1abf0 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
1ac00 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
1ac10 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
1ac20 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
1ac30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ac40 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
1ac50 65 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  ed & SQLITE_IOER
1ac60 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
1ac70 52 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20  RR) ? failed2 : 
1ac80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
1aca0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1acb0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
1acc0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
1acd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ace0 72 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20  rc = failed; .  
1acf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ad00 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
1ad10 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
1ad20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
1ad30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ad40 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
1ad50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1ad60 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
1ad70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
1ad80 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
1ad90 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
1ada0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1adb0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
1adc0 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
1add0 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
1ade0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1adf0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
1ae00 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63  }.  .afp_end_loc
1ae10 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
1ae20 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
1ae30 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
1ae40 20 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46   %s (afp)\n", pF
1ae50 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
1ae60 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
1ae70 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
1ae80 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
1ae90 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
1aea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1aeb0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
1aec0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
1aed0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
1aee0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
1aef0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
1af00 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
1af10 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
1af20 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
1af30 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1af40 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
1af50 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
1af60 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
1af70 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1af80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
1af90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1afa0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1afb0 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28  c int afpUnlock(
1afc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1afd0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
1afe0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
1aff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
1b000 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1b010 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
1b020 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
1b030 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e  ode;.  afpLockin
1b040 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
1b050 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
1b060 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
1b070 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
1b080 0a 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65  .  int skipShare
1b090 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
1b0a0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
1b0b0 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65  h = pFile->h;.#e
1b0c0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1b0d0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
1b0e0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
1b0f0 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
1b100 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22   pid=%d (afp)\n"
1b110 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
1b120 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
1b130 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1b140 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
1b150 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
1b160 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
1b170 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ared,.          
1b180 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
1b190 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
1b1a0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
1b1b0 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
1b1c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
1b1d0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
1b1e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b1f0 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
1b200 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
1b210 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
1b220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
1b230 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
1b240 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
1b250 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
1b260 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
1b270 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
1b280 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
1b290 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53  ileLock );.    S
1b2a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1b2b0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d  nign(1);.    Sim
1b2c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
1b2d0 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c  (-1) ).    Simul
1b2e0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1b2f0 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66  (0);.    .#ifdef
1b300 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1b310 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
1b320 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
1b330 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
1b340 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
1b350 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
1b360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1b370 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
1b380 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
1b390 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1b3a0 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1b3b0 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
1b3c0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
1b3d0 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
1b3e0 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1b3f0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1b400 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
1b410 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
1b420 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
1b430 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
1b440 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
1b450 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
1b460 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
1b470 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
1b480 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
1b490 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
1b4a0 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
1b4b0 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
1b4c0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
1b4d0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
1b4e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  /.    assert( pF
1b4f0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
1b500 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
1b510 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64   || pFile->dbUpd
1b520 61 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ate==0.         
1b530 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e    || pFile->tran
1b540 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a  sCntrChng==1 );.
1b550 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
1b560 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  malWrite = 0;.#e
1b570 6e 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66  ndif.    .    if
1b580 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
1b590 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1b5a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
1b5b0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1b5c0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1b5d0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
1b5e0 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
1b5f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1b600 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
1b610 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1b620 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
1b630 3e 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20  >nShared>1) ){. 
1b640 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72         /* only r
1b650 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  e-establish the 
1b660 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e  shared lock if n
1b670 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
1b680 20 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f      int sharedLo
1b690 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
1b6a0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
1b6b0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20  aredByte;.      
1b6c0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1b6d0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1b6e0 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
1b6f0 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
1b700 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
1b710 20 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72          skipShar
1b720 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
1b730 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1b740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1b750 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
1b760 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
1b770 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
1b780 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1b790 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
1b7a0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
1b7b0 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69  0);.    } .    i
1b7c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b7d0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1b7e0 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
1b7f0 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e  OCK && context->
1b800 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
1b810 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1b820 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1b830 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
1b840 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  ED_BYTE, 1, 0);.
1b850 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
1b860 20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78   .        contex
1b870 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  t->reserved = 0;
1b880 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
1b890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b8a0 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c  TE_OK && (eFileL
1b8b0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
1b8c0 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   || pInode->nSha
1b8d0 72 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70  red>1)){.      p
1b8e0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1b8f0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
1b900 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1b910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b920 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
1b930 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
1b940 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
1b950 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
1b960 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
1b970 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
1b980 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
1b990 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
1b9a0 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
1b9b0 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
1b9c0 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
1b9d0 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
1b9e0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
1b9f0 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
1ba00 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
1ba10 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
1ba20 42 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Byte;.    pInode
1ba30 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
1ba40 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
1ba50 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
1ba60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ba70 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1ba80 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ba90 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20  ( h=(-1) ).     
1baa0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1bab0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1bac0 20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64   if( !skipShared
1bad0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bae0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1baf0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1bb00 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
1bb10 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  te, 1, 0);.     
1bb20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63   }.      if( !rc
1bb30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
1bb40 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1bb50 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
1bb60 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1bb70 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
1bb80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1bb90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bba0 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65   ){.      pInode
1bbb0 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20  ->nLock--;.     
1bbc0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1bbd0 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
1bbe0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
1bbf0 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
1bc00 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
1bc10 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
1bc20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
1bc30 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1bc40 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
1bc50 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
1bc60 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
1bc70 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
1bc80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1bc90 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65  ose a file & cle
1bca0 61 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69  anup AFP specifi
1bcb0 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  c locking contex
1bcc0 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t .*/.static int
1bcd0 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65   afpClose(sqlite
1bce0 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
1bcf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bd00 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
1bd10 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1bd20 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28  e*)id;.  assert(
1bd30 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 66 70 55   id!=0 );.  afpU
1bd40 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
1bd50 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d  K);.  unixEnterM
1bd60 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46  utex();.  if( pF
1bd70 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
1bd80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
1bd90 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
1bda0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
1bdb0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
1bdc0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
1bdd0 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
1bde0 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
1bdf0 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
1be00 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
1be10 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
1be20 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
1be30 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
1be40 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e  Inode->aPending.
1be50 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74    It will be aut
1be60 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
1be70 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  d when.    ** th
1be80 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
1be90 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
1bea0 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
1beb0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
1bec0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
1bed0 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  File);.  sqlite3
1bee0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
1bef0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
1bf00 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
1bf10 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65  le(id);.  unixLe
1bf20 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
1bf30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
1bf40 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1bf50 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1bf60 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1bf70 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1bf80 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1bf90 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
1bfa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1bfb0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1bfc0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1bfd0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1bfe0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1bff0 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c000 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c010 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c020 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
1c030 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
1c040 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
1c050 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
1c060 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
1c070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c080 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1c090 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1c0a0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1c0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1c110 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1c120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c160 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
1c180 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
1c190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c1b0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1c1c0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c1d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c1e0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
1c1f0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1c200 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1c210 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1c220 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1c230 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
1c240 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
1c250 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
1c260 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
1c270 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1c280 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
1c290 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
1c2a0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
1c2b0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1c2c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
1c2d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c2e0 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
1c2f0 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
1c300 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1c310 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
1c320 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
1c330 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
1c340 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
1c350 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1c360 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1c370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1c380 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
1c390 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
1c3a0 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
1c3b0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1c3c0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
1c3d0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
1c3e0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
1c3f0 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
1c400 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
1c410 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
1c420 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1c430 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
1c440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1c450 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
1c460 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c480 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1c490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4d0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
1c4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c520 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1c530 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
1c540 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
1c550 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
1c560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c570 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1c580 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
1c590 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
1c5a0 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
1c5b0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
1c5c0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
1c5d0 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
1c5e0 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
1c5f0 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
1c600 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
1c610 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
1c620 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
1c630 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
1c640 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
1c650 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
1c660 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
1c670 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
1c680 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
1c690 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
1c6a0 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
1c6b0 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
1c6c0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1c6d0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1c6e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1c6f0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
1c700 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
1c710 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
1c720 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1c730 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
1c740 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
1c750 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
1c760 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
1c770 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
1c780 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
1c790 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
1c7a0 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
1c7b0 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
1c7c0 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
1c7d0 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
1c7e0 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
1c7f0 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
1c800 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e   USE_PREAD.** in
1c810 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
1c820 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
1c830 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
1c840 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
1c850 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
1c860 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
1c870 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
1c880 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1c890 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1c8a0 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
1c8b0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1c8c0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1c8d0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1c8e0 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1c8f0 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
1c900 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
1c910 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
1c920 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1c930 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74    int got;.  int
1c940 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20   prior = 0;.#if 
1c950 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
1c960 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
1c970 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
1c980 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
1c990 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
1c9a0 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20  TART;.  assert( 
1c9b0 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66  cnt==(cnt&0x1fff
1c9c0 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1c9d0 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b  id->h>2 );.  do{
1c9e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1c9f0 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20  _PREAD).    got 
1ca00 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c  = osPread(id->h,
1ca10 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1ca20 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
1ca30 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1ca40 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
1ca50 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1ca60 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
1ca70 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
1ca80 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
1ca90 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1caa0 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
1cab0 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66  .#else.    newOf
1cac0 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
1cad0 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
1cae0 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1caf0 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f  ateIOError( newO
1cb00 66 66 73 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20  ffset = -1 );.  
1cb10 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 3c    if( newOffset<
1cb20 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  0 ){.      store
1cb30 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1cb40 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b  ile*)id, errno);
1cb50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1cb60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
1cb70 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
1cb80 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
1cb90 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
1cba0 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
1cbb0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
1cbc0 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
1cbd0 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
1cbe0 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
1cbf0 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
1cc00 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1cc10 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
1cc20 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  ,  errno);.     
1cc30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
1cc40 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20  e if( got>0 ){. 
1cc50 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b       cnt -= got;
1cc60 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1cc70 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f   got;.      prio
1cc80 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  r += got;.      
1cc90 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67  pBuf = (void*)(g
1cca0 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66  ot + (char*)pBuf
1ccb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1ccc0 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49  e( got>0 );.  TI
1ccd0 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
1cce0 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE(("READ    %-3
1ccf0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
1cd00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1cd10 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f   id->h, got+prio
1cd20 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c  r, offset-prior,
1cd30 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1cd40 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70  ;.  return got+p
1cd50 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rior;.}../*.** R
1cd60 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
1cd70 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
1cd80 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
1cd90 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
1cda0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
1cdb0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
1cdc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
1cdd0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1cde0 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
1cdf0 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
1ce00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ce10 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
1ce20 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
1ce30 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1ce40 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78  offset.){.  unix
1ce50 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
1ce60 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
1ce70 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
1ce80 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
1ce90 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
1cea0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1ceb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1cec0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1ced0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1cee0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1cef0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1cf00 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1cf10 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1cf20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1cf30 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1cf40 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1cf50 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1cf60 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1cf70 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1cf80 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1cf90 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1cfa0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1cfb0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1cfc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1cfd0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1cfe0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1cff0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
1d000 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1d010 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1d020 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1d030 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1d040 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1d050 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1d060 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1d070 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1d080 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1d090 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d0a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1d0b0 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
1d0c0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1d0d0 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
1d0e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d0f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1d100 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1d110 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1d120 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1d130 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
1d140 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
1d150 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1d160 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
1d170 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1d180 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1d190 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1d1a0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1d1b0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1d1c0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1d1d0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
1d1e0 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
1d1f0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
1d200 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
1d210 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d220 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
1d230 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1d240 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
1d250 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
1d260 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1d270 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
1d280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
1d290 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1d2a0 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74  le, 0);   /* not
1d2b0 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1d2c0 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
1d2d0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
1d2e0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
1d2f0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
1d300 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
1d310 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
1d320 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
1d330 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d340 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1d350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1d360 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
1d370 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
1d380 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1d390 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
1d3a0 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
1d3b0 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
1d3c0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
1d3d0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1d3e0 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
1d3f0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1d400 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
1d410 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
1d420 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
1d430 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
1d440 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
1d450 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
1d460 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
1d470 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
1d480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1d490 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
1d4a0 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d4c0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1d4d0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1d4e0 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1d510 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1d520 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1d530 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1d540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1d550 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1d560 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1d570 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1d580 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1d590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d5a0 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1d5b0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1d5c0 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d5e0 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1d5f0 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1d600 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1d610 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1d620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d630 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1d640 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1d650 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1d660 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1d670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1d680 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
1d690 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e  iErrno!=0 );.  n
1d6a0 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a  Buf &= 0x1ffff;.
1d6b0 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a    TIMER_START;..
1d6c0 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
1d6d0 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20  PREAD).  do{ rc 
1d6e0 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28  = (int)osPwrite(
1d6f0 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1d700 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72  iOff); }while( r
1d710 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1d720 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
1d730 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1d740 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1d750 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c  t)osPwrite64(fd,
1d760 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1d770 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  f);}while( rc<0 
1d780 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
1d790 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
1d7a0 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73    i64 iSeek = ls
1d7b0 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45  eek(fd, iOff, SE
1d7c0 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
1d7d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53  ulateIOError( iS
1d7e0 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20  eek = -1 );.    
1d7f0 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20  if( iSeek<0 ){. 
1d800 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1d810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d820 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1d830 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1d840 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1d850 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1d860 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1d870 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1d880 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1d890 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1d8a0 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1d8b0 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1d8c0 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1d8d0 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72   ) *piErrno = er
1d8e0 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rno;.  return rc
1d8f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ;.}.../*.** Seek
1d900 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
1d910 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
1d920 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
1d930 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
1d940 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1d950 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1d960 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
1d970 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a   the offset..**.
1d980 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1d990 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1d9a0 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1d9b0 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45   write the lastE
1d9c0 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1d9d0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1d9e0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1d9f0 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
1da00 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
1da10 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
1da20 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
1da30 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e  t cnt){.  return
1da40 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
1da50 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70  id->h, offset, p
1da60 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c  Buf, cnt, &id->l
1da70 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f  astErrno);.}.../
1da80 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1da90 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
1daa0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
1dab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1dac0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
1dad0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1dae0 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
1daf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1db00 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
1db10 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
1db20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1db30 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1db40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1db50 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46  fset .){.  unixF
1db60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1db70 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
1db80 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
1db90 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1dba0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1dbb0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1dbc0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1dbd0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1dbe0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1dbf0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1dc00 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1dc10 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1dc20 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1dc30 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1dc40 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1dc50 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
1dc60 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1dc70 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1dc80 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1dc90 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1dca0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1dcb0 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1dcc0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1dcd0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
1dce0 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1dcf0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1dd00 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1dd10 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e  sed to.  ** doin
1dd20 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1dd30 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1dd40 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1dd50 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1dd60 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1dd70 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65  se file) then re
1dd80 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1dd90 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  at the database.
1dda0 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64    ** has changed
1ddb0 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
1ddc0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
1ddd0 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72   modified, recor
1dde0 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74  d that.  ** fact
1ddf0 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
1de00 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1de10 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69  Write ){.    pFi
1de20 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31  le->dbUpdate = 1
1de30 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
1de40 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
1de50 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  fied */.    if( 
1de60 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66  offset<=24 && of
1de70 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a  fset+amt>=27 ){.
1de80 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1de90 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72      char oldCntr
1dea0 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  [4];.      Simul
1deb0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1dec0 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
1ded0 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
1dee0 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20  e, 24, oldCntr, 
1def0 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4);.      Simula
1df00 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1df10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1df20 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c  !=4 || memcmp(ol
1df30 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29  dCntr, &((char*)
1df40 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d  pBuf)[24-offset]
1df50 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)!=0 ){.     
1df60 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1df70 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a  ntrChng = 1;  /*
1df80 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1df90 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61   counter has cha
1dfa0 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  nged */.      }.
1dfb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1dfc0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1dfd0 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
1dfe0 49 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  ITE) && SQLITE_M
1dff0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1e000 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
1e010 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
1e020 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
1e030 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
1e040 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
1e050 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
1e060 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
1e070 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
1e080 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
1e090 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1e0a0 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
1e0b0 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
1e0c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
1e0d0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1e0e0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1e0f0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1e100 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
1e110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1e130 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d  t nCopy = pFile-
1e140 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
1e150 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  et;.      memcpy
1e160 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d  (&((u8 *)(pFile-
1e170 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1e180 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f  fset], pBuf, nCo
1e190 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
1e1a0 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
1e1b0 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
1e1c0 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
1e1d0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
1e1e0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
1e1f0 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28 20 28  dif. .  while( (
1e200 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  wrote = seekAndW
1e210 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  rite(pFile, offs
1e220 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3c  et, pBuf, amt))<
1e230 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30 20 29  amt && wrote>0 )
1e240 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1e250 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1e260 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1e270 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1e280 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1e290 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1e2a0 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1e2b0 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1e2c0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1e2d0 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1e2e0 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1e2f0 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 69 66  >wrote ){.    if
1e300 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
1e310 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
1e320 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
1e330 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1e340 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
1e350 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1e360 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1e370 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
1e380 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1e390 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f  rno(pFile, 0); /
1e3a0 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
1e3b0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
1e3c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1e3d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1e3e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e3f0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1e400 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1e410 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1e420 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1e430 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1e440 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1e450 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1e460 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1e470 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1e480 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1e490 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1e4a0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1e4b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1e4c0 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1e4d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1e4e0 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1e4f0 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1e500 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1e510 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1e520 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1e530 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1e540 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1e550 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1e560 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1e570 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1e580 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1e590 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1e5a0 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1e5b0 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1e5c0 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1e5d0 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1e5e0 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56  atasync or -DHAV
1e5f0 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23  E_FDATASYNC.*/.#
1e600 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1e610 61 73 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f  async) && !HAVE_
1e620 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69  FDATASYNC.# defi
1e630 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1e640 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1e650 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1e660 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1e670 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1e680 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1e690 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1e6a0 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1e6b0 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1e6c0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1e6d0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1e6e0 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1e6f0 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1e700 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1e710 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1e720 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1e730 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1e740 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1e750 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   0.#endif..#ifde
1e760 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51  f SQLITE_USE_REQ
1e770 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  UEST_FULLFSYNC.#
1e780 69 6d 70 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68  import <notify.h
1e790 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65  >.#import <libke
1e7a0 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73  rn/OSAtomic.h>.s
1e7b0 74 61 74 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b  tatic OSSpinLock
1e7c0 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30   notify_lock = 0
1e7d0 3b 0a 23 64 65 66 69 6e 65 20 52 45 51 55 45 53  ;.#define REQUES
1e7e0 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46  T_FULLSYNC_NOTIF
1e7f0 49 43 41 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e  ICATION    "com.
1e800 61 70 70 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23  apple.reqsync".#
1e810 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1e820 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
1e830 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
1e840 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
1e850 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
1e860 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
1e870 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
1e880 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
1e890 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
1e8a0 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
1e8b0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
1e8c0 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
1e8d0 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
1e8e0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
1e8f0 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
1e900 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
1e910 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
1e920 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
1e930 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
1e940 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
1e950 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
1e960 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1e970 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
1e980 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
1e990 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1e9a0 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
1e9b0 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
1e9c0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
1e9d0 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
1e9e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e9f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  le..**.** SQLite
1ea00 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e   sets the dataOn
1ea10 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73  ly flag if the s
1ea20 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1ea30 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
1ea40 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64   The idea behind
1ea50 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61   dataOnly is tha
1ea60 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  t it should only
1ea70 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
1ea80 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69  content.** to di
1ea90 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64  sk, not the inod
1eaa0 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20  e.  We only set 
1eab0 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20  dataOnly if the 
1eac0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a  file size is .**
1ead0 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65   unchanged since
1eae0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1eaf0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
1eb00 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a  ode.  However, .
1eb10 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c  ** Ted Ts'o tell
1eb20 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73  s us that fdatas
1eb30 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20  ync() will also 
1eb40 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20  write the inode 
1eb50 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73  if the.** file s
1eb60 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ize has changed.
1eb70 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20    The only real 
1eb80 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1eb90 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a  en fdatasync().*
1eba0 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54  * and fsync(), T
1ebb0 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20  ed tells us, is 
1ebc0 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1ebd0 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20   will not flush 
1ebe0 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20  the.** inode if 
1ebf0 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e  the mtime or own
1ec00 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64  er or other inod
1ec10 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76  e attributes hav
1ec20 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65  e changed..** We
1ec30 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
1ec40 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1ec50 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69  not the other fi
1ec60 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73  le attributes, s
1ec70 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53  o.** as far as S
1ec80 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e  QLite is concern
1ec90 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63  ed, an fdatasync
1eca0 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65  () is always ade
1ecb0 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65  quate..** So, we
1ecc0 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74   always use fdat
1ecd0 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73  async() if it is
1ece0 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61   available, rega
1ecf0 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65  rdless of.** the
1ed00 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
1ed10 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a  taOnly flag..*/.
1ed20 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
1ed30 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
1ed40 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
1ed50 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
1ed60 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66   rc;..  /* The f
1ed70 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f  ollowing "ifdef/
1ed80 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63  elif/else/" bloc
1ed90 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  k has the same s
1eda0 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a  tructure as.  **
1edb0 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20   the one below. 
1edc0 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64  It is replicated
1edd0 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20   here solely to 
1ede0 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67  avoid cluttering
1edf0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65   .  ** up the re
1ee00 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65  al code with the
1ee10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ee20 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f  R() macros..  */
1ee30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1ee40 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  O_SYNC.  UNUSED_
1ee50 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1ee60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ee70 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1ee80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1ee90 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66  dataOnly);.#elif
1eea0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1eeb0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1eec0 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1eed0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
1eee0 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1eef0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1ef00 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1ef10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
1ef20 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
1ef30 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
1ef40 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
1ef50 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
1ef60 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
1ef70 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
1ef80 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
1ef90 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
1efa0 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
1efb0 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
1efc0 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
1efd0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1efe0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
1eff0 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
1f000 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
1f010 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
1f020 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
1f030 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
1f040 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
1f050 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
1f060 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
1f070 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
1f080 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61 64  p.  But go ahead
1f090 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74 28   and call fstat(
1f0a0 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74 68  ) to validate th
1f0b0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  e file.  ** desc
1f0c0 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65 65  riptor as we nee
1f0d0 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70 72  d a method to pr
1f0e0 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65 20  ovoke a failure 
1f0f0 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65  during.  ** cove
1f100 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20 20  rate testing..  
1f110 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1f120 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20  _NO_SYNC.  {.   
1f130 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1f140 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  ;.    rc = osFst
1f150 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20 20  at(fd, &buf);.  
1f160 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  }.#elif HAVE_FUL
1f170 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
1f180 6c 53 79 6e 63 20 29 7b 0a 23 69 66 64 65 66 20  lSync ){.#ifdef 
1f190 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45  SQLITE_USE_REQUE
1f1a0 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  ST_FULLFSYNC.   
1f1b0 20 72 63 20 3d 20 6f 73 46 73 79 6e 63 28 66 64   rc = osFsync(fd
1f1c0 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20  );.    if (!rc) 
1f1d0 7b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f  {.      OSSpinLo
1f1e0 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c  ckLock(&notify_l
1f1f0 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ock);.      rc =
1f200 20 6e 6f 74 69 66 79 5f 70 6f 73 74 28 52 45 51   notify_post(REQ
1f210 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f  UEST_FULLSYNC_NO
1f220 54 49 46 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20  TIFICATION);.   
1f230 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c     OSSpinLockUnl
1f240 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b  ock(&notify_lock
1f250 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  );.    }.#else. 
1f260 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
1f270 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c  fd, F_FULLFSYNC,
1f280 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65   0);.#endif.  }e
1f290 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
1f2a0 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
1f2b0 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
1f2c0 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
1f2d0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
1f2e0 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
1f2f0 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
1f300 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
1f310 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
1f320 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
1f330 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
1f340 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
1f350 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
1f360 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
1f370 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
1f380 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
1f390 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
1f3a0 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
1f3b0 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
1f3c0 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
1f3d0 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
1f3e0 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
1f3f0 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
1f400 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
1f410 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
1f420 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
1f430 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
1f440 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
1f450 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
1f460 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
1f470 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
1f480 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
1f490 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61  PPLE__).  /* fda
1f4a0 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b  tasync() on HFS+
1f4b0 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75   doesn't yet flu
1f4c0 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  sh the file size
1f4d0 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63   if it changed c
1f4e0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f  orrectly.  ** so
1f4f0 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65   currently we de
1f500 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63  fault to the mac
1f510 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65  ro that redefine
1f520 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66  s fdatasync to f
1f530 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  sync.  */.  rc =
1f540 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73   fsync(fd);.#els
1f550 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73  e .  rc = fdatas
1f560 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f  ync(fd);.#if OS_
1f570 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1f580 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ==-1 && errno==E
1f590 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63  NOTSUP ){.    rc
1f5a0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
1f5b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
1f5c0 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66  XWORKS */.#endif
1f5d0 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
1f5e0 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
1f5f0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
1f600 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b  .  if( OS_VXWORK
1f610 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
1f620 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
1f630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f640 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1f650 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1f660 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1f670 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
1f680 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
1f690 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
1f6a0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
1f6b0 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
1f6c0 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
1f6d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1f6e0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
1f6f0 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
1f700 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
1f710 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1f720 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f730 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1f740 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
1f750 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  value..**.** The
1f760 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
1f770 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73  descriptor is us
1f780 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20  ed for only one 
1f790 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73  thing - to.** fs
1f7a0 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72  ync() a director
1f7b0 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66  y to make sure f
1f7c0 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  ile creation and
1f7d0 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73   deletion events
1f7e0 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20  .** are flushed 
1f7f0 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66  to disk.  Such f
1f800 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65  syncs are not ne
1f810 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a  eded on newer.**
1f820 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65   journaling file
1f830 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65  systems, but are
1f840 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64   required on old
1f850 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  er filesystems..
1f860 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f870 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  ne can be overri
1f880 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78  dden using the x
1f890 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72  SetSysCall inter
1f8a0 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69  face..** The abi
1f8b0 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
1f8c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1f8d0 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f  s added in suppo
1f8e0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72  rt of the.** chr
1f8f0 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20  omium sandbox.  
1f900 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74  Opening a direct
1f910 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74  ory is a securit
1f920 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a  y risk (we are.*
1f930 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e  * told) so makin
1f940 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c  g it overrideabl
1f950 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72  e allows the chr
1f960 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f  omium sandbox to
1f970 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73  .** replace this
1f980 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
1f990 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20  harmless no-op. 
1f9a0 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f   To make this ro
1f9b0 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  utine.** a no-op
1f9c0 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  , replace it wit
1f9d0 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65  h a stub that re
1f9e0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1f9f0 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70  but leaves.** *p
1fa00 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61  Fd set to a nega
1fa10 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  tive number..**.
1fa20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1fa30 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1fa40 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1fa50 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
1fa60 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
1fa70 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
1fa80 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
1fa90 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
1faa0 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
1fab0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1fac0 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
1fad0 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
1fae0 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
1faf0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
1fb00 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
1fb10 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1fb20 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
1fb30 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
1fb40 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
1fb50 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
1fb60 65 29 3b 20 69 69 3e 30 20 26 26 20 7a 44 69 72  e); ii>0 && zDir
1fb70 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
1fb80 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
1fb90 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
1fba0 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  [ii] = '\0';.  }
1fbb0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 44  else{.    if( zD
1fbc0 69 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f 27 20 29  irname[0]!='/' )
1fbd0 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 20 3d 20 27   zDirname[0] = '
1fbe0 2e 27 3b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65  .';.    zDirname
1fbf0 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66  [1] = 0;.  }.  f
1fc00 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
1fc10 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1fc20 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1fc30 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
1fc40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
1fc50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1fc60 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
1fc70 3b 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66  ;.  }.  *pFd = f
1fc80 64 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29  d;.  if( fd>=0 )
1fc90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fca0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 75 6e 69 78  K;.  return unix
1fcb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1fcc0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
1fcd0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20  openDirectory", 
1fce0 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  zDirname);.}../*
1fcf0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
1fd00 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
1fd10 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
1fd20 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
1fd30 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
1fd40 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
1fd50 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
1fd60 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
1fd70 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
1fd80 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
1fd90 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
1fda0 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
1fdb0 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
1fdc0 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
1fdd0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
1fde0 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
1fdf0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1fe00 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1fe10 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
1fe20 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
1fe30 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
1fe40 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1fe50 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1fe60 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
1fe70 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
1fe80 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
1fe90 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
1fea0 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
1feb0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1fec0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
1fed0 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
1fee0 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
1fef0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
1ff00 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
1ff10 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
1ff20 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
1ff30 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
1ff40 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1ff50 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1ff60 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
1ff70 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
1ff80 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1ff90 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
1ffa0 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
1ffb0 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
1ffc0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
1ffd0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1ffe0 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
1fff0 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
20000 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
20010 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
20020 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
20030 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
20040 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
20050 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
20060 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
20070 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
20080 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
20090 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
200a0 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
200b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
200c0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
200d0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
200e0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
200f0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
20100 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
20110 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
20120 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
20130 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
20140 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
20150 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
20160 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
20170 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
20180 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
20190 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
201a0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
201b0 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
201c0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
201d0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
201e0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73  TE_FULL );..  as
201f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
20200 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
20210 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
20220 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66  e->h));.  rc = f
20230 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
20240 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
20250 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
20260 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
20270 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
20280 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
20290 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
202a0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
202b0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
202c0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
202d0 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
202e0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
202f0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
20300 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
20310 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
20320 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
20330 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
20340 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
20350 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
20360 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rence.  Many sys
20370 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
20380 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
20390 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
203a0 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
203b0 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
203c0 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
203d0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
203e0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
203f0 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
20400 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
20410 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
20420 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
20430 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
20440 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
20450 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
20460 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
20470 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
20480 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
20490 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
204a0 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
204b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
204c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
204d0 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c  ull_fsync(dirfd,
204e0 20 30 2c 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c   0, 0);.#if OSCL
204f0 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f  OSE_CHECK_CLOSE_
20500 49 4f 45 52 52 0a 20 20 20 20 20 20 69 66 28 20  IOERR.      if( 
20510 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
20520 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
20530 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
20540 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
20550 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20560 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
20570 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
20580 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
20590 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
205a0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64   __LINE__);.#end
205b0 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
205c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
205d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
205e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
205f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20600 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
20610 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
20620 5f 44 49 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20  _DIRSYNC;..  }. 
20630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20640 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
20650 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
20660 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
20670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20680 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
20690 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
206a0 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
206b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
206c0 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
206d0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
206e0 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
206f0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
20700 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
20710 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
20720 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
20730 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
20740 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
20750 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
20760 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
20770 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
20780 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
20790 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
207a0 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
207b0 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
207c0 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
207d0 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
207e0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
207f0 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
20800 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
20810 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
20820 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
20830 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
20840 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
20850 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
20860 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
20870 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
20880 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
20890 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20  e->h, nByte);.  
208a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
208b0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
208c0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
208d0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
208e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
208f0 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
20900 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
20910 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
20920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20930 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
20940 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
20950 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
20960 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
20970 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
20980 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
20990 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
209a0 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
209b0 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
209c0 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
209d0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
209e0 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
209f0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
20a00 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
20a10 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
20a20 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
20a30 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
20a40 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
20a50 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
20a60 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
20a70 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
20a80 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
20a90 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
20aa0 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
20ab0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
20ac0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
20ad0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
20ae0 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
20af0 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
20b00 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
20b10 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20b20 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20  IZE>0.    /* If 
20b30 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
20b40 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
20b50 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
20b60 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
20b70 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
20b80 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
20b90 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
20ba0 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
20bb0 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
20bc0 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
20bd0 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
20be0 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
20bf0 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
20c00 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
20c10 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
20c20 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
20c30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20c40 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
20c50 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
20c60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20c70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
20c80 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
20c90 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20ca0 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
20cb0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
20cc0 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
20cd0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
20ce0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
20cf0 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
20d00 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
20d10 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
20d20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
20d30 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
20d40 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
20d50 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
20d60 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
20d70 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
20d80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
20d90 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
20da0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
20db0 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
20dc0 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
20dd0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
20de0 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
20df0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
20e00 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
20e10 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
20e20 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
20e30 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
20e40 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
20e50 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
20e60 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
20e70 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
20e80 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
20e90 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
20ea0 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
20eb0 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
20ec0 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
20ed0 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
20ee0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
20ef0 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
20f00 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
20f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
20f20 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
20f30 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
20f40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
20f50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20f60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
20f70 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
20f80 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
20f90 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
20fa0 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
20fb0 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
20fc0 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
20fd0 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
20fe0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
20ff0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
21000 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
21010 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
21020 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
21030 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21040 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
21050 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
21060 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
21070 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
21080 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c   operation.  Enl
21090 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73  arge the databas
210a0 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73  e to nBytes in s
210b0 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20  ize.** (rounded 
210c0 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  up to the next c
210d0 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20  hunk-size).  If 
210e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
210f0 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65  already.** nByte
21100 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69  s or larger, thi
21110 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
21120 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
21130 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
21140 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
21150 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
21160 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
21170 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34  unk>0 ){.    i64
21180 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
21190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
211a0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
211b0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
211c0 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
211d0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
211e0 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
211f0 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
21200 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
21210 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
21220 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 73  &buf) ){.      s
21230 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
21240 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
21250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21260 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
21270 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d    }..    nSize =
21280 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
21290 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
212a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
212b0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
212c0 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
212d0 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
212e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
212f0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
21300 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
21310 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
21320 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
21330 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
21340 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
21350 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
21360 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
21370 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
21380 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
21390 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
213a0 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
213b0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
213c0 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
213d0 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
213e0 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
213f0 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
21400 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
21410 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
21420 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
21430 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
21440 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
21450 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
21460 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
21470 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
21480 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
21490 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
214a0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
214b0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
214c0 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
214d0 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
214e0 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
214f0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
21500 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
21510 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
21520 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
21530 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
21540 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
21550 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
21560 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
21570 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
21580 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
21590 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
215a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
215b0 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
215c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
215d0 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
215e0 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
215f0 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
21600 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
21610 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
21620 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
21630 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
21640 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
21650 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
21660 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
21670 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
21680 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
21690 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
216a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
216b0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
216c0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
216d0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
216e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
216f0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
21700 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
21710 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
21720 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42   (buf.st_size/nB
21730 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20  lk)*nBlk + nBlk 
21740 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
21750 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73  t( iWrite>=buf.s
21760 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  t_size );.      
21770 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65  assert( ((iWrite
21780 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a  +1)%nBlk)==0 );.
21790 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f        for(/*no-o
217a0 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a  p*/; iWrite<nSiz
217b0 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65  e+nBlk-1; iWrite
217c0 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  +=nBlk ){.      
217d0 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53    if( iWrite>=nS
217e0 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e  ize ) iWrite = n
217f0 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20  Size - 1;.      
21800 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41    nWrite = seekA
21810 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69  ndWrite(pFile, i
21820 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20  Write, "", 1);. 
21830 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
21840 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
21850 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
21860 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
21870 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
21880 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
21890 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
218a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
218b0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
218c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
218d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
218e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
218f0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
21900 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
21910 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
21920 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
21930 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
21940 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
21950 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
21960 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
21970 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
21980 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
21990 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
219a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
219b0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
219c0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
219d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
219e0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
219f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21a00 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
21a10 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
21a20 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
21a30 50 4c 45 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20  PLE__).#include 
21a40 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65  "sqlite3_private
21a50 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 6f  .h".#include <co
21a60 70 79 66 69 6c 65 2e 68 3e 0a 73 74 61 74 69 63  pyfile.h>.static
21a70 20 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50   int proxyGetDbP
21a80 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75  athForUnixFile(u
21a90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
21aa0 63 68 61 72 20 2a 64 62 50 61 74 68 29 3b 0a 23  char *dbPath);.#
21ab0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
21ac0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
21ad0 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
21ae0 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  t isProxyLocking
21af0 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 29  Mode(unixFile *)
21b00 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
21b10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
21b20 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
21b30 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
21b40 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
21b50 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65 28  runcateDatabase(
21b60 75 6e 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29  unixFile *, int)
21b70 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  ;..static int un
21b80 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70  ixInvalidateSupp
21b90 6f 72 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c  ortFiles(unixFil
21ba0 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74  e *, int);..stat
21bb0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
21bc0 65 46 69 6c 65 4d 6f 64 65 28 63 6f 6e 73 74 20  eFileMode(const 
21bd0 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64  char *, int, mod
21be0 65 5f 74 2a 2c 20 75 69 64 5f 74 20 2a 2c 67 69  e_t*, uid_t *,gi
21bf0 64 5f 74 20 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e  d_t *);../* open
21c00 73 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63  s a read/write c
21c10 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 66  onnection to a f
21c20 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 68 65 72 69  ile zName inheri
21c30 74 69 6e 67 20 74 68 65 20 61 70 70 72 6f 70 72  ting the appropr
21c40 69 61 74 65 0a 2a 2a 20 75 73 65 72 2f 70 65 72  iate.** user/per
21c50 6d 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ms from the data
21c60 62 61 73 65 20 66 69 6c 65 20 69 66 20 72 75 6e  base file if run
21c70 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 20 20 52  ning as root.  R
21c80 65 74 75 72 6e 73 20 74 68 65 20 66 69 6c 65 20  eturns the file 
21c90 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 62  .** descriptor b
21ca0 79 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 73  y reference.*/.s
21cb0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
21cc0 65 6e 43 68 69 6c 64 46 69 6c 65 28 0a 20 20 63  enChildFile(.  c
21cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
21ce0 2c 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ,.  int openFlag
21cf0 73 2c 0a 20 20 69 6e 74 20 64 62 4f 70 65 6e 46  s,.  int dbOpenF
21d00 6c 61 67 73 2c 0a 20 20 69 6e 74 20 70 72 6f 74  lags,.  int prot
21d10 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 46  Flags,.  int *pF
21d20 64 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20  d.){.  int fd = 
21d30 2d 31 3b 0a 20 20 6d 6f 64 65 5f 74 20 6f 70 65  -1;.  mode_t ope
21d40 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
21d50 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
21d60 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
21d70 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
21d80 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  t uid;          
21d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
21da0 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rid for the file
21db0 20 2a 2f 0a 20 20 67 69 64 5f 74 20 67 69 64 3b   */.  gid_t gid;
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66      /* Groupid f
21de0 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
21df0 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73   int rc;.  .  as
21e00 73 65 72 74 28 70 46 64 21 3d 4e 55 4c 4c 29 3b  sert(pFd!=NULL);
21e10 0a 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61  .  rc = findCrea
21e20 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
21e30 2c 20 64 62 4f 70 65 6e 46 6c 61 67 73 2c 20 26  , dbOpenFlags, &
21e40 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
21e50 26 67 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21  &gid);.  if( rc!
21e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21e80 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
21e90 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
21ea0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
21eb0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
21ec0 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
21ed0 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
21ee0 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 69  openFlags));.  i
21ef0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  f( fd<0 ){.    r
21f00 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
21f10 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
21f20 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
21f30 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
21f40 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69  n rc;.  }.  /* i
21f50 66 20 77 65 27 72 65 20 6f 70 65 6e 69 6e 67 20  f we're opening 
21f60 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f 75 72 6e  the wal or journ
21f70 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 61  al and running a
21f80 73 20 72 6f 6f 74 2c 20 73 65 74 0a 20 20 2a 2a  s root, set.  **
21f90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64   the journal uid
21fa0 2f 67 69 64 20 2a 2f 0a 20 20 69 66 28 20 64 62  /gid */.  if( db
21fb0 4f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c  OpenFlags & (SQL
21fc0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
21fd0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
21fe0 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 75 69  URNAL) ){.    ui
21ff0 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75  d_t euid = geteu
22000 69 64 28 29 3b 0a 20 20 20 20 69 66 28 20 65 75  id();.    if( eu
22010 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
22020 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29  uid || getegid()
22030 21 3d 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  !=gid) ){.      
22040 69 66 28 20 66 63 68 6f 77 6e 28 66 64 2c 20 75  if( fchown(fd, u
22050 69 64 2c 20 67 69 64 29 20 29 7b 0a 20 20 20 20  id, gid) ){.    
22060 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22070 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
22080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22090 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
220a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 46 64  E_OK ){.    *pFd
220b0 20 3d 20 66 64 3b 0a 20 20 7d 20 65 6c 73 65 20   = fd;.  } else 
220c0 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20 2d 31 3b  {.    *pFd = -1;
220d0 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  .    close(fd);.
220e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
220f0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
22100 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61  nixReplaceDataba
22110 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
22120 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a 73 72 63  le, sqlite3 *src
22130 64 62 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  db) {.  sqlite3_
22140 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69  file *id = (sqli
22150 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  te3_file *)pFile
22160 3b 0a 20 20 42 74 72 65 65 20 2a 70 53 72 63 42  ;.  Btree *pSrcB
22170 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73  tree = NULL;.  s
22180 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 72 63  qlite3_file *src
22190 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _file = NULL;.  
221a0 75 6e 69 78 46 69 6c 65 20 2a 70 53 72 63 46 69  unixFile *pSrcFi
221b0 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61  le = NULL;.  cha
221c0 72 20 73 72 63 57 61 6c 50 61 74 68 5b 4d 41 58  r srcWalPath[MAX
221d0 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e  PATHLEN+5];.  in
221e0 74 20 73 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b  t srcWalFD = -1;
221f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22200 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70  TE_OK;.  void *p
22210 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69  Lock = NULL;.  i
22220 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  nt flags = 0;.  
22230 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 32 20  sqlite3 *srcdb2 
22240 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69  = NULL;.  copyfi
22250 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20  le_state_t s;.  
22260 69 6e 74 20 63 6f 72 72 75 70 74 53 72 63 46 69  int corruptSrcFi
22270 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  leLock = 0;.  in
22280 74 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65  t corruptDstFile
22290 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Lock = 0;.  int 
222a0 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d 20 30  isSrcCorrupt = 0
222b0 3b 0a 20 20 69 6e 74 20 69 73 44 73 74 43 6f 72  ;.  int isDstCor
222c0 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69  rupt = 0;.  .  i
222d0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
222e0 79 43 68 65 63 6b 4f 6b 28 73 72 63 64 62 29 20  yCheckOk(srcdb) 
222f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22300 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
22310 0a 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45  .    .#if SQLITE
22320 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
22330 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20  TECTION.  flags 
22340 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c  |= pFile->protFl
22350 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ags;.#endif.#if 
22360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22370 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66  CKING_STYLE.  if
22380 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  ( isProxyLocking
22390 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20  Mode(pFile) ){. 
223a0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
223b0 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
223c0 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  Y;.  }.#endif.  
223d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64  .  rc = sqlite3d
223e0 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46  emo_superlock(pF
223f0 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66  ile->zPath, 0, f
22400 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f  lags, 0, 0, &pLo
22410 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ck);.  if( rc ){
22420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22430 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72  ITE_CORRUPT || r
22440 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  c==SQLITE_NOTADB
22450 20 29 7b 0a 20 20 20 20 20 20 69 73 44 73 74 43   ){.      isDstC
22460 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20  orrupt = 1;.    
22470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
22480 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72  mo_superlock_cor
22490 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f  rupt(id, SQLITE_
224a0 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a  LOCK_EXCLUSIVE,.
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 20 20 20 20 20 20 26 63 6f 72 72 75 70           &corrup
224e0 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tDstFileLock);. 
224f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
22500 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22510 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
22520 2f 2a 20 67 65 74 20 74 68 65 20 73 72 63 20 66  /* get the src f
22530 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
22540 64 68 65 72 69 6e 67 20 74 6f 20 74 68 65 20 64  dhering to the d
22550 62 20 73 74 72 75 63 74 20 61 63 63 65 73 73 20  b struct access 
22560 72 75 6c 65 73 20 0a 20 20 20 2a 2a 20 74 68 69  rules .   ** thi
22570 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65  s code is modele
22580 64 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 5f  d after sqlite3_
22590 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69  file_control() i
225a0 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a  n main.c.   */ .
225b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
225c0 65 6e 74 65 72 28 73 72 63 64 62 2d 3e 6d 75 74  enter(srcdb->mut
225d0 65 78 29 3b 0a 20 20 69 66 28 20 73 72 63 64 62  ex);.  if( srcdb
225e0 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20 20 20 70  ->nDb>0 ){.    p
225f0 53 72 63 42 74 72 65 65 20 3d 20 73 72 63 64 62  SrcBtree = srcdb
22600 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20  ->aDb[0].pBt;.  
22610 7d 0a 20 20 69 66 28 20 70 53 72 63 42 74 72 65  }.  if( pSrcBtre
22620 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  e ){.    Pager *
22630 70 53 72 63 50 61 67 65 72 3b 0a 20 20 20 20 73  pSrcPager;.    s
22640 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
22650 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20  (pSrcBtree);.   
22660 20 70 53 72 63 50 61 67 65 72 20 3d 20 73 71 6c   pSrcPager = sql
22670 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
22680 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 61  SrcBtree);.    a
22690 73 73 65 72 74 28 20 70 53 72 63 50 61 67 65 72  ssert( pSrcPager
226a0 21 3d 30 20 29 3b 0a 20 20 20 20 73 72 63 5f 66  !=0 );.    src_f
226b0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
226c0 65 72 46 69 6c 65 28 70 53 72 63 50 61 67 65 72  erFile(pSrcPager
226d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
226e0 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20  rc_file!=0 );.  
226f0 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e    if( src_file->
22700 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
22710 20 20 69 6e 74 20 73 72 63 46 6c 61 67 73 20 3d    int srcFlags =
22720 20 30 3b 0a 20 20 20 20 20 20 70 53 72 63 46 69   0;.      pSrcFi
22730 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
22740 29 73 72 63 5f 66 69 6c 65 3b 0a 23 69 66 20 53  )src_file;.#if S
22750 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22760 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
22770 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
22780 0a 20 20 20 20 20 20 69 66 20 28 28 70 53 72 63  .      if ((pSrc
22790 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
227a0 26 20 4f 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52  & O_RDWR) == O_R
227b0 44 57 52 29 20 7b 0a 20 20 20 20 20 20 20 20 73  DWR) {.        s
227c0 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  rcFlags = SQLITE
227d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
227e0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
227f0 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
22800 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
22810 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
22820 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 72 63  .#else.      src
22830 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
22840 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 23  PEN_READWRITE;.#
22850 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
22860 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
22870 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 73 72  TECTION.      sr
22880 63 46 6c 61 67 73 20 7c 3d 20 70 53 72 63 46 69  cFlags |= pSrcFi
22890 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
228a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
228b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
228c0 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
228d0 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
228e0 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a  de(pSrcFile) ){.
228f0 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
22900 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
22910 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20  AUTOPROXY;.     
22920 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
22930 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
22940 6e 5f 76 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a  n_v2(pSrcFile->z
22950 50 61 74 68 2c 20 26 73 72 63 64 62 32 2c 20 73  Path, &srcdb2, s
22960 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rcFlags, 0);.   
22970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22990 2f 2a 20 73 74 61 72 74 20 61 20 64 65 66 65 72  /* start a defer
229a0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  red transaction 
229b0 61 6e 64 20 72 65 61 64 20 74 6f 20 65 73 74 61  and read to esta
229c0 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f 63  blish a read loc
229d0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
229e0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73  = sqlite3_exec(s
229f0 72 63 64 62 32 2c 20 22 42 45 47 49 4e 20 44 45  rcdb2, "BEGIN DE
22a00 46 45 52 52 45 44 3b 20 50 52 41 47 4d 41 20 73  FERRED; PRAGMA s
22a10 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 0a  chema_version",.
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
22a40 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
22a50 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
22a60 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  PT || rc==SQLITE
22a70 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20  _NOTADB ){.     
22a80 20 20 20 20 20 69 73 53 72 63 43 6f 72 72 75 70       isSrcCorrup
22a90 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
22aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d   rc = sqlite3dem
22ab0 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72  o_superlock_corr
22ac0 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 53 51  upt(src_file, SQ
22ad0 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
22ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22b10 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
22b20 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ck);.        }. 
22b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22b40 0a 20 20 69 66 28 20 21 73 72 63 64 62 32 20 7c  .  if( !srcdb2 |
22b50 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c  | pSrcFile==NULL
22b60 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d 3e 68 3c   || pSrcFile->h<
22b70 30 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  0){.    rc = SQL
22b80 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
22b90 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
22ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
22bb0 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61  o end_replace_da
22bc0 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a  tabase;.  }.  /*
22bd0 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 20   both databases 
22be0 61 72 65 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f  are locked appro
22bf0 70 72 69 61 74 65 6c 79 2c 20 63 6f 70 79 20 74  priately, copy t
22c00 68 65 20 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e  he src wal journ
22c10 61 6c 20 69 66 20 0a 20 20 20 2a 2a 20 6f 6e 65  al if .   ** one
22c20 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 6e   exists and then
22c30 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
22c40 62 61 73 65 20 66 69 6c 65 0a 20 20 20 2a 2f 0a  base file.   */.
22c50 20 20 73 74 72 6c 63 70 79 28 73 72 63 57 61 6c    strlcpy(srcWal
22c60 50 61 74 68 2c 20 70 53 72 63 46 69 6c 65 2d 3e  Path, pSrcFile->
22c70 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
22c80 4e 2b 35 29 3b 0a 20 20 73 74 72 6c 63 61 74 28  N+5);.  strlcat(
22c90 73 72 63 57 61 6c 50 61 74 68 2c 20 22 2d 77 61  srcWalPath, "-wa
22ca0 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35  l", MAXPATHLEN+5
22cb0 29 3b 0a 20 20 73 72 63 57 61 6c 46 44 20 3d 20  );.  srcWalFD = 
22cc0 6f 70 65 6e 28 73 72 63 57 61 6c 50 61 74 68 2c  open(srcWalPath,
22cd0 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66   O_RDONLY);.  if
22ce0 28 20 21 28 73 72 63 57 61 6c 46 44 3c 30 29 20  ( !(srcWalFD<0) 
22cf0 29 7b 0a 20 20 20 20 63 68 61 72 20 64 73 74 57  ){.    char dstW
22d00 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
22d10 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e 74 20 64 73  N+5];.    int ds
22d20 74 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20  tWalFD = -1;.   
22d30 20 69 6e 74 20 70 72 6f 74 46 6c 61 67 73 20 3d   int protFlags =
22d40 20 30 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   0;.    strlcpy(
22d50 64 73 74 57 61 6c 50 61 74 68 2c 20 70 46 69 6c  dstWalPath, pFil
22d60 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
22d70 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72  HLEN+5);.    str
22d80 6c 63 61 74 28 64 73 74 57 61 6c 50 61 74 68 2c  lcat(dstWalPath,
22d90 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48   "-wal", MAXPATH
22da0 4c 45 4e 2b 35 29 3b 0a 0a 20 20 20 20 72 63 20  LEN+5);..    rc 
22db0 3d 20 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46  = unixOpenChildF
22dc0 69 6c 65 28 64 73 74 57 61 6c 50 61 74 68 2c 20  ile(dstWalPath, 
22dd0 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
22de0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c  SQLITE_OPEN_WAL,
22df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22e00 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 74              prot
22e10 46 6c 61 67 73 2c 20 26 64 73 74 57 61 6c 46 44  Flags, &dstWalFD
22e20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
22e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22e40 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73    s = copyfile_s
22e50 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  tate_alloc();.  
22e60 20 20 20 20 6c 73 65 65 6b 28 73 72 63 57 61 6c      lseek(srcWal
22e70 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  FD, 0, SEEK_SET)
22e80 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 64 73  ;.      lseek(ds
22e90 74 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f  tWalFD, 0, SEEK_
22ea0 53 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20  SET);.      if( 
22eb0 66 63 6f 70 79 66 69 6c 65 28 73 72 63 57 61 6c  fcopyfile(srcWal
22ec0 46 44 2c 20 64 73 74 57 61 6c 46 44 2c 20 73 2c  FD, dstWalFD, s,
22ed0 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20   COPYFILE_DATA) 
22ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
22ef0 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
22f00 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a    switch(err) {.
22f10 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 45            case E
22f20 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20  NOMEM:.         
22f30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
22f40 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
22f50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22f60 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
22f70 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
22f80 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
22f90 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
22fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22fb0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
22fc0 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66     }.      copyf
22fd0 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73  ile_state_free(s
22fe0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 64  );.      close(d
22ff0 73 74 57 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a  stWalFD);.    }.
23000 20 20 20 20 63 6c 6f 73 65 28 73 72 63 57 61 6c      close(srcWal
23010 46 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  FD);.  }.  if( r
23020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23030 20 20 20 20 2f 2a 20 62 65 66 6f 72 65 20 77 65      /* before we
23040 20 63 6f 70 79 2c 20 65 6e 73 75 72 65 20 74 68   copy, ensure th
23050 61 74 20 74 68 65 20 66 69 6c 65 20 63 68 61 6e  at the file chan
23060 67 65 20 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20  ge counter will 
23070 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  be modified */. 
23080 20 20 20 75 69 6e 74 33 32 5f 74 20 73 72 63 43     uint32_t srcC
23090 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 75  hange = 0;.    u
230a0 69 6e 74 33 32 5f 74 20 64 73 74 43 68 61 6e 67  int32_t dstChang
230b0 65 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 61 64  e = 0;.    pread
230c0 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73  (pSrcFile->h, &s
230d0 72 63 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29  rcChange, 4, 24)
230e0 3b 0a 20 20 20 20 70 72 65 61 64 28 70 46 69 6c  ;.    pread(pFil
230f0 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65  e->h, &dstChange
23100 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20  , 4, 24);.    . 
23110 20 20 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 61     /* copy the a
23120 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 2a  ctual database *
23130 2f 0a 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69  /.    s = copyfi
23140 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29  le_state_alloc()
23150 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 53 72 63  ;.    lseek(pSrc
23160 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b  File->h, 0, SEEK
23170 5f 53 45 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b  _SET);.    lseek
23180 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45  (pFile->h, 0, SE
23190 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 69 66 28  EK_SET);.    if(
231a0 20 66 63 6f 70 79 66 69 6c 65 28 70 53 72 63 46   fcopyfile(pSrcF
231b0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68  ile->h, pFile->h
231c0 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41  , s, COPYFILE_DA
231d0 54 41 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  TA) ){.      int
231e0 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
231f0 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a    switch(err) {.
23200 20 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f          case ENO
23210 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 72  MEM:.          r
23220 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23230 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
23240 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
23250 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 73 74  lt:.          st
23260 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
23270 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20  le, err);.      
23280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23290 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20  IOERR;.      }. 
232a0 20 20 20 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c     }.    copyfil
232b0 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
232c0 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 72  .    .    if (sr
232d0 63 43 68 61 6e 67 65 20 3d 3d 20 64 73 74 43 68  cChange == dstCh
232e0 61 6e 67 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a  ange) {.      /*
232f0 20 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61 6e   modify the chan
23300 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f  ge counter to fo
23310 72 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74 6f  rce page zero to
23320 20 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a   be reloaded */.
23330 20 20 20 20 20 20 64 73 74 43 68 61 6e 67 65 20        dstChange 
23340 2b 2b 3b 0a 20 20 20 20 20 20 70 77 72 69 74 65  ++;.      pwrite
23350 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43  (pFile->h, &dstC
23360 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
23370 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
23380 73 53 72 63 43 6f 72 72 75 70 74 20 29 7b 0a 20  sSrcCorrupt ){. 
23390 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
233a0 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
233b0 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72  pt(src_file, cor
233c0 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
233d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
233e0 2a 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * done with the 
233f0 73 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e 64  source db so end
23400 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23410 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
23420 65 78 65 63 28 73 72 63 64 62 32 2c 20 22 43 4f  exec(srcdb2, "CO
23430 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
23440 0a 20 20 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f  .  }.  /* zero o
23450 75 74 20 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e  ut any old journ
23460 61 6c 20 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20  al clutter */.  
23470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23480 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69  K ){.    int ski
23490 70 57 41 4c 20 3d 20 28 73 72 63 57 61 6c 46 44  pWAL = (srcWalFD
234a0 3c 30 29 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69  <0)?0:1;.    uni
234b0 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f  xInvalidateSuppo
234c0 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 73  rtFiles(pFile, s
234d0 6b 69 70 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a  kipWAL);.  }.  .
234e0 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61  end_replace_data
234f0 62 61 73 65 3a 0a 20 20 69 66 28 20 70 53 72 63  base:.  if( pSrc
23500 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
23510 69 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64 62  ite3_close(srcdb
23520 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  2);.    sqlite3B
23530 74 72 65 65 4c 65 61 76 65 28 70 53 72 63 42 74  treeLeave(pSrcBt
23540 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ree);.  }.  sqli
23550 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
23560 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  srcdb->mutex);. 
23570 20 69 66 28 20 69 73 44 73 74 43 6f 72 72 75 70   if( isDstCorrup
23580 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23590 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
235a0 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72  _corrupt(id, cor
235b0 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29  ruptDstFileLock)
235c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
235d0 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
235e0 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20  unlock(pLock);. 
235f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23600 7d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  }.#define SQLITE
23610 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e  _FILE_HEADER_LEN
23620 20 31 36 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72   16./* Check for
23630 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
23640 6f 63 6b 2e 20 20 49 66 20 6f 6e 65 20 69 73 20  ock.  If one is 
23650 66 6f 75 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20  found, print an 
23660 74 68 69 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e  this. ** on stan
23670 64 61 72 64 20 6f 75 74 70 75 74 20 75 73 69 6e  dard output usin
23680 67 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  g the format str
23690 69 6e 67 20 67 69 76 65 6e 20 61 6e 64 20 72 65  ing given and re
236a0 74 75 72 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74  turn 1.. ** If t
236b0 68 65 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66  here are no conf
236c0 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72  licting locks, r
236d0 65 74 75 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61  eturn 0.. */.sta
236e0 74 69 63 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f  tic int unixIsLo
236f0 63 6b 65 64 28 0a 20 20 70 69 64 5f 74 20 70 69  cked(.  pid_t pi
23700 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
23710 20 50 49 44 20 74 6f 20 74 65 73 74 20 66 6f 72   PID to test for
23720 20 6c 6f 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20   lock owner */. 
23730 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
23740 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
23750 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 68 65  escriptor to che
23760 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65  ck */.  int type
23770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23780 20 46 5f 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52   F_RDLCK or F_WR
23790 4c 43 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  LCK */.  unsigne
237a0 64 20 69 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f  d int iOfst,   /
237b0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
237c0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  the lock */.  un
237d0 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c  signed int iCnt,
237e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
237f0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
23800 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f  ck range */.  co
23810 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
23820 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c      /* Type of l
23830 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
23840 63 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69  ct flock lk;.  i
23850 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d  nt err;.  .  mem
23860 73 65 74 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65  set(&lk, 0, size
23870 6f 66 28 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f  of(lk));.  lk.l_
23880 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c  type = type;.  l
23890 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
238a0 4b 5f 53 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74  K_SET;.  lk.l_st
238b0 61 72 74 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c  art = iOfst;.  l
238c0 6b 2e 6c 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a  k.l_len = iCnt;.
238d0 20 20 0a 20 20 69 66 28 20 70 69 64 21 3d 53 51    .  if( pid!=SQ
238e0 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41  LITE_LOCKSTATE_A
238f0 4e 59 50 49 44 20 29 7b 0a 23 69 66 6e 64 65 66  NYPID ){.#ifndef
23900 20 46 5f 47 45 54 4c 4b 50 49 44 0a 23 20 77 61   F_GETLKPID.# wa
23910 72 6e 69 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44  rning F_GETLKPID
23920 20 75 6e 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c   undefined, _sql
23930 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66  ite3_lockstate f
23940 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74 6f 20 46  alling back to F
23950 5f 47 45 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d  _GETLK.    err =
23960 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c   fcntl(h, F_GETL
23970 4b 2c 20 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20  K, &lk);.#else. 
23980 20 20 20 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69     lk.l_pid = pi
23990 64 3b 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e  d;.    err = fcn
239a0 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44  tl(h, F_GETLKPID
239b0 2c 20 26 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20  , &lk);.#endif. 
239c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 72 72 20   }else{.    err 
239d0 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54  = fcntl(h, F_GET
239e0 4c 4b 2c 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20  LK, &lk);.  }.  
239f0 0a 20 20 69 66 28 20 65 72 72 3d 3d 28 2d 31 29  .  if( err==(-1)
23a00 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
23a10 73 74 64 65 72 72 2c 20 22 66 63 6e 74 6c 28 25  stderr, "fcntl(%
23a20 64 29 20 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f  d) failed: errno
23a30 3d 25 64 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f  =%d\n", h, errno
23a40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  );.    return -1
23a50 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c  ;.  }.  .  if( l
23a60 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
23a70 4b 20 26 26 20 28 70 69 64 3d 3d 53 51 4c 49 54  K && (pid==SQLIT
23a80 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50  E_LOCKSTATE_ANYP
23a90 49 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d  ID || lk.l_pid==
23aa0 70 69 64 29 20 29 7b 0a 23 69 66 64 65 66 20 53  pid) ){.#ifdef S
23ab0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
23ac0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
23ad0 22 25 73 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  "%s lock held by
23ae0 20 25 64 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28   %d\n", zType, (
23af0 69 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23  int)lk.l_pid);.#
23b00 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
23b10 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72   1;.  } .  retur
23b20 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
23b30 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65  nt unixLockstate
23b40 50 69 64 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20  Pid(unixFile *, 
23b50 70 69 64 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a  pid_t, int *);..
23b60 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54  #endif /* (SQLIT
23b70 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
23b80 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
23b90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a  (__APPLE__) */..
23ba0 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
23bb0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67  is initially neg
23bc0 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
23bd0 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
23be0 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
23bf0 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
23c00 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
23c10 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
23c20 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
23c30 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
23c40 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
23c50 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
23c60 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
23c70 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
23c80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
23c90 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e  d unixModeBit(un
23ca0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
23cb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
23cc0 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
23cd0 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
23ce0 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
23cf0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
23d00 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
23d10 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
23d20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
23d30 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
23d40 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
23d50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
23d60 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
23d70 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
23d80 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
23d90 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
23da0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
23db0 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a  char *zBuf);../*
23dc0 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** Information 
23dd0 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61  and control of a
23de0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  n open file hand
23df0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
23e00 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f  t unixFileContro
23e10 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
23e20 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
23e30 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46   *pArg){.  unixF
23e40 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
23e50 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  ixFile*)id;.  sw
23e60 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
23e70 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
23e80 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
23e90 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
23ea0 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
23eb0 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
23ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
23ed0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
23ee0 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52  TE_FCNTL_LAST_ER
23ef0 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
23f00 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
23f10 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
23f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23f30 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
23f40 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
23f50 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
23f60 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
23f70 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
23f80 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
23f90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23fa0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
23fb0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
23fc0 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
23fd0 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
23fe0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
23ff0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
24000 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
24010 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
24020 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
24030 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
24040 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24050 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
24060 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
24070 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
24080 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
24090 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
240a0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
240b0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
240c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
240d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
240e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
240f0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
24100 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
24110 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
24120 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
24130 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
24140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24160 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
24170 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
24180 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
24190 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
241a0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
241b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
241c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
241d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
241e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
241f0 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
24200 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
24210 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24220 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73  c64( pFile->pVfs
24230 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
24240 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65        if( zTFile
24250 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78   ){.        unix
24260 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c  GetTempname(pFil
24270 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
24280 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20  ame, zTFile);.  
24290 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
242a0 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20  Arg = zTFile;.  
242b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
242c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
242d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
242e0 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
242f0 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  VED: {.      *(i
24300 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48  nt*)pArg = fileH
24310 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a  asMoved(pFile);.
24320 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24330 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
24340 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
24350 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
24360 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
24370 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
24380 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
24390 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
243a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
243b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
243c0 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
243d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
243e0 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
243f0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
24400 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24410 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
24420 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
24430 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
24440 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
24450 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
24460 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
24470 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
24480 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
24490 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
244a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
244b0 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
244c0 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
244d0 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
244e0 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
244f0 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
24500 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
24510 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
24520 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
24530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24540 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24550 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
24560 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
24570 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
24580 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
24590 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
245a0 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
245b0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
245c0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
245d0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
245e0 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
245f0 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
24600 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
24610 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
24620 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
24630 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
24640 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
24650 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
24660 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
24670 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
24680 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
24690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
246a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
246b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
246c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
246d0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
246e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
246f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24700 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
24710 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
24720 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
24730 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
24740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
24750 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
24760 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
24770 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
24780 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
24790 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
247a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
247b0 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
247c0 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
247d0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
247e0 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
247f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55  SQLITE_FCNTL_TRU
24800 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20  NCATE_DATABASE: 
24810 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
24820 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
24830 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72 67  ase(pFile, (pArg
24840 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67   ? (*(int *)pArg
24850 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ) : 0));.    }. 
24860 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24870 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54  CNTL_REPLACE_DAT
24880 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72  ABASE: {.      r
24890 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61 63  eturn unixReplac
248a0 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c  eDatabase(pFile,
248b0 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67   (sqlite3 *)pArg
248c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
248d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
248e0 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a  OCKSTATE_PID: {.
248f0 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50        LockstateP
24900 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a  ID *pLockstate;.
24910 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
24920 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70      .      if( p
24930 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Arg==NULL ){.   
24940 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24950 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20  TE_MISUSE;.     
24960 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73 74   }.      pLockst
24970 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65  ate = (Lockstate
24980 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  PID *)pArg;.    
24990 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73    rc = unixLocks
249a0 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20 70  tatePid(pFile, p
249b0 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20  Lockstate->pid, 
249c0 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74  &(pLockstate->st
249d0 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ate));.      ret
249e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
249f0 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28      .#endif /* (
24a00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
24a10 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
24a20 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24a30 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
24a40 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
24a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24a60 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
24a70 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
24a80 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
24a90 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
24aa0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
24ab0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
24ac0 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
24ad0 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
24ae0 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
24af0 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
24b00 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
24b10 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
24b20 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
24b30 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
24b40 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
24b50 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
24b60 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
24b70 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
24b80 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
24b90 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
24ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
24bb0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
24bc0 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
24bd0 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
24be0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
24bf0 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20  NXNTO__ .static 
24c00 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
24c10 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
24c20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
24c30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
24c40 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
24c50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
24c60 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23  SECTOR_SIZE;.}.#
24c70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
24c80 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69   following versi
24c90 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72  on of unixSector
24ca0 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69  Size() is optimi
24cb0 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a  zed for QNX..*/.
24cc0 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
24cd0 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  _.#include <sys/
24ce0 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63  dcmd_blk.h>.#inc
24cf0 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66  lude <sys/statvf
24d00 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20  s.h>.static int 
24d10 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
24d20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
24d30 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
24d40 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
24d50 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
24d60 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20  ->sectorSize == 
24d70 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
24d80 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a  statvfs fsInfo;.
24d90 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53         .    /* S
24da0 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20  et defaults for 
24db0 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69  non-supported fi
24dc0 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20  lesystems */.   
24dd0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
24de0 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
24df0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
24e00 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
24e10 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24e20 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66  s = 0;.    if( f
24e30 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68  statvfs(pFile->h
24e40 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
24e50 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
24e60 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
24e70 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
24e80 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
24e90 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
24ea0 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20  tmp") ) {.      
24eb0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
24ec0 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
24ed0 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
24ee0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
24ef0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
24f00 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
24f10 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f  OMIC4K |       /
24f20 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79  * All ram filesy
24f30 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
24f40 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
24f50 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
24f60 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
24f70 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
24f80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
24f90 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
24fc0 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
24fd0 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
24fe0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
24ff0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
25000 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
25010 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
25020 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25050 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
25060 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
25070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
25080 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
25090 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20  setype, "etfs") 
250a0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
250b0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
250c0 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
250d0 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
250e0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
250f0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66  =.        /* etf
25100 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77  s cluster size w
25110 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
25120 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69   */.        (pFi
25130 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
25140 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
25150 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c  CAP_ATOMIC512) |
25160 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
25170 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
25180 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
25190 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
251a0 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
251e0 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
251f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
25200 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
25210 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
25220 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
25230 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
25270 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
25280 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
25290 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
252a0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
252b0 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20  "qnx6") ){.     
252c0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
252d0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
252e0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
252f0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25300 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
25310 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
25320 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20  TOMIC |         
25330 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65  /* All filesyste
25340 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
25350 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
25360 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25370 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
25380 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
25390 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
253a0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
253d0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
253e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
253f0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25400 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
25410 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
25420 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
25430 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
25460 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
25470 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25480 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
25490 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
254a0 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b  type, "qnx4") ){
254b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
254c0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
254d0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
254e0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
254f0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
25500 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
25510 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
25520 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
25530 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
25540 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
25550 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25560 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
25570 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
25580 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
25590 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
255a0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
255b0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
255c0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
255d0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
25610 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
25620 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
25630 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
25640 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64  o.f_basetype, "d
25650 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  os") ){.      pF
25660 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25670 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
25680 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
25690 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
256a0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
256b0 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
256c0 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
256d0 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
256e0 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
256f0 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
25700 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
25710 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
25720 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
25730 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
25740 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25750 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
25760 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
25770 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
25780 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
257b0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
257c0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
257d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
257e0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
257f0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
25800 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
25810 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20  P_ATOMIC512 |   
25820 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65     /* blocks are
25830 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
25840 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25850 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
25860 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
25870 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
25880 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258b0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
258c0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
258d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
258e0 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76  /* Last chance v
258f0 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66  erification.  If
25900 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
25910 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c   isn't a multipl
25920 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68  e of 512.  ** th
25930 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69  en it isn't vali
25940 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  d.*/.  if( pFile
25950 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35  ->sectorSize % 5
25960 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70  12 != 0 ){.    p
25970 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
25980 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
25990 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
259a0 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
259b0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
259c0 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
259d0 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
259e0 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
259f0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a   __QNXNTO__ */..
25a00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25a10 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
25a20 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
25a30 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
25a40 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
25a50 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
25a60 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
25a70 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
25a80 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
25a90 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
25aa0 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73   controversial s
25ab0 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
25ac0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
25ad0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
25ae0 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
25af0 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
25b00 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
25b10 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
25b20 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
25b30 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
25b40 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
25b50 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
25b60 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
25b70 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
25b80 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
25b90 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
25ba0 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
25bb0 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
25bc0 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
25bd0 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
25be0 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
25bf0 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
25c00 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
25c10 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
25c20 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
25c30 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
25c40 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
25c50 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
25c60 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
25c70 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
25c80 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
25c90 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
25ca0 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
25cb0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
25cc0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
25cd0 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
25ce0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
25cf0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25d00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
25d10 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
25d20 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  p = (unixFile*)i
25d30 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
25d40 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
25d50 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74  __.  if( p->sect
25d60 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78  orSize==0 ) unix
25d70 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a  SectorSize(id);.
25d80 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65    rc = p->device
25d90 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
25da0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
25db0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
25dc0 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
25dd0 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49    rc |= SQLITE_I
25de0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
25df0 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20  VERWRITE;.  }.  
25e00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
25e10 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
25e20 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
25e30 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
25e40 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  IZE>0../*.** Ret
25e50 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70  urn the system p
25e60 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
25e70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
25e80 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
25e90 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f  ed directly by o
25ea0 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69  ther code in thi
25eb0 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74  s file. .** Inst
25ec0 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ead, it should b
25ed0 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  e called via mac
25ee0 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ro osGetpagesize
25ef0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
25f00 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a  t unixGetpagesiz
25f10 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f  e(void){.#if OS_
25f20 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
25f30 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66   1024;.#elif def
25f40 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
25f50 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
25f60 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
25f70 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
25f80 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
25f90 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ZE);.#endif.}..#
25fa0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
25fb0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
25fc0 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
25fd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
25fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25ff0 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
26000 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
26010 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
26020 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
26030 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
26040 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
26050 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
26060 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
26070 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
26080 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
26090 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
260a0 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
260b0 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
260c0 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
260d0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
260e0 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
260f0 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
26100 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
26110 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
26120 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
26130 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
26140 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
26150 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
26160 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
26170 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
26180 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
26190 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
261a0 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
261b0 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
261c0 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
261d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
261e0 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
261f0 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
26200 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
26210 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
26220 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
26230 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
26240 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
26250 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
26260 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
26270 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
26280 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
26290 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
262a0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
262b0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
262c0 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
262d0 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
262e0 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
262f0 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
26300 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
26310 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
26320 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
26330 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
26340 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
26350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
26360 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
26370 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
26380 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
26390 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
263a0 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
263b0 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
263c0 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
263d0 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
263e0 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
263f0 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
26400 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
26410 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
26420 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
26430 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
26440 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
26450 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
26460 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
26470 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
26480 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
26490 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
264a0 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
264b0 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
264c0 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
264d0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
264e0 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
264f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
26500 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
26510 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
26520 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
26530 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
26540 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26560 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
26570 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
26580 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
26590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
265a0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
265b0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
265c0 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
265d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
265e0 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
265f0 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
26600 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
26610 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
26620 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
26630 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
26640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
26650 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
26660 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
26670 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
26680 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
26690 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
266a0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
266b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
266c0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
266d0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
266e0 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
266f0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
26700 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
26710 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
26720 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26740 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
26750 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
26760 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
26770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26780 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
26790 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
267a0 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
267b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
267c0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
267d0 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
267e0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
267f0 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
26800 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
26810 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
26820 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
26830 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
26840 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
26850 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
26860 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
26870 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
26880 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
26890 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
268a0 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
268b0 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
268c0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
268d0 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
268e0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
268f0 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
26900 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
26910 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
26920 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
26930 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
26940 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
26950 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
26960 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
26970 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
26980 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
26990 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
269a0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
269b0 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
269c0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
269d0 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
269e0 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
269f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
26a00 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
26a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26a20 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
26a30 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
26a40 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b  utex */.  u8 id;
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
26a70 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
26a80 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d  thin its unixShm
26a90 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68  Node */.  u16 sh
26aa0 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
26ab0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
26ac0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
26ad0 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
26ae0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
26af0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
26b00 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
26b10 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
26b20 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
26b30 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
26b40 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
26b50 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
26b60 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
26b70 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
26b80 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
26b90 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
26ba0 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
26bb0 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
26bc0 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
26bd0 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
26be0 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
26bf0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
26c00 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
26c10 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
26c20 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
26c30 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
26c40 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
26c50 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
26c60 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
26c70 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
26c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26c90 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
26ca0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
26cb0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  e,       /* Open
26cc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
26cd0 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20  he WAL file */. 
26ce0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
26cf0 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c          /* F_UNL
26d00 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20  CK, F_RDLCK, or 
26d10 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74  F_WRLCK */.  int
26d20 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
26d30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
26d40 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e of the locking
26d50 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
26d60 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
26d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26d80 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
26d90 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  .){.  unixShmNod
26da0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
26db0 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
26dc0 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
26dd0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
26de0 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  /.  struct flock
26df0 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68   f;        /* Th
26e00 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
26e10 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
26e20 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
26e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
26e40 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  * Result code fo
26e50 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20  rm fcntl() */.. 
26e60 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
26e70 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
26e80 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
26e90 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
26ea0 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d   */.  pShmNode =
26eb0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
26ec0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65  pShmNode;.  asse
26ed0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
26ee0 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d  x_held(pShmNode-
26ef0 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e  >mutex) || pShmN
26f00 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ode->nRef==0 );.
26f10 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63  .  /* Shared loc
26f20 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f  ks never span mo
26f30 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65  re than one byte
26f40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   */.  assert( n=
26f50 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d  =1 || lockType!=
26f60 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a  F_RDLCK );..  /*
26f70 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69   Locks are withi
26f80 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73  n range */.  ass
26f90 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d  ert( n>=1 && n<=
26fa0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
26fb0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
26fc0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
26fd0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
26fe0 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
26ff0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
27000 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
27010 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
27020 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
27030 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
27040 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
27050 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
27060 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
27070 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
27080 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
27090 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
270a0 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
270b0 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
270c0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
270d0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
270e0 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
270f0 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
27100 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
27110 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
27120 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
27130 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
27140 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
27150 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66  = ofst>31 ? 0xff
27160 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  ff : (1<<(ofst+n
27170 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
27180 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27190 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
271a0 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
271b0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
271c0 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
271d0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
271e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
271f0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
27200 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
27210 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
27220 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
27230 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
27240 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
27250 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
27260 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
27270 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27280 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
27290 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
272a0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
272b0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
272c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
272d0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
272e0 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
272f0 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
27300 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
27310 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
27320 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
27330 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
27340 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
27350 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
27360 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
27370 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
27380 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
27390 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
273a0 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
273b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
273c0 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
273d0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
273e0 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
273f0 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
27400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
27410 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
27420 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
27430 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
27440 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
27450 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
27460 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
27470 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
27480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
27490 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
274a0 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
274b0 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
274c0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
274d0 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
274e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
274f0 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   minimum number 
27500 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69  of 32KB shm regi
27510 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ons that should 
27520 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20  be mapped at.** 
27530 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67  a time, assuming
27540 20 74 68 61 74 20 65 61 63 68 20 6d 61 70 70 69   that each mappi
27550 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e  ng must be an in
27560 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
27570 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
27580 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a   system page-siz
27590 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79  e..**.** Usually
275a0 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54 68 65  , this is 1. The
275b0 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73   exception seems
275c0 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74   to be systems t
275d0 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72  hat are configur
275e0 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b  ed.** to use 64K
275f0 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69  B pages - in thi
27600 73 20 63 61 73 65 20 65 61 63 68 20 6d 61 70 70  s case each mapp
27610 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61  ing must cover a
27620 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73  t least two.** s
27630 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73  hm regions..*/.s
27640 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
27650 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f  mRegionPerMap(vo
27660 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a  id){.  int shmsz
27670 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20   = 32*1024;     
27680 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65         /* SHM re
27690 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69  gion size */.  i
276a0 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70  nt pgsz = osGetp
276b0 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20  agesize();   /* 
276c0 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  System page size
276d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28   */.  assert( ((
276e0 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30  pgsz-1)&pgsz)==0
276f0 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69   );   /* Page si
27700 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
27710 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28  er of 2 */.  if(
27720 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65   pgsz<shmsz ) re
27730 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
27740 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a   pgsz/shmsz;.}..
27750 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
27760 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20  unixShmNodeList 
27770 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
27780 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d  ies with unixShm
27790 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
277a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
277b0 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
277c0 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
277d0 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
277e0 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
277f0 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
27800 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
27810 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
27820 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c  ShmPurge(unixFil
27830 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53  e *pFd){.  unixS
27840 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d  hmNode *p = pFd-
27850 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
27860 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
27870 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
27880 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59    if( p && ALWAY
27890 53 28 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29 7b  S(p->nRef==0) ){
278a0 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72  .    int nShmPer
278b0 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67  Map = unixShmReg
278c0 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20  ionPerMap();.   
278d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
278e0 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70  rt( p->pInode==p
278f0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
27900 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
27910 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
27920 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
27930 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53  ->nRegion; i+=nS
27940 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20  hmPerMap){.     
27950 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
27960 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
27970 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
27980 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
27990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
279a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
279b0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
279c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
279d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
279e0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
279f0 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
27a00 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
27a10 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
27a20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
27a30 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
27a40 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
27a50 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
27a60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27a70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  p);.  }.}..#if d
27a80 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
27a90 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
27aa0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
27ab0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
27ac0 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d  ar *proxySharedM
27ad0 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e  emoryBasePath(un
27ae0 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69  ixFile *);.#endi
27af0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
27b00 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
27b10 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
27b20 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
27b30 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
27b40 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
27b50 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
27b60 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
27b70 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
27b80 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
27b90 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
27ba0 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
27bb0 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
27bc0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
27bd0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
27be0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
27bf0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
27c00 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
27c10 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
27c20 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
27c30 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
27c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
27c50 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
27c60 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
27c70 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
27c80 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
27c90 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
27ca0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
27cb0 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
27cc0 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
27cd0 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
27ce0 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
27cf0 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
27d00 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
27d10 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
27d20 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
27d30 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
27d40 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
27d50 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
27d60 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
27d70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
27d80 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
27d90 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
27da0 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
27db0 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
27dc0 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
27dd0 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
27de0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
27df0 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
27e00 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
27e10 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
27e20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
27e30 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
27e40 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
27e50 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
27e60 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
27e70 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
27e80 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
27e90 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
27ea0 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
27eb0 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
27ec0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
27ed0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
27ee0 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
27ef0 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
27f00 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
27f10 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
27f20 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
27f30 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
27f40 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
27f50 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
27f60 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
27f70 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
27f80 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
27f90 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
27fa0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
27fb0 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
27fc0 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
27fd0 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
27fe0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
27ff0 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
28000 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
28010 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
28020 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
28030 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
28040 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
28050 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
28060 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
28070 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
28080 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
28090 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
280a0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
280b0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
280c0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
280d0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
280e0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
280f0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
28100 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
28110 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
28120 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
28130 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
28140 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
28150 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
28160 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
28170 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
28180 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
28190 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
281a0 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
281b0 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
281c0 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
281d0 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
281e0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
281f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28200 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
28210 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
28220 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
28230 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
28240 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
28250 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
28260 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
28270 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
28280 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
28290 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
282a0 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
282b0 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
282c0 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
282d0 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
282e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
282f0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
28300 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
28310 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
28320 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
28330 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
28340 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
28350 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
28360 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
28370 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
28380 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
28390 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
283a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
283b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
283c0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
283d0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
283e0 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
283f0 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
28400 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
28410 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
28420 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
28430 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
28440 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
28450 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28470 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
28480 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
28490 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
284a0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
284b0 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
284c0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
284d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
284e0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
284f0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
28500 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28510 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28  _BKPT;.  memset(
28520 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
28530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
28540 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a  Fd->pShm==0 );..
28550 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
28560 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f  e if a unixShmNo
28570 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64  de object alread
28580 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20  y exists. Reuse 
28590 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
285a0 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e   one if present.
285b0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
285c0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
285d0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
285e0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
285f0 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
28600 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  e;.  pShmNode = 
28610 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
28620 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
28630 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
28640 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28660 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f   fstat() info fo
28670 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
28680 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
28690 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
286a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
286b0 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46  zBasePath = pDbF
286c0 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66  d->zPath;.#endif
286d0 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73  ..    /* Call fs
286e0 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  tat() to figure 
286f0 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69  out the permissi
28700 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ons on the datab
28710 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20  ase file. If.   
28720 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20   ** a new *-shm 
28730 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
28740 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c   an attempt will
28750 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61   be made to crea
28760 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74  te it.    ** wit
28770 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  h the same permi
28780 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  ssions..    */. 
28790 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
287a0 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29  DbFd->h, &sStat)
287b0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
287c0 61 73 74 45 72 72 6e 6f 28 70 44 62 46 64 2c 20  astErrno(pDbFd, 
287d0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  errno);.      rc
287e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
287f0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
28800 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
28810 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
28820 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
28830 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
28840 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20  OCKING_STYLE \. 
28850 20 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64       && !defined
28860 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
28870 43 54 4f 52 59 29 0a 20 20 20 20 2f 2a 20 49 66  CTORY).    /* If
28880 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66 69 67   pDbFd is config
28890 75 72 65 64 20 77 69 74 68 20 70 72 6f 78 79 20  ured with proxy 
288a0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 75 73  locking mode, us
288b0 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20  e the local .   
288c0 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61   ** lock file pa
288d0 74 68 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  th to determine 
288e0 74 68 65 20 2d 73 68 6d 20 66 69 6c 65 20 70 61  the -shm file pa
288f0 74 68 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  th.    */.    if
28900 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  ( isProxyLocking
28910 4d 6f 64 65 28 70 44 62 46 64 29 20 29 7b 0a 20  Mode(pDbFd) ){. 
28920 20 20 20 20 20 7a 42 61 73 65 50 61 74 68 20 3d       zBasePath =
28930 20 70 72 6f 78 79 53 68 61 72 65 64 4d 65 6d 6f   proxySharedMemo
28940 72 79 42 61 73 65 50 61 74 68 28 70 44 62 46 64  ryBasePath(pDbFd
28950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 42  );.      if( !zB
28960 61 73 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  asePath ){.     
28970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28980 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
28990 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
289a0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
289b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
289c0 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
289d0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
289e0 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
289f0 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f  = sizeof(SQLITE_
28a00 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b  SHM_DIRECTORY) +
28a10 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e   31;.#else.    n
28a20 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20  ShmFilename = 6 
28a30 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  + (int)strlen(zB
28a40 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  asePath);.#endif
28a50 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
28a60 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
28a70 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  ( sizeof(*pShmNo
28a80 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61  de) + nShmFilena
28a90 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53  me );.    if( pS
28aa0 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
28ab0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
28ac0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
28ad0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
28ae0 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rr;.    }.    me
28af0 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30  mset(pShmNode, 0
28b00 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f  , sizeof(*pShmNo
28b10 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  de)+nShmFilename
28b20 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e  );.    zShmFilen
28b30 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ame = pShmNode->
28b40 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
28b50 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
28b60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
28b70 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
28b80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28b90 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
28ba0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  zShmFilename, . 
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44      SQLITE_SHM_D
28bd0 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74  IRECTORY "/sqlit
28be0 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20  e-shm-%x-%x",.  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74     (u32)sStat.st
28c10 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74  _ino, (u32)sStat
28c20 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a  .st_dev);.#else.
28c30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28c40 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
28c50 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
28c60 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65   "%s-shm", zBase
28c70 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
28c80 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
28c90 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
28ca0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
28cb0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  f.    pShmNode->
28cc0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46  h = -1;.    pDbF
28cd0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
28ce0 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
28cf0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49      pShmNode->pI
28d00 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49  node = pDbFd->pI
28d10 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  node;.    pShmNo
28d20 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
28d30 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
28d40 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
28d50 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
28d60 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
28d70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
28d80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
28d90 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
28da0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
28db0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
28dc0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
28dd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65  ){.      int ope
28de0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
28df0 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20  | O_CREAT;.     
28e00 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
28e10 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e  _boolean(pDbFd->
28e20 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79  zPath, "readonly
28e30 5f 73 68 6d 22 2c 20 30 29 0a 23 69 66 20 64 65  _shm", 0).#if de
28e40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
28e50 42 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 29  BLE_PERSIST_WAL)
28e60 26 26 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  &&(SQLITE_ENABLE
28e70 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c  _LOCKING_STYLE \
28e80 0a 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28  .    || defined(
28e90 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20  __APPLE__)).    
28ea0 20 20 20 20 20 7c 7c 20 28 70 44 62 46 64 2d 3e       || (pDbFd->
28eb0 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44  openFlags & O_RD
28ec0 57 52 29 20 21 3d 20 4f 5f 52 44 57 52 0a 23 65  WR) != O_RDWR.#e
28ed0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 29 7b  ndif.         ){
28ee0 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
28ef0 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
28f00 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
28f10 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
28f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
28f30 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
28f40 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
28f50 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
28f60 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
28f70 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
28f80 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
28f90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28fa0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
28fb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
28fc0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
28fd0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
28fe0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28ff0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
29000 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
29010 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
29020 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65  ng as root, make
29030 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53   sure that the S
29040 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  HM file.      **
29050 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65   is owned by the
29060 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20   same user that 
29070 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61  owns the origina
29080 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68  l database.  Oth
29090 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
290a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77   the original ow
290b0 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ner will not be 
290c0 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e  able to connect.
290d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
290e0 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68  robustFchown(pSh
290f0 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e  mNode->h, sStat.
29100 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74  st_uid, sStat.st
29110 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20  _gid);.  .      
29120 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
29130 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
29140 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
29150 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
29160 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
29170 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
29180 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
29190 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
291a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
291b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
291c0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
291d0 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
291e0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
291f0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
29200 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
29210 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
29220 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b  hmNode->h, 0) ){
29230 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29240 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
29250 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
29260 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  N, "ftruncate", 
29270 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
29280 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29290 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75          /* If ru
292a0 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65  nning as root se
292b0 74 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66  t the uid/gid of
292c0 20 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f   the shm file to
292d0 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20   match.         
292e0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
292f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 69   */.          ui
29300 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75  d_t euid = geteu
29310 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  id();.          
29320 69 66 28 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e  if( (!pShmNode->
29330 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 65  isReadonly) && e
29340 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21  uid==0 && (euid!
29350 3d 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c  =sStat.st_uid ||
29360 20 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61   getegid()!=sSta
29370 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20  t.st_gid) ){.   
29380 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 46           if( osF
29390 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e  chown(pShmNode->
293a0 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c  h, sStat.st_uid,
293b0 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29   sStat.st_gid) )
293c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
293d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
293e0 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20  R_SHMOPEN;.     
293f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29430 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
29440 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
29450 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
29460 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
29470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29480 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
29490 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
294a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
294b0 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
294c0 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
294d0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
294e0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
294f0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
29500 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29510 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
29520 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
29530 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
29540 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
29550 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
29560 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
29570 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
29580 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
29590 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
295a0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
295b0 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
295c0 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
295d0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
295e0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
295f0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
29600 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
29610 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
29620 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
29630 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
29640 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
29650 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
29660 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
29670 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
29680 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
29690 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
296a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
296b0 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
296c0 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
296d0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
296e0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
296f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
29700 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
29710 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
29720 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
29730 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
29740 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
29750 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
29760 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
29770 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
29780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29790 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
297a0 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
297b0 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
297c0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
297d0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
297e0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
297f0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
29800 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
29810 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
29820 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
29830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29840 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29850 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
29860 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
29870 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
29880 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
29890 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
298a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
298b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
298c0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
298d0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
298e0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
298f0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
29900 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
29910 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
29920 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
29930 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
29940 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
29950 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
29960 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
29970 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
29980 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
29990 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
299a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
299b0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
299c0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
299d0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
299e0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
299f0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
29a00 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
29a10 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
29a20 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
29a30 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
29a40 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
29a50 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
29a60 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
29a70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
29a80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
29a90 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
29aa0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
29ab0 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
29ac0 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
29ad0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
29ae0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
29af0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
29b00 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
29b10 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
29b20 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
29b30 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
29b40 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
29b50 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
29b60 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
29b70 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
29b80 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
29b90 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
29ba0 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
29bb0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
29bc0 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
29bd0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
29be0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
29bf0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
29c00 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
29c10 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
29c20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
29c30 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
29c40 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
29c50 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c70 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
29c80 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
29c90 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
29ca0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
29cb0 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
29cc0 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
29cf0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
29d00 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
29d10 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
29d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29d30 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
29d40 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
29d50 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
29d60 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
29d70 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
29d80 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
29d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29da0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
29db0 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
29dc0 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
29dd0 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
29de0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
29df0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
29e00 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
29e10 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
29e20 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
29e30 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
29e40 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
29e50 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
29e60 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
29e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
29e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
29e90 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
29ea0 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
29eb0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
29ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
29ed0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
29ee0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
29ef0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
29f00 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
29f10 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
29f20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29f30 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
29f40 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
29f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
29f60 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
29f70 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
29f80 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
29f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
29fa0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
29fb0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
29fc0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
29fd0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
29fe0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
29ff0 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
2a000 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
2a010 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
2a020 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
2a030 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
2a040 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
2a050 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2a060 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
2a070 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
2a080 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2a090 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
2a0a0 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
2a0b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
2a0c0 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
2a0d0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
2a0e0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
2a0f0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
2a100 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2a110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a120 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
2a130 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
2a140 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
2a150 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
2a160 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
2a170 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
2a180 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
2a190 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
2a1a0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
2a1b0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
2a1c0 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
2a1d0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
2a1e0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
2a1f0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
2a200 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
2a210 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
2a220 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
2a230 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
2a240 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
2a250 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
2a260 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
2a270 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
2a280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a290 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
2a2a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
2a2b0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2a2c0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
2a2d0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
2a2e0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
2a2f0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
2a300 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
2a310 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
2a320 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
2a330 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
2a340 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
2a350 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
2a360 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
2a370 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2a380 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2a390 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
2a3a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
2a3b0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2a3c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2a3d0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
2a3e0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
2a3f0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
2a400 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
2a410 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
2a420 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
2a430 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
2a440 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
2a450 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
2a460 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
2a470 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
2a480 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
2a490 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
2a4a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
2a4b0 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
2a4c0 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
2a4d0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
2a4e0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
2a4f0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
2a500 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
2a510 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
2a520 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
2a530 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
2a540 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
2a550 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
2a560 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
2a570 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
2a580 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
2a590 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
2a5a0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
2a5b0 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
2a5c0 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
2a5d0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
2a5e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
2a5f0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
2a600 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
2a610 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
2a620 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
2a630 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
2a640 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
2a650 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
2a660 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
2a670 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
2a680 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
2a690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2a6a0 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
2a6b0 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
2a6c0 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
2a6d0 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
2a6e0 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
2a6f0 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
2a700 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2a710 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
2a720 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
2a740 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2a750 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
2a760 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
2a770 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
2a780 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2a790 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
2a7a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2a7b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a7c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2a7d0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
2a7e0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
2a7f0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
2a800 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
2a810 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
2a820 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
2a830 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
2a840 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
2a850 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
2a860 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
2a870 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
2a880 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
2a890 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2a8a0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2a8b0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2a8c0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2a8d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
2a8e0 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20  gion = apNew;.  
2a8f0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
2a900 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52  e->nRegion<nReqR
2a910 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69  egion ){.      i
2a920 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69  nt nMap = szRegi
2a930 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  on*nShmPerMap;. 
2a940 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2a950 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20    void *pMem;.  
2a960 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
2a970 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
2a980 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28    pMem = osMmap(
2a990 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20  0, nMap,.       
2a9a0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69       pShmNode->i
2a9b0 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54  sReadonly ? PROT
2a9c0 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41  _READ : PROT_REA
2a9d0 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20  D|PROT_WRITE, . 
2a9e0 20 20 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53             MAP_S
2a9f0 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d  HARED, pShmNode-
2aa00 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36  >h, szRegion*(i6
2aa10 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  4)pShmNode->nReg
2aa20 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ion.        );. 
2aa30 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
2aa40 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
2aa50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
2aa60 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2aa70 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20  E_IOERR_SHMMAP, 
2aa80 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65  "mmap", pShmNode
2aa90 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
2aaa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
2aab0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
2aac0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2aad0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
2aae0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
2aaf0 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
2ab00 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
2ab10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2ab20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2ab30 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
2ab40 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2ab50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ab60 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
2ab70 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
2ab80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
2ab90 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
2aba0 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
2abb0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
2abc0 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
2abd0 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
2abe0 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
2abf0 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
2ac00 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
2ac10 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
2ac20 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
2ac30 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
2ac40 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
2ac50 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
2ac60 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
2ac70 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
2ac80 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
2ac90 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
2aca0 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
2acb0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
2acc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2acd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
2ace0 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
2acf0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
2ad00 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2ad10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ad20 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2ad30 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
2ad40 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
2ad50 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
2ad60 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
2ad70 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
2ad80 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
2ad90 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
2ada0 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
2adb0 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
2adc0 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
2add0 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
2ade0 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
2adf0 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
2ae00 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
2ae10 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
2ae20 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
2ae30 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
2ae40 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
2ae50 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
2ae60 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
2ae70 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
2ae80 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2ae90 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
2aea0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
2aeb0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2aec0 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
2aed0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
2aee0 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
2af10 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
2af20 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2af50 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
2af60 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
2af70 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2af90 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
2afa0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
2afb0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
2afc0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
2afd0 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
2afe0 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
2aff0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
2b000 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
2b010 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
2b020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
2b030 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
2b040 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
2b050 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2b080 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
2b090 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
2b0a0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
2b0b0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
2b0c0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
2b0d0 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
2b0e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b0f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2b100 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2b110 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
2b120 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
2b150 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
2b160 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
2b170 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
2b180 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
2b190 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
2b1a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
2b1b0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
2b1c0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
2b1d0 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
2b1e0 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
2b1f0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2b200 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
2b210 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
2b220 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
2b230 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
2b240 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
2b250 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
2b260 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
2b270 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
2b280 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
2b290 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
2b2a0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
2b2b0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
2b2c0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
2b2d0 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
2b2e0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
2b2f0 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
2b300 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
2b310 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
2b320 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
2b330 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
2b340 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
2b350 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
2b360 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2b370 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
2b380 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
2b390 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
2b3a0 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
2b3b0 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
2b3c0 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
2b3d0 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
2b3e0 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
2b3f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2b400 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2b410 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
2b420 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
2b430 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
2b440 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
2b450 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
2b460 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
2b470 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
2b480 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
2b490 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
2b4a0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
2b4b0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
2b4c0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
2b4d0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
2b4e0 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
2b4f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b500 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
2b510 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
2b520 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
2b530 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
2b540 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
2b550 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2b560 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
2b570 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
2b580 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
2b590 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
2b5a0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2b5b0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
2b5c0 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
2b5d0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
2b5e0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2b5f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b600 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
2b610 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
2b620 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
2b630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b640 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
2b650 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
2b660 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
2b670 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
2b680 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
2b690 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2b6a0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
2b6b0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
2b6c0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
2b6d0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
2b6e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
2b6f0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
2b700 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
2b710 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
2b720 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
2b730 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
2b740 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
2b750 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
2b760 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
2b770 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2b780 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
2b790 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
2b7a0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
2b7b0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
2b7c0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
2b7d0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
2b7e0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
2b7f0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
2b800 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2b810 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
2b820 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2b830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2b840 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
2b850 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
2b860 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
2b870 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
2b880 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
2b890 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
2b8a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b8b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2b8c0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
2b8d0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
2b8e0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
2b8f0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
2b900 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
2b910 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
2b920 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b930 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b940 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2b950 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2b960 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
2b970 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
2b980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b990 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
2b9a0 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
2b9b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2b9c0 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
2b9d0 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
2b9e0 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
2b9f0 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
2ba00 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
2ba10 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
2ba20 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2ba30 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
2ba40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
2ba50 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
2ba60 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
2ba70 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
2ba80 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
2ba90 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
2baa0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
2bab0 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
2bac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bad0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
2bae0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2baf0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
2bb00 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
2bb10 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
2bb20 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
2bb30 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
2bb40 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
2bb50 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
2bb60 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
2bb70 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
2bb80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bb90 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2bba0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
2bbb0 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
2bbc0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
2bbd0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
2bbe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bbf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2bc00 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
2bc10 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
2bc20 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
2bc30 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
2bc40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bc50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2bc60 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2bc70 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
2bc80 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
2bc90 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
2bca0 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
2bcc0 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
2bcd0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
2bce0 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
2bcf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bd00 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
2bd10 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
2bd20 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
2bd30 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
2bd40 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
2bd50 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
2bd60 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
2bd70 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
2bd80 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
2bd90 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
2bda0 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
2bdb0 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
2bdc0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
2bdd0 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
2bde0 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
2bdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2be00 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
2be10 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
2be20 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
2be30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
2be40 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
2be50 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
2be60 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
2be70 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
2be80 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e   barrier */.  un
2be90 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2beb0 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72   Also mutex, for
2bec0 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20   redundancy */. 
2bed0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2bee0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
2bef0 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
2bf00 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
2bf10 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
2bf20 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
2bf30 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
2bf40 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
2bf50 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2bf60 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
2bf70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2bf80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
2bf90 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
2bfa0 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2bfb0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
2bfc0 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
2bfd0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
2bfe0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
2bff0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
2c000 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2c010 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
2c020 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
2c030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2c040 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
2c050 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
2c060 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c080 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
2c090 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
2c0a0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
2c0b0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
2c0c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
2c0d0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
2c0e0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2c0f0 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
2c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c110 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2c120 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
2c130 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
2c140 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c160 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
2c170 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c180 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
2c190 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
2c1a0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
2c1b0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2c1c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
2c1d0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
2c1e0 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
2c1f0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
2c200 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2c210 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2c220 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2c230 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2c240 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
2c250 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
2c260 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
2c270 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
2c280 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
2c290 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
2c2a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2c2b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2c2c0 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
2c2d0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
2c2e0 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
2c2f0 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
2c300 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
2c310 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
2c320 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
2c330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2c340 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
2c350 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
2c360 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2c370 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
2c380 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
2c390 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
2c3a0 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
2c3b0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
2c3c0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
2c3d0 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
2c3e0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
2c400 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
2c410 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
2c420 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
2c430 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
2c440 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
2c450 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
2c460 3e 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 69 66  >=0 ) {.      if
2c470 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20   (deleteFlag == 
2c480 31 29 20 7b 20 0a 20 20 20 20 20 20 20 20 6f 73  1) { .        os
2c490 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
2c4a0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
2c4b0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 65     } else if (de
2c4c0 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b  leteFlag == 2) {
2c4d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 74 72 75  .        /* ftru
2c4e0 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
2c4f0 68 2c 20 33 32 20 2a 20 31 30 32 34 29 3b 20 2a  h, 32 * 1024); *
2c500 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2c510 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
2c520 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
2c530 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2c540 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2c550 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
2c560 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
2c570 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
2c580 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
2c590 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
2c5a0 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
2c5b0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
2c5c0 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
2c5d0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
2c5e0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
2c5f0 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
2c600 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
2c610 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c620 5f 5f 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  __).static const
2c630 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2c640 69 6c 65 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73  ileDir(void);..s
2c650 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e  tatic int unixIn
2c660 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
2c670 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  iles(unixFile *p
2c680 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57 41  File, int skipWA
2c690 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a 50 61 74  L) {.  char jPat
2c6a0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b  h[MAXPATHLEN+9];
2c6b0 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74  .  int zLen = st
2c6c0 72 6c 63 70 79 28 6a 50 61 74 68 2c 20 70 46 69  rlcpy(jPath, pFi
2c6d0 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
2c6e0 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20  THLEN+9);.  if( 
2c6f0 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20  zLen<MAXPATHLEN 
2c700 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c  ){.    size_t jL
2c710 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
2c720 61 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d  ar extensions[3]
2c730 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20  [9] = { "-wal", 
2c740 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68  "-journal", "-sh
2c750 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20  m" };.    int j 
2c760 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a  = (skipWAL ? 1 :
2c770 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20   0);.    for( ; 
2c780 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20  j<3; j++ ){.    
2c790 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
2c7a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2c7b0 73 68 6d 20 66 69 6c 65 20 69 73 20 61 6c 72 65  shm file is alre
2c7c0 61 64 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 74  ady opened for t
2c7d0 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20  his pFile */.   
2c7e0 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
2c7f0 20 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72         unixEnter
2c800 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
2c810 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
2c820 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
2c830 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
2c840 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64        unixShmNod
2c850 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  e *pShmNode = pF
2c860 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
2c870 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  mNode;.        i
2c880 66 28 20 70 53 68 6d 4e 6f 64 65 20 26 26 20 21  f( pShmNode && !
2c890 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
2c8a0 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  only ){.        
2c8b0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2c8c0 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  tat;.          s
2c8d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2c8e0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
2c8f0 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  ex);.          .
2c900 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2c910 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20  hmNode->h>=0 && 
2c920 21 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64  !osFstat(pShmNod
2c930 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
2c940 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
2c950 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20  igned long size 
2c960 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  = (sStat.st_size
2c970 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73  <4) ? sStat.st_s
2c980 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20  ize : 4;.       
2c990 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20       if( size>0 
2c9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c9b0 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d   bzero(pShmNode-
2c9c0 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69  >apRegion[0], si
2c9d0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
2c9e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2c9f0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2ca00 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  >mutex);.       
2ca10 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
2ca20 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
2ca30 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2ca40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ca50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ca60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2ca70 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2ca80 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2ca90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69     }.        uni
2caa0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2cab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65       }.      jLe
2cac0 6e 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61  n = strlcpy(&jPa
2cad0 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73  th[zLen], extens
2cae0 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20  ions[j], 9);.   
2caf0 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20     if( jLen < 9 
2cb00 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
2cb10 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20  flags = (j<2) ? 
2cb20 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52  O_TRUNC : O_RDWR
2cb30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66  ;.        int jf
2cb40 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20  d = open(jPath, 
2cb50 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  jflags);.       
2cb60 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29   if( jfd==(-1) )
2cb70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2cb80 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2cb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72  .            per
2cba0 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20  ror(jPath);.    
2cbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cbc0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2cbd0 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
2cbe0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2cbf0 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20  t stat sStat;.  
2cc00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6f            if( !o
2cc10 73 46 73 74 61 74 28 6a 66 64 2c 20 26 73 53 74  sFstat(jfd, &sSt
2cc20 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  at) ){.         
2cc30 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f       unsigned lo
2cc40 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74  ng size = (sStat
2cc50 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53  .st_size<4) ? sS
2cc60 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b  tat.st_size : 4;
2cc70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2cc80 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 75 69 6e               uin
2cca0 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a  t32_t zero = 0;.
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccc0 70 77 72 69 74 65 28 6a 66 64 2c 20 26 7a 65 72  pwrite(jfd, &zer
2ccd0 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c  o, (size_t)size,
2cce0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2ccf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2cd00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2cd10 20 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a           fsync(j
2cd20 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  fd);.          c
2cd30 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20  lose(jfd);.     
2cd40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2cd50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2cd60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
2cd70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 73  atic int unixUns
2cd80 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61 62  afeTruncateDatab
2cd90 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ase(unixFile *pF
2cda0 69 6c 65 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20  ile){.  /* this 
2cdb0 69 73 20 6e 61 73 74 79 20 26 20 62 61 64 2e 20  is nasty & bad. 
2cdc0 20 64 65 73 74 72 75 63 74 69 6f 6e 20 77 69 74   destruction wit
2cdd0 68 20 70 72 65 6a 75 64 69 63 65 2e 20 20 77 65  h prejudice.  we
2cde0 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65  'll lose all the
2cdf0 0a 20 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73  .  ** file locks
2ce00 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
2ce10 2c 20 68 6f 77 65 76 65 72 2e 20 73 71 6c 69 74  , however. sqlit
2ce20 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
2ce30 77 6f 72 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a  works properly..
2ce40 20 20 2a 2a 20 42 75 74 20 69 66 20 69 74 20 66    ** But if it f
2ce50 61 69 6c 73 2c 20 74 68 69 73 20 77 6f 72 6b 73  ails, this works
2ce60 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20   approximately. 
2ce70 20 2a 2f 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e   */.  char journ
2ce80 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
2ce90 4e 5d 3b 0a 20 20 63 68 61 72 20 77 61 6c 50 61  N];.  char walPa
2cea0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
2ceb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2cec0 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20  E_OK;.  .#ifdef 
2ced0 44 45 42 55 47 0a 20 20 66 70 72 69 6e 74 66 28  DEBUG.  fprintf(
2cee0 73 74 64 65 72 72 2c 20 22 46 6f 72 63 65 20 74  stderr, "Force t
2cef0 72 75 6e 63 61 74 69 6e 67 20 64 61 74 61 62 61  runcating databa
2cf00 73 65 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  se %s\n", pFile-
2cf10 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
2cf20 20 20 73 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61    strlcpy(journa
2cf30 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  lPath, pFile->zP
2cf40 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2cf50 3b 0a 20 20 73 74 72 6c 63 61 74 28 6a 6f 75 72  ;.  strlcat(jour
2cf60 6e 61 6c 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e  nalPath, "-journ
2cf70 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  al", MAXPATHLEN)
2cf80 3b 0a 20 20 73 74 72 6c 63 70 79 28 77 61 6c 50  ;.  strlcpy(walP
2cf90 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
2cfa0 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2cfb0 20 20 73 74 72 6c 63 61 74 28 77 61 6c 50 61 74    strlcat(walPat
2cfc0 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
2cfd0 54 48 4c 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64  THLEN);.  int fd
2cfe0 31 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  1 = pFile->h;.  
2cff0 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a  int result = 0;.
2d000 20 20 72 65 73 75 6c 74 20 3d 20 66 74 72 75 6e    result = ftrun
2d010 63 61 74 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a  cate(fd1, 0ll);.
2d020 20 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a    if (result) {.
2d030 20 20 20 20 72 65 73 75 6c 74 20 3d 20 65 72 72      result = err
2d040 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 20 28 72 65  no;.  }.  if (re
2d050 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d  sult) {.    rc =
2d060 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2d070 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2d080 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 29  o(pFile, result)
2d090 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66  ;.  }.  .  int f
2d0a0 64 32 20 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61  d2 = open(journa
2d0b0 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a  lPath, O_RDWR);.
2d0c0 20 20 69 6e 74 20 72 65 73 75 6c 74 32 20 3d 20    int result2 = 
2d0d0 30 3b 0a 20 20 69 66 20 28 66 64 32 20 3c 20 30  0;.  if (fd2 < 0
2d0e0 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e  ) {.    if (errn
2d0f0 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20  o != ENOENT) {. 
2d100 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65       result2 = e
2d110 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
2d120 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32   {.      result2
2d130 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = 0;.    }.  } 
2d140 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c  else {.    resul
2d150 74 32 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66  t2 = ftruncate(f
2d160 64 32 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66  d2, 0ll);.    if
2d170 20 28 72 65 73 75 6c 74 32 29 20 7b 0a 20 20 20   (result2) {.   
2d180 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72     result2 = err
2d190 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  no;.    }.  }.  
2d1a0 69 66 20 28 72 65 73 75 6c 74 32 20 26 26 20 21  if (result2 && !
2d1b0 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63  result) {.    rc
2d1c0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2d1d0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
2d1e0 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c  rno(pFile, resul
2d1f0 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e  t2);.  }.  .  in
2d200 74 20 66 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c  t fd3 = open(wal
2d210 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20  Path, O_RDWR);. 
2d220 20 69 6e 74 20 72 65 73 75 6c 74 33 20 3d 20 30   int result3 = 0
2d230 3b 0a 20 20 69 66 20 28 66 64 33 20 3c 20 30 29  ;.  if (fd3 < 0)
2d240 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f   {.    if (errno
2d250 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20   != ENOENT) {.  
2d260 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72      result3 = er
2d270 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
2d280 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20  {.      result3 
2d290 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  = 0;.    }.  } e
2d2a0 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74  lse {.    result
2d2b0 33 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64  3 = ftruncate(fd
2d2c0 33 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20  3, 0ll);.    if 
2d2d0 28 72 65 73 75 6c 74 33 29 20 7b 0a 20 20 20 20  (result3) {.    
2d2e0 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e    result3 = errn
2d2f0 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  o;.    }.  }.  i
2d300 66 20 28 72 65 73 75 6c 74 33 20 26 26 20 21 28  f (result3 && !(
2d310 72 65 73 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74  result || result
2d320 32 29 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53  2)) {.    rc = S
2d330 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
2d340 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2d350 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b  pFile, result2);
2d360 0a 20 20 7d 0a 20 20 0a 20 20 69 66 20 28 66 64  .  }.  .  if (fd
2d370 33 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73  3 >= 0) {.    fs
2d380 79 6e 63 28 66 64 33 29 3b 0a 20 20 20 20 63 6c  ync(fd3);.    cl
2d390 6f 73 65 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20  ose(fd3);.  }.  
2d3a0 69 66 20 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a  if (fd2 >= 0) {.
2d3b0 20 20 20 20 66 73 79 6e 63 28 66 64 32 29 3b 0a      fsync(fd2);.
2d3c0 20 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a      close(fd2);.
2d3d0 20 20 7d 0a 20 20 66 73 79 6e 63 28 66 64 31 29    }.  fsync(fd1)
2d3e0 3b 0a 09 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ;...  return rc;
2d3f0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
2d400 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
2d410 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ase(unixFile *pF
2d420 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67 73 29  ile, int bFlags)
2d430 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
2d440 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
2d450 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
2d460 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d470 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f  _OK;.  void *pLo
2d480 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74  ck = NULL;.  int
2d490 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e   flags = 0;.  in
2d4a0 74 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63  t corruptFileLoc
2d4b0 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43  k = 0;.  int isC
2d4c0 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e  orrupt = 0;.  in
2d4d0 74 20 66 6f 72 63 65 20 3d 20 28 62 46 6c 61 67  t force = (bFlag
2d4e0 73 20 26 20 53 51 4c 49 54 45 5f 54 52 55 4e 43  s & SQLITE_TRUNC
2d4f0 41 54 45 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e  ATE_FORCE);.  in
2d500 74 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 30  t safeFailed = 0
2d510 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
2d520 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
2d530 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
2d540 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
2d550 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
2d560 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2d570 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
2d580 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
2d590 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
2d5a0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2d5b0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
2d5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2d5d0 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
2d5e0 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
2d5f0 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
2d600 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
2d610 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2d620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d630 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
2d640 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
2d650 0a 20 20 20 20 20 20 69 73 43 6f 72 72 75 70 74  .      isCorrupt
2d660 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
2d670 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
2d680 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  erlock_corrupt(i
2d690 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
2d6a0 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20 20 20  XCLUSIVE,.      
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6d0 20 20 20 26 63 6f 72 72 75 70 74 46 69 6c 65 4c     &corruptFileL
2d6e0 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
2d6f0 69 66 28 20 72 63 20 26 26 20 21 66 6f 72 63 65  if( rc && !force
2d700 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d710 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2d720 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
2d730 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63  * Ignore the loc
2d740 6b 69 6e 67 20 66 61 69 6c 75 72 65 20 69 66 20  king failure if 
2d750 66 6f 72 63 65 20 69 73 20 74 72 75 65 20 2a 2f  force is true */
2d760 0a 20 20 7d 0a 20 20 69 66 28 20 28 62 46 6c 61  .  }.  if( (bFla
2d770 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2d780 54 45 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45  TE_INITIALIZE_HE
2d790 41 44 45 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b  ADER_MASK)!=0 ){
2d7a0 0a 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69  .    /* initiali
2d7b0 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ze a new databas
2d7c0 65 20 69 6e 20 54 4d 50 44 49 52 20 61 6e 64 20  e in TMPDIR and 
2d7d0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2d7e0 73 20 6f 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f  s over */.    co
2d7f0 6e 73 74 20 63 68 61 72 20 2a 74 44 69 72 20 3d  nst char *tDir =
2d800 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2d810 28 29 3b 0a 20 20 20 20 69 6e 74 20 74 44 69 72  ();.    int tDir
2d820 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74 44 69  Len = strlen(tDi
2d830 72 29 3b 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e  r);.    int tLen
2d840 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20   = sizeof(char) 
2d850 2a 20 28 74 44 69 72 4c 65 6e 20 2b 20 31 32 29  * (tDirLen + 12)
2d860 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 44 62 50  ;.    char *tDbP
2d870 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
2d880 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20  lloc(tLen);.    
2d890 69 6e 74 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20  int tFd = -1;.  
2d8a0 20 20 0a 20 20 20 20 73 74 72 6c 63 70 79 28 74    .    strlcpy(t
2d8b0 44 62 50 61 74 68 2c 20 74 44 69 72 2c 20 74 4c  DbPath, tDir, tL
2d8c0 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 74 44 62  en);.    if( tDb
2d8d0 50 61 74 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29  Path[(tDirLen-1)
2d8e0 5d 20 21 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20  ] != '/' ){.    
2d8f0 20 20 73 74 72 6c 63 61 74 28 74 44 62 50 61 74    strlcat(tDbPat
2d900 68 2c 20 22 2f 74 6d 70 64 62 58 58 58 58 58 22  h, "/tmpdbXXXXX"
2d910 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65  , tLen);.    } e
2d920 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 72 6c  lse {.      strl
2d930 63 61 74 28 74 44 62 50 61 74 68 2c 20 22 74 6d  cat(tDbPath, "tm
2d940 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29  pdbXXXXX", tLen)
2d950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 46 64 20  ;.    }.    tFd 
2d960 3d 20 6d 6b 73 74 65 6d 70 28 74 44 62 50 61 74  = mkstemp(tDbPat
2d970 68 29 3b 0a 20 20 20 20 69 66 28 20 74 46 64 3d  h);.    if( tFd=
2d980 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  =-1 ){.      sto
2d990 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2d9a0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
2d9b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2d9c0 52 52 3b 0a 20 20 20 20 20 20 73 61 66 65 46 61  RR;.      safeFa
2d9d0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
2d9e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2d9f0 65 33 20 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a  e3 *tDb = NULL;.
2da00 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73        copyfile_s
2da10 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20 20  tate_t s;.      
2da20 69 6e 74 20 74 72 63 20 3d 20 73 71 6c 69 74 65  int trc = sqlite
2da30 33 5f 6f 70 65 6e 5f 76 32 28 74 44 62 50 61 74  3_open_v2(tDbPat
2da40 68 2c 20 26 74 44 62 2c 0a 20 20 20 20 20 20 20  h, &tDb,.       
2da50 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
2da60 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
2da70 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2da80 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
2da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
2daa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2dab0 50 52 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20  PROXY), NULL);. 
2dac0 20 20 20 20 20 63 68 61 72 20 2a 65 72 72 6d 73       char *errms
2dad0 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
2dae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 20  const char *sql 
2daf0 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
2db00 21 74 72 63 20 26 26 20 28 62 46 6c 61 67 73 26  !trc && (bFlags&
2db10 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2db20 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29  PAGESIZE_MASK) )
2db30 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2db40 63 68 61 72 20 70 61 67 65 73 69 7a 65 5f 73 71  char pagesize_sq
2db50 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20  l[4][22] = {.   
2db60 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2db70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a  age_size=1024",.
2db80 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2db90 61 20 70 61 67 65 5f 73 69 7a 65 3d 32 30 34 38  a page_size=2048
2dba0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2dbb0 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 34  agma page_size=4
2dbc0 30 39 36 22 2c 0a 20 20 20 20 20 20 20 20 20 20  096",.          
2dbd0 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a  "pragma page_siz
2dbe0 65 3d 38 31 39 32 22 20 0a 20 20 20 20 20 20 20  e=8192" .       
2dbf0 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
2dc00 69 50 61 67 65 73 69 7a 65 20 3d 20 28 28 28 62  iPagesize = (((b
2dc10 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2dc20 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d  NCATE_PAGESIZE_M
2dc30 41 53 4b 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b  ASK) >> 4) - 1);
2dc40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dc50 20 69 50 61 67 65 73 69 7a 65 3e 3d 30 20 26 26   iPagesize>=0 &&
2dc60 20 69 50 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b   iPagesize<=4 );
2dc70 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 70  .        sql = p
2dc80 61 67 65 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67  agesize_sql[iPag
2dc90 65 73 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  esize];.        
2dca0 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  trc = sqlite3_ex
2dcb0 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20  ec(tDb, sql, 0, 
2dcc0 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20  0, &errmsg);.   
2dcd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2dce0 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  trc ){.        c
2dcf0 6f 6e 73 74 20 63 68 61 72 20 61 75 74 6f 76 61  onst char autova
2dd00 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20  cuum_sql[3][21] 
2dd10 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70  = {.          "p
2dd20 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75  ragma auto_vacuu
2dd30 6d 3d 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20  m=0",.          
2dd40 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63  "pragma auto_vac
2dd50 75 75 6d 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  uum=1",.        
2dd60 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76    "pragma auto_v
2dd70 61 63 75 75 6d 3d 32 22 0a 20 20 20 20 20 20 20  acuum=2".       
2dd80 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
2dd90 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b  iAutovacuum = 2;
2dda0 20 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f 20 69   /* default to i
2ddb0 6e 63 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20  ncremental */.  
2ddc0 20 20 20 20 20 20 69 66 28 20 28 62 46 6c 61 67        if( (bFlag
2ddd0 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2dde0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53  E_AUTOVACUUM_MAS
2ddf0 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  K) ){.          
2de00 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 28 28  iAutovacuum = ((
2de10 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  (bFlags&SQLITE_T
2de20 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55  RUNCATE_AUTOVACU
2de30 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d  UM_MASK) >> 2) -
2de40 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
2de50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2de60 41 75 74 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26  Autovacuum>=0 &&
2de70 20 69 41 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20   iAutovacuum<=2 
2de80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d  );.        sql =
2de90 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b   autovacuum_sql[
2dea0 69 41 75 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20  iAutovacuum];.  
2deb0 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69        trc = sqli
2dec0 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71  te3_exec(tDb, sq
2ded0 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67  l, 0, 0, &errmsg
2dee0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2def0 20 69 66 28 20 21 74 72 63 20 26 26 20 28 62 46   if( !trc && (bF
2df00 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2df10 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  CATE_JOURNALMODE
2df20 5f 57 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _WAL) ){.       
2df30 20 73 71 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a   sql = "pragma j
2df40 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
2df50 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20  ;.        trc = 
2df60 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62  sqlite3_exec(tDb
2df70 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72  , sql, 0, 0, &er
2df80 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
2df90 20 20 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a       if( trc ){.
2dfa0 20 20 20 20 20 20 20 20 69 66 28 20 21 74 44 62          if( !tDb
2dfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
2dfc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2dfd0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 65  ailed to open te
2dfe0 6d 70 20 64 61 74 61 62 61 73 65 20 27 25 73 27  mp database '%s'
2dff0 20 74 6f 20 72 65 73 65 74 20 22 0a 20 20 20 20   to reset ".    
2e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e010 20 20 20 20 20 20 22 74 72 75 6e 63 61 74 65 64        "truncated
2e020 20 64 61 74 61 62 61 73 65 20 25 73 20 77 69 74   database %s wit
2e030 68 20 66 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e  h flags %x: %d\n
2e040 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 44                tD
2e060 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  bPath, pFile->zP
2e070 61 74 68 2c 20 62 46 6c 61 67 73 2c 20 74 72 63  ath, bFlags, trc
2e080 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e090 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
2e0a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
2e0b0 6c 65 64 20 74 6f 20 73 65 74 20 27 25 73 27 20  led to set '%s' 
2e0c0 6f 6e 20 74 72 75 6e 63 61 74 65 64 20 64 61 74  on truncated dat
2e0d0 61 62 61 73 65 20 25 73 2c 20 25 64 3a 20 22 0a  abase %s, %d: ".
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0f0 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 6e 22            "%s\n"
2e100 2c 20 73 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50  , sql, pFile->zP
2e110 61 74 68 2c 20 74 72 63 2c 20 65 72 72 6d 73 67  ath, trc, errmsg
2e120 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e130 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
2e140 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Db ){.        in
2e150 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  t off = 0;.     
2e160 20 20 20 2f 2a 20 6d 65 72 67 65 20 74 68 65 20     /* merge the 
2e170 77 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 62 20  wal into the db 
2e180 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2e190 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2e1a0 74 44 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  tDb, NULL, SQLIT
2e1b0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
2e1c0 57 41 4c 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20  WAL, &off);.    
2e1d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2e1e0 65 28 74 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  e(tDb);.      }.
2e1f0 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69        s = copyfi
2e200 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29  le_state_alloc()
2e210 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 74 46  ;.      lseek(tF
2e220 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b  d, 0, SEEK_SET);
2e230 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69  .      lseek(pFi
2e240 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
2e250 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ET);.      if( f
2e260 63 6f 70 79 66 69 6c 65 28 74 46 64 2c 20 70 46  copyfile(tFd, pF
2e270 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46  ile->h, s, COPYF
2e280 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20  ILE_DATA) ){.   
2e290 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
2e2a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74  no;.        swit
2e2b0 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20  ch(err) {.      
2e2c0 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a      case ENOMEM:
2e2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 63  .            trc
2e2e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2e300 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  ak;.          de
2e310 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
2e320 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2e330 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20  o(pFile, err);. 
2e340 20 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d             trc =
2e350 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2e360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e370 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
2e380 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
2e390 20 20 20 20 20 66 73 79 6e 63 28 70 46 69 6c 65       fsync(pFile
2e3a0 2d 3e 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  ->h);.      clos
2e3b0 65 28 74 46 64 29 3b 0a 20 20 20 20 20 20 75 6e  e(tFd);.      un
2e3c0 6c 69 6e 6b 28 74 44 62 50 61 74 68 29 3b 0a 20  link(tDbPath);. 
2e3d0 20 20 20 20 20 69 66 28 20 74 72 63 21 3d 53 51       if( trc!=SQ
2e3e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e3f0 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e400 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
2e410 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  trc;.      }.   
2e420 20 7d 0a 20 20 20 20 66 72 65 65 28 74 44 62 50   }.    free(tDbP
2e430 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  ath);.  } else {
2e440 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
2e450 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63  >pMethod->xTrunc
2e460 61 74 65 28 69 64 2c 20 0a 20 20 20 20 20 20 20  ate(id, .       
2e470 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 66 73 46      ((pFile->fsF
2e480 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
2e490 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20  FLAGS_IS_MSDOS) 
2e4a0 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29  != 0) ? 1L : 0L)
2e4b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2e4c0 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64        safeFailed
2e4d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
2e4e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e4f0 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a  _OK || force ){.
2e500 20 20 20 20 72 63 20 3d 20 75 6e 69 78 49 6e 76      rc = unixInv
2e510 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
2e520 6c 65 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20  les(pFile, 0);. 
2e530 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e540 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e550 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
2e560 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2e570 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f  Sync(id, SQLITE_
2e580 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20  SYNC_FULL);...  
2e590 69 66 28 20 69 73 43 6f 72 72 75 70 74 20 29 7b  if( isCorrupt ){
2e5a0 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
2e5b0 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
2e5c0 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74  rupt(id, corrupt
2e5d0 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c  FileLock);.  }el
2e5e0 73 65 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a  se if( pLock ){.
2e5f0 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f      sqlite3demo_
2e600 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63  superunlock(pLoc
2e610 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k);.  }else{.   
2e620 20 61 73 73 65 72 74 28 66 6f 72 63 65 29 3b 0a   assert(force);.
2e630 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 66 6f 72    }.  .  if( for
2e640 63 65 20 26 26 20 73 61 66 65 46 61 69 6c 65 64  ce && safeFailed
2e650 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
2e660 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44 61  UnsafeTruncateDa
2e670 74 61 62 61 73 65 28 70 46 69 6c 65 29 3b 0a 20  tabase(pFile);. 
2e680 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
2e690 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63  c;.}../*. ** Loc
2e6a0 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20  k locations for 
2e6b0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f  shared-memory lo
2e6c0 63 6b 73 20 75 73 65 64 20 62 79 20 57 41 4c 20  cks used by WAL 
2e6d0 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  mode.. */.#ifnde
2e6e0 66 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66  f SHM_BASE.# def
2e6f0 69 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20  ine SHM_BASE    
2e700 20 20 20 20 20 20 31 32 30 0a 23 20 64 65 66 69        120.# defi
2e710 6e 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20  ne SHM_WRITE    
2e720 20 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20       SHM_BASE.# 
2e730 64 65 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b  define SHM_CHECK
2e740 50 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41  POINT    (SHM_BA
2e750 53 45 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53  SE+1).# define S
2e760 48 4d 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20  HM_RECOVER      
2e770 20 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20   (SHM_BASE+2).# 
2e780 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f  define SHM_READ_
2e790 46 49 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41  FIRST    (SHM_BA
2e7a0 53 45 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53  SE+3).# define S
2e7b0 48 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20  HM_READ_SIZE    
2e7c0 20 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d   5.#endif /* SHM
2e7d0 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _BASE */../*.** 
2e7e0 54 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20 77  This test only w
2e7f0 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65  orks for lock te
2e800 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f  sting on unix/po
2e810 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70  six VFS..** Adap
2e820 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65  ted from tool/ge
2e830 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62 36 35  tlock.c f4c39b65
2e840 31 33 37 30 31 35 36 63 61 65 39 37 39 35 30 31  1370156cae979501
2e850 61 37 62 31 35 36 62 64 62 61 35 30 65 37 63 65  a7b156bdba50e7ce
2e860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2e870 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
2e880 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
2e890 20 70 69 64 5f 74 20 70 69 64 2c 20 69 6e 74 20   pid_t pid, int 
2e8a0 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20  *pLockstate){.  
2e8b0 69 6e 74 20 68 44 62 3b 20 20 20 20 20 20 20 20  int hDb;        
2e8c0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2e8d0 6f 72 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20  or for the open 
2e8e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2e8f0 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31  .  int hShm = -1
2e900 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72  ;  /* File descr
2e910 69 70 74 6f 72 20 66 6f 72 20 57 41 4c 20 73 68  iptor for WAL sh
2e920 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
2e930 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f   */.  ssize_t go
2e940 74 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72  t;    /* Bytes r
2e950 65 61 64 20 66 72 6f 6d 20 68 65 61 64 65 72 20  ead from header 
2e960 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c 20 3d  */.  int isWal =
2e970 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e980 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 57 41  /* True if in WA
2e990 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  L mode */.  int 
2e9a0 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  nLock = 0;      
2e9b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e9c0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a   of locks held *
2e9d0 2f 0a 20 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20  /.  int noHdr = 
2e9e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2e9f0 2a 20 5a 65 72 6f 20 62 79 74 65 20 44 42 20 68  * Zero byte DB h
2ea00 61 73 20 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a  as no header */.
2ea10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2ea20 61 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20  aHdr[100];   /* 
2ea30 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
2ea40 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70  */.  .  assert(p
2ea50 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20  Lockstate);.  . 
2ea60 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77 65   /* make sure we
2ea70 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2ea80 68 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  h a database fil
2ea90 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46 69  e */.  hDb = pFi
2eaa0 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44 62  le->h;.  if( hDb
2eab0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b  <0 ){.    *pLock
2eac0 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
2ead0 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a  OCKSTATE_ERROR;.
2eae0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2eaf0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2eb00 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28 53  ssert( (strlen(S
2eb10 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45  QLITE_FILE_HEADE
2eb20 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49  R)+1)==SQLITE_FI
2eb30 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b  LE_HEADER_LEN );
2eb40 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 68  .  got = pread(h
2eb50 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30  Db, aHdr, 100, 0
2eb60 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  );.  if( got<0 )
2eb70 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74  {.    *pLockstat
2eb80 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  e = SQLITE_LOCKS
2eb90 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  TATE_ERROR;.    
2eba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ebb0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2ebc0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48  ot==0 ){.    noH
2ebd0 64 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  dr = 1;.  }else 
2ebe0 69 66 28 20 67 6f 74 21 3d 31 30 30 0a 20 20 20  if( got!=100.   
2ebf0 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28        || memcmp(
2ec00 61 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c  aHdr, SQLITE_FIL
2ec10 45 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54 45  E_HEADER, SQLITE
2ec20 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e  _FILE_HEADER_LEN
2ec30 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70  )!=0.  ){.    *p
2ec40 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2ec50 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54  TE_LOCKSTATE_NOT
2ec60 41 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ADB;.    return 
2ec70 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
2ec80 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74   }.  .  /* First
2ec90 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78   check for an ex
2eca0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
2ecb0 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49    nLock += unixI
2ecc0 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62  sLocked(pid, hDb
2ecd0 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45  , F_RDLCK, SHARE
2ece0 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
2ecf0 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIZE,.          
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
2ed10 58 43 4c 55 53 49 56 45 22 29 3b 0a 20 20 69 66  XCLUSIVE");.  if
2ed20 20 28 21 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20   (!noHdr) {.    
2ed30 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d  isWal = aHdr[18]
2ed40 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ==2;.  }.  if( n
2ed50 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c  Lock==0 && isWal
2ed60 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f  ==0 ){.    /* Ro
2ed70 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20  llback mode */. 
2ed80 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78     nLock += unix
2ed90 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44  IsLocked(pid, hD
2eda0 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44  b, F_WRLCK, PEND
2edb0 49 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45 44  ING_BYTE, SHARED
2edc0 5f 53 49 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20  _SIZE+2,.       
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ede0 20 20 20 22 50 45 4e 44 49 4e 47 7c 52 45 53 45     "PENDING|RESE
2edf0 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b 0a 20  RVED|SHARED");. 
2ee00 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d   }.  if( nLock==
2ee10 30 20 26 26 20 69 73 57 61 6c 21 3d 30 20 29 7b  0 && isWal!=0 ){
2ee20 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74  .    /* lookup t
2ee30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2ee40 6f 72 20 66 6f 72 20 74 68 65 20 73 68 61 72 65  or for the share
2ee50 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 66  d memory file if
2ee60 20 77 65 20 68 61 76 65 20 69 74 20 6f 70 65 6e   we have it open
2ee70 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
2ee80 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75  process */.    u
2ee90 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2eea0 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
2eeb0 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
2eec0 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
2eed0 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68  ds */.    unixSh
2eee0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
2eef0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
2ef00 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69  >pShmNode;.    i
2ef10 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
2ef20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2ef30 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
2ef40 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2ef50 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70   .      hShm = p
2ef60 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20  ShmNode->h;.    
2ef70 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29    if( hShm >= 0)
2ef80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  {.        if( un
2ef90 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
2efa0 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
2efb0 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22  HM_RECOVER, 1, "
2efc0 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c  WAL-RECOVERY") |
2efd0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  |.           uni
2efe0 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
2eff0 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
2f000 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c  M_WRITE, 1, "WAL
2f010 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20  -WRITE") ){.    
2f020 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b        nLock = 1;
2f030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f040 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2f050 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2f060 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2f070 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  tex);.    } .   
2f080 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30   .    if( hShm<0
2f090 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65   ){.      /* the
2f0a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66   shared memory f
2f0b0 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69  ile isn't open i
2f0c0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 73  n this process s
2f0d0 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20  pace, open our. 
2f0e0 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a       ** own FD *
2f0f0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a 53 68  /.      char zSh
2f100 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  m[MAXPATHLEN];. 
2f110 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 57       .      /* W
2f120 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20  AL mode */.     
2f130 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70   strlcpy(zShm, p
2f140 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
2f150 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2f160 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d  strlcat(zShm, "-
2f170 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  shm", MAXPATHLEN
2f180 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20  );.      hShm = 
2f190 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f  open(zShm, O_RDO
2f1a0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  NLY, 0);.      i
2f1b0 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20  f( hShm<0 ){.   
2f1c0 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65       *pLockstate
2f1d0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
2f1e0 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20  ATE_OFF;.       
2f1f0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2f200 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2f210 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f220 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 75     }.      if( u
2f230 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2f240 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
2f250 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20  SHM_RECOVER, 1, 
2f260 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20  "WAL-RECOVERY") 
2f270 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e 69 78  ||.         unix
2f280 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
2f290 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
2f2a0 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d  _WRITE, 1, "WAL-
2f2b0 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20  WRITE") ){.     
2f2c0 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20     nLock = 1;.  
2f2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
2f2e0 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(hShm);.    }. 
2f2f0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2f300 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  x();.  }.  if( n
2f310 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70  Lock>0 ){.    *p
2f320 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2f330 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b  TE_LOCKSTATE_ON;
2f340 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
2f350 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
2f360 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f  LITE_LOCKSTATE_O
2f370 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  FF;.  }.  return
2f380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2f390 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45  endif /* (SQLITE
2f3a0 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
2f3b0 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
2f3c0 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23  __APPLE__) */..#
2f3d0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2f3e0 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
2f3f0 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  If it is current
2f400 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ly memory mapped
2f410 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64  , unmap file pFd
2f420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f430 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
2f440 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
2f450 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
2f460 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
2f470 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
2f480 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e  ion ){.    osMun
2f490 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67  map(pFd->pMapReg
2f4a0 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ion, pFd->mmapSi
2f4b0 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70  zeActual);.    p
2f4c0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
2f4d0 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
2f4e0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  pSize = 0;.    p
2f4f0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f500 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
2f510 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2f520 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
2f530 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
2f540 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ng maintained by
2f550 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
2f560 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77  ptor pFd to nNew
2f570 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73   bytes. Any exis
2f580 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
2f590 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a  discarded..**.**
2f5a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2f5b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
2f5c0 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
2f5d0 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
2f5e0 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
2f5f0 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20  .pMapRegion.**  
2f600 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
2f610 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  apSize.**       
2f620 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
2f630 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66  eActual.**.** If
2f640 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61   unsuccessful, a
2f650 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2f660 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71  is logged via sq
2f670 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a  lite3_log() and.
2f680 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72  ** the three var
2f690 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65  iables above are
2f6a0 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73   zeroed. In this
2f6b0 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f   case SQLite sho
2f6c0 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  uld.** continue 
2f6d0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
2f6e0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
2f6f0 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72   xRead() and xWr
2f700 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73  ite().** methods
2f710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f720 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a   unixRemapfile(.
2f730 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c    unixFile *pFd,
2f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f750 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2f760 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ptor object */. 
2f770 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20   i64 nNew       
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f790 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70   /* Required map
2f7a0 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  ping size */.){.
2f7b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
2f7c0 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69  rr = "mmap";.  i
2f7d0 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20  nt h = pFd->h;  
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7f0 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2f800 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64  riptor open on d
2f810 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  b file */.  u8 *
2f820 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46  pOrig = (u8 *)pF
2f830 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d->pMapRegion;  
2f840 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2f850 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70  urrent file mapp
2f860 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72  ing */.  i64 nOr
2f870 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ig = pFd->mmapSi
2f880 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a  zeActual;     /*
2f890 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72   Size of pOrig r
2f8a0 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a  egion in bytes *
2f8b0 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30  /.  u8 *pNew = 0
2f8c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2f8e0 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70  tion of new mapp
2f8f0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ing */.  int fla
2f900 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20  gs = PROT_READ; 
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f920 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
2f930 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61  o mmap() */..  a
2f940 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
2f950 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73  chOut==0 );.  as
2f960 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e  sert( nNew>pFd->
2f970 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
2f980 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d  sert( nNew<=pFd-
2f990 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a  >mmapSizeMax );.
2f9a0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
2f9b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
2f9c0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
2f9d0 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  l>=pFd->mmapSize
2f9e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41   );.  assert( MA
2f9f0 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a  P_FAILED!=0 );..
2fa00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d  #ifdef SQLITE_MM
2fa10 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69  AP_READWRITE.  i
2fa20 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61  f( (pFd->ctrlFla
2fa30 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
2fa40 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73  ONLY)==0 ) flags
2fa50 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a   |= PROT_WRITE;.
2fa60 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f  #endif..  if( pO
2fa70 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f  rig ){.#if HAVE_
2fa80 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e  MREMAP.    i64 n
2fa90 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  Reuse = pFd->mma
2faa0 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20  pSize;.#else.   
2fab0 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73   const int szSys
2fac0 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65  page = osGetpage
2fad0 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20  size();.    i64 
2fae0 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d  nReuse = (pFd->m
2faf0 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79  mapSize & ~(szSy
2fb00 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69  spage-1));.#endi
2fb10 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d  f.    u8 *pReq =
2fb20 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b   &pOrig[nReuse];
2fb30 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61  ..    /* Unmap a
2fb40 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ny pages of the 
2fb50 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
2fb60 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
2fb70 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69  reused. */.    i
2fb80 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67  f( nReuse!=nOrig
2fb90 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
2fba0 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e  ap(pReq, nOrig-n
2fbb0 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23  Reuse);.    }..#
2fbc0 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
2fbd0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d     pNew = osMrem
2fbe0 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
2fbf0 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d  , nNew, MREMAP_M
2fc00 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72  AYMOVE);.    zEr
2fc10 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65  r = "mremap";.#e
2fc20 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  lse.    pNew = o
2fc30 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77  sMmap(pReq, nNew
2fc40 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20  -nReuse, flags, 
2fc50 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e  MAP_SHARED, h, n
2fc60 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Reuse);.    if( 
2fc70 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew!=MAP_FAILED
2fc80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   ){.      if( pN
2fc90 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20  ew!=pReq ){.    
2fca0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65      osMunmap(pNe
2fcb0 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65  w, nNew - nReuse
2fcc0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
2fcd0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2fce0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  {.        pNew =
2fcf0 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a   pOrig;.      }.
2fd00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2fd10 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74    /* The attempt
2fd20 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65   to extend the e
2fd30 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
2fd40 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e  failed. Free it.
2fd50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77   */.    if( pNew
2fd60 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20  ==MAP_FAILED || 
2fd70 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
2fd80 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c   osMunmap(pOrig,
2fd90 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a   nReuse);.    }.
2fda0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65    }..  /* If pNe
2fdb0 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c  w is still NULL,
2fdc0 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
2fdd0 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d  n entirely new m
2fde0 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  apping. */.  if(
2fdf0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
2fe00 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pNew = osMmap(0,
2fe10 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41   nNew, flags, MA
2fe20 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b  P_SHARED, h, 0);
2fe30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
2fe40 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
2fe50 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
2fe60 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    nNew = 0;.    
2fe70 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2fe80 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46  ITE_OK, zErr, pF
2fe90 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20  d->zPath);..    
2fea0 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29  /* If the mmap()
2feb0 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61   above failed, a
2fec0 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73  ssume that all s
2fed0 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29  ubsequent mmap()
2fee0 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69   calls.    ** wi
2fef0 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c  ll probably fail
2ff00 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20   too. Fall back 
2ff10 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  to using xRead/x
2ff20 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c  Write exclusivel
2ff30 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  y.    ** in this
2ff40 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70   case.  */.    p
2ff50 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
2ff60 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e  = 0;.  }.  pFd->
2ff70 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f  pMapRegion = (vo
2ff80 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64  id *)pNew;.  pFd
2ff90 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64  ->mmapSize = pFd
2ffa0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
2ffb0 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = nNew;.}../*.*
2ffc0 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
2ffd0 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
2ffe0 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
2fff0 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
30000 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
30010 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
30020 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
30030 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
30040 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
30050 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
30060 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
30070 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
30080 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
30090 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
300a0 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
300b0 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
300c0 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
300d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
300e0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
300f0 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
30100 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
30110 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
30120 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
30130 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
30140 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
30150 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
30160 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
30170 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
30180 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
30190 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
301a0 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
301b0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
301c0 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
301d0 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
301e0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
301f0 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
30200 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
30210 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
30220 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63  MMAP_LIMIT, whic
30230 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
30240 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
30250 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
30260 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
30270 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
30280 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
30290 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
302a0 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
302b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
302c0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
302d0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
302e0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
302f0 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
30300 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
30310 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73  i64 nMap){.  ass
30320 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
30330 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
30340 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
30350 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d  Map>0 || (pFd->m
30360 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46  mapSize==0 && pF
30370 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
30380 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  ) );.  if( pFd->
30390 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
303a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
303b0 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
303c0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
303d0 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
303e0 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
303f0 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
30400 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
30410 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61  tat(pFd->h, &sta
30420 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 72  tbuf) ){.      r
30430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30440 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
30450 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62      nMap = statb
30460 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a  uf.st_size;.  }.
30470 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e    if( nMap>pFd->
30480 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20  mmapSizeMax ){. 
30490 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d     nMap = pFd->m
304a0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a  mapSizeMax;.  }.
304b0 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
304c0 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53  0 || (pFd->mmapS
304d0 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70  ize==0 && pFd->p
304e0 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b  MapRegion==0) );
304f0 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64  .  if( nMap!=pFd
30500 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
30510 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28    unixRemapfile(
30520 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a  pFd, nMap);.  }.
30530 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30540 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
30550 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
30560 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
30570 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
30580 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
30590 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  to a mapping of 
305a0 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67  file fd starting
305b0 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f   at offset.** iO
305c0 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20  ff. The mapping 
305d0 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f  must be valid fo
305e0 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20  r at least nAmt 
305f0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bytes..**.** If 
30600 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63  such a pointer c
30610 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  an be obtained, 
30620 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20  store it in *pp 
30630 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
30640 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  E_OK..** Or, if 
30650 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e  one cannot but n
30660 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
30670 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64  set *pp to 0 and
30680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30690 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69  K..** Finally, i
306a0 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
306b0 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e  occur, return an
306c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
306d0 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a  de. The final.**
306e0 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73   value of *pp is
306f0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
30700 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
30710 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
30720 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f  does return a po
30730 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65  inter, the calle
30740 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c  r must eventuall
30750 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  y .** release th
30760 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
30770 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74  alling unixUnfet
30780 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ch()..*/.static 
30790 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71  int unixFetch(sq
307a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
307b0 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41  i64 iOff, int nA
307c0 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a  mt, void **pp){.
307d0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
307e0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
307f0 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
30800 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f  ixFile *)fd;   /
30810 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
30820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
30830 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d  /.#endif.  *pp =
30840 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   0;..#if SQLITE_
30850 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
30860 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
30870 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20  izeMax>0 ){.    
30880 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
30890 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
308a0 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70  int rc = unixMap
308b0 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
308c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
308d0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
308e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
308f0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  ( pFd->mmapSize 
30900 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a  >= iOff+nAmt ){.
30910 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75        *pp = &((u
30920 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
30930 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  ion)[iOff];.    
30940 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
30950 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ++;.    }.  }.#e
30960 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
30970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
30980 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
30990 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
309a0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
309b0 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
309c0 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65   a .** reference
309d0 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
309e0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
309f0 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65  unixFetch(). The
30a00 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
30a10 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
30a20 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
30a30 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
30a40 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
30a50 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68  g.** argument th
30a60 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  at was passed to
30a70 20 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29   the unixFetch()
30a80 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a   invocation. .**
30a90 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
30aa0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
30ab0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
30ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
30ad0 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f  ng called .** to
30ae0 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20   inform the VFS 
30af0 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f  layer that, acco
30b00 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20  rding to POSIX, 
30b10 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  any existing map
30b20 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77  ping .** may now
30b30 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
30b40 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
30b50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
30b60 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71  t unixUnfetch(sq
30b70 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
30b80 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
30b90 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
30ba0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
30bb0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
30bc0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
30bd0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
30be0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
30bf0 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  le */.  UNUSED_P
30c00 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
30c10 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
30c20 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
30c30 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
30c40 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
30c50 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46  tanding .  ** xF
30c60 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e  etch references.
30c70 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65   Or, if p!=0 (me
30c80 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78  aning it is an x
30c90 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29  Fetch reference)
30ca0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
30cb0 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
30cc0 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
30cd0 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ng.  */.  assert
30ce0 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e  ( (p==0)==(pFd->
30cf0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b  nFetchOut==0) );
30d00 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20  ..  /* If p!=0, 
30d10 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  it must match th
30d20 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f  e iOff value. */
30d30 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
30d40 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46  || p==&((u8 *)pF
30d50 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
30d60 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70  Off] );..  if( p
30d70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65   ){.    pFd->nFe
30d80 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73  tchOut--;.  }els
30d90 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70  e{.    unixUnmap
30da0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a  file(pFd);.  }..
30db0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
30dc0 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23  FetchOut>=0 );.#
30dd0 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
30de0 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
30df0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30e00 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
30e10 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65  AMETER(iOff);.#e
30e20 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
30e30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
30e40 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
30e50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
30e60 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
30e70 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
30e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e90 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
30ea0 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
30eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
30ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
30f20 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
30f30 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
30f40 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
30f50 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
30f60 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
30f70 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
30f80 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
30f90 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
30fa0 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
30fb0 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
30fc0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
30fd0 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
30fe0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
30ff0 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
31000 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
31010 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
31020 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
31030 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
31040 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
31050 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
31060 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
31070 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
31080 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
31090 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
310a0 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
310b0 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
310c0 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
310d0 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
310e0 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
310f0 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
31100 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31110 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
31120 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
31130 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
31140 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
31150 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
31160 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
31170 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
31180 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
31190 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
311a0 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
311b0 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
311c0 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63   For finder-func
311d0 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
311e0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
311f0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
31200 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
31210 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
31220 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
31230 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
31240 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
31250 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
31260 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
31270 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
31280 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
31290 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
312a0 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
312b0 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
312c0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
312d0 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
312e0 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
312f0 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
31300 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
31310 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
31320 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
31330 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
31340 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
31350 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
31360 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
31370 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
31380 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
31390 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
313a0 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
313b0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
313c0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
313d0 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
313e0 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
313f0 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
31400 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
31410 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
31420 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
31430 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
31440 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
31450 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
31460 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
31470 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
31480 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
31490 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
314a0 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
314b0 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c  S(FINDER,METHOD,
314c0 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f  VERSION,CLOSE,LO
314d0 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b  CK,UNLOCK,CKLOCK
314e0 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73  ,SHMMAP)     \.s
314f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
31500 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
31510 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31530 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31540 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31560 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31590 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
315a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
315b0 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
315c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
315e0 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
315f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
31600 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31620 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31630 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
31640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
31650 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
31680 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
31690 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
316a0 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
316d0 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
316e0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
316f0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31710 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
31720 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
31730 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
31740 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31760 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31780 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
31790 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317b0 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317d0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
317e0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31800 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31820 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
31830 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31850 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
31860 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
31870 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
31880 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318a0 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
318b0 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
318c0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
318d0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318f0 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
31900 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
31910 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
31920 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
31940 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20  .   SHMMAP,     
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31990 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
319b0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
319e0 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
319f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
31a00 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31a30 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20   unixShmUnmap,  
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31a50 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31a80 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20  unixFetch,      
31a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31aa0 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  Fetch */        
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31ad0 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20  nixUnfetch,     
31ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
31af0 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20  nfetch */       
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
31b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
31b70 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
31b80 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
31b90 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
31ba0 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
31bb0 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
31bc0 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
31bd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31be0 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c00 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
31c10 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c50 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ca0 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
31cb0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
31cc0 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
31cd0 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
31ce0 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
31cf0 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
31d00 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
31d10 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
31d20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
31d30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
31d40 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
31d50 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
31d60 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
31d70 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
31d80 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
31d90 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
31da0 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
31db0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
31dc0 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
31dd0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
31de0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
31df0 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
31e00 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
31e10 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
31e20 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
31e30 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
31e60 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62  nd mmap are enab
31e70 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
31e80 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
31e90 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
31ea0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
31eb0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
31ec0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
31ed0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
31ee0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
31ef0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
31f00 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
31f10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
31f20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
31f30 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
31f40 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20  */.  unixShmMap 
31f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31f60 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
31f70 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
31f80 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
31f90 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
31fa0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
31fb0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
31fc0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
31fd0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
31fe0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
31ff0 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
32000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32010 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32020 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
32030 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73   */.  nolockClos
32040 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
32050 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
32060 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   */.  nolockLock
32070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32080 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
32090 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63  */.  nolockUnloc
320a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
320b0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
320c0 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63   */.  nolockChec
320d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
320e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
320f0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
32100 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
32110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32120 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
32130 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
32140 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  dotlockIoFinder,
32150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
32160 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
32170 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  e */.  dotlockIo
32180 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
32190 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
321a0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
321b0 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321d0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
321e0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
321f0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65  /.  dotlockClose
32200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
32210 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
32220 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c  /.  dotlockLock,
32230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32240 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
32250 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  .  dotlockUnlock
32260 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32270 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
32280 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  /.  dotlockCheck
32290 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a  ReservedLock, /*
322a0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
322b0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
322c0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
322d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
322e0 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
322f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
32300 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32310 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66  E.IOMETHODS(.  f
32320 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
32330 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
32340 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
32350 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74   */.  flockIoMet
32360 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
32370 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
32380 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
32390 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323b0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
323c0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
323d0 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20  .  flockClose,  
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
323f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
32400 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20  .  flockLock,   
32410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32420 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32430 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20    flockUnlock,  
32440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32450 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
32460 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  .  flockCheckRes
32470 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20  ervedLock,   /* 
32480 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32490 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
324a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
324c0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
324d0 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56  #endif..#if OS_V
324e0 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
324f0 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c  (.  semIoFinder,
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32510 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
32520 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f   name */.  semIo
32530 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
32540 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
32550 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
32560 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
32570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32580 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
32590 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
325a0 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73  ed */.  semXClos
325b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
325c0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
325d0 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b  od */.  semXLock
325e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
325f0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
32600 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63  d */.  semXUnloc
32610 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
32620 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
32630 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63  od */.  semXChec
32640 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
32650 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
32660 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
32670 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32690 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
326a0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
326b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
326c0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
326d0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
326e0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
326f0 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  afpIoFinder,    
32700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
32710 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
32720 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68  e */.  afpIoMeth
32730 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
32740 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
32750 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
32760 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32780 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
32790 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
327a0 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20  /.  afpClose,   
327b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
327c0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
327d0 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20  /.  afpLock,    
327e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
327f0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
32800 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20  .  afpUnlock,   
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32820 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
32830 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65  /.  afpCheckRese
32840 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
32850 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
32860 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32870 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
32880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
32890 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
328a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
328b0 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  he proxy locking
328c0 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75   method is a "su
328d0 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  per-method" in t
328e0 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74  he sense that it
328f0 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64  .** opens second
32900 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ary file descrip
32910 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e  tors for the con
32920 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ch and lock file
32930 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73  s and.** it uses
32940 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65   proxy, dot-file
32950 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b  , AFP, and flock
32960 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  () locking metho
32970 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73  ds on those.** s
32980 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20  econdary files. 
32990 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
329a0 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
329b0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a  hat implements.*
329c0 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * proxy locking 
329d0 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20  is located much 
329e0 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20  further down in 
329f0 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77  the file.  But w
32a00 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20  e need.** to go 
32a10 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65  ahead and define
32a20 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
32a30 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64  methods and find
32a40 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  er function.** f
32a50 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  or proxy locking
32a60 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f   here.  So we fo
32a70 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68  rward declare th
32a80 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a  e I/O methods..*
32a90 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
32aa0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
32ab0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
32ac0 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69  G_STYLE.static i
32ad0 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71  nt proxyClose(sq
32ae0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74  lite3_file*);.st
32af0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f  atic int proxyLo
32b00 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
32b10 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
32b20 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73  nt proxyUnlock(s
32b30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
32b40 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
32b50 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
32b60 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
32b70 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45  le*, int*);.IOME
32b80 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f  THODS(.  proxyIo
32b90 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
32ba0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
32bb0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
32bc0 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20  proxyIoMethods, 
32bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
32be0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
32bf0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
32c00 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
32c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
32c20 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65  ared memory is e
32c30 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  nabled */.  prox
32c40 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
32c50 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
32c60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
32c70 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
32c80 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
32c90 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
32ca0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
32cb0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
32cc0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
32cd0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
32ce0 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
32cf0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
32d00 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
32d30 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
32d40 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
32d50 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
32d60 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
32d70 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
32d80 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
32d90 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
32da0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
32db0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
32dc0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
32dd0 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32df0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
32e00 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
32e10 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
32e20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
32e30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
32e40 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e60 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32e70 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
32e80 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
32e90 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
32ea0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32eb0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
32ec0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32ed0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
32ee0 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
32ef0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
32f00 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
32f10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
32f20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32f30 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
32f40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
32f50 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
32f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f70 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
32f80 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
32f90 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
32fa0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
32fb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
32fc0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
32fd0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
32fe0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
32ff0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
33000 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
33010 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
33020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33030 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
33040 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
33050 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
33060 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
33070 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
33080 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
33090 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
330a0 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
330b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
330c0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
330d0 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
330e0 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
330f0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
33100 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
33110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33120 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
33130 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
33140 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
33150 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
33160 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
33170 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
33180 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
33190 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
331a0 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
331b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
331c0 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
331d0 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
331e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
331f0 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
33200 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
33210 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
33220 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
33230 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
33240 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
33250 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
33260 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
33270 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
33280 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
33290 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
332a0 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
332b0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
332c0 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
332d0 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
332e0 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
332f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
33300 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
33310 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
33320 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
33330 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
33340 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
33350 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
33360 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
33370 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
33380 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
33390 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
333a0 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
333b0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
333c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
333d0 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
333e0 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
333f0 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
33400 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
33410 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
33420 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
33430 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
33440 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
33450 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
33460 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
33470 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
33480 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
33490 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
334a0 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
334b0 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
334c0 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
334d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
334e0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
334f0 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
33500 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
33510 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
33520 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
33530 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
33540 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
33550 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
33560 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
33570 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
33580 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
33590 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
335a0 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
335b0 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
335c0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
335d0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
335e0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
335f0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
33600 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
33610 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
33620 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
33630 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ) {.    if( strc
33640 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
33650 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d  pename, "nfs")==
33660 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
33670 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b  n &nfsIoMethods;
33680 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
33690 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
336a0 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  xIoMethods;.    
336b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
336c0 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
336d0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
336e0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
336f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
33700 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
33710 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
33720 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
33730 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
33740 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
33750 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
33760 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33770 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33780 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
33790 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a   OS_VXWORKS./*.*
337a0 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
337b0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57  function for VxW
337c0 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73  orks checks to s
337d0 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69  ee if posix advi
337e0 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20  sory.** locking 
337f0 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f  works.  If it do
33800 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  es, then that is
33810 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   what is used.  
33820 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
33830 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c  * work, then fal
33840 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73  lback to named s
33850 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
33860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
33870 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
33880 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46  hods *vxworksIoF
33890 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
338a0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
338b0 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
338c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
338d0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
338e0 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
338f0 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
33900 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
33910 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
33920 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
33930 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
33940 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
33950 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
33960 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
33970 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
33980 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
33990 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
339a0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
339b0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
339c0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
339d0 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
339e0 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
339f0 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
33a00 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
33a10 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
33a20 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
33a30 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
33a40 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
33a50 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
33a60 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
33a70 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
33a80 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
33a90 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
33aa0 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
33ab0 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
33ac0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
33ad0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
33ae0 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
33af0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
33b00 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
33b10 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
33b20 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
33b30 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
33b40 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
33b50 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72    *(*const vxwor
33b60 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ksIoFinder)(cons
33b70 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
33b80 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69  *) = vxworksIoFi
33b90 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
33ba0 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
33bb0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
33bc0 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
33bd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49   pointer to an I
33be0 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
33bf0 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
33c00 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
33c10 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
33c20 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
33c30 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
33c40 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
33c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33c90 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
33ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33cb0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
33cc0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
33cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ce0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
33cf0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
33d00 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
33d10 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
33d20 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
33d30 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
33d40 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
33d50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
33d60 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
33d70 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
33d80 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
33d90 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
33da0 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
33db0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
33dc0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
33dd0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
33de0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
33df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
33e00 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
33e10 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
33e20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
33e30 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
33e40 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
33e50 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
33e60 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
33e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
33e80 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
33e90 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
33ea0 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
33eb0 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20  nt ctrlFlags    
33ec0 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
33ed0 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f  r more UNIXFILE_
33ee0 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  * values */.){. 
33ef0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
33f00 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
33f10 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
33f20 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
33f30 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
33f40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
33f50 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
33f60 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
33f70 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  L );..  /* Usual
33f80 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
33f90 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
33fa0 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
33fb0 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
33fc0 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
33fd0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
33fe0 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
33ff0 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
34000 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
34010 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
34020 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
34030 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
34040 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
34050 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
34060 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
34070 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
34080 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
34090 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
340a0 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
340b0 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
340c0 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
340d0 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
340e0 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
340f0 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
34100 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f  .#endif..  /* No
34110 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
34120 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
34130 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
34140 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
34150 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
34160 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
34170 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
34180 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
34190 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
341a0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
341b0 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
341c0 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
341d0 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
341e0 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
341f0 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
34200 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
34210 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
34220 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
34230 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
34240 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
34250 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
34260 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
34270 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
34280 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
34290 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
342a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
342b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
342c0 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
342d0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
342e0 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
342f0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
34300 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
34310 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
34320 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
34330 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
34340 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
34350 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
34360 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
34370 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
34380 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
34390 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
343a0 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
343b0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
343c0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
343d0 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
343e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
343f0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
34400 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73  .  if( ctrlFlags
34410 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
34420 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69  CK ){.    pLocki
34430 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63  ngStyle = &noloc
34440 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  kIoMethods;.  }e
34450 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  lse{.    pLockin
34460 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e  gStyle = (**(fin
34470 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e  der_type*)pVfs->
34480 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e  pAppData)(zFilen
34490 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20  ame, pNew);.#if 
344a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
344b0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
344c0 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61  /* Cache zFilena
344d0 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  me in the lockin
344e0 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61  g context (AFP a
344f0 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72  nd dotlock overr
34500 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ide) for.    ** 
34510 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61  proxyLock activa
34520 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  tion is possible
34530 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69   (remote proxy i
34540 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61  s based on db na
34550 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65  me).    ** zFile
34560 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  name remains val
34570 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73  id until file is
34580 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70   closed, to supp
34590 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  ort */.    pNew-
345a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
345b0 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61  = (void*)zFilena
345c0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  me;.#endif.  }..
345d0 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74    if( pLockingSt
345e0 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d  yle == &posixIoM
345f0 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e  ethods.#if defin
34600 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
34610 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
34620 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
34630 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c   || pLockingStyl
34640 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f  e == &nfsIoMetho
34650 64 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 2f  ds.#endif.     /
34660 2a 20 73 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f  * support WAL mo
34670 64 65 20 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20  de on read only 
34680 6d 6f 75 6e 74 65 64 20 66 69 6c 65 73 79 73 74  mounted filesyst
34690 65 6d 20 2a 2f 0a 20 20 20 20 7c 7c 20 28 70 4c  em */.    || (pL
346a0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
346b0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
346c0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 29  && zFilename!=0)
346d0 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e  .  ){.    unixEn
346e0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
346f0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
34700 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
34710 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
34720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34730 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e  {.      /* If an
34740 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
34750 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  in findInodeInfo
34760 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
34770 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
34780 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
34790 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
347a0 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
347b0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
347c0 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a  may fail.      *
347d0 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  * in two scenari
347e0 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  os:.      **.   
347f0 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61     **   (a) A ca
34800 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61  ll to fstat() fa
34810 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20  iled..      **  
34820 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61   (b) A malloc fa
34830 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  iled..      **. 
34840 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f       ** Scenario
34850 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63   (b) may only oc
34860 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65  cur if the proce
34870 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f  ss is holding no
34880 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
34890 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
348a0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
348b0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
348c0 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65   were other file
348d0 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
348e0 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69  ptors on this fi
348f0 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c  le, then no mall
34900 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75  oc would be requ
34910 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
34920 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
34930 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
34940 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69   case, it is qui
34950 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65  te safe to close
34960 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  .      ** handle
34970 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75   h - as it is gu
34980 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f  aranteed that no
34990 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c   posix locks wil
349a0 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20  l be released.  
349b0 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20      ** by doing 
349c0 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  so..      **.   
349d0 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69     ** If scenari
349e0 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65  o (a) caused the
349f0 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e   error then thin
34a00 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61  gs are not so sa
34a10 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  fe. The.      **
34a20 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70   implicit assump
34a30 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61  tion here is tha
34a40 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69  t if fstat() fai
34a50 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69  ls, things are i
34a60 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20  n.      ** such 
34a70 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64  bad shape that d
34a80 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f  ropping a lock o
34a90 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61  r two doesn't ma
34aa0 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20  tter much..     
34ab0 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
34ac0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
34ad0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
34ae0 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   h = -1;.    }. 
34af0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
34b00 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  x();.  }..#if SQ
34b10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34b20 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
34b30 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
34b40 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
34b50 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70  ingStyle == &afp
34b60 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
34b70 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20   /* AFP locking 
34b80 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
34b90 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
34ba0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
34bb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c  .    ** the afpL
34bc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20  ockingContext.. 
34bd0 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63     */.    afpLoc
34be0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
34bf0 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  x;.    pNew->loc
34c00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43  kingContext = pC
34c10 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  tx = sqlite3_mal
34c20 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
34c30 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
34c40 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
34c50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34c60 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  EM_BKPT;.    }el
34c70 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
34c80 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
34c90 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
34ca0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
34cb0 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
34cc0 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
34cd0 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
34ce0 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
34cf0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
34d00 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
34d10 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
34d20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
34d30 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
34d40 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
34d50 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
34d60 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
34d70 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
34d80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
34d90 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
34da0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
34db0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
34dc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
34de0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
34df0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
34e00 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
34e10 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
34e20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
34e30 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
34e40 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
34e50 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
34e60 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
34e70 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
34e80 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
34e90 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
34ea0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
34eb0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
34ec0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
34ed0 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
34ee0 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
34ef0 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
34f00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
34f10 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
34f20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
34f30 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
34f40 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
34f50 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e  name!=0 );.    n
34f60 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29  Filename = (int)
34f70 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
34f80 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
34f90 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
34fa0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
34fb0 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
34fc0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
34fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
34fe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
34ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35000 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
35010 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a  ntf(nFilename, z
35020 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44  LockFile, "%s" D
35030 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a  OTLOCK_SUFFIX, z
35040 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Filename);.    }
35050 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
35060 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63  ngContext = zLoc
35070 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20  kFile;.  }..#if 
35080 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73  OS_VXWORKS.  els
35090 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
350a0 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74  yle == &semIoMet
350b0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  hods ){.    /* N
350c0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
350d0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
350e0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
350f0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
35100 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ** included in t
35110 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e  he semLockingCon
35120 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20  text.    */.    
35130 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
35140 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
35150 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
35160 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
35170 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
35180 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d  TE_OK) && (pNew-
35190 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e  >pInode->pSem==N
351a0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68  ULL) ){.      ch
351b0 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70  ar *zSemName = p
351c0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
351d0 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74  mName;.      int
351e0 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   n;.      sqlite
351f0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
35200 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d  ATHNAME, zSemNam
35210 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20  e, "/%s.sem",.  
35220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35230 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e       pNew->pId->
35240 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b  zCanonicalName);
35250 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b  .      for( n=1;
35260 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b   zSemName[n]; n+
35270 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20  + ).        if( 
35280 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27  zSemName[n]=='/'
35290 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d   ) zSemName[n] =
352a0 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77   '_';.      pNew
352b0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
352c0 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61   sem_open(zSemNa
352d0 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36  me, O_CREAT, 066
352e0 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  6, 1);.      if(
352f0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
35300 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45  Sem == SEM_FAILE
35310 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  D ){.        rc 
35320 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
35330 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  KPT;.        pNe
35340 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
35350 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
35360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35370 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
35380 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
35390 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e  .  storeLastErrn
353a0 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20  o(pNew, 0);.#if 
353b0 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
353c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
353d0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
353e0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
353f0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
35400 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20  ;.    h = -1;.  
35410 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65    osUnlink(zFile
35420 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  name);.    pNew-
35430 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
35440 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20  IXFILE_DELETE;. 
35450 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
35460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35470 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
35480 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
35490 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
354a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
354b0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
354c0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
354d0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
354e0 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69  ;.    verifyDbFi
354f0 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20  le(pNew);.  }.  
35500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35510 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
35520 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
35530 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
35540 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ut temporary fil
35550 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  es..** If no sui
35560 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  table temporary 
35570 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63  file directory c
35580 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
35590 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
355a0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
355b0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
355c0 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
355d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
355e0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c  rs[] = {.     0,
355f0 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
35600 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
35610 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
35620 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
35630 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
35640 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
35650 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
35660 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
35670 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
35680 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
35690 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
356a0 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
356b0 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
356c0 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
356d0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
356e0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
356f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
35700 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
35710 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
35720 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
35730 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  ]){.    if( zDir
35740 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
35750 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a      if( osStat(z
35760 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  Dir, &buf) ) con
35770 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
35780 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
35790 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
357a0 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73  .    if( osAcces
357b0 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f  s(zDir, 07) ) co
357c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61  ntinue;.    brea
357d0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
357e0 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  zDir;.}../*.** C
357f0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
35800 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
35810 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
35820 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  be allocated.** 
35830 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  by the calling p
35840 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20  rocess and must 
35850 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
35860 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a   hold at least.*
35870 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  * pVfs->mxPathna
35880 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  me bytes..*/.sta
35890 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
358a0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
358b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
358c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
358d0 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  r;.  int iLimit 
358e0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  = 0;..  /* It's 
358f0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
35900 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
35910 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
35920 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
35930 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
35940 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
35950 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
35960 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
35970 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
35980 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
35990 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
359a0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
359b0 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
359c0 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
359d0 69 72 28 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ir();.  do{.    
359e0 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  u64 r;.    sqlit
359f0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
35a00 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
35a10 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32    assert( nBuf>2
35a20 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75   );.    zBuf[nBu
35a30 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  f-2] = 0;.    sq
35a40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
35a50 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  Buf, zBuf, "%s/"
35a60 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
35a70 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c  _PREFIX"%llx%c",
35a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35a90 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30        zDir, r, 0
35aa0 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b  );.    if( zBuf[
35ab0 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69  nBuf-2]!=0 || (i
35ac0 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65  Limit++)>10 ) re
35ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
35ae0 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  R;.  }while( osA
35af0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
35b00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
35b10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
35b20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
35b30 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
35b40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
35b50 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
35b60 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
35b70 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
35b80 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
35b90 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
35ba0 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
35bb0 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
35bc0 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
35bd0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
35be0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
35bf0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
35c00 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
35c10 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
35c20 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
35c30 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
35c40 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
35c50 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
35c60 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
35c70 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
35c80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
35c90 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
35ca0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
35cb0 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
35cc0 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
35cd0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
35ce0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
35cf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
35d00 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
35d10 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
35d20 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
35d30 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
35d40 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
35d50 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
35d60 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
35d70 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
35d80 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
35d90 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
35da0 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
35db0 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
35dc0 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
35dd0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
35de0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
35df0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
35e00 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
35e10 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
35e20 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
35e30 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
35e40 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
35e50 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
35e60 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
35e70 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
35e80 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
35e90 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
35ea0 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
35eb0 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
35ec0 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
35ed0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
35ee0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
35ef0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
35f00 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
35f10 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
35f20 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
35f30 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
35f40 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
35f50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
35f60 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
35f70 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
35f80 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
35f90 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
35fa0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
35fb0 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
35fc0 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
35fd0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
35fe0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
35ff0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
36000 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
36010 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
36020 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
36030 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
36040 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
36050 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
36060 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
36070 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
36080 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
36090 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
360a0 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
360b0 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
360c0 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
360d0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
360e0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
360f0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
36100 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
36110 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
36120 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
36130 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
36140 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
36150 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
36160 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
36170 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
36180 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
36190 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
361a0 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
361b0 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
361c0 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
361d0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
361e0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
361f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
36200 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
36210 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
36220 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
36230 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
36240 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
36250 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
36260 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
36270 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
36280 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
36290 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
362a0 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
362b0 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
362c0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
362d0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
362e0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
362f0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
36300 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
36310 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69  or a reusable fi
36320 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
36330 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
36340 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
36350 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
36360 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
36370 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
36380 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
36390 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
363a0 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
363b0 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
363c0 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
363d0 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
363e0 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
363f0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
36400 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
36410 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
36420 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
36430 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
36440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
36450 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
36460 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
36470 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
36480 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
36490 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
364a0 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
364b0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
364c0 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
364d0 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
364e0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
364f0 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
36500 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
36510 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
36520 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
36530 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
36540 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
36550 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
36560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
36570 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36580 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
36590 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
365a0 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
365b0 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
365c0 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
365d0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
365e0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
365f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
36600 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
36610 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
36620 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
36630 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
36640 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
36650 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
36660 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
36670 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
36680 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
36690 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
366a0 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
366b0 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
366c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
366d0 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
366e0 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
366f0 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
36700 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
36710 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
36720 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
36730 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
36740 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
36750 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
36760 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
36770 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
36780 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
36790 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
367a0 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
367b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
367c0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
367d0 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
367e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
367f0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
36800 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
36810 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
36820 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
36830 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
36840 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
36850 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
36860 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
36870 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
36880 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
36890 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
368a0 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
368b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
368c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
368d0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
368e0 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
368f0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
36900 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
36910 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
36920 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
36930 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
36940 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
36950 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
36960 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
36970 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
36980 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
36990 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
369a0 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
369b0 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
369c0 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
369d0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
369e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
369f0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
36a00 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
36a10 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
36a20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
36a30 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
36a40 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
36a50 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
36a60 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
36a70 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
36a80 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
36a90 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
36aa0 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
36ab0 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ad0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
36ae0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
36af0 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
36b00 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
36b10 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
36b20 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
36b30 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
36b40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36b60 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
36b70 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
36b80 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
36b90 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
36ba0 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
36bb0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
36bc0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
36bd0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
36be0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
36bf0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
36c00 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
36c10 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
36c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
36c40 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
36c50 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
36c60 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
36c70 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
36c80 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
36c90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
36ca0 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
36cb0 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
36cc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
36cd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
36ce0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
36cf0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
36d00 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
36d10 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
36d20 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
36d30 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
36d40 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
36d50 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
36d60 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
36d70 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
36d80 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
36d90 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
36da0 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
36db0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
36dc0 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
36dd0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
36de0 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
36df0 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
36e00 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
36e10 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
36e20 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
36e30 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
36e40 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
36e50 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
36e60 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
36e70 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
36e80 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c  ) - 1; .    whil
36e90 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  e( zPath[nDb]!='
36ea0 2d 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  -' ){.#ifndef SQ
36eb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
36ec0 4e 41 4d 45 53 0a 20 20 20 20 20 20 2f 2a 20 49  NAMES.      /* I
36ed0 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 20 63 61 73  n the normal cas
36ee0 65 20 28 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  e (8+3 filenames
36ef0 20 64 69 73 61 62 6c 65 64 29 20 74 68 65 20 6a   disabled) the j
36f00 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
36f10 20 20 20 20 20 20 2a 2a 20 69 73 20 67 75 61 72        ** is guar
36f20 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69  anteed to contai
36f30 6e 20 61 20 27 2d 27 20 63 68 61 72 61 63 74 65  n a '-' characte
36f40 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
36f50 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20  rt( nDb>0 );.   
36f60 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
36f70 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
36f80 6e 44 62 5d 29 20 29 3b 0a 23 65 6c 73 65 0a 20  nDb]) );.#else. 
36f90 20 20 20 20 20 2f 2a 20 49 66 20 38 2b 33 20 6e       /* If 8+3 n
36fa0 61 6d 65 73 20 61 72 65 20 70 6f 73 73 69 62 6c  ames are possibl
36fb0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
36fc0 6e 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  nal file might n
36fd0 6f 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  ot contain.     
36fe0 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63   ** a '-' charac
36ff0 74 65 72 2e 20 20 53 6f 20 63 68 65 63 6b 20 66  ter.  So check f
37000 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 64  or that case and
37010 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
37020 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d  /.      if( nDb=
37030 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
37040 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53  =='.' ) return S
37050 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
37060 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
37070 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a    }.    memcpy(z
37080 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
37090 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
370a0 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
370b0 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
370c0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
370d0 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
370e0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
370f0 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
37100 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
37110 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
37120 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
37130 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
37140 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
37150 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
37160 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
37170 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
37180 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
37190 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
371a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
371b0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
371c0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
371d0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
371e0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
371f0 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
37200 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
37210 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
37220 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
37230 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
37240 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
37250 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
37260 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
37270 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
37280 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
37290 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
372a0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
372b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
372c0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
372d0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
372e0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
372f0 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
37300 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
37310 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
37320 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
37330 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
37340 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
37350 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
37360 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
37370 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
37380 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
37390 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
373a0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
373b0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
373c0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
373d0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
373e0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
373f0 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
37400 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
37410 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
37420 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
37430 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
37440 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
37450 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
37460 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
37470 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
37480 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
37490 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
374a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
374b0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
374c0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
374d0 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
374e0 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
374f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
37500 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
37510 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
37520 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
37530 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
37540 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
37550 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
37560 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
37570 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
37580 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
37590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
375a0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
375b0 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
375c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
375d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
375e0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
375f0 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
37600 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
37610 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
37620 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
37630 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
37640 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
37650 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
37660 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
37670 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
37680 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
37690 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
376a0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
376b0 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66  to open() */.#if
376c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
376d0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
376e0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
376f0 67 73 26 30 78 46 46 30 46 46 46 30 30 3b 20 20  gs&0xFF0FFF00;  
37700 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
37710 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65  to open */.#else
37720 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
37730 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
37740 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
37750 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
37760 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b  dif.  int noLock
37770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37780 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
37790 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
377a0 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
377b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
377c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
377d0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
377e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
377f0 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
37800 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
37810 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
37820 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
37830 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
37840 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
37850 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
37860 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
37870 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
37880 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
37890 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
378a0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
378b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
378c0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
378d0 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
378e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
378f0 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
37900 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
37910 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
37920 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
37930 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37940 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
37950 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
37960 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
37970 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
37980 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
37990 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
379a0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
379b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
379c0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
379d0 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
379e0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
379f0 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
37a00 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
37a10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
37a20 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
37a30 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
37a40 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
37a50 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
37a60 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
37a70 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
37a80 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
37a90 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
37aa0 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
37ab0 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
37ac0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
37ad0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
37ae0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
37af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
37b00 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
37b10 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
37b20 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
37b30 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
37b40 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
37b50 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
37b60 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
37b70 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
37b80 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
37b90 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
37ba0 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
37bb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
37bc0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
37bd0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
37be0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
37bf0 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
37c00 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
37c10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
37c20 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
37c30 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
37c40 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
37c50 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
37c60 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
37c70 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
37c80 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
37c90 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
37ca0 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
37cb0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
37cc0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
37cd0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
37ce0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
37cf0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
37d00 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
37d10 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
37d20 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
37d30 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
37d40 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
37d50 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
37d60 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
37d70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
37d80 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
37d90 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
37da0 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
37db0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
37dc0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
37dd0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
37de0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
37df0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
37e00 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
37e10 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
37e20 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
37e30 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
37e40 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
37e50 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
37e60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
37e70 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
37e80 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
37e90 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
37ea0 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
37eb0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
37ec0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
37ed0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
37ee0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
37ef0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
37f00 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
37f10 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
37f20 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
37f30 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
37f40 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
37f50 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
37f60 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
37f70 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
37f80 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
37f90 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
37fa0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
37fb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
37fc0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
37fd0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
37fe0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
37ff0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
38000 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
38010 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
38020 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
38030 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
38040 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
38050 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
38060 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
38070 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
38080 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
38090 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
380a0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
380b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
380c0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
380d0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
380e0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
380f0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
38100 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
38110 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
38120 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
38130 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
38140 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64   /* Detect a pid
38150 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65   change and rese
38160 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65  t the PRNG.  The
38170 72 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  re is a race con
38180 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65  dition.  ** here
38190 20 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f   such that two o
381a0 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61  r more threads a
381b0 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  ll trying to ope
381c0 6e 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20  n databases at. 
381d0 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73   ** the same ins
381e0 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72  tant might all r
381f0 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20  eset the PRNG.  
38200 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73  But multiple res
38210 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72  ets.  ** are har
38220 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mless..  */.  if
38230 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21  ( randomnessPid!
38240 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a  =osGetpid(0) ){.
38250 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69      randomnessPi
38260 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b  d = osGetpid(0);
38270 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
38280 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
38290 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  }..  memset(p, 0
382a0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
382b0 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
382c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
382d0 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
382e0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
382f0 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
38300 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
38310 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
38320 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
38330 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
38340 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
38350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
38360 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
38370 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a  alloc64(sizeof(*
38380 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
38390 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
383a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
383b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
383c0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
383d0 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20  .    p->pUnused 
383e0 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20  = pUnused;..    
383f0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
38400 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
38410 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
38420 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
38430 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74  .    ** URIs wit
38440 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
38450 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
38460 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
38470 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  into.    ** sqli
38480 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
38490 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
384a0 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  rt( (flags & SQL
384b0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
384c0 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
384d0 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
384e0 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
384f0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
38500 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
38510 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
38520 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
38530 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
38540 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
38550 26 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20  && !syncDir);.  
38560 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65    rc = unixGetTe
38570 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50  mpname(pVfs->mxP
38580 61 74 68 6e 61 6d 65 2c 2